Modbus TCP

Registradores e coils Modbus sobre TCP/IP, com endereçamento tipado, controle de ordem de bytes e uma varredura de rede limitada.

Ver como Markdown

O driver Modbus TCP lê e escreve registradores e coils Modbus sobre TCP/IP: CLPs, medidores, gateways e qualquer servidor que fale Modbus/TCP. O endereçamento é totalmente tipado: você escolhe uma classe de registrador e um número de registrador em base 0, e a aplicação monta a requisição do barramento; não há endereço em texto livre para errar.

Dispositivo

Campo Significado Padrão
Host Nome DNS, endereço IPv4 ou IPv6 do servidor ou gateway Modbus. localhost quando deixado vazio
Porta Porta TCP. 502 (um 0 configurado recai em 502)
Unit ID O unit id (escravo) Modbus levado em toda requisição, o que um gateway usa para rotear até o dispositivo atrás dele. De 0 a 255. 1
Intervalo mínimo entre transações (ms) Ritmo de compatibilidade: o silêncio mínimo depois que uma transação termina, antes de a próxima começar, de 0 a 1000. Zero não acrescenta atraso artificial. 0
Intervalo de leitura (ms) Taxa de leitura padrão para as tags que não a sobrepõem. 1000

O Base URI mostrado no cabeçalho do painel é modbus+tcp://host:port/unitID, mais ?minimumTransactionIntervalMs=n quando o intervalo está definido.

Dispositivos que compartilham host e porta também compartilham uma única porteira de transações: requisições ao mesmo endpoint nunca se sobrepõem, e o maior intervalo mínimo entre transações configurado entre os dispositivos habilitados naquele endpoint ritma todos eles. O painel avisa quando outro dispositivo eleva o intervalo efetivo acima do que está configurado aqui. O intervalo governa apenas o tráfego que esta aplicação emite: ele é um recurso de compatibilidade para um servidor ou gateway lento, não um conserto para falhas de rede.

Conectar espera no máximo 5 segundos; uma resposta é esperada por no máximo 10 segundos; não há novas tentativas no nível do protocolo. O laço de tentativas em segundo plano é dono da reconexão, então um dispositivo desligado não custa nada além de uma leitura de qualidade ruim.

Endereçamento da tag

Campo Significado Padrão
Classe de registrador Qual entidade Modbus a tag endereça: HoldingRegister, InputRegister, Coil ou DiscreteInput. Derivada do tipo e do acesso: tags booleanas recebem DiscreteInput (somente leitura) ou Coil (gravável); todo outro tipo recebe InputRegister (somente leitura) ou HoldingRegister (gravável).
Número do registrador (base 0) O endereço bruto do protocolo. Este é o endereço em base 0 no barramento, não a notação clássica 4xxxx: o holding register "40001" é o registrador número 0. O registrador viaja no barramento como um número de 16 bits, então o campo aceita de 0 a 65535 e recusa qualquer coisa mais larga onde é digitado. 0
Quantidade (registradores, em branco = automático) Quantos registradores de 16 bits o valor ocupa. A caixa é desenhada só em tags String: todo outro tipo tem largura fixa, então não há o que sobrepor. Por tipo: Boolean 1, Int32 e Float 2, String 4
Byte mais significativo primeiro Qual byte de cada registrador de 16 bits vem primeiro no barramento. Só em tags numéricas. ligado (o que a especificação Modbus pede)
Palavra mais significativa primeiro Qual registrador de um valor de dois registradores leva a metade alta. Só em tags numéricas. ligado

O cartão Origem mostra o endereço de barramento montado (por exemplo 100?quantity=2) como prévia somente leitura, então o que o painel mostra é exatamente o que a requisição leva.

Tipos de valor e quantidades

Quatro tipos de valor são oferecidos, e a largura de protocolo de cada um é fixa:

Tipo de dado Registradores Forma no barramento
Boolean 1 Numa classe de registrador: qualquer registrador diferente de zero lê verdadeiro, e uma escrita envia 1 ou 0. Em Coil/DiscreteInput: o próprio bit.
Int32 2 Inteiro de 32 bits com sinal, num par de registradores.
Float 2 Precisão simples IEEE 754, num par de registradores.
String 1 ou mais (padrão 4) Bytes UTF-8 empacotados dois por registrador. Uma leitura para no primeiro byte NUL; uma escrita precisa caber na quantidade declarada (2 bytes por registrador) e é preenchida com zeros.

