Há muito tempo queria falar sobre os meandros da programação da troca por meio do protocolo Modbus RTU no caso em que o controlador (em nosso caso, S7-1214) é o RTU Master. Recentemente fui solicitado a ajudar na troca entre o PLC e o conversor de frequência Sinamics V20, bom, porque não escrever uma nota ao mesmo tempo, tentando trazer a solução do problema mais perto das condições de combate.
Na verdade, os próprios alemães cobriram esse assunto por muito tempo:
Veja este exemplo, é feito de forma muito sensata, com visualização, diálogos e buscas e a capacidade de expandir o programa de aplicação para pesquisar vários inversores V20 através de várias interfaces (S7-1200 permite a instalação de até 4 portas RS-485/422 em sua cesta). O exemplo é muito bem feito e muito pedante. Já mencionei anteriormente as questões de comunicação usando o protocolo Modbus TCP, elas estão no Habré.
Portanto, não irei explicar algumas das nuances novamente, apenas escreverei imediatamente como fazê-lo correta e convenientemente do meu ponto de vista, especificamente no caso da pesquisa V20. A configuração inicial do conversor de frequência é descrita na documentação, incluindo a documentação que acompanha o exemplo acima. Vamos retirar apenas os pontos que são importantes para nós como introdutórios.
Endereço escravo Modbus na rede: 1
Parâmetros de comunicação: 9600 8-Even-1
Lendo registros de armazenamento escravo:
40110 ZSW "Palavra de status"
40111 HIW "Velocidade atual"
Registros de armazenamento para gravação:
40100 STW "Palavra de controle"
40101 HSW "Referência de velocidade"
«Telegram off time (ms)» P2014[0] , 2000 (2 ), 130 . Modbus , , 130 , Fault 72.
. . S7-1214 1241 RS-485/422:
Step 7 V15.1 Update 4, CPU — 4.3.
, . Simatic : Modbus_Comm_Load (, ) Modbus_Master ( / /). FB Modbus_Comm_Load , Modbus_Master — , , , , ( ). , ( ) .
, , , SCL. ModbusMasterV20 SCL. « », .. . , Modbus_Master . , , , — «» , .
Init (Bool) — ,
PORT (PORT) —
BAUD (UDINT) —
STOP_BITS (USINT) — «»
PARITY (USINT) — , 0 — , 1 — odd, , 2 — even,
Step UInt, « » « »
Modbus RTU
, .
1.
#instModbusCommLoad.MODE := 4; // RS-485 4!
#instModbusCommLoad.STOPBITS := #STOP_BITS;
Modbus_Comm_Load, «» . , , . , () . , , , , . -, :
MODE , . , RS-485 4. 0, .
STOP_BITS — .
Modbus_Comm_Load. PORT ( ) . BAUD PARITY — — «» , . MB_DB . P2P_MB_BASE, Modbus_Master. «» , :
: .
«» CASE, , , .. .
Modbus Master :
#instModbusMaster(REQ := TRUE,
MB_ADDR := 1,
MODE := 0,
DATA_ADDR := 40110,
DATA_LEN := 2,
DATA_PTR := #ZSWHIW);
REQ — . TRUE, , FALSE — . ( Modbus RTU S7-300/S7-400), TRUE
MB_ADDR — Modbus RTU. = 1.
MODE — , 0 — , 1 —
DATA_ADDR — . ( 4), 110. Modbus ( RTU, TCP) «» «». . . 2 , 40110. Modbus 3. 3 Modbus. 40110, 109. , . , . , . ( ), , . « 0 », DATA_ADDR 30001. , - , «», . 16 , , 15 . ? 17. .
DATA_LEN — , 2
DATA_PTR — , «» . , , , . — STAT . , , , ( ). , , /.
FB:
,
ZSW — ( )
HIW —
, . , :
- , ( , №1). — - .
, , . , . , , «» , . , « ». . — . , Init . - .
OB1 CPU:
FirstScan «» OB. , CPU.
Port. Step 7, :
, . , , :
- , . ZSW:
Low enabled . , №15, , , 0, 1. watch table , , — , :
, . , , , , (fault, №3).
, WORD , - .
, . , — . , , - . DataV20:
, Inv :
- :
, Real, . , , . , , , .
— . .
:
, , , . , . , V20Data , Real.
№1, №2.
, :
. , , , / CPU.
. , . (MODE), 1, , . , .
, , — . ( ) . . , . , , «» ( ) , Invalid data. , «» , V20 . , , , . , «Control by PLC», . RTFM, !
, ( , ). , 0 16384. . , .
DataV20 «»:
V20 , , , .. 50 . , modbus.
, №1 ( ), №2 , . «» , , .
DataV20 .
25 , Running .
, , . (), (), , .. - , :
, , , , . .
, , , . , , - «» . , , DataV20. :
(mode = 0) 40025. [0..4] of WORD. Real .
, . Modbus_Master DONE Error (, «» , — ).
, Modbus. , 10 , , , «» , 30. , , , , .
Assumiremos que o conversor de frequência está trocando informações de forma estável com o PLC quando todas as três solicitações para ele forem concluídas com êxito. Portanto, a última linha de nosso bloco de funções será a seguinte (primeiro adicionaremos a variável booleana Connected no bloco de dados DataV20):