¿Qué es, para que sirve y cómo se usa MODBUS?

¿Qué es modbus?

En términos de protocolo de comunicación MODBUS es un protocolo de capa de Aplicación. Por lo cual, MODBUS puede ser utilizado (viajar u transportado) sobre RS232, RS485, TCP/IP, etc.

MODBUS es un protocolo tipo pregunta-respuesta, lo cual significa que hay un dispositivo (master/maestro) que pregunta mediante una query, a otro dispositivo (slave/esclavo), el cual responde y/o actúa a lo que solicita el maestro.

En MODBUS, pueden existir varios maestros y varios esclavos en una sola red MODBUS. Una red MODBUS, es un espacio en el cual, dispositivos modbus pueden "conversar" entre ellos de manera directa. La red MODBUS, físicamente depende de las capas inferiores, es decir, el transporte que utiliza modbus (RS485, TCP/IP, RS232, etc).

Existen tres versiones de modbus: MODBUS RTU, MODBUS ASCII y MODBUS TCP. La diferencia de cada uno de estos es la manera en la cual se arman los paquetes MODBUS. Por ejemplo, MODBUS RTU utiliza bytes con valores 0 a 255, en cambio, MODBUS ASCII utiliza solo caracteres ASCII para armar los paquetes (bytes con valores cuya representación ascii es de 0-9 y A-F). MODBUS RTU y ASCII están hechos para ser utilizados con protocolos sin una capa de networking, tales como RS232 o RS485. MODBUS TCP está diseñado para ser utilizado con TCP/IP.

¿Para qué sirve Modbus?

El protocolo MODBUS sirve para interactuar con sensores y actuadores que tienen una interfáz MODBUS. Y es ampliamente utilizado en aplicaciones industriales, por su simpleza y su fiabilidad.

Típicos sensores y actuadores MODBUS incluyen:

¿Cómo funciona Modbus?

Dejaremos MODBUS TCP de lado y estudiaremos MODBUS RTU Y MODBUS ASCII.

Tipos de mensaje
MODBUS define 8 tipos de funciones y también tiene otros mensajes especiales de error.
  1. 0x01 READ INPUT COILS: Esta función es utilizada para leer las salidas digitales de un actuador, 1 o 0. (led, relés, gpio, motor, etc.).
  2. 0x02 READ INPUT STATUS: Leer las entradas digitales de un sensor, 1 o 0 (alerta de temperatura, boton pulsado, estanque lleno, etc.)
  3. 0x03 READ HOLDING REGISTER: Leer configuración, información de un sensor (factores de calibración, identificador serial, capacidad de memoria, rangos de lectura, etc) o bien, salida analógica de un actuador (PWM, ángulo de giro, velocidad de un motor).
  4. 0x04 READ INPUT REGISTER: Leer entradas analógicas de un sensor. (temperatura, humedad, presión, voltaje, frecuencia, etc.)
  5. 0x05 WRITE SINGLE COIL: Escribir en una salida digital (ver 0x01).
  6. 0x06 WRITE SINGLE REGISTER: Escribir en una configuración o salida de un actuador (ver 0x03).
  7. 0x0f WRITE MULTIPLE COILS: Escribir en múltiples salidas digitales (0x01).
  8. 0x10 WRITE MULTIPLE REGISTERS: Escribir en los registros 0x03.
0x01 READ INPUT COILS
La estructura de los mensajes tipo 0x01 es para MODBUS RTU:

slave_address | función | registro_hi | registro_lo | cantidad_hi | cantidad_lo | crc_lo | crc_hi

La estructura de los mensajes tipo 0x01 es para MODBUS ASCII:

: (dos puntos) | slave_address | función | registro_hi | registro_lo | cantidad_hi | cantidad_lo | crc_lo | crc_hi | CR | LF