Modbus es un protocolo de petición y respuesta para leer y escribir números en dispositivos de campo. Un cliente, como una pasarela, un PLC o un sistema SCADA, envía una petición a un único servidor, como un contador de energía. La petición indica una tabla, una dirección inicial y una cantidad, y el servidor responde con los valores o con un error. Modicon publicó Modbus en 1979 para sus PLC, y hoy la Modbus Organization mantiene las especificaciones y las ofrece gratis. Funciona sobre una línea serie como Modbus RTU y sobre Ethernet como Modbus TCP, y sigue siendo la forma más común de leer contadores, inversores, variadores y controladores de planta.
Cómo funciona Modbus de un vistazo
| Elemento | Qué es | Ejemplo |
|---|---|---|
| Cliente (maestro) | El dispositivo que envía todas las peticiones y sondea en bucle | Una pasarela, un PLC o un servidor SCADA |
| Servidor (esclavo) | El dispositivo que guarda los datos y responde cuando se le direcciona | Un contador de energía o un inversor |
| Dirección | A qué servidor va la petición | 1 a 247 en una línea serie; dirección IP e identificador de unidad en TCP |
| Código de función | Qué hace la petición | 04, leer registros de entrada |
| Dirección de datos y cantidad | Qué entradas de la tabla, y cuántas | Desde 0, leer 2 registros |
| Mapa de registros | La lista del fabricante que dice qué significa cada dirección | Registro de entrada 0: tensión L1, float de 32 bits, voltios |
| Comprobación de errores | La prueba de que la trama llegó intacta | Un CRC de 16 bits en RTU; las comprobaciones de TCP en Modbus TCP |
La especificación separa la unidad de datos de protocolo (PDU), que es el código de función y sus datos, de la unidad de datos de aplicación (ADU), que añade la dirección y la comprobación de errores de un medio de transporte. La PDU es la misma en todos los medios; por eso una pasarela puede pasar una petición de Modbus TCP a Modbus RTU sin cambiar su significado. La comparación entre Modbus TCP y RTU analiza los dos en detalle.
El modelo de datos Modbus: cuatro tablas
Un servidor Modbus expone cuatro tablas. Cada entrada tiene una dirección de 0 a 65.535, y cada tabla tiene sus propios códigos de función:
| Tabla | Tamaño de una entrada | Acceso | Lectura con | Escritura con |
|---|---|---|---|---|
| Bobinas (coils) | 1 bit | Lectura y escritura | 01 | 05, 15 |
| Entradas discretas | 1 bit | Solo lectura | 02 | Ninguna |
| Registros de entrada | 16 bits | Solo lectura | 04 | Ninguna |
| Registros de retención (holding) | 16 bits | Lectura y escritura | 03 | 06, 16 |
Un registro guarda una palabra de 16 bits. Lo que es mayor ocupa registros consecutivos: un float o un entero de 32 bits ocupa dos, un contador de energía de 64 bits ocupa cuatro. El protocolo no dice qué palabra va primero, y los fabricantes de contadores usan los dos órdenes. Además, los valores suelen ser enteros escalados, de modo que un registro que lee 2302 puede significar 230,2 V. La guía de mapas de registros explica cómo leer una fila del mapa, las convenciones 30001 y 40001 y el orden de las palabras.
La tabla la elige el fabricante. Muchos contadores ponen las mediciones en registros de entrada y la configuración en registros de retención. Otros lo ponen todo en registros de retención, así que la función 03 también lee las mediciones. La única guía fiable es el mapa de registros del modelo y el firmware exactos.
Códigos de función Modbus
El código de función es el primer byte de cada PDU. Estos son los que aparecen en contadores y controladores:
| Código | Nombre | Uso típico |
|---|---|---|
| 01 (0x01) | Leer bobinas | Estado de relés y salidas |
| 02 (0x02) | Leer entradas discretas | Estado de contactos y alarmas |
| 03 (0x03) | Leer registros de retención | Configuración, y mediciones en muchos contadores |
| 04 (0x04) | Leer registros de entrada | Mediciones en muchos contadores |
| 05 (0x05) | Escribir una bobina | Activar o desactivar un relé |
| 06 (0x06) | Escribir un registro | Cambiar una consigna |
| 15 (0x0F) | Escribir varias bobinas | Fijar varias salidas a la vez |
| 16 (0x10) | Escribir varios registros | Escribir una consigna de 32 bits o un bloque de configuración |
| 23 (0x17) | Leer/escribir varios registros | Escribir y releer en una transacción |
| 43/14 (0x2B/0x0E) | Leer la identificación del dispositivo | Fabricante, código de producto y versión del firmware |
Una lectura devuelve hasta 125 registros o 2000 bobinas, y una escritura lleva hasta 123 registros. Estos límites vienen de la PDU de 253 bytes. Leer un bloque de registros vecinos en una petición es mucho más rápido que leerlos de uno en uno, pero muchos contadores rechazan un bloque que cruza un hueco de su mapa.
Cuando un servidor recibe una trama válida que no puede ejecutar, responde con una excepción: el código de función con su bit más alto activado (0x83 para una función 03 fallida) y un código de excepción. La referencia de códigos de función y excepción los recoge todos.
| Excepción | Significado | Causa habitual en obra |
|---|---|---|
| 01 Función no válida | El servidor no admite este código de función | Función 03 enviada a un contador que usa la 04 |
| 02 Dirección de datos no válida | La dirección o el bloque está fuera del mapa | Una dirección desplazada en uno, o un bloque que cruza un hueco |
| 03 Valor de datos no válido | La cantidad o el valor no está permitido | Demasiados registros en una petición |
| 04 Fallo del dispositivo servidor | El servidor falló al ejecutar la petición | Una avería del dispositivo |
| 0A, 0B Fallo de ruta o destino de la pasarela | Una pasarela no pudo llegar al dispositivo serie | Identificador de unidad erróneo o bus serie caído |
No recibir respuesta es distinto de una excepción. Un tiempo de espera agotado significa que la petición nunca llegó al servidor o que la respuesta nunca volvió: cableado, parámetros serie, dirección o un problema de red. La guía de resolución de problemas Modbus recorre los dos casos.
Modbus RTU, ASCII y TCP
| Modbus RTU | Modbus ASCII | Modbus TCP | |
|---|---|---|---|
| Transporte | Línea serie, normalmente RS-485 | Línea serie | Ethernet o cualquier red IP |
| Codificación | Binaria | Caracteres hexadecimales | Binaria |
| Inicio y fin de trama | Silencio de 3,5 tiempos de carácter | Dos puntos y luego CR LF | Campo de longitud de la cabecera MBAP |
| Comprobación de errores | CRC-16 | LRC | Ninguna en Modbus; TCP y Ethernet comprueban los datos |
| Direccionamiento | Dirección de servidor 1 a 247 | Dirección de servidor 1 a 247 | Dirección IP más un identificador de unidad |
| Clientes | Uno por bus | Uno por bus | Varios, si el servidor los acepta |
| Ajustes por defecto | 19 200 baudios, paridad par, 1 bit de parada | 19 200 baudios, 7 bits de datos, paridad par | Puerto TCP 502 |
Modbus RTU es con diferencia el más común en contadores. Modbus ASCII es raro en equipos nuevos. Modbus TCP envuelve la misma PDU en una cabecera MBAP de 7 bytes: un identificador de transacción, un identificador de protocolo 0, una longitud y el identificador de unidad. En un dispositivo que está él mismo en Ethernet, el identificador de unidad suele ignorarse o fijarse en 1 o 255. En una pasarela de TCP a RTU, selecciona el dispositivo serie. La guía RS485 y Modbus explica por qué RTU y RS-485 son dos capas y no dos nombres de lo mismo.
Ejemplo práctico: leer la tensión de un contador
El mapa de registros del Eastron SDM630 sitúa la tensión de fase 2 a neutro en el registro de entrada 30003, como float de 32 bits en voltios. 30003 es el tercer registro de entrada, así que la petición lleva la dirección 2 y pide dos registros (un float). Para un contador con dirección 1, la petición Modbus RTU tiene ocho bytes:
| Byte | Valor | Significado |
|---|---|---|
| 1 | 01 | Dirección del servidor: 1 |
| 2 | 04 | Función 04, leer registros de entrada |
| 3 y 4 | 00 02 | Dirección inicial 2 (registro 30003) |
| 5 y 6 | 00 02 | Cantidad: 2 registros |
| 7 y 8 | D0 0B | CRC-16, byte bajo primero |
El contador responde 01 04 04 43 67 99 9A B5 E4: dirección 1, función 04, 4 bytes de datos, los dos registros 0x4367 y 0x999A y el CRC. Decodificado como float IEEE 754 con la palabra alta primero, 0x4367999A son 231,6 V. Puede comprobar el CRC de cualquier trama con la calculadora de CRC:
La misma lectura por Modbus TCP no lleva CRC. El cliente envía 00 01 00 00 00 06 01 04 00 02 00 02: transacción 1, protocolo 0, 6 bytes a continuación, identificador de unidad 1 y la misma PDU. El contador responde 00 01 00 00 00 07 01 04 04 43 67 99 9A: la misma transacción, 7 bytes a continuación (el identificador de unidad y la PDU de 6 bytes) y los mismos datos. Si el contador hubiera respondido 01 84 02, sería la excepción 02: la dirección no está en su mapa.
Lo que Modbus no hace
Modbus transporta números. No transporta:
- Unidades ni escalas. 2302 no significa nada sin el «V × 0,1» del mapa de registros.
- Marcas de tiempo. Una lectura tiene la antigüedad del sondeo que la trajo. El cliente tiene que anotar la hora a la que recibió cada valor.
- Calidad. Un contador que ha perdido su entrada de tensión puede devolver 0 V sin error. Algunos mapas ofrecen palabras de estado o valores de «no disponible» como 0xFFFF o NaN; el cliente tiene que comprobarlos.
- Eventos. Un servidor no puede enviar nada por su cuenta. Un cambio solo se ve en el siguiente sondeo, así que el intervalo de sondeo fija la latencia.
- Seguridad. Modbus básico no tiene inicio de sesión ni cifrado. Úselo solo en una red en la que todos los dispositivos conectados sean de confianza y sepárela del tráfico de oficina y de Internet.
Por estas carencias, una pasarela que lee Modbus suele añadir la hora, la unidad y un indicador de calidad antes de enviar la lectura, por ejemplo por MQTT u OPC UA. También explican por qué los mismos dispositivos aparecen a menudo en la comparación BACnet frente a Modbus: los objetos BACnet llevan unidades e indicadores de estado que los registros Modbus no tienen.
Sondeo y tiempos
En un bus serie solo puede haber una transacción en curso. A 9600 baudios cada carácter de 11 bits dura unos 1,15 ms. Una petición de 8 bytes y una respuesta de 40 registros de 85 bytes ocupan la línea unos 106,6 ms, y los dos silencios de 3,5 caracteres lo llevan a 114,6 ms. Con el tiempo de respuesta del contador, normalmente de 20 a 50 ms, cada transacción tarda de 135 a 165 ms. Diez contadores con tres bloques cada uno necesitan unos 4 a 5 segundos por ciclo. Velocidades más altas y menos bloques, pero más grandes, acortan el ciclo. La calculadora de tiempos RTU da las cifras para cualquier ajuste, y la guía de puesta en marcha calcula un presupuesto de sondeo para un bus real.
Modbus TCP es más rápido por transacción, pero una pasarela delante de un bus serie sigue enviando una petición cada vez por el lado serie. Varios clientes TCP que sondean la misma pasarela comparten su ciclo serie.
Modbus con EpiSensor
Edge, en la Gateway ZGW-20, es un cliente Modbus. Lee dispositivos Modbus TCP de la red del emplazamiento, y dispositivos Modbus RTU en la entrada RS-485 de la placa de E/S de la versión Industrial de la Gateway, o en un adaptador serie USB. Registra cada valor con su hora, su unidad y su estado, y puede ofrecer valores seleccionados a un BMS o un sistema SCADA como registros Modbus TCP. Cuando un contador está lejos de la Gateway, la interfaz Modbus ZMB lo lee en un bus RS-485 local corto y envía los registros por la red mallada Zigbee. El directorio de dispositivos recoge contadores y controladores con mapas de registros y plantillas de Edge, y la guía de pasarelas Modbus y BACnet compara la Gateway con los convertidores de protocolo.
Preguntas frecuentes
¿Para qué se usa Modbus?
Modbus conecta un controlador, una pasarela o un sistema SCADA con dispositivos de campo como contadores de energía, inversores, variadores, PLC y controladores de bombas de calor. El sistema que sondea lee de los registros del dispositivo valores como la tensión, la potencia y la energía total, y puede escribir consignas u órdenes cuando el dispositivo lo permite.
¿Modbus es un protocolo serie o Ethernet?
Las dos cosas. Modbus RTU y Modbus ASCII funcionan sobre una línea serie, normalmente RS-485. Modbus TCP funciona sobre redes Ethernet e IP en el puerto TCP 502. Los códigos de función y el modelo de datos son los mismos en los tres; solo cambian la trama y el direccionamiento.
¿Qué son los códigos de función Modbus?
El código de función es el byte que indica qué hace la petición. Los habituales son 01 leer bobinas, 02 leer entradas discretas, 03 leer registros de retención, 04 leer registros de entrada, 05 escribir una bobina, 06 escribir un registro, 15 escribir varias bobinas y 16 escribir varios registros. Un servidor que no puede atender la petición responde con el código de función más 0x80 y un código de excepción.
¿Qué diferencia hay entre maestro y esclavo Modbus?
Son los nombres antiguos de cliente y servidor. El maestro (cliente) envía todas las peticiones y el esclavo (servidor) solo responde. La Modbus Organization habla hoy de cliente y servidor, pero muchas hojas de datos y herramientas de configuración siguen diciendo maestro y esclavo.
¿Cuántos dispositivos puede haber en una red Modbus?
En una línea serie, un cliente puede direccionar los servidores 1 a 247. Un segmento RS-485 admite 32 cargas unitarias sin repetidor, o más con transceptores de carga fraccionaria. En Modbus TCP cada dispositivo tiene su propia dirección IP, y una pasarela puede llegar hasta 247 dispositivos serie detrás de una sola dirección IP mediante el identificador de unidad.
¿Es seguro Modbus?
Modbus básico no tiene autenticación ni cifrado: cualquier cliente que llegue a un dispositivo puede leerlo y, si el dispositivo admite escrituras, cambiarlo. Mantenga Modbus TCP en una red separada o detrás de una pasarela. La Modbus Organization publica también Modbus/TCP Security, que añade TLS en el puerto 802, aunque pocos dispositivos de campo lo admiten.