Antes de empezar
Modbus RTU es un protocolo ampliamente utilizado para interactuar con dispositivos esclavos, escribir y leer en sus registros, y controlar múltiples puntos finales al mismo tiempo. Para una introducción básica a Modbus RTU, consulta las siguientes entradas de blog:
Configuración básica
In this example, we used a Touchberry Panel, but the configuration and performance of the UPSafePi is the same, as it used the same GPIOs.
El Touchberry Panel actuará como el maestro, ya que la pantalla que incorpora puede ser muy útil para mostrar los estados actuales de todos los dispositivos conectados a través de Modbus RTU, como otros PLCs de Industrial Shields, controladores genéricos o sensores.
Para conectar los dispositivos, conecta todos los pines A+ y todos los pines B- utilizando pares de cables trenzados para minimizar las reflexiones de señal. Luego, enciende el Touchberry Panel y conecta un teclado y un ratón utilizando los puertos USB que están debajo.
First of all, open a terminal and install the libgpiod-dev depencendy:
sudo apt install libgpiod-dev
Then, create a folder to store all the files:
mkdir modbusrtu && cd modbusrtu
Then download the corresponding files and store them under the modbusrtu directory.
This two files compose the Modbus RTU library for Touchberry Panel. The Raspberry Pi port which is used to work over RS-485 is the /dev/ttyAMA0.
OS related configuration
Before starting, ensure you Operative System version is updated to the newest version (Bookworm 12 at the moment of writing this post). You can check your own version with cat /etc/os-release.
Before starting, add the following line in /boot/firmware/config.txt. You can open this file with:
sudo nano /boot/firmware/config.txt
By default, the Raspberry Pi serial port is /dev/ttyS0, but it is a miniUART and, because of its hardware limitations, lacks parity control, leading to incompatibility with most of Modbus RTU slave devices. The UART that has parity control is automatically occupied by the Bluetooth device.
In order to change that, we use the previous configuration. We specify the Raspberry Pi's Bluetooth device to use this miniUART, so the RPI's serial port can automatically occupy the UART, which has parity control. This serial port in specific is /dev/ttyAMA0.
Finally, reboot the device.
Código de prueba 1
Para probar la funcionalidad de la biblioteca, podemos usar un script que toma como parámetros las siguientes variables
- Identificador de esclavo.
- Velocidad de baudios.
- Serial configuration
- Código de función.
- Dirección.
- Valor que escribir / Cantidad a leer.
El código es el siguiente:
Por lo que se puede ver, la biblioteca adapta los siguientes Códigos de Función
- FC 1: Leer bobinas.
- FC 2: Leer entradas discretas (Discrete Inputs).
- FC 3: Leer registros de retención (Holding Registers).
- FC 4: Read Input Registers.
- FC 5: Escribir una sola bobina.
- FC 6: Escribir un solo registro.
- FC 15: Write Multiple Coils.
- FC 16: Write Multiple Registers.
Para compilar el código usa:
gcc -o main main.c modbus.c -lgpiod
Y para executar
./main <slave_id> <baudrate> <serial_config> <fc> <address> <value/quantity>
Por ejemplo, echa un vistazo a la siguiente imagen:

- Los primeros comandos son con FC: 5 (escribir bobinas). Esto configura las bobinas 0, 1 y 3 a 1.
- Al leer las bobinas (FC: 1), se puede ver que se han escrito correctamente.
- A continuación, FC: 6, que es escribir registros. Escribimos 100 en el registro 0, 512 en el registro 1 y 0 en el registro 2.
- FC: 3 es leer registros de retención, y podemos ver claramente que funciona.
Este método de establecer los parámetros en la línea de comandos puede ser muy útil al llamar al script desde una aplicación en Python o Node-RED, ya que este script es muy flexible y se puede llamar varias veces para interactuar con más de un esclavo, cambiando el ID del esclavo, la velocidad de baudios o el código de función.
Código alternativo
En lugar de establecer los parámetros en la línea de comandos, podemos crear un script para hacer algunas peticiones de forma secuencial. Por ejemplo, hagamos lo mismo que se ve en la imagen anterior:
Usando este código y compilando de la misma manera que antes (gcc -o testt test.c modbus.c -lgpiod), obtenemos este resultado:

El resultado es el mismo, hemos escrito y leído con éxito de acuerdo con la prueba que hicimos previamente.
Un paso más allá
Gracias a la flexibilidad de la biblioteca, es posible crear y desarrollar una interfaz de usuario con Node-RED. Por ejemplo, echa un vistazo a este diseño simple:

Este es solo un enfoque básico. Se puede tomar como un boceto inicial, pero debe adaptarse a las necesidades del usuario. El flujo código se adjunta a continuación. Recuerda usar el primer código visto en esta publicación y compilarlo nombrando el archivo ejecutable como "cmd" (gcc -o cmd test.c modbus.c -lgpiod).
flows.json

Como usar Modbus RTU con el Touchberry Panel / UPSafePi