Modbus TCP lleva más de 25 años en producción y sigue siendo el protocolo de comunicación más extendido en entornos industriales. Su sencillez, su amplio soporte en dispositivos de campo y la ausencia de coste de licencia lo mantienen vigente incluso frente a OPC-UA o MQTT. CODESYS incluye un stack Modbus TCP certificado que, configurado correctamente, permite integrar cientos de dispositivos con muy poco overhead de programación.
El modelo Modbus: registros, funciones y dirección
Antes de configurar nada en CODESYS, es fundamental entender el modelo de datos de Modbus. Todo gira en torno a cuatro espacios de datos:
| Espacio | Función de lectura | Función de escritura | Tipo |
|---|---|---|---|
| Coils (0x) | FC01 | FC05 / FC15 | Bit R/W |
| Discrete Inputs (1x) | FC02 | — | Bit R |
| Input Registers (3x) | FC04 | — | Word 16-bit R |
| Holding Registers (4x) | FC03 | FC06 / FC16 | Word 16-bit R/W |
En la práctica, el 90% de los dispositivos de campo exponen sus datos en Holding Registers (FC03/FC16). La dirección de los registros puede ser base-0 (el registro "1" se accede como dirección 0) o base-1 según el dispositivo — consulta siempre el datasheet del esclavo y verifica el offset.
Configurar el maestro Modbus TCP en CODESYS
En CODESYS, el maestro Modbus TCP se añade como un dispositivo en la vista de árbol del proyecto bajo el nodo Ethernet. Los pasos son:
- En Device Tree, haz clic derecho sobre el interfaz Ethernet → Agregar dispositivo
- Selecciona Modbus TCP Master del catálogo de dispositivos
- Bajo el maestro, agrega un Modbus TCP Slave por cada dispositivo de campo
- Configura la IP del esclavo, el puerto (defecto: 502) y el Unit ID (normalmente 1 o 255)
- En la pestaña Modbus TCP Slave Channel, define los canales de lectura y escritura
Definición de canales de comunicación
Cada canal representa una petición Modbus independiente. Para un canal de lectura de Holding Registers:
- Function Code: Read Holding Registers (3)
- Read Starting Address: dirección inicial del primer registro (en base-0)
- Quantity: número de registros a leer
- Trigger: Cyclic (se lee cada ciclo de tarea) o On Change (solo cuando cambia)
- Timeout: 500 ms es un valor seguro para redes locales; aumenta a 1500–2000 ms en redes con latencia
Optimización importante: agrupa registros contiguos en un solo canal en lugar de crear un canal por cada registro individual. Una petición de 20 registros consecutivos es igual de rápida que una de 1 solo, y reduce drásticamente el overhead de red y el tiempo de ciclo de comunicación.
Mapeo de variables en CODESYS
Los registros leídos se mapean automáticamente en el árbol de I/O de CODESYS como variables de tipo WORD o ARRAY OF WORD. Para tipos de dato más complejos (REAL de 32 bits, enteros con signo) necesitas conversión explícita en ST:
(* Leer REAL de 32 bits en dos registros consecutivos Word *)
VAR
reg_hi : WORD; (* Registro 40001 → Word alto *)
reg_lo : WORD; (* Registro 40002 → Word bajo *)
valor : REAL;
END_VAR
(* Combinar los dos Words en DWORD y convertir a REAL *)
valor := DWORD_TO_REAL(
SHL(WORD_TO_DWORD(reg_hi), 16) OR WORD_TO_DWORD(reg_lo)
);
El orden de los bytes (Big Endian vs Little Endian) y el orden de los Words varía por fabricante. Si obtienes valores incorrectos, prueba intercambiando reg_hi y reg_lo.
Gestión de múltiples esclavos
En instalaciones con 10+ dispositivos Modbus, la gestión del tiempo de respuesta se vuelve crítica. El maestro CODESYS interroga los esclavos secuencialmente dentro del ciclo de tarea. Si el timeout de cada esclavo es 500 ms y tienes 20 esclavos, el ciclo completo puede tardar hasta 10 segundos. Estrategias para mitigarlo:
- Reducir el timeout al mínimo fiable para tu red (muchas redes industriales responden en menos de 100 ms)
- Usar múltiples maestros Modbus TCP en tareas separadas para paralelizar la comunicación
- Ajustar la frecuencia de polling: no todos los registros necesitan leerse cada ciclo. Usa trigger "On Change" o maneja el polling manualmente con un contador de ciclos
- Monitorizar el diagnóstico de cada esclavo: la variable
xErrordel canal indica timeout o error de respuesta
Debugging en producción
Los problemas más frecuentes en campo y cómo diagnosticarlos:
- Timeout constante: verifica firewall del PC o PLC, IP del esclavo accesible (ping), puerto 502 abierto
- Valores erróneos: revisa offset de dirección (base-0 vs base-1), orden de bytes/words, tipo de función (FC03 vs FC04)
- Comunicación intermitente: reduce el número de canales activos, aumenta el timeout, verifica calidad de red con Wireshark (filtra por puerto 502)
- Esclavo no responde tras un tiempo: algunos PLCs y gateways cierran la conexión TCP por inactividad. Activa el parámetro KeepAlive en el maestro CODESYS o reduce el intervalo de polling
Conclusión
Modbus TCP en CODESYS es una combinación probada y fiable para la integración de dispositivos de campo. La clave está en modelar correctamente los canales de comunicación, optimizar el agrupamiento de registros y monitorizar activamente los errores de timeout. Con estos fundamentos dominados, integrar un nuevo dispositivo lleva minutos en lugar de horas.
En Hexadecimal implementamos integraciones Modbus TCP complejas — plantas con más de 100 dispositivos en red — como parte de nuestros servicios de integración de sistemas. Contacta con nosotros si necesitas soporte técnico en tu proyecto.