Bloco que executa uma leitura de até 64 registradores de 16 bits (via Read Holding Registers ou Read Input Registers) de um escravo em rede Modbus RTU.
Representação Ladder

Estrutura do Bloco
Tipo de Variável |
Nome |
Tipo de Dado |
Descrição |
VAR_INPUT |
Execute |
BOOL |
Habilitação do bloco |
SlaveAddress |
BYTE |
Endereço do escravo |
|
Function# |
BYTE |
Código da função de leitura |
|
InitialDataAddress |
WORD |
Endereço do registrador inicial a ser lido |
|
NumberOfData |
BYTE |
Número de registradores a serem lidos (1 a 64) |
|
Timeout# |
WORD |
Tempo máximo de espera pela resposta do escravo [ms] |
|
Offset# |
BOOL |
Indicação de offset em InitialDataAddress, ou seja, necessidade de subtrair 1 deste número |
|
VAR_OUTPUT |
Done |
BOOL |
Habilitação de saída |
Active |
BOOL |
Sinalizador de aguardo de resposta |
|
Busy |
BOOL |
Sinalizador de que a interface RS485 está ocupada com outra requisição |
|
Error |
BOOL |
Sinalizador de erro na execução |
|
ErrorID |
BYTE |
Identificador do erro ocorrido |
|
Value |
BYTE SINT USINT WORD UINT INT DWORD UDINT DINT REAL |
Variável que armazena os dados recebidos |
|
VAR |
MB_READREGISTER _INST_0 |
MB_READREGISTER |
Instância de acesso à estrutura do bloco |
Funcionamento
Este bloco, quando detecta uma borda de subida em Execute, verifica se o escravo Modbus RTU no endereço especificado em SlaveAddress está livre para envio de dados (variável Busy em nível FALSE). Caso esteja, envia a requisição de leitura de um número de registradores indicado por NumberOfData no endereço InitialDataAddress utilizando a função escolhida em Function# e seta a saída Active, resetando-a ao receber a resposta do escravo. Os dados recebidos são armazenados na variável Value. Caso o escravo não esteja livre, o bloco aguarda Busy ir para nível FALSE para reenviar a solicitação.
|
NOTA! Caso Execute vá para nível FALSE e Busy ainda esteja em nível TRUE, a requisição é cancelada. |
|
NOTA! Value é um array de número de bits a NumberOfData multiplicado por 16. Ou seja, caso NumberOfData seja 16, Value pode ser um array de 32 posições BYTE, 16 posições WORD ou 8 posições DWORD. É importante verificar esta compatibilidade para não gerar erros no bloco. |
Quando Execute possui valor FALSE, Done permanece FALSE. A saída Done só é ativada quando o bloco termina a execução com sucesso, permanecendo em nível TRUE até que Execute receba FALSE.
Caso haja algum erro na execução, a saída Error é ativada e ErrorID exibe o código do erro segundo a tabela abaixo.
Código |
Descrição |
0 |
Executado com sucesso |
1 |
Algum dado de entrada inválido |
2 |
Mestre não habilitado |
4 |
Timeout na resposta do escravo |
5 |
Escravo retornou erro |
Fluxograma do Bloco

Exemplo em Ladder

O exemplo acima requisita leitura de um número de dados de registradores descrito por DATA_COUNT, posicionados em INIT no escravo Modbus RTU de endereço SLAVE através da função Read Input Register. Esses dados são repassados a VALUE. Finalizado o bloco com sucesso, a saída Done é ativada.
Exemplo em ST
O exemplo abaixo, exibe as instruções para aplicação do exemplo acima na linguagem ST.
VAR SLAVE : BYTE := 1; INIT : WORD; VALUE : ARRAY [0..4] OF WORD; MB_READREGISTER_INST_0 : FB_MB_ReadRegister; END_VAR
MB_READREGISTER_INST_0.Execute := DI1; MB_READREGISTER_INST_0( SlaveAddress:=SLAVE, Function:=4, InitialDataAddress:=INIT, NumberOfData:=4, Timeout:=30, Offset:=0, Value=>VALUE); DO1 := MB_READREGISTER_INST_0.Done;
|
|---|