Modbus RTU sobre la Interfaz RS485 para SBC
Pocas placas de desarrollo embebido incorporan de serie una interfaz RS485, sin embargo si que incorporan varias UART (Tranmisión y Recepción de Datos Serie) en estos apuntes veremos un ejemplo práctico del protocolo Modbus RTU sobre la interfaz RS485 utilizando una UART implementado en la Orange Pi 5 Plus
SISTEMAS EMBEBIDOS
Biblioman
1/30/20255 min leer


Introducción al Protocolo Modbus
El protocolo Modbus, desarrollado inicialmente por Modicon en 1979, ha evolucionado para convertirse en un estándar de facto en la comunicación industrial. El diseño de la arquitectura Modbus es del tipo maestro-esclavo. El maestro es el encargado de iniciar y controlar las comunicaciones, mientras que los esclavos responden a las solicitudes del maestro. Opera a través de diferentes interfaces físicas como RS232, RS485 y TCP/IP, siendo RS485 la mas utilizada. Atendiendo al formato de la trama de datos existen dos versiones:
Modbus RTU (Remote Terminal Unit) : versión original del protocolo, los datos se envían en formato binario, lo que hace que sea eficiente y en la práctica es la versión que mas se utiliza.
Modbus ASCII: en esta versión los datos de envían como caracteres ASCII, tiene una mayor legibilidad pero las tramas son mas grandes que el formato RTU y por tanto es menos eficiente
De una forma muy simplificada podríamos decir que el protocolo define la trama de datos y la estructura de los mensajes y la interfaz el medio físico por donde se transmiten esos mensajes y las características eléctricas de la red. El ejemplo lo haremos utilizando el protocolo Modbus RTU y la interfaz física RS485.
Interfaz RS485
La interfaz RS485 es un estándar de comunicación serial que se utiliza ampliamente en aplicaciones industriales y de automatización debido a su robustez, capacidad de transmitir datos a largas distancias y su habilidad para conectar múltiples dispositivos en un mismo bus.
Características:
Topología de bus Multipunto: Permite conectar múltiples dispositivos en un mismo bus, lo que la hace ideal para aplicaciones donde se necesitan conectar varios sensores, actuadores o controladores en una misma red. Puede conectar hasta 32 dispositivos al bus (limite impuesto por la carga eléctrica en los transceptores no por el protocolo Modbus RTU) .
Velocidad de transmisión: La velocidad de transmisión puede variar desde unos pocos kilobits por segundo hasta varios megabits por segundo. Sin embargo, a mayor velocidad, menor distancia máxima de transmisión. por ejemplo: hasta 10 Mbps en distancias cortas (alrededor de 10 metros), hasta 100 kbps para distancias máximas (hasta 1200 metros).
Transmisión diferencial: Utiliza dos cables para enviar señales (A+ y B-) en lugar de un cable para transmitir y otro para recibir como otras interfaces seriales (RS232). Esto permite que las señales sean menos susceptibles al ruido y a las interferencias electromagnéticas, lo que es ideal para entornos industriales.
Niveles de tensión diferenciales mínimos:
Lógica 1: Voltaje positivo entre la línea diferencial VA+ - VB- ≥+200mV
Lógica 0: Voltaje negativo entre la línea diferencial VA+ - VB- ≤−200mV
Nota: la norma establece que las tensiones absolutas en los cables A+ y B- (respecto a GND) deben estar entre -7 V y +12 V y los valores anteriores son umbrales diferenciales mínimos de tensión por lo que dependiendo del transceptor RS485 utilizado los valores diferenciales pueden variar. Esto implica que algunos transceptores tienen mejor inmunidad al ruido que otros.
Modo de transmisión: Opera en modo half-duplex (comunicación bidireccional pero no simultánea), es decir, un dispositivo transmite mientras otro recibe. Se elige un dispositivo como maestro que inicia y controla la comunicación, mientras que los demás dispositivos se configuran como esclavos que responden a las solicitudes del maestro.
Cable utilizado: usualmente dos conductores de par trenzado, con una impedancia característica de 120 ohmios para evitar reflexiones de señal.
Cómo Funciona la Comunicación Modbus RTU sobre RS485
Al tratarse de una arquitectura del tipo maestro-esclavo el maestro es el que inicia la comunicación, una trama de datos sería la siguiente:


Dirección del esclavo: identificador único que se le asigna a cada dispositivo esclavo en la red.
Código de función: es un código que especifica la acción a realizar por el esclavo puede ser de lectura o escritura.
Datos: es el mensaje en si y puede ser de escritura en un registro del esclavo, por ejemplo poner a 1 un pin GPIO del esclavo o de lectura, por ejemplo leer el valor de una señal analógica. El tamaño en bytes depende del código de función y de la operación que se realice.
CRC (Cyclic Redundancy Check): para la detección de errores y garantizar la integridad de los datos transmitidos, utiliza dos bytes y la generación y forma de transmitirlo dentro de la trama es un estándar definido en la norma Modbus RTU. Desde está calculadora podemos calcular el CRC para una trama determinada. Este CRC se adjunta al final de la trama para que el receptor pueda realizar la misma operación y comparar su propio CRC con el recibido, asegurando que los datos no hayan sido alterados. Modbus RTU utiliza el formato little-endian para el envío del CRC lo que significa que a la hora de añadirlo a la trama debemos de cambiar el orden de los bytes obtenidos en la calculadora sino dará error.
Nota: un dato importante a tener en cuenta es el tiempo de espera entre tramas (también conocido como inter-frame delay) es un parámetro importante en las comunicaciones Modbus RTU sobre una red RS485, ya que asegura que el protocolo funcione correctamente y sin interferencias. Este tiempo de espera permite que los dispositivos tengan suficiente tiempo para procesar los mensajes y para la correcta sincronización de la transmisión y recepción de las tramas. Según el estándar Modbus, el tiempo mínimo de silencio entre tramas debe ser equivalente a 3.5 veces el tiempo de transmisión de un carácter (3.5 character times). Este silencio garantiza que los dispositivos reconozcan el final de una trama y el inicio de otra y depende directamente de la velocidad de transmisión (baud rate).
Ejemplo práctico
Vamos a utilizar la Orange Pi 5 plus como dispositivo maestro para enviar comandos Modbus RTU a una placa de 16 reles que incorpora un transceptor RS485. Para ello necesitamos convertir los niveles TTL de una de las UART de la Orange Pi 5 Plus a los voltajes requeridos para la comunicación RS485. El esquema de conexiones es el siguiente:


En el siguiente vídeo se describen los siguientes puntos:
Descripción mas detallada de la placa de reles y del módulo convertidor de niveles TTL a RS485.
Configuración de la UART3 en la Orange Pi 5 Plus así como la instalación del software a utilizar.
Explicación del manual de la placa de reles.
Ejemplos de uso donde se muestra el funcionamiento

Hardware
Una Orange Pi 5 Plus o cualquier placa SBC
Una fuente de alimentación 5V/4A para SBC
Una fuente de alimentación de 12V CC para módulo de reles