Uma tag String é lida e escrita na ordem em que o dispositivo guarda os bytes, e uma escrita sempre envia UTF-8. Bytes que não são UTF-8 válido, que é a cara de uma faixa que o dispositivo nunca inicializou ou de um texto escrito em outra codificação, leem como o caractere de substituição do Unicode em vez de falhar: a tag mostra algo visivelmente errado, e toda outra tag daquele dispositivo segue lendo.

A Quantidade é pedida só em tags String. As larguras de Boolean, Int32 e Float são fixas, então a caixa não é desenhada nesses pontos, nem no painel da tag nem na grade de tags; a sobreposição existe para dimensionar tags String.

Ordem de bytes e de palavras

As duas caixas de ordem são desenhadas em tags numéricas. Elas são perguntas independentes: qual byte vem na frente dentro de cada registrador, e qual registrador vem na frente num par. O Modbus não define nenhuma das duas para texto, então uma tag String não as recebe: os bytes dela viajam na ordem em que o dispositivo os guarda. Para o valor 0x01020304, com A sendo o byte mais significativo, os quatro arranjos são:

Byte mais significativo primeiro Palavra mais significativa primeiro Bytes no barramento
ligado ligado AB CD (o padrão da especificação)
ligado desligado CD AB (a troca clássica de palavras)
desligado ligado BA DC
desligado desligado DC BA

Leituras e escritas aplicam as mesmas duas respostas na mesma ordem, então uma escrita deposita exatamente os bytes que uma leitura teria trazido de volta.

Códigos de função

Classe de registrador Leitura Escrita
HoldingRegister 3 (Read Holding Registers) 6 (registrador único) ou 16 (vários registradores)
InputRegister 4 (Read Input Registers) somente leitura; uma escrita é recusada
Coil 1 (Read Coils) 5 (Force Single Coil), um bit por vez
DiscreteInput 2 (Read Discrete Inputs) somente leitura; uma escrita é recusada

Uma escrita só retorna sucesso quando a resposta de protocolo do servidor confirma a aceitação; o valor cacheado só avança então.

Descoberta

A varredura é explícita e limitada: a aplicação nunca deduz nem varre a sua sub-rede local. O formulário de escopo recebe:

Campo Significado Padrão
Host IPv4 ou CIDR Um endereço (192.168.1.10) ou uma sub-rede não mais ampla que /24 (192.168.1.0/24). Os endereços de rede e de difusão são pulados. obrigatório
Porta A porta a sondar. 502
Unit IDs Valores, listas separadas por vírgula ou faixas crescentes: 1, 1,5,9, 1, 3, 8-16 (de 0 a 255). 1
Intervalo mínimo entre transações (ms) Ritmo entre sondagens concluídas no mesmo host, de 0 a 1000. 0

Uma varredura pode enviar no máximo 256 sondagens (hosts × unit ids); um plano maior é recusado antes de qualquer soquete abrir. A única requisição enviada é a Read Basic Device Identification (função 43/14): a descoberta nunca lê registradores nem adivinha um mapa de registradores. Uma resposta de exceção Modbus totalmente válida prova que uma unidade está presente sem afirmar a identidade dela; alcançabilidade TCP, timeouts e quadros malformados não provam. Até quatro hosts são varridos em paralelo, sequencialmente dentro de cada host, com timeouts de 750 ms para conectar e para sondar.

Os resultados carregam o endpoint completo e um nome sugerido, montado a partir do fabricante e do código de produto quando o dispositivo os relata. Os candidatos têm zero tags: os registradores são configurados depois do Adicionar. Uma unidade já configurada é marcada como tal e oferece Abrir em vez de criar uma duplicata.

Limites que vale conhecer

  • Tipos inteiros largos (Int64, larguras sem sinal) e Double não são oferecidos: o codec do barramento vai e volta exatamente com os quatro tipos acima.
  • Uma requisição fica pendente por endpoint de cada vez; muitos dispositivos atrás de um gateway compartilham essa serialização por projeto.
  • As escritas endereçam um coil ou uma sequência de registradores por vez; não há escrita de vários coils.