Modbus RTU, ASCII y TCP con SerialTool

Última actualización el por Oliver Reed

Qué es Modbus

El protocolo Modbus es un protocolo de comunicación serie creado en 1979 por Modicon® (empresa que hoy forma parte del grupo Schneider Electric) para permitir la comunicación entre sus controladores lógicos programables (PLC). Se ha convertido en un estándar de facto en las comunicaciones industriales y actualmente es uno de los protocolos de conexión más utilizados del mundo entre dispositivos electrónicos industriales. Modbus es un protocolo libre de regalías cuyas especificaciones se publican en el sitio web de The Modbus Organization.

En términos simples, es un método utilizado para transmitir información por líneas serie entre dispositivos electrónicos. El dispositivo que solicita la información se denomina Cliente Modbus, y los dispositivos que la proporcionan se denominan Servidores Modbus. En una red Modbus estándar hay un cliente y hasta 247 servidores, cada uno con una dirección de servidor única del 1 al 247. El cliente también puede escribir información en los servidores.


Originalmente pensado para uso industrial, con el tiempo este protocolo también se ha adoptado en otros sectores y se ha convertido en uno de los más extendidos. Incluso hoy, a pesar de tener más de 40 años, sigue estando presente en muchos dispositivos, como paneles de operador, PLC, sistemas domóticos e incluso dispositivos sencillos como Arduino.

Transmisión Modbus RTU y ASCII por serie

Cuando se creó el protocolo, la comunicación estaba pensada para funcionar a través de un puerto serie, y por esta razón se ha implementado en SerialTool. Modbus se utiliza a menudo para conectar un ordenador de supervisión con una unidad terminal remota (RTU) en sistemas SCADA (Supervisory Control and Data Acquisition). Según el formato utilizado para transmitir los datos, el protocolo se divide en:

  • MODBUS RTU - los datos se transmiten en formato hexadecimal.
  • MODBUS ASCII - los datos se transmiten en formato ASCII.

La verificación de errores difiere en ambos casos: en MODBUS RTU se utiliza un CRC (Cyclic Redundancy Check) añadido al final de los comandos, mientras que en MODBUS ASCII se utiliza un LRC (Longitudinal Redundancy Check), también enviado después de los comandos.

Transmisión Modbus TCP

En 1999 se desarrolló “Modbus TCP”, un estándar dedicado a redes que utilizan la suite de protocolos TCP/IP: en la práctica es una versión de Modbus basada en RTU serie construida sobre TCP/IP, lo que permite comunicaciones a través de redes Internet/intranet. En los últimos años la versión TCP/IP se ha utilizado cada vez más porque es Open Source, fácil de implementar, de bajo coste de desarrollo y requiere muy poco soporte hardware.

La verificación de errores difiere en ambos casos: en MODBUS RTU se utiliza un CRC (Cyclic Redundancy Check) añadido al final de los comandos, mientras que en MODBUS ASCII se utiliza un LRC (Longitudinal Redundancy Check), también enviado después de los comandos.

El protocolo Modbus TCP/IP utiliza codificación binaria de datos y el mecanismo de detección de errores de TCP/IP. A diferencia del Modbus serie, la versión TCP/IP está orientada a conexión y permite conexiones concurrentes al mismo esclavo o a varios dispositivos. Modbus TCP/IP también utiliza el paradigma maestro-esclavo; esta comunicación utiliza además cuatro tipos de mensaje.

Modbus se sitúa en el nivel 7 de la pila ISO/OSI (capa de aplicación), definiendo el formato de los mensajes, denominado framing, y el método de transmisión de datos y funciones de control. La comunicación se realiza mediante el paradigma cliente-servidor. El protocolo define una Protocol Data Unit (PDU) que no depende de la capa de comunicación subyacente. La Application Data Unit (ADU) introduce campos adicionales para direccionamiento y control de errores.

