Modbus TCP
Registradores e coils Modbus sobre TCP/IP, com endereçamento tipado, controle de ordem de bytes e uma varredura de rede limitada.
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.