Modbus TCP

Registros y bobinas Modbus sobre TCP/IP, con direccionamiento tipado, control del orden de bytes y un escaneo de red acotado.

Ver como Markdown

El driver Modbus TCP lee y escribe registros y bobinas Modbus sobre TCP/IP: PLC, medidores, puertas de enlace y cualquier servidor que hable Modbus/TCP. El direccionamiento es completamente tipado: usted elige una clase de registro y un número de registro desde 0, y la aplicación arma la petición del bus; no hay ninguna dirección de texto libre en la que equivocarse.

El dispositivo

Campo Significado Valor inicial
Host o IP Nombre DNS, dirección IPv4 o IPv6 del servidor Modbus o de la puerta de enlace. localhost cuando se deja vacío
Puerto Puerto TCP. 502 (un 0 configurado cae en 502)
ID de unidad El id de unidad (esclavo) Modbus que lleva cada petición, lo que usa una puerta de enlace para enrutar al dispositivo que hay detrás. De 0 a 255. 1
Intervalo mínimo entre transacciones (ms) Cadencia de compatibilidad: el silencio mínimo después de que se completa una transacción y antes de que empiece la siguiente, de 0 a 1000. Cero no agrega retardo artificial. 0
Intervalo de sondeo (ms) El ritmo de sondeo predeterminado para los tags que no lo invaliden. 1000

El URI base que se muestra en el encabezado del panel es modbus+tcp://host:puerto/idDeUnidad, más ?minimumTransactionIntervalMs=n cuando el intervalo está puesto.

Los dispositivos que comparten host y puerto comparten también una sola compuerta de transacciones: las peticiones al mismo punto de conexión nunca se traslapan, y el intervalo mínimo entre transacciones más grande de entre los dispositivos activados de ese punto de conexión los cadencia a todos. El panel dice cuándo otro dispositivo eleva el intervalo efectivo por encima del que se configuró aquí. El intervalo gobierna solo el tráfico que emite esta aplicación: es una ayuda de compatibilidad para un servidor o una puerta de enlace lentos, no un arreglo de las fallas de la red.

Conectarse espera 5 segundos como máximo; una respuesta se espera 10 segundos como máximo; no hay reintentos a nivel de protocolo. El lazo de reintentos en segundo plano se encarga de la reconexión, así que un dispositivo apagado no cuesta más que una lectura de mala calidad.

El direccionamiento del tag

Campo Significado Valor inicial
Clase de registro Qué entidad Modbus direcciona el tag: HoldingRegister, InputRegister, Coil o DiscreteInput. Se deriva del tipo y del acceso: los tags booleanos reciben DiscreteInput (solo lectura) o Coil (escribible); todos los demás tipos reciben InputRegister (solo lectura) o HoldingRegister (escribible).
Número de registro (desde 0) La dirección cruda del protocolo. Es la dirección desde 0 tal como va en el bus, no la notación clásica 4xxxx: el registro de retención "40001" es el número de registro 0. El registro viaja por el bus como un número de 16 bits, así que el campo toma de 0 a 65535 y rechaza cualquier cosa más ancha ahí mismo donde se escribe. 0
Cantidad (registros, en blanco = automático) Cuántos registros de 16 bits ocupa el valor. La caja se dibuja solo en los tags String: todos los demás tipos tienen un ancho fijo, así que no hay nada que invalidar. Por tipo: Boolean 1, Int32 y Float 2, String 4
Byte más significativo primero Qué byte de cada registro de 16 bits va primero en el bus. Solo tags numéricos. encendido (lo que pide la especificación de Modbus)
Palabra más significativa primero Qué registro de un valor de dos registros lleva la mitad alta. Solo tags numéricos. encendido

La tarjeta Origen muestra la dirección de bus armada (por ejemplo 100?quantity=2) como una vista previa de solo lectura, así que lo que muestra el panel es exactamente lo que lleva la petición.

Los tipos de valor y las cantidades

Se ofrecen cuatro tipos de valor, y el ancho de protocolo de cada uno es fijo:

Tipo de dato Registros Forma en el bus
Boolean 1 Sobre una clase de registro: cualquier registro distinto de cero se lee como verdadero, y una escritura envía 1 o 0. Sobre Coil/DiscreteInput: el bit mismo.
Int32 2 Entero con signo de 32 bits a lo largo de un par de registros.
Float 2 IEEE 754 de precisión simple a lo largo de un par de registros.
String 1 o más (4 al inicio) Bytes UTF-8 empacados de dos por registro. Una lectura se detiene en el primer byte NUL; una escritura debe caber en la cantidad declarada (2 bytes por registro) y se rellena con ceros.

