How do I use Modbus equipment with my Arduino?

Arduino y Modbus: Conectando tu Proyecto al Mundo Industrial

16/05/2025

Valoración: 4.51 (16776 votos)

La automatización industrial y la domótica moderna dependen en gran medida de protocolos de comunicación robustos y eficientes. Entre ellos, Modbus se ha consolidado como uno de los más populares debido a su simplicidad y fiabilidad. Si eres un entusiasta de Arduino y buscas expandir las capacidades de tus proyectos para interactuar con sistemas más complejos o entornos industriales, entender y aplicar el protocolo Modbus es un paso fundamental. Este artículo te guiará a través de los conceptos esenciales y te mostrará cómo puedes hacer que tu Arduino se comunique utilizando Modbus, ya sea a través de conexiones seriales RS-485 o mediante redes Ethernet y WiFi con TCP/IP.

How do I use Modbus equipment with my Arduino?
Use Modbus equipment with your Arduino. Using TCP or RS485 shields, like the MKR 485 Shield. This library depends on the ArduinoRS485 library. This library implements the Modbus protocol over two different types of transport: serial communication over RS485 with RTU (Remote Terminal Unit) or Ethernet and WiFi communication with TCP protocol.
Índice de Contenido

¿Qué es Modbus y por qué es relevante para Arduino?

Modbus es un protocolo de comunicación de tipo maestro-esclavo (o cliente-servidor en Modbus TCP) ampliamente utilizado en la automatización industrial para la transmisión de datos entre dispositivos. Su popularidad radica en su sencillez, su carácter de código abierto y su eficiencia. Si bien nació en el ámbito industrial, su flexibilidad lo ha llevado a ser adoptado en otras áreas, como la automatización del hogar (domótica), el control de edificios e incluso sistemas de energía renovable.

El protocolo Modbus opera sobre diferentes capas físicas, lo que lo hace muy versátil. Las más comunes son:

  • Modbus Serial: Utiliza puertos serie como RS-232 o, más comúnmente, RS-485. RS-485 es ideal para largas distancias y entornos ruidosos, permitiendo la conexión de múltiples dispositivos en un bus.
  • Modbus IP (o Modbus TCP): Opera sobre redes Ethernet o WiFi, utilizando el protocolo TCP/IP, generalmente en el puerto 502. Esto permite la comunicación a través de redes locales o incluso internet.

La relevancia de Modbus para Arduino es enorme. Las placas Arduino, con su bajo costo y facilidad de uso, son plataformas excelentes para prototipar y desarrollar soluciones de automatización. Al integrar Modbus, un Arduino puede actuar como un esclavo (o servidor) en una red Modbus, permitiendo que un sistema maestro (como un PLC, un SCADA o incluso otro Arduino) lea datos de sus sensores, controle sus actuadores o configure sus parámetros. Esto abre la puerta a la interconexión de tus proyectos Arduino con sistemas industriales existentes o a la creación de soluciones de automatización doméstica más sofisticadas y estandarizadas.

Conceptos Clave del Protocolo Modbus: El Lenguaje de los Registros

Para entender cómo Modbus funciona con Arduino, es crucial familiarizarse con su terminología específica, especialmente con los tipos de registros que maneja. Modbus organiza los datos en diferentes categorías, cada una con un propósito y un tipo de acceso particular. La librería Modbus-Arduino de Andrés Sarmento, en la que nos centraremos, utiliza esta terminología directamente en sus métodos.

A continuación, presentamos una tabla que resume los principales tipos de registros Modbus:

Tipo de Registro ModbusUso TípicoAccesoMétodos de la Librería (Ejemplos)
Coil (Bobina)Salida Digital (ej. encender/apagar una lámpara, un LED)Lectura/EscrituraaddCoil(), Coil()
Holding Register (Registro de Retención)Salida Analógica o Valor de Retención (ej. controlar brillo de un LED, posición de un servomotor, un contador)Lectura/EscrituraaddHreg(), Hreg()
Input Status (Estado de Entrada)Entrada Digital (ej. estado de un interruptor, sensor de puerta)Solo LecturaaddIsts(), Ists()
Input Register (Registro de Entrada)Entrada Analógica (ej. lectura de un sensor de temperatura, humedad)Solo LecturaaddIreg(), Ireg()

Es importante destacar que los "Input Status" a veces también se denominan "Discrete Inputs". Los "Holding Registers" son quizás los más versátiles, ya que se utilizan para almacenar valores que pueden ser modificados por el maestro o por el propio esclavo. Cada uno de estos registros tiene una "dirección" u "offset" que lo identifica dentro del dispositivo esclavo, y que el maestro usará para solicitar o escribir datos. Un detalle crucial es que los offsets suelen ser 0-based, es decir, el primer registro es el 0, el segundo el 1, y así sucesivamente. Sin embargo, algunos sistemas supervisores o software de prueba pueden usar offsets 1-based, lo que significa que un registro configurado como 100 en la librería podría ser 101 en ese software. Este es un punto a verificar cuidadosamente al configurar tu sistema.