Cliente Modbus de SerialTool (Master / Polling)

SerialTool es un cliente Modbus RTU, ASCII y TCP con polling, escaneo de registros, monitorización de tráfico y gráficos en tiempo real para probar y depurar dispositivos industriales.

El Cliente Modbus permite conectarse a un dispositivo Modbus Slave/server a través de Serie (RTU o ASCII) o Red (TCP sobre IPv4 o IPv6), leer y escribir datos mediante las funciones estándar de Modbus y crear un dispositivo Modbus con su propio mapeo sobre el que se pueda ejecutar polling programado.
Dentro del dispositivo prototipo es posible añadir estructuras Modbus (Discrete Output Coils, Discrete Input Contacts, Analog Input Register, Analog Output Holding Register) y guardar el dispositivo para poder volver a cargarlo siempre que sea necesario. El dispositivo Modbus prototipo también puede exportarse en formato Texto, CSV o PDF para compartirlo de una forma simple e intuitiva.
Una vez creado un dispositivo con el mapeo correcto, es posible mostrar gráficos en tiempo real con los valores leídos directamente del dispositivo Slave mediante polling programado.
SerialTool también ofrece la posibilidad de visualizar el tráfico Modbus (Serie y TCP) en un terminal dedicado al tráfico generado y recibido. El terminal avanzado admite exportación de datos y filtrado en tiempo real de datos entrantes y salientes.
SerialTool también ofrece la posibilidad de escanear el dispositivo Slave remoto mediante la función Modbus Scanner. Configurando los filtros correctos, puede intentarse mapear el dispositivo remoto (Modbus Slave) incluso sin conocer los registros actualmente soportados. La función Modbus Scanner resulta especialmente útil cuando se desea explorar un dispositivo cuyas características son desconocidas o solo se conocen parcialmente.

A continuación se muestra la pantalla principal del módulo Modbus de SerialTool:

Modbus Client (Master/Polling) Main page

Pantalla principal del Cliente Modbus de SerialTool

La pantalla principal destaca las funciones clave de SerialTool y del Cliente Modbus (Master).

Cliente Modbus de SerialTool (Master / Polling)

En la parte izquierda de la pantalla puede elegirse el modo de conexión Serie o TCP:

Modbus Client Connection

Pantalla de conexión del Cliente Modbus

Como se indicó anteriormente, el protocolo Modbus serie se divide en dos tipos: RTU y ASCII. Para comunicarse correctamente con el dispositivo remoto, en caso de conexión serie es esencial saber qué tipo de protocolo Modbus admite nuestro dispositivo Slave.

La conexión ModBus TCP, por su parte, admite IPv4 e IPv6. Para configurar la conexión Modbus vía TCP, es necesario establecer la IP del esclavo y el puerto remoto al que conectarse.

En la pantalla de conexión hay dos parámetros para el tiempo de espera de la respuesta que debe proporcionar el dispositivo Modbus Slave.
Un tiempo de espera genérico de respuesta (Response Timeout), tras el cual el Cliente (Master) deja de esperar la respuesta del esclavo, y un tiempo de espera desde el último byte recibido del Slave.

Emulación Modbus ENRON/Daniel

Entre los parámetros de conexión se encuentra la emulación ENRON/Daniel (a menudo llamada simplemente Enron Modbus o Daniels Modbus), que hace referencia a una variante específica del protocolo estándar de comunicación Modbus.
Fue desarrollada originalmente por Enron Corporation e implantada ampliamente en los flow computers de Daniel Measurement and Control. Con el tiempo se convirtió en un estándar de facto para la medición electrónica de fluidos (EFM), especialmente en el sector Oil & Gas.

