Asesoría Agenda una llamada de descubrimiento técnico hoy mismo »

· Industrial Protocols  · 3 min de lectura

Modbus RTU y TCP: La Guía Definitiva (Protocolo, Endianness y MBAP)

Más allá del cable. Aprende a dominar el Byte Swapping, los Function Codes y la estructura real de los mensajes Modbus para integraciones 100% fiables.

Más allá del cable. Aprende a dominar el Byte Swapping, los Function Codes y la estructura real de los mensajes Modbus para integraciones 100% fiables.

Si lograste que el cable RS485 no tenga ruido (revisá mi Guía de Supervivencia RTU), ahora viene el verdadero reto: interpretar los datos.

Modbus es un protocolo de “Capa de Aplicación”. No le importa si viaja por un cable serial o fibra óptica; la lógica del mensaje es casi siempre la misma. Pero “casi siempre” es donde los ingenieros pierden horas.

1. Las 4 Tablas: El Modelo de Datos Real

No pienses en Modbus como variables. Pensalo como 4 cajoneras independientes.

ModeloRef.AccesoTipoUso Industrial
Coils0xR/WBitActivar motores, luces, reset de alarmas.
Discretes1xRBitEstados de sensores, finales de carrera.
Input Reg.3xR16-bitLecturas de sensores analógicos (ADC).
Holding4xR/W16-bitSetpoints, configuraciones, variadores.

La Trampa del Offset (0 vs 1)

Este es el error #1.

  • Manual del PLC: Dice “Configura la consigna en el registro 40101”.
  • Protocolo Real: En el bus, el mensaje pide el registro 100.

Los protocolos son Zero-Based (empiezan en 0). La mayoría de los SCADAs modernos te permiten escribir 40101 y ellos hacen la resta, pero si usas librerías como pymodbus, tenés que pedir el 100.

2. El Infierno de los Floats y el Endianness

Modbus nativamente solo entiende enteros de 16 bits. ¿Como mandamos una temperatura de 25.43? Usamos dos registros (32 bits).

Aquí es donde el fabricante puede ser creativo. El orden de los bytes (Endianness) y de las palabras (Word Swapping) varía.

Si lees un valor y te da algo absurdo como 1.43e-38, tenés un problema de Endianness. He documentado todas las combinaciones y cómo fixearlas en Python aquí:

👉 Docs: Endianness Mastery Guide

Ejemplo de Código (Fixing Swap)

import struct

# Leemos dos registros [REG_HI, REG_LO]
regs = client.read_holding_registers(100, 2).registers

# 'Swap' manual si el PLC es raro (CD AB)
pack = struct.pack('>HH', regs[1], regs[0]) 
float_val = struct.unpack('>f', pack)[0]

3. Modbus TCP: El MBAP Header

A diferencia de RTU (que usa CRC al final), Modbus TCP envuelve el mensaje en un header de 7 bytes llamado MBAP Header.

  • Transaction ID (2 bytes): Permite al cliente saber qué respuesta corresponde a qué pregunta (fundamental en redes de alta velocidad).
  • Unit ID (1 byte): Crucial si usas un Gateway TCP a RTU. Este byte le dice al gateway a qué ID serial debe redirigir el mensaje. Si hablas directo a un PLC, suele ser 0 o 255.

4. Casos Prácticos: Troubleshooting de Errores

CódigoSignificadoCausa Probable
01Illegal FunctionEl dispositivo no soporta ese código (ej: tratás de escribir en un Input Register).
02Illegal AddressEl registro no existe o está fuera de rango.
03Illegal ValueEl dato que mandás no es válido (ej: mandar 500 a un registro de 0-255).

Conclusión

Integrar Modbus no es adivinar. Es leer el mapa de registros, entender el offset y dominar el Endianness. Para ver ejemplos completos de servidores y clientes asíncronos en producción, bajate mi toolkit:

👉 Repo: modbus-troubleshooting-toolkit


Fuentes y Referencias:

Volver al blog

Related Posts

View All Posts »