Guía completa de Modbus
Presentación
Modbus es el protocolo de comunicación industrial más extendido del mundo. Creado en 1979, está presente en millones de controladores lógicos programables, variadores, reguladores, contadores y sensores industriales. Eziwan es compatible de forma nativa con Modbus RTU (sobre RS-485) y Modbus TCP (sobre Ethernet).
Modbus RTU en RS-485
Cableado RS-485: guía completa
RS-485 es una interfaz diferencial de dos hilos (A y B). La diferencia de tensión entre A y B codifica la señal, lo que le confiere una excelente inmunidad frente a las interferencias electromagnéticas de los entornos industriales.
⚠️ Topología en línea (A↔A, B↔B, GND común). Resistencias de terminación de 120 Ω solo en ambos extremos del bus —ya integradas en el lado de Eziwan, deben colocarse en el último esclavo—. Nunca se debe colocar una resistencia en medio de la línea.
Tabla de conexiones de los terminales Eziwan RS-485:
| Terminal Eziwan | Señal RS-485 | Color de cable recomendado |
|---|---|---|
| A (o D+) | Positivo diferencial | Blanco o rojo |
| B (o D-) | Negativo diferencial | Azul o negro |
| GND | Masa de referencia | Verde o gris |
Parámetros de comunicación RS-485
Los parámetros deben ser idénticos en la pasarela y en todos los esclavos:
| Parámetro | Valores habituales | Valor por defecto de Eziwan |
|---|---|---|
| Velocidad (baudrate) | 1200, 2400, 4800, 9600, 19200, 38 400, 57 600, 115 200 | 9 600 |
| Paridad | N (ninguna), E (par), O (impar) | N |
| Bits de datos | 7, 8 | 8 |
| Bits de parada | 1, 2 | 1 |
| Retardo entre mensajes | 3,5 tiempos de carácter (Modbus estándar) | Auto |
Configuración estándar más habitual: 9600 8N1 (9600 baudios, 8 bits de datos, sin paridad, 1 bit de parada)
Distancia máxima y número de esclavos
| Velocidad de transmisión | Distancia máxima | Número máximo de esclavos (eléctrico) |
|---|---|---|
| 9 600 bps | 1 200 m | 32 (cargas unitarias) |
| 19 200 bps | 800 m | 32 |
| 57 600 bps | 200 m | 32 |
| 115 200 bps | 50 m | 32 |
Para superar los 32 esclavos o los 1 200 m, utiliza un repetidor RS-485.
Modbus TCP
Conexión Ethernet
Modbus TCP encapsula el protocolo Modbus en tramas TCP/IP. La conexión es directa a través de Ethernet RJ45.
| Parámetro | Valor |
|---|---|
| Puerto TCP | 502 (estándar), a veces 503 u otro según el fabricante |
| ID de unidad | Dirección del esclavo (de 1 a 247), o 255 para acceso directo |
| Tiempo de espera recomendado | De 500 ms a 2000 ms, dependiendo de la red |
| Keep-alive TCP | Recomendado para conexiones de larga duración |
Configuración de red
La pasarela Eziwan debe poder conectarse al controlador Modbus TCP a través de la red Ethernet. Comprueba lo siguiente:
- La pasarela y el controlador se encuentran en la misma subred (o hay un router entre ambos)
- No hay ningún cortafuegos que bloquee el puerto TCP 502 entre la pasarela y el controlador
- El controlador Modbus TCP está configurado para aceptar conexiones (PUT/GET activado en Siemens)
Los cuatro tipos de registros Modbus
La especificación Modbus define cuatro espacios de datos distintos:
| Tipo | Código Modbus | Direcciones | Acceso maestro | Tamaño | Descripción |
|---|---|---|---|---|---|
| Bobinas | 0x (1x) | 00001–09999 | Lectura/Escritura | 1 bit | Salidas digitales (relés, bobinas) |
| Entradas discretas | 1x (2x) | 10001–19999 | Solo lectura | 1 bit | Entradas digitales (sensores discretos) |
| Registros de entrada | 3x | 30001–39999 | Solo lectura | 16 bits | Valores medidos (sensores analógicos) |
| Registros de retención | 4x | 40001–49999 | Lectura/escritura | 16 bits | Parámetros y puntos de consigna |
Nota importante: las direcciones Modbus comienzan por 1 en la notación «funcional» (40001 a 49999), pero las funciones Modbus utilizan direcciones basadas en 0 (la solicitud FC03 para el registro 40001 utiliza la dirección 0x0000). Eziwan admite ambas notaciones.
Funciones Modbus estándar
| Código de función | Nombre | Registros de destino |
|---|---|---|
| FC01 | Lectura de bobinas | Bobinas (0x) |
| FC02 | Lectura de entradas discretas | Entradas discretas (1x) |
| FC03 | Lectura de registros de retención | Registros de retención (4x) |
| FC04 | Lectura de registros de entrada | Registros de entrada (3x) |
| FC05 | Escritura en una bobina | Bobinas (0x) |
| FC06 | Escritura en un solo registro | Registros de retención (4x) |
| FC15 | Escritura en varias bobinas | Bobinas (0x) |
| FC16 | Escritura en varios registros | Registros de retención (4x) |
Configuración de la asignación en Eziwan
Interfaz de configuración JSON
La asignación Modbus define cómo se recogen y se publican los registros del controlador:
{
"device": {
"name": "Compresseur_Atlas_GA75",
"description": "Compresseur d'air atelier principal",
"protocol": "modbus_rtu",
"connection": {
"port": "/dev/ttyS0",
"baudrate": 9600,
"parity": "N",
"databits": 8,
"stopbits": 1,
"slave_id": 1
}
},
"polling": {
"interval_ms": 5000,
"timeout_ms": 500,
"retry_count": 3,
"retry_delay_ms": 200
},
"registers": [
{
"name": "Pression_Service",
"address": "3x0001",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "bar",
"description": "Pression de service sortie compresseur",
"alarm_low": 6.0,
"alarm_high": 12.0,
"publish_on_change": true
},
{
"name": "Temperature_Huile",
"address": "3x0002",
"count": 1,
"type": "uint16",
"scale_factor": 0.1,
"unit": "°C",
"alarm_high": 95.0
},
{
"name": "Heures_Fonctionnement",
"address": "4x0010",
"count": 2,
"type": "uint32_ab",
"unit": "h",
"description": "Compteur d'heures moteur"
},
{
"name": "Debit_Air",
"address": "3x0005",
"count": 2,
"type": "float32_abcd",
"unit": "m³/h"
},
{
"name": "Alarme_Active",
"address": "1x0001",
"count": 1,
"type": "bool",
"description": "Au moins une alarme active"
},
{
"name": "Code_Alarme",
"address": "4x0020",
"count": 1,
"type": "uint16",
"description": "Code alarme (voir tableau constructeur)"
}
]
}
Ejemplo completo: 10 registros de temperatura, 5 registros de estado
A continuación se muestra un mapa típico para una línea de producción con 10 puntos de temperatura y 5 estados de la máquina:
{
"registers": [
{ "name": "Temp_Zone1", "address": "4x0001", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone2", "address": "4x0003", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone3", "address": "4x0005", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone4", "address": "4x0007", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone5", "address": "4x0009", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone6", "address": "4x0011", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone7", "address": "4x0013", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone8", "address": "4x0015", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone9", "address": "4x0017", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Temp_Zone10", "address": "4x0019", "count": 2, "type": "float32_abcd", "unit": "°C" },
{ "name": "Etat_EnMarche", "address": "1x0001", "count": 1, "type": "bool" },
{ "name": "Etat_EnChauffe", "address": "1x0002", "count": 1, "type": "bool" },
{ "name": "Etat_Production", "address": "1x0003", "count": 1, "type": "bool" },
{ "name": "Etat_Defaut", "address": "1x0004", "count": 1, "type": "bool" },
{ "name": "Etat_ArretUrgence", "address": "1x0005", "count": 1, "type": "bool" }
]
}
Tipos de datos compatibles con Eziwan
| Tipo JSON | Descripción | Tamaño (registros) | Ejemplo de valor |
|---|---|---|---|
uint16 | Entero sin signo de 16 bits | 1 | De 0 a 65 535 |
int16 | Entero con signo de 16 bits | 1 | -32768 a 32767 |
uint32_ab | Entero de 32 bits, big-endian | 2 | 0 a 4 294 967 295 |
uint32_ba | Entero de 32 bits, little-endian | 2 | — |
float32_abcd | Número real IEEE 754, ABCD | 2 | 23,456 |
float32_cdab | Número de coma flotante IEEE 754, CDAB (Schneider) | 2 | — |
float32_badc | Número de coma flotante IEEE 754, BADC | 2 | — |
float64_abcdefgh | Doble precisión | 4 | — |
bool | Booleano (entrada de bobina o discreta) | 1 | verdadero/falso |
Depuración de Modbus
Herramienta Modbus Poll (Windows)
Modbus Poll es la herramienta de referencia para probar y depurar las conexiones Modbus:
- Descargar en modbustools.com
- Versión de prueba gratuita (30 días)
- Configuración: Conexión → Conectar → Modbus TCP (IP + puerto 502) o serie (COM + velocidad de transmisión)
- Definir los registros que se van a leer: Configuración → Definición de lectura/escritura
Modbus Poll: configuración de lectura
─────────────────────────────────────
Slave ID: 1
Function: 03 Read Holding Registers
Address: 0 (= registre 40001)
Quantity: 10
Scan Rate: 1000 ms
Registros de Eziwan para la depuración de Modbus
En el portal Eziwan → Gateway → Registros → Modbus:
2026-06-04 14:32:00.123 [[INFO] Modbus RTU: solicitud FC03 esclavo=1, dirección=0, recuento=10
2026-06-04 14:32:00.145 [[INFO] Modbus RTU: respuesta recibida en 22 ms, 10 registros
2026-06-04 14:32:00.145 [DATA] Reg[0001]=0x4529 (23.4°C FLOAT32), Reg[0003]=0x42C6 (99.2 rpm)
2026-06-04 14:32:01.123 [[ADVERTENCIA] Modbus RTU: tiempo de espera agotado tras 500 ms, esclavo=2 (intento 1/3)
2026-06-04 14:32:01.623 [[WARN] Modbus RTU: tiempo de espera agotado tras 500 ms, esclavo=2 (intento 2/3)
2026-06-04 14:32:02.123 [[ERROR] Modbus RTU: esclavo 2 inaccesible tras 3 intentos
Activa el nivel de registro DEBUG para obtener las tramas hexadecimales sin procesar:
2026-06-04 14:32:00.100 [DEBUG] TX: 01 03 00 00 00 0A C5 CD
│ │ ├──────┤ ├──────┤ └── CRC16
│ │ addr=0 count=10
│ FC03
slave=1
2026-06-04 14:32:00.122 [DEBUG] RX: 01 03 14 45 29 ... (20 octets + 2 CRC)
Solución de problemas
Problema 1: Tiempo de espera de Modbus RTU
Síntomas: mensajes timeout, falta de respuesta del esclavo.
Causas y soluciones:
| Causa | Diagnóstico | Solución |
|---|---|---|
| ID de esclavo incorrecto | Probar manualmente los ID de esclavo del 1 al 10 | Consultar la documentación del equipo |
| Velocidad de transmisión incorrecta | — | Probar sucesivamente 9600, 19200 y 57600 |
| Cableado A/B invertido | Medir la tensión entre A y B: +1,5 V a 5 V = correcto | Invertir los cables A y B |
| Falta la resistencia de terminación | Medir R entre A y B con el sistema apagado: ~60 Ω si hay 2 resistencias | Añadir una resistencia de 120 Ω al final del bus |
| Cable demasiado largo | Calcular la longitud total | Reducir la velocidad de transmisión o añadir un repetidor |
| Falta la alimentación RS-485 | Medir la tensión de alimentación del esclavo | Comprobar los 24 V CC del esclavo |
Problema 2: Errores CRC
Síntomas: CRC error en los registros de Eziwan, datos incorrectos.
Causas:
- Interferencias electromagnéticas en el cable RS-485 (alejar el cable de los cables de alimentación)
- Cable sin blindaje (utilizar un cable blindado, con el blindaje conectado a tierra únicamente en el lado de la pasarela)
- Mala calidad del cable (utilizar un cable específico para RS-485, con una impedancia de 120 Ω)
- Velocidad de transmisión demasiado alta para la longitud del cable (reducir la velocidad de transmisión)
Problema 3: Conflicto de ID de esclavo
Síntomas: un esclavo responde en lugar de otro; datos mezclados.
Causa: dos esclavos tienen el mismo ID de esclavo en el mismo bus RS-485.
Solución:
- Desconectar todos los esclavos del bus excepto uno
- Escanear el bus con Modbus Poll para encontrar el ID de ese esclavo
- Cambiar el ID si hay un conflicto (a través de la interfaz de configuración del equipo)
- Volver a conectar los esclavos uno por uno
Problema 4: Registro ilegible (código de excepción 02)
Síntoma: Illegal Data Address (Exception Code 02).
Causa: la dirección solicitada no existe en el controlador o no es accesible a través de Modbus.
Soluciones:
- Consultar la documentación del fabricante para conocer las direcciones compatibles
- Algunos equipos solo exponen un rango limitado de registros
- En Siemens, comprobar que la zona de memoria se encuentre efectivamente en el bloque de datos expuesto a través de PUT/GET
Lista de comprobación para un diagnóstico rápido
□ Tensión de alimentación de 24 V CC presente en los bornes de alimentación de Eziwan
□ El LED RS-485 de Eziwan parpadea durante la transmisión (TX)
□ Cableado A/B: A = positivo, B = negativo (sin invertir)
□ Resistencias de 120 Ω únicamente en ambos extremos del bus
□ ID de esclavo correcto (compruébalo en la pantalla del equipo o en la documentación)
□ Velocidad de transmisión idéntica en la pasarela y el equipo
□ Paridad idéntica en la pasarela y el equipo (N, E u O)
□ Dirección IP y puerto 502 correctos para Modbus TCP
□ PUT/GET activado en S7-1500/1200 si es necesario
□ No hay ningún cortafuegos que bloquee el puerto 502 en la red local OT
Preguntas frecuentes
Modbus RTU o Modbus TCP: ¿cuál elegir?
RTU si tus equipos están conectados a un bus serie RS-485 (sensores, contadores, controladores antiguos); TCP si los equipos ya están conectados a Ethernet. La pasarela Eziwan gestiona ambos protocolos simultáneamente y actúa como puente entre RTU y TCP.
¿Qué funciones Modbus se utilizan para la supervisión?
Principalmente FC03 (lectura de registros de espera) y FC04 (registros de entrada) para la recopilación de datos; FC06/FC16 para la escritura de valores de consigna. Los códigos de excepción (02: dirección ilegal; 0B: destino inaccesible) sirven de guía para la resolución de problemas.
¿Cómo se lee un valor de 32 bits o un número de coma flotante?
En dos registros consecutivos, especificando el orden de las palabras (big/little endian, intercambio de palabras) en la configuración de la pasarela. Un mismo equipo puede combinar ambas convenciones: consulta la documentación del fabricante registro por registro.
¿Se puede transmitir Modbus a través de Internet?
Nunca en claro: el protocolo no cuenta con autenticación ni cifrado. La pasarela limita el Modbus a la red local y transporta los datos a la nube a través de un túnel VPN cifrado.
Recursos relacionados
- Modbus a la nube — la solución de recopilación
- Modbus RTU a la nube — el caso de los buses serie
- Modbus TCP a la nube — el caso de las redes Ethernet
- Modbus RTU frente a TCP — la comparación detallada
- RS485 / Modbus RTU — cableado y sondeo en detalle