Activar la emulación ENRON/Daniel en un dispositivo modifica el comportamiento de Modbus para soportar las siguientes características clave:

  • 1. Gestión de datos de 32 bits en un único registro: Esta es la diferencia técnica más importante. En Standard Modbus, los registros son de 16 bits (2 bytes) y requieren leer dos registros para un valor de 32 bits. En Enron Modbus, los valores de 32 bits se mapean en un único registro (4 bytes por registro).
  • 2. Mapeo específico de direcciones: Utiliza rangos predefinidos para datos de 32 bits. La serie 5000 (por ejemplo 45001 - 45999) es para enteros largos, mientras que la serie 7000 (por ejemplo 47001 - 47999) es para coma flotante.
  • 3. Datos históricos y eventos: Soporta comandos especiales para extraer registros históricos y archivos de alarmas, a diferencia del Modbus estándar, pensado casi exclusivamente para lectura en tiempo real.
  • 4. Sin offset: La dirección solicitada coincide exactamente con el número de registro, eliminando el clásico “offset +1” típico del Modbus estándar.

En resumen: Esta emulación es esencial para evitar errores de comunicación (desalineación de bytes) al interactuar con dispositivos que transmiten datos nativos de 32 bits en el sector Oil & Gas.


Funciones del Cliente Modbus

En la parte central de la pantalla se encuentran las funciones Modbus compatibles con SerialTool.

Funciones del Cliente Modbus

Funciones compatibles con el modo Cliente Modbus

Las funciones del cliente ModBus pueden resumirse en la siguiente tabla.

Código de función Acción Nombre de tabla / Descripción
0x01 Leer Discrete Output Coils
0x02 Leer Discrete Input Contacts
0x03 Leer Analog Output Holding Register
0x04 Leer Analog Input Registers
0x05 Escritura simple Discrete Output Coil
0x06 Escritura simple Analog Output Holding Register
0x07 Leer Exception Status
0x08 Diagnóstico Diagnóstico (Serial Line only)
0x0B (dec 11) Leer Comm Event Counter (Serial Line only)
0x0F (dec 15) Escritura múltiple Discrete Output Coils
0x10 (dec 16) Escritura múltiple Analog Output Holding Registers
0x11 (dec 17) Informe Server ID (Serial Line only)
0x16 (dec 22) Escritura con máscara Holding Register
0x17 (dec 23) Lectura/Escritura múltiple Holding Registers
0x2B / 0x0E (dec 43 / 14) Leer Device Identification

Estructuras de datos Modbus

La información se almacena en el dispositivo Server en cuatro tablas diferentes. Dos tablas almacenan valores discretos on/off (coils) y dos almacenan valores numéricos (registers). Tanto coils como registers tienen una tabla de solo lectura y otra de lectura/escritura. Cada tabla tiene 9999 valores. Cada coil o contact es de 1 bit y tiene una dirección de datos comprendida entre 0000 y 270E. Cada register es 1 palabra = 16 bits = 2 bytes y también tiene una dirección de datos comprendida entre 0000 y 270E.

Números de coils/registers Direcciones de datos Tipo Nombre de tabla
1-9999 0x0000 to 0x270E Lectura/Escritura Discrete Output Coils
10001-19999 0x0000 to 0x270E Solo lectura Discrete Input Contacts
30001-39999 0x0000 to 0x270E Solo lectura Analog Input Register
40001-49999 0x0000 to 0x270E Lectura/Escritura Analog Output Holding Register

Dispositivo Modbus

SerialTool permite crear un dispositivo Modbus Slave que representa el mapeo de registros del dispositivo Slave al que se desea conectar. Este mapeo es muy importante porque permite visualizar en una tabla local los valores presentes en el dispositivo slave remoto.

Funciones del Cliente Modbus

Modbus Slave functions map

Funciones disponibles para el Cliente Modbus

Desde la barra de funciones es posible cargar un dispositivo creado previamente con la función "Load Device", guardar el dispositivo actual con "Save Device" y añadir registros individuales con "Add Item" o múltiples registros con "Add Items" al mapeo del dispositivo.

Add Multiple Modbus Registers

