Arduino - Modbus
En este tutorial, vamos a aprender:
- ¿Qué es Modbus?
- ¿Por qué se necesita Modbus?
- ¿Cuáles son las alternativas a Modbus?
- ¿Cómo funciona Modbus?
- Modbus RTU/ASCII y Modbus TCP
- ¿Cómo usar la biblioteca Modbus de Arduino?
¿Qué es Modbus?
Modbus es un protocolo que se utiliza para comunicar entre dispositivos, entre un dispositivo y software/aplicación, y entre dispositivos y la HMI. Se utiliza ampliamente en áreas industriales para controlar y monitorear dispositivos.
En una palabra, Modbus es un lenguaje que un dispositivo utiliza para comunicarse con otros dispositivos, software/aplicaciones y dispositivos HMI.
Este tutorial trata sobre Arduino, así que Arduino representa para el dispositivo. Al usar Modbus, podemos hacer:
- Dos Arduinos se comunican entre sí para controlar/monitorear la salida/entrada
- El Arduino se comunica con el software en la PC o con la app en el teléfono inteligente
- El Arduino se comunica con un dispositivo HMI
Por ejemplo, Arduino #1 con 4 interruptores controla Arduino #2 con 4 bombillas a larga distancia.
¿Por qué necesita Modbus?
¿Existen alternativas a Modbus? Si las hay, ¿cuándo se debe usar Modbus? ¿Cuándo se deben usar las alternativas?
Para responder a estas preguntas, consideremos un caso: un interruptor conectado a Arduino #1 controla un LED conectado a Arduino #2 a larga distancia.

La forma alternativa más simple de Modbus es definir un protocolo simple por nosotros mismos:
- Arduino #1:
- Cuando el interruptor se cambie a ENCENDIDO, Arduino #1 envía un byte (comando) con valor 1 a Arduino #2.
- Cuando el interruptor se cambie a APAGADO, Arduino #1 envía un byte (comando) con valor 0 a Arduino #2.
- Arduino #2:
- Si el byte recibido es 1, Encender el LED
- Si el byte recibido es 0, Apagar el LED
- Arduino #1 quiere saber si Arduino #2 ejecuta el comando con éxito.
- Arduino #1 quiere verificar el estado del LED en Arduino #2.
- Arduino #1 con múltiples interruptores quiere controlar múltiples LEDs en Arduino #2.
- Arduino #1 quiere usar un interruptor para controlar un LED en Arduino #2 y Arduino #2 también quiere usar un interruptor para controlar un LED en Arduino #1.
- Y más casos de uso.
- NO necesitamos definir los comandos; Modbus los ha definido para cada caso. Solo necesitamos implementarlos.
- Nuestro dispositivo puede funcionar con otros dispositivos o software que soporten Modbus sin colaborar con el creador del dispositivo o del software.
El protocolo anterior está definido por nosotros mismos, no es un protocolo estándar. Necesitamos definir más si:
No es fácil definir todos los comandos por nosotros mismos. El problema se complica aún más cuando combinamos los requisitos anteriores. Y tampoco podemos garantizar que esté libre de errores.
Otro problema surge al definir el protocolo por nosotros mismos. Si queremos que nuestro Arduino funcione con otro Arduino que utilice un protocolo definido por otra persona, es imposible a menos que trabajemos juntos y compartamos el protocolo que hemos definido.
Estas son las razones por las que necesitamos el protocolo Modbus. Si usamos el protocolo Modbus:
Si usamos el protocolo Modbus para Arduino, podemos usar muchos programas o aplicaciones gratuitas para controlar y monitorizar nuestro Arduino.
Cuándo usar y NO usar Modbus
El protocolo Modbus no es fácil de entender ni de implementar para los principiantes, incluso cuando la biblioteca Modbus está disponible. Por lo tanto, es aceptable usar un protocolo simple autodefinido, como se describe arriba, si:
- El sistema es sencillo, por ejemplo, varios interruptores en Arduino #1 controlan varios LEDs en Arduino #2
- Arduino no necesita funcionar con otros dispositivos o software de otros creadores
Debemos usar Modbus cuando:
- El sistema es complicado
- El sistema requirió una alta fiabilidad
- Arduino necesita trabajar con otros dispositivos y software de otros creadores
※ Nota:
Existen otros protocolos estándar y protocolos no estándar que son alternativas a Modbus. Están fuera del alcance de este tutorial.
Cómo funciona el protocolo Modbus
Como se mencionó anteriormente, un Arduino puede comunicarse con software o una aplicación, un dispositivo HMI o con otro Arduino mediante el protocolo Modbus. Este tutorial toma la comunicación entre dos Arduinos como ejemplo de la comunicación Modbus. Los demás son iguales.
Conceptos
Hay algunos conceptos en Modbus:
- Maestro y Esclavo
- Solicitud y Respuesta
- Código de función (FC) y Dirección
El protocolo Modbus funciona en el modelo Maestro-Esclavo. Entre dos Arduino, uno DEBE funcionar como Maestro, y el otro funciona como Esclavo.
Maestro envía una solicitud, y el Esclavo envía una respuesta.