Preparando tu Arduino para Modbus: Hardware y Librerías

Para que tu Arduino se comunique vía Modbus, necesitarás hardware adicional dependiendo del tipo de comunicación (serial o IP) y una librería de software que implemente el protocolo.

Are Arduino boards Modbus compatible?
A lot of Arduino boards are Modbus compatible especially if you consider Ethernet-type messages. In case you want to communicate via RS-485, MKR 485 Shields will help you convert any MKR board into a Modbus compatible device. Check out this tutorial to learn more about sending data between two MKR 485 Shields.

Hardware Necesario: Shields para la Comunicación Física

  • Para Modbus Serial (RS-485): Necesitarás un convertidor TTL a RS-485 o un shield RS-485. Por ejemplo, el MKR 485 Shield es excelente para las placas Arduino MKR, ya que proporciona la interfaz necesaria para RS-485. Este shield convierte las señales TTL del Arduino a las señales diferenciales de RS-485, permitiendo una comunicación robusta en largas distancias y entornos con ruido eléctrico.
  • Para Modbus IP (TCP/Ethernet/WiFi): Necesitarás un shield Ethernet (como el basado en WIZnet W5100), un módulo Ethernet con chip ENC28J60, o un módulo WiFi como el ESP8266. Estos dispositivos permiten que tu Arduino se conecte a una red IP y envíe/reciba paquetes TCP.

La Librería `andresarmento/Modbus-Arduino`

Esta es una de las librerías más completas y versátiles para implementar Modbus en Arduino, y es la base de la información proporcionada. Permite que tu Arduino opere como un esclavo Modbus y soporta tanto Modbus Serial como Modbus sobre IP. Sus características principales incluyen:

  • Soporte para Modbus Serial (RS-232 o RS-485) y Modbus IP (TCP).
  • Implementación de varias funciones Modbus estándar para lectura y escritura de diferentes tipos de registros (Coils, Holding Registers, Input Status, Input Registers).
  • Capacidad para responder con mensajes de excepción en caso de errores.
  • Flexibilidad para elegir entre Hardware Serial o Software Serial para Modbus Serial.
  • Opciones para optimizar el uso de memoria (ej. limitar a funciones de Holding Registers).

La librería se estructura en varias clases que corresponden a las diferentes capas físicas de Modbus:

  • Modbus: La librería base que define el protocolo.
  • ModbusSerial: Para comunicación Modbus sobre RS-232 o RS-485.
  • ModbusIP: Para Modbus TCP usando el shield Ethernet estándar (WIZnet W5100).
  • ModbusIP_ENC28J60: Para Modbus TCP usando el chip ENC28J60.
  • ModbusIP_ESP8266AT: Para Modbus IP usando un módulo ESP8266 con firmware AT.

Implementación de Modbus Serial (RS-485) con Arduino

La comunicación Modbus Serial, especialmente a través de RS-485, es fundamental en muchos entornos industriales por su robustez y capacidad de operar en distancias considerables. Para implementar esto con tu Arduino, sigue estos pasos:

1. Conexión del Hardware

Conecta tu shield RS-485 (o módulo convertidor TTL a RS-485) a tu Arduino. Asegúrate de conectar los pines de datos (A/B o DATA+/DATA-) correctamente a tu bus RS-485. Si tu shield requiere un pin para control de Transmisión/Recepción (TX/RX), tenlo en cuenta.

2. Inclusión de Librerías

En tu sketch de Arduino, necesitarás incluir las librerías Modbus.h y ModbusSerial.h. Si usas Software Serial para la comunicación con el módulo RS-485, también deberás incluir SoftwareSerial.h.

#include <Modbus.h> #include <ModbusSerial.h> // #include <SoftwareSerial.h> // Solo si usas SoftwareSerial 

3. Configuración de la Instancia ModbusSerial

Crea una instancia de ModbusSerial y configúrala en la función setup(). Aquí definirás el puerto serial a usar, la velocidad de baudios y el ID del esclavo Modbus.