Añadir registros Modbus al mapeo del dispositivo Modbus


Dispositivo Modbus Slave Memory Mapping

Área de memoria del dispositivo Modbus Slave (dispositivo Modbus)

Una vez creado el mapeo del dispositivo Modbus Slave, SerialTool permite guardarlo para usos posteriores o exportar su contenido en formato CSV, Texto o PDF para compartirlo y procesarlo con terceros. La siguiente imagen muestra un ejemplo de exportación del mapeo de un dispositivo Modbus Slave:

Modbus Slave Mapping

Ejemplo de exportación en PDF del mapeo de un dispositivo Modbus Slave

Puede descargar el PDF desde este enlace.

Polling Modbus

Crear un dispositivo Modbus Slave permite realizar polling, es decir, la lectura programada de algunos registros del dispositivo slave al que se está conectado.
Para ello, primero debe crearse y mapearse el Slave, y añadir el registro o los registros sobre los que se desea realizar polling, como se muestra en la figura siguiente:

Modbus Master to Slave Polling

La imagen muestra cómo añadir un elemento al polling hacia el slave

Una vez añadidos uno o más elementos al polling, es posible iniciar el polling de los elementos vinculados a la lista de polling.

Modbus Master to Slave Polling Mask

La imagen muestra los elementos seleccionados para el polling

Acceso a las funciones Modbus

El cliente Modbus de SerialTool (Master/Polling) está diseñado para ejecutar funciones en tres modos:

Modbus execute function

Ejecución de funciones Modbus

  • "Execute from Device Table" - Ejecuta la función Modbus tomando como referencia el mapeo del dispositivo.
  • "Execute Function" - Ejecuta la función Modbus directa y muestra el resultado en la ventana de log.
  • "Send Raw Data" - Envía una solicitud directa formada por bytes hexadecimales y espera la respuesta.

Execute from Device Table

Este modo ejecuta la función Modbus seleccionada utilizando directamente la tabla del dispositivo cargada o creada localmente. El usuario puede seleccionar el tipo de referencia Modbus, como Coils, Discrete Inputs, Holding Registers o Input Registers, elegir la dirección inicial y el número de elementos que desea leer o escribir, y después enviar el comando al slave con un solo clic.
La principal ventaja de este modo es que el resultado se refleja inmediatamente en el mapa del dispositivo, actualizando los valores mostrados en la tabla local. De este modo es posible disponer de una representación ordenada y persistente del estado del dispositivo remoto, útil tanto durante las pruebas como durante las actividades de monitorización y mantenimiento.
Cuando el comando afecta a una función de escritura, SerialTool permite preparar fácilmente los datos que se van a transmitir eligiendo el tipo de dato, el formato de visualización y el contenido que se escribirá en los registros seleccionados. Por ello, este modo es especialmente adecuado cuando se desea trabajar directamente sobre la estructura lógica del dispositivo Modbus.

Execute Function

El modo Execute Function permite ejecutar una función Modbus seleccionándola directamente de la lista de códigos de función disponibles, como lectura de coils, lectura de discrete inputs, lectura de holding registers, lectura de input registers, escritura simple o múltiple y otras funciones compatibles con el protocolo.
En este caso, la operación no se limita únicamente a la visualización en el mapa del dispositivo, ya que el resultado se muestra en el área de log de la aplicación. Este enfoque resulta especialmente útil cuando se desea verificar rápidamente el contenido de la respuesta recibida, probar una función Modbus específica o realizar pruebas dirigidas sobre direcciones y cantidades variables sin modificar necesariamente el mapeo del dispositivo.
El modo Execute Function también es muy cómodo para la depuración, ya que permite ver inmediatamente el resultado del comando ejecutado, los posibles errores devueltos por el slave y la información asociada a la solicitud y la respuesta.

Send Raw Data

