Arduino - Modbus

En este tutorial, vamos a aprender:

¿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.

LED controlado por botón 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

    El protocolo anterior está definido por nosotros mismos, no es un protocolo estándar. Necesitamos definir más si:

    • 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 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:

    • 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.

    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.

Modbus Maestro y Esclavo

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
Interruptor LED Modbus para Arduino

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
Modbus TCP frente a Modbus RTU/ASCII
  • Pila de protocolos
Modbus TCP frente a Modbus RTU/ASCII

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.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!