ModbusSerial mb; void setup() { // Para Hardware Serial (ej. Serial de Arduino UNO/Nano) mb.config(&Serial, 38400, SERIAL_8N1); // Puerto, Baudios, Formato (8N1 es estándar) // Si usas RS-485 con un pin de control TX/RX (ej. pin 2) // mb.config(&Serial, 38400, SERIAL_8N1, 2); // Para Software Serial (ej. pines 2 y 3) // SoftwareSerial myserial(2, 3); // mb.config(&myserial, 38400); // Puerto, Baudios // Si usas RS-485 con un pin de control TX/RX (ej. pin 4) // mb.config(&myserial, 38400, 4); mb.setSlaveId(10); // Asigna el ID del esclavo Modbus (debe ser único en la red) // Añadir registros Modbus (ejemplo: un Coil para un LED) mb.addCoil(100); // Añade un Coil en el offset 100 (valor inicial por defecto: false) // mb.addCoil(100, true); // También puedes establecer un valor inicial } 

4. Procesamiento de Tareas Modbus en el Loop

Dentro de la función loop(), debes llamar al método mb.task(). Esta función es la que realiza toda la "magia" del protocolo: escucha las peticiones del maestro, las procesa, actualiza los registros si es necesario y envía las respuestas. Debe ser llamada una única vez en cada iteración del loop.

void loop() { mb.task(); // Procesar comunicaciones Modbus // Usar el valor del Coil para controlar un LED // digitalWrite(ledPin, mb.Coil(100)); } 

Este es el esquema básico. La librería proporciona métodos como addHreg(), addIsts(), addIreg() para añadir otros tipos de registros, y Coil(), Hreg(), Ists(), Ireg() para leer o escribir sus valores.

What is Modbus & how does it work?
Allows your Arduino to communicate via Modbus protocol The Modbus is a master-slave protocol used in industrial automation and can be used in other areas, such as home automation. The Modbus generally uses serial RS-232 or RS-485 as physical layer (then called Modbus Serial) and TCP/IP via Ethernet or WiFi (Modbus TCP).

Implementación de Modbus IP (TCP/Ethernet/WiFi) con Arduino

La comunicación Modbus IP es ideal para integrar tu Arduino en redes existentes o para aplicaciones donde la velocidad y la conectividad de red son prioritarias. La implementación varía ligeramente dependiendo del hardware de red que utilices.

1. Conexión del Hardware de Red

  • Shield Ethernet estándar (WIZnet W5100): Conecta el shield a tu Arduino.
  • Módulo ENC28J60: Conéctalo a tu Arduino (generalmente pines 10, 11, 12, 13 para SPI).
  • Módulo ESP8266 (con firmware AT): Conéctalo vía serial a tu Arduino. Asegúrate de que el ESP8266 esté configurado con un firmware AT compatible y que reciba 3.3V para su alimentación.

2. Inclusión de Librerías Específicas

Las librerías a incluir varían según el chip Ethernet/WiFi:

  • Para WIZnet W5100:
    #include <SPI.h> #include <Ethernet.h> #include <Modbus.h> #include <ModbusIP.h> 
  • Para ENC28J60 (usando EtherCard):
    #include <EtherCard.h> #include <Modbus.h> #include <ModbusIP_ENC28J60.h> 

    Nota: EtherCard es más eficiente en memoria que UIPEthernet para ENC28J60.

  • Para ESP8266 (con firmware AT):
    #include <ESP8266.h> #include <Modbus.h> #include <ModbusIP_ESP8266AT.h> // #include <SoftwareSerial.h> // Solo si usas SoftwareSerial para ESP8266 

3. Configuración de la Instancia ModbusIP

Crea una instancia de ModbusIP y configura la red en setup():

ModbusIP mb; void setup() { // Para WIZnet W5100 byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; IPAddress ip(192, 168, 1, 120); // Dirección IP estática para el Arduino mb.config(mac, ip); // También puedes usar DHCP omitiendo la IP o configurando más parámetros // Para ESP8266 (ej. usando SoftwareSerial en pines 2 y 3) // SoftwareSerial wifiSerial(2, 3); // ESP8266 wifi(wifiSerial, 9600); // Configura baudios (9600 recomendado para SoftwareSerial) // mb.config(wifi, "tu_ssid", "tu_contraseña"); // Conecta a la red WiFi // Opcional: Configurar IP estática para ESP8266 (después de mb.config) // delay(1000); // wifiSerial.println("AT+CIPSTA=\"192.168.1.44\""); // Añadir registros Modbus (ejemplo: un Input Status para un interruptor) mb.addIsts(100); // Añade un Input Status en el offset 100 } 

4. Procesamiento de Tareas Modbus en el Loop

Al igual que con Modbus Serial, la función mb.task() es esencial en el loop() para que el Arduino procese las peticiones Modbus TCP.

void loop() { mb.task(); // Procesar comunicaciones Modbus IP // Actualizar el valor del Input Status con el estado de un interruptor // mb.Ists(100, digitalRead(switchPin)); } 

Consideraciones Importantes y Optimización

  • Offsets de Registros: Siempre verifica si tu sistema maestro (SCADA, HMI, software de prueba) usa offsets 0-based o 1-based para tus registros Modbus. Esto es una fuente común de errores.
  • Modbus TCP Keep-Alive: Por defecto, Modbus IP en esta librería cierra la conexión TCP después de cada mensaje. Si tu aplicación requiere una conexión persistente (keep-alive), puedes habilitarla descomentando #define TCP_KEEP_ALIVE en el archivo de cabecera de la librería (ej. ModbusIP.h).
  • Optimización de Memoria: Si tu Arduino tiene poca memoria de programa (flash), puedes limitar las funciones Modbus soportadas a solo las de "Holding Registers" (0x03, 0x06, 0x10) descomentando #define USE_HOLDING_REGISTERS_ONLY en Modbus.h. Esto puede ahorrar espacio valioso.
  • Elección de Serial: Para Modbus Serial, puedes elegir entre Hardware Serial (más eficiente) o Software Serial (útil si necesitas el Hardware Serial para depuración o para otro propósito). La configuración se realiza en ModbusSerial.h.
  • Pruebas: Utiliza software de prueba Modbus como Modbus Poll (Windows) o mbpoll (Linux) para verificar la comunicación con tu Arduino. Esto te permitirá leer y escribir los registros y depurar tu código.

Preguntas Frecuentes sobre Modbus y Arduino

¿Es compatible mi Arduino con Modbus?

Sí, la mayoría de las placas Arduino son compatibles con Modbus. La compatibilidad no es inherente a la placa, sino que se logra mediante la adición de hardware (shields o módulos) para la capa física (RS-485, Ethernet, WiFi) y el uso de librerías de software que implementan el protocolo Modbus.

¿Necesito hardware adicional para usar Modbus?

Absolutamente. Para Modbus Serial (RTU), necesitarás un convertidor TTL a RS-485 o un shield RS-485 (como el MKR 485 Shield). Para Modbus IP (TCP), necesitarás un shield Ethernet (W5100, ENC28J60) o un módulo WiFi (ESP8266).

What is GitHub - andresarmento/Modbus-Arduino?
GitHub - andresarmento/modbus-arduino: A library that allows your Arduino to communicate via Modbus protocol, acting as a slave (master in development). Supports serial (RS-232, RS-485) and IP via Ethernet (Modbus IP). Cannot retrieve latest commit at this time. This library allows your Arduino to communicate via Modbus protocol.

¿Qué es un "Coil" y un "Holding Register" en Modbus?

En el contexto de Modbus, un "Coil" es un registro digital de lectura/escritura (similar a un bit) que se usa típicamente para controlar salidas binarias (encender/apagar). Un "Holding Register" es un registro de 16 bits de lectura/escritura que se usa para almacenar valores numéricos, como configuraciones, contadores o valores de salida analógicos. Ambos son fundamentales para la interacción con dispositivos Modbus.

¿Puedo usar Modbus para automatización doméstica?

Sí, aunque Modbus es un protocolo industrial, su simplicidad y disponibilidad de librerías lo hacen viable para proyectos de domótica. Puedes usarlo para controlar luces, sensores de temperatura, actuadores, etc., y luego integrar tu sistema Arduino con un controlador Modbus principal o un software SCADA doméstico.

¿Cómo sé si mi sistema supervisor usa offsets 0-based o 1-based?

Esto debe especificarse en la documentación de tu software supervisor o sistema SCADA. Si no está claro, la forma más sencilla es la prueba y error: si configuras un registro en tu Arduino con offset 100 y tu software no lo encuentra, prueba con 101. La mayoría de los sistemas modernos permiten configurar esto o lo especifican claramente.

¿Qué es Modbus RTU y Modbus TCP?

Modbus RTU (Remote Terminal Unit) es la implementación de Modbus sobre una línea serial (comúnmente RS-485). Utiliza un formato de mensaje binario compacto. Modbus TCP es la implementación del protocolo Modbus sobre TCP/IP (Ethernet o WiFi). Utiliza tramas de datos similares a RTU pero encapsuladas en paquetes TCP/IP, lo que permite la comunicación a través de redes modernas.

Conclusión

Integrar el protocolo Modbus con tu Arduino es una habilidad invaluable que amplía enormemente las posibilidades de tus proyectos. Ya sea que busques conectar tu Arduino a un PLC industrial, crear un sistema de monitoreo de energía en tu hogar o desarrollar una solución de automatización personalizada, Modbus te proporciona un lenguaje de comunicación estandarizado y confiable. Con la ayuda de shields de comunicación adecuados y librerías como la de Andrés Sarmento, puedes convertir tu Arduino en un potente dispositivo esclavo Modbus, listo para interactuar con el mundo de la automatización. Empieza explorando los ejemplos de la librería y pronto estarás controlando y monitoreando tus dispositivos con la robustez y eficiencia que solo Modbus puede ofrecer.

Si quieres conocer otros artículos parecidos a Arduino y Modbus: Conectando tu Proyecto al Mundo Industrial puedes visitar la categoría Librerías.

Subir