Una solicitud enviada por Master contiene básicamente la siguiente información:
- Código de Función (FC): 1 byte, es el comando que indica al Esclavo qué hacer. Por ejemplo, lee el estado de un pin de entrada digital, de un pin de salida digital o de un pin de entrada analógica, y controla un pin de salida digital.
- Dirección: 2 bytes, se usa para identificar el pin. A cada pin de entrada digital, pin de salida digital y pin de entrada analógica se le asigna una dirección.
- Datos (p. ej. valor de control)
Una vez que se recibe una solicitud, el esclavo toma la acción correspondiente y envía de vuelta una respuesta que contiene el resultado de la acción o la información que maestro solicitó.
Código de Función
El Código de Función fue definido por la norma Modbus. Existen muchos Códigos de Función. A continuación, veamos algunos Códigos de Función básicos:
- FC 01 (Leer Bobinas): es un comando utilizado para leer el estado de una o varias salidas digitales
- FC 05 (Escribir una Bobina Única): es un comando utilizado para controlar (escribir) el estado de una o varias salidas digitales
- FC 02 (Leer Entradas Discretas): es un comando utilizado para leer el estado de una o varias entradas digitales
"FC 01" significa que el valor del Código de Función es 0x01.
Hay más códigos de función. Con el fin de evitar sobrecargar a los novatos, este tutorial solo presenta algunos códigos de función esenciales.
Al usar la biblioteca Modbus de Arduino, debes:
- Decide cuál Código de Función usar
- Proporciona direcciones para cada pin de Arduino (solo los pines que utilices)
Las instrucciones detalladas para usar la biblioteca Modbus se presentarán en el próximo tutorial; dale Me gusta a nuestra página de Facebook para recibir la notificación del nuevo tutorial.
Arduino Maestro puede leer el estado de su pin de entrada digital, y luego controlar el estado de la salida digital de Arduino Esclavo, y viceversa
Por ejemplo:
- Arduino Maestro está conectado al LED #M, interruptor #M
- Arduino Esclavo está conectado al LED #S, interruptor #S
- Hagamos que el interruptor #M controle el LED #S, y que el interruptor #S controle el LED #M

Solución:
- Maestro lee el estado del interruptor #M → envía una solicitud al Esclavo para controlar el LED #S de acuerdo con el estado del interruptor #M → Esclavo controla LED #S y envía la respuesta
- Maestro envía una solicitud al Esclavo para leer el estado del interruptor #S → Esclavo responde con el estado del interruptor #S → Maestro controla el LED #M según el estado del interruptor #S
※ Nota:
- En lo anterior, usamos los términos 'pin de entrada digital' y 'pin de salida digital' para facilitarlo a los principiantes. De hecho, 'pin de entrada digital' representa el estado de cualquier dispositivo que sea de solo lectura, 'pin de salida digital' representa el estado de cualquier dispositivo que sea de lectura/escritura
- Modbus puede soportar múltiples maestros y múltiples esclavos
- Modbus puede usarse no solo para la entrada/salida digital, sino también para la entrada/salida analógica
Modbus RTU/ASCII y Modbus TCP
Existen tres tipos populares de Modbus: Modbus RTU, Modbus ASCII y Modbus TCP. Los principios de funcionamiento son los mismos para todos los tipos de Modbus, como se describió anteriormente. Cada tipo de Modbus está diseñado para adaptarse al entorno de red: serie o TCP.
- Diagrama del sistema

- Pila de protocolos

Diferencias entre Modbus RTU/ASCII y Modbus TCP
| Modbus RTU/ASCII | Modbus TCP |
|---|---|
| Over serial (RS-232/RS-422/RS-485) | Over TCP |
| Support single transaction(*) | Support multiple transactions(**) |
- (*): Modbus RTU/ASCII admite una única transacción. Significa que cuando un Maestro envía una solicitud Modbus, DEBE esperar una respuesta de Modbus o un tiempo de espera antes de enviar otra solicitud.
- (): Modbus TCP admite múltiples transacciones. Significa que cuando un Maestro envía una solicitud Modbus, no es necesario esperar una respuesta de Modbus. Puede enviar múltiples solicitudes de forma continua. Para identificar una respuesta que corresponde a una solicitud, Modbus TCP tiene un campo adicional, llamado "ID de Transacción". La solicitud y la correspondiente respuesta tienen el mismo ID de Transacción.
Cómo usar la biblioteca Modbus de Arduino
Gracias a Modbus library, usar Modbus con Arduino se simplifica.
Vamos a hacer un tutorial sobre cómo usar la biblioteca Modbus. Dale me gusta a nuestra página de Facebook para recibir la notificación del nuevo tutorial.