Esta función envía y recibe comandos arbitrarios enviados al slave en formato hexadecimal. Permite al usuario escribir manualmente la secuencia de bytes que se transmitirá por la conexión activa, como serie o TCP/IP, sin construcción automática del frame por parte del software.
Esta función resulta muy útil para pruebas avanzadas, reverse engineering, diagnóstico o validación de dispositivos Modbus y protocolos compatibles. En la práctica, el cliente transmite exactamente los bytes introducidos por el usuario, dejando un control total sobre el contenido del paquete. Esto permite simular solicitudes personalizadas, probar respuestas anómalas o enviar frames completos preparados manualmente.
Activando la opción de esperar la respuesta, SerialTool también puede adquirir el frame de retorno recibido del slave y mostrarlo en el log de tráfico, permitiendo así una comparación inmediata entre los datos transmitidos y los recibidos.

Modbus Raw Data

Envío de datos Raw

Función Modbus Scanner

SerialTool incluye una función de escaneo de las direcciones Modbus del dispositivo Slave conectado. Esta función permite explorar rápidamente un rango de direcciones desde una dirección inicial hasta una dirección final, especificando también el código de función que se utilizará durante el escaneo.
El escáner resulta especialmente útil cuando no se conoce con precisión el mapa completo del dispositivo remoto o cuando se desea verificar qué direcciones son válidas y cuáles contienen datos significativos. Para cada dirección consultada, SerialTool muestra en la tabla el tipo de función utilizada, la dirección, el valor leído y el resultado de la operación.
Este modo acelera significativamente las actividades de diagnóstico e integración con dispositivos de terceros, ya que permite identificar rápidamente las áreas de la memoria Modbus realmente utilizadas por el slave y exportar los resultados del escaneo para análisis posteriores o para compartirlos.

Modbus Slave Scanner

Tabla de direcciones

Gráfico de los registros Modbus del Slave

Los valores de los registros Modbus pueden visualizarse en un gráfico. Esta función permite vincular uno o más elementos del mapeo del dispositivo a una ventana de gráfico dedicada, donde los valores se representan a lo largo del tiempo durante el polling o durante las operaciones de actualización.
Cada registro vinculado al gráfico puede mostrarse con su propia traza, identificada por un color específico y por información como la referencia Modbus, la dirección, el valor actual y el nombre asignado al elemento. De este modo es posible observar fácilmente la evolución temporal de variables analógicas, consignas, medidas o registros numéricos que cambian durante el funcionamiento del dispositivo.
La función de gráfico resulta especialmente útil para tareas de monitorización, pruebas y análisis dinámico, ya que permite ver inmediatamente cómo evolucionan los datos en el tiempo sin limitarse únicamente a la lectura tabular.

Modbus Client/Slave Chart

Gráfico de registros Modbus

Log de tráfico Modbus

Todos los comandos enviados y recibidos se muestran en la ventana de log del tráfico Modbus en bytes. El log de tráfico es una herramienta fundamental para la depuración de la comunicación, ya que permite visualizar con detalle los datos transmitidos por el cliente y los datos recibidos del dispositivo slave, mostrando las secuencias de bytes de forma legible.
Gracias a esta ventana, es posible comprobar el contenido real de los frames, verificar que los comandos generados sean correctos y diagnosticar posibles problemas de timeout, respuestas anómalas, excepciones Modbus o datos inesperados. El tráfico puede consultarse durante el uso normal del cliente, durante el polling automático o durante el envío de datos raw.
La ventana de tráfico también ofrece funciones avanzadas como copiar datos en formato ASCII o hexadecimal, guardar en archivo, buscar dentro del contenido, seleccionar líneas y opciones de personalización gráfica como colores, fuentes, espaciado y ajustes de visualización. Esto convierte el log de tráfico no solo en un simple visor, sino también en una herramienta operativa muy útil para desarrolladores, técnicos e integradores.

Modbus Client/Slave Traffic

Tráfico Modbus