Funções Modbus suportadas no ScadaBR

Neste tutorial irei detalhar quais são as funções Modbus utilizadas pelo ScadaBR e em quais contextos cada função é utilizada.

Tabela de funções Modbus

Estas são todas as funções Modbus que eu testei e confirmei que o ScadaBR (versão 1.2) utiliza em sua comunicação com dispostivos:

Decimal Hexadecimal Função
01 0x01 Read Coils
02 0x02 Read Discrete Inputs
03 0x03 Read Holding Registers
04 0x04 Read Input Registers
05 0x05 Write Single Coil
06 0x06 Write Single Register
16 0x10 Write Multiple registers
22 0x16 Mask Write Register

Funções 01, 02, 03 e 04 (0x01, 0x02, 0x03, 0x04)

Estas funções servem para a leitura de um ou mais endereços dos tipos coil (01), input status (02), holding register (03) e input register (04). São utilizadas sempre que o ScadaBR faz a “atualização” (poll) dos valores do data source Modbus. Se você configurou seu data source para atualizar em 5 minutos, por exemplo, a cada 5 minutos o ScadaBR usará essas funções para ler os dados do CLP.

Quando a opção Apenas valores contíguos estiver selecionada, o ScadaBR pode ter que fazer mais de uma requisição utilizando essas funções.

Por exemplo, digamos que temos em nosso data source 4 data points binários, tipo input status, nos endereços 1001, 1002, 1003 e 1010. Quando a opção de valores contíguos está desativada, o ScadaBR usa a função Modbus 02 para ler os valores de todos os endereços entre 1001 e 1010, descartando os valores que não serão salvos num data point (ou seja, descartando de 1004 a 1009).
Entretanto, se estiver configurado para ler apenas valores contíguos, o ScadaBR fará uma primeira requisição com a função 02 para ler de 1001 a 1003, e uma segunda requisição com 02 para ler apenas o endereço 1010. Isso pode ser necessário em alguns dispositivos, caso os endereços intermediários não sejam utilizados, o que pode gerar erros de leitura.

Você também pode restringir o número máximo de endereços contíguos (sequenciais) que podem ser lidos numa mesma requisição, através da opção Máxima contagem de leitura de registradores, embora o valor padrão (125) seja adequado na grande maioria dos casos.

Função 05 (0x05)

Esta função serve para escrever um valor binário em uma bobina (coil). Ela escreve sempre em um único endereço, diferentemente da função Modbus 15 (0x0F) que permite escrever em vários endereços coil simultaneamente. De acordo com meus testes o ScadaBR não oferece suporte à função 15.

Função 06 (0x06)

Esta função serve para escrever uma word de 2 bytes em um registrador holding. Ela permite a escrita em apenas 1 endereço tipo holding. No ScadaBR, esta função sempre será utilizada se o tipo de dado associado ao endereço holding tiver apenas 2 bytes (inteiro de 2 bytes, BCD de 2 bytes, string de 2 bytes, etc).

Função 16 (0x10)

Esta função serve para escrever em um ou mais registradores holding contíguos (sequenciais). Como cada registrador holding tem 2 bytes (16 bits), no ScadaBR, esta função sempre será utilizada se o tipo de dado associado ao endereço holding tiver mais que 2 bytes (floats de 4 e 8 bytes, BCD de 4 bytes, string com mais de 2 bytes, etc).

Por exemplo: um float de 4 bytes no endereço (offset) 4001 ocupará os 2 bytes de 4001 e mais os 2 bytes de 4002, então o ScadaBR usará a função 16 toda vez que precisar atualizar o valor desse float no dispositivo.

Se você definisse na opção Máxima contagem de escrita de registradores um valor menor que 2, o ScadaBR não conseguiria escrever nenhum tipo de dado que usasse mais que 2 registradores (4 bytes), como um float, por exemplo. Portanto, convém não modificar o valor original dessa opção (120), que funciona bem na maioria dos casos.

Função 22 (0x16)

Esta função serve para escrever um valor em um registrador holding aplicando “máscaras lógicas” do tipo AND e OR.
Sem entrar em detalhes técnicos, este recurso é utilizado no ScadaBR quando um registrador holding é associado a um tipo de dado binário. Esta função permite alterar um único bit dentro do endereço holding sem modificar o estado dos demais bits. Isso pode ser necessário em dispositivos que usam cada bit de um endereço holding para controlar uma saída digital, por exemplo.

NOTA: nos testes que eu realizei com alguns dispositivos e simuladores a função 22 funcionou perfeitamente. Entretanto, eu já tive experiências prévias com dispositivos em que a escrita de um único bit simplesmente não funcionou (como por exemplo em modens GPRS da ABS Telemetria). Então deve ser testado caso a caso para ver se no seu dispositivo este recurso do ScadaBR funciona corretamente ou apresenta algum bug.

Funções não listadas aqui

A especificação Modbus ainda inclui várias outras funções, como por exemplo, 23 (0x17) e 20 (0x14). Entretanto, em todos os testes que eu fiz, eu não encontrei nenhuma situação em que fosse possível utilizá-las no ScadaBR. Assim, eu não posso garantir nem que elas estejam ou não estejam implementadas no software. O conjunto de funções detalhadas neste tutorial são aquelas que você pode considerar “seguras” para utilizar no seu ScadaBR, nos contextos que eu detalhei acima.

1 curtida