Un tag String se lee y se escribe en el orden en el que el dispositivo guarda los bytes, y una escritura siempre envía UTF-8. Los bytes que no son UTF-8 válido, que es lo que parece un rango que el dispositivo nunca inicializó o un texto escrito en otra codificación, se leen como el carácter Unicode de reemplazo en lugar de fallar: el tag muestra algo visiblemente equivocado, y todos los demás tags de ese dispositivo siguen leyendo.

La Cantidad se pide solo en los tags String. Los anchos de Boolean, Int32 y Float son fijos, así que la caja no se dibuja en esos puntos, ni en el panel del tag ni en la cuadrícula de tags; la invalidación existe para dimensionar los tags String.

El orden de bytes y de palabras

Las dos cajas de orden se dibujan en los tags numéricos. Son preguntas independientes: qué byte encabeza dentro de cada registro, y qué registro encabeza a lo largo de un par. Modbus no define ninguna de las dos para el texto, así que a un tag String no se le ofrecen: sus bytes viajan en el orden en el que el dispositivo los guarda. Para el valor 0x01020304, con A como el byte más significativo, las cuatro disposiciones son:

Byte más significativo primero Palabra más significativa primero Bytes en el bus
encendido encendido AB CD (el valor predeterminado de la especificación)
encendido apagado CD AB (el intercambio clásico de palabras)
apagado encendido BA DC
apagado apagado DC BA

Las lecturas y las escrituras aplican las mismas dos respuestas en el mismo orden, así que una escritura deja exactamente los bytes que una lectura habría recuperado.

Los códigos de función

Clase de registro Lectura Escritura
HoldingRegister 3 (Read Holding Registers) 6 (un solo registro) o 16 (varios registros)
InputRegister 4 (Read Input Registers) solo lectura; una escritura se rechaza
Coil 1 (Read Coils) 5 (Force Single Coil), una sola bobina
DiscreteInput 2 (Read Discrete Inputs) solo lectura; una escritura se rechaza

Una escritura devuelve éxito solo cuando la respuesta de protocolo del servidor confirma que la aceptó; el valor en caché avanza solo entonces.

El descubrimiento

El escaneo es explícito y acotado: la aplicación nunca deduce ni barre su subred local. El formulario de alcance toma:

Campo Significado Valor inicial
Host IPv4 o CIDR Una dirección (192.168.1.10) o una subred no más ancha que /24 (192.168.1.0/24). Las direcciones de red y de difusión se saltan. obligatorio
Puerto El puerto que se sondea. 502
ID de unidad Valores, listas separadas por comas o rangos ascendentes: 1, 1,5,9, 1, 3, 8-16 (de 0 a 255). 1
Intervalo mínimo entre transacciones (ms) La cadencia entre sondeos completados en el mismo host, de 0 a 1000. 0

Un solo escaneo puede enviar como máximo 256 sondeos (hosts × ID de unidad); un plan más grande se rechaza antes de que se abra ningún socket. La única petición que se envía es Read Basic Device Identification (función 43/14): el descubrimiento nunca lee registros ni adivina un mapa de registros. Una respuesta de excepción Modbus completamente válida prueba que hay una unidad presente sin declarar su identidad; la accesibilidad TCP, los tiempos de espera agotados y las tramas mal formadas no lo prueban. Se escanean hasta cuatro hosts en paralelo, y de forma secuencial dentro de cada host, con tiempos de espera de 750 ms para conectar y para sondear.

Los resultados llevan el punto de conexión completo y un nombre sugerido, armado con el fabricante y el código de producto cuando el dispositivo los reporta. Los candidatos tienen cero tags: los registros se configuran después de Agregar. Una unidad que ya está configurada se marca como tal y ofrece Abrir en lugar de crear un duplicado.

Límites que conviene conocer

  • Los tipos enteros anchos (Int64, los anchos sin signo) y Double no se ofrecen: el códec del bus va y viene exactamente con los cuatro tipos de arriba.
  • Hay una petición pendiente por punto de conexión a la vez; muchos dispositivos detrás de una misma puerta de enlace comparten esa serialización por diseño.
  • Las escrituras direccionan una bobina o una tirada de registros a la vez; no hay escritura de varias bobinas.