Modbus en Raspberry PLC con C
Implementación para PLCs basados en Raspberry (C)
Instalación
libmodbus es una librería de C que ofrece implementaciones de cliente y servidor para Modbus RTU y TCP. Encontrarás la librería aquí; instálala ejecutando el comando: sudo apt install libmodbus-dev.
Maestro
Los siguientes ejemplos son implementaciones de maestro Modbus, tanto con RTU como con TCP:
Configuración
La configuración inicial de Modbus RTU y de Modbus TCP se diferencia principalmente en el tipo de comunicación que usa cada uno.
- En Modbus RTU, la configuración consiste en fijar los parámetros de la comunicación serie. Esto incluye definir el SLAVE_ID, que identifica el dispositivo esclavo Modbus concreto, el SERIAL_PORT, que indica la interfaz serie usada para la comunicación, y parámetros de comunicación como BAUD_RATE, PARITY, DATA_BITS y STOP_BITS. Ajusta estos valores según tu instalación.
#define SLAVE_ID 1 #define SERIAL_PORT "/dev/ttySC0" #define BAUD_RATE 38400 #define PARITY 'E' #define DATA_BITS 8 #define STOP_BITS 1
#define SLAVE_ID 1 #define SERIAL_PORT "/dev/ttySC0" #define BAUD_RATE 38400 #define PARITY 'E' #define DATA_BITS 8 #define STOP_BITS 1
Para crear el contexto Modbus, Modbus RTU usa la siguiente función, que inicializa la conexión con los parámetros serie indicados.
ctx = modbus_new_rtu(SERIAL_PORT, BAUD_RATE, PARITY, DATA_BITS, STOP_BITS);
ctx = modbus_new_rtu(SERIAL_PORT, BAUD_RATE, PARITY, DATA_BITS, STOP_BITS);
- Modbus TCP requiere fijar los parámetros de la comunicación sobre una red IP. En lugar de la configuración del puerto serie, indicas la dirección SLAVE_IP y el número de PORT. El SLAVE_ID se sigue usando para identificar el dispositivo esclavo.
#define SLAVE_ID 1 #define SLAVE_IP "10.10.10.20" #define PORT 502
#define SLAVE_ID 1 #define SLAVE_IP "10.10.10.20" #define PORT 502
Para crear el contexto Modbus, Modbus TCP usa la siguiente función, que establece la conexión con la dirección IP y el puerto indicados.
ctx = modbus_new_tcp(SLAVE_IP, PORT);
ctx = modbus_new_tcp(SLAVE_IP, PORT);
Referencia de la API
Esta referencia de la API detalla las funciones Modbus esenciales para leer y escribir datos entre un maestro y un esclavo Modbus. Las funciones cubren operaciones sobre bobinas (coils), entradas discretas, registros de retención (holding registers) y registros de entrada (input registers). Estas operaciones incluyen leer el estado o los valores y escribir datos en el esclavo Modbus.
Descripción:
Lee el contenido de un número determinado de bobinas (coils) de un dispositivo esclavo (FC=01).
Sintaxis:
modbus_read_bits(ctx, addr, nb, dest);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de las bobinas.
- nb: el número de bobinas que se leen.
- dest: el array donde se guarda la lectura.
Devuelve:
Devuelve el número de bits leídos si la operación se realiza correctamente y -1 en caso contrario.
Descripción:
Lee el contenido de un número determinado de entradas discretas de un dispositivo esclavo (FC=02).
Sintaxis:
read_input_bits(ctx, addr, nb, dest);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de las entradas discretas.
- nb: el número de entradas discretas que se leen.
- dest: el array donde se guarda la lectura.
Devuelve:
Devuelve el número de estados de entrada leídos si la operación se realiza correctamente y -1 en caso contrario.
Descripción:
Lee el contenido de un número determinado de registros de retención (holding registers) de un dispositivo esclavo (FC=03).
Sintaxis:
modbus_read_registers(ctx, addr, nb, dest);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de los registros de retención.
- nb: el número de registros de retención que se leen.
- dest: el array donde se guarda la lectura.
Devuelve:
Devuelve el número de registros leídos si la operación se realiza correctamente y -1 en caso contrario.
Descripción:
Lee el contenido de un número determinado de registros de entrada (input registers) de un dispositivo esclavo (FC=04).
Sintaxis:
modbus_read_input_registers(ctx, addr, nb, dest);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de los registros de entrada.
- nb: el número de registros de entrada que se leen.
- dest: el array donde se guarda la lectura.
Devuelve:
Devuelve el número de registros de entrada leídos si la operación se realiza correctamente y -1 en caso contrario.
Descripción:
Escribe una sola bobina a 0 o a 1 en un dispositivo esclavo (FC=05).
Sintaxis:
modbus_write_bit(ctx, addr, status);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección de la bobina.
- status: el valor que se escribe en la bobina.
Devuelve:
Devuelve 1 si la operación se ha realizado correctamente y -1 en caso contrario.
Descripción:
Escribe un valor en un solo registro de retención de un dispositivo esclavo (FC=06).
Sintaxis:
modbus_write_register(ctx, addr, value);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección del registro de retención.
- value: el valor que se escribe en el registro de retención.
Devuelve:
Devuelve 1 si la operación se ha realizado correctamente y -1 en caso contrario.
Descripción:
Escribe valores en una secuencia de bobinas de un dispositivo esclavo (FC=15).
Sintaxis:
modbus_write_bits(ctx, addr, nb, src);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de las bobinas.
- nb: el número de bobinas que se escriben.
- src: el array de valores que se escriben en las bobinas.
Devuelve:
Devuelve el número de bobinas escritas si la operación se realiza correctamente y -1 en caso contrario.
Descripción:
Escribe valores en una secuencia de registros de retención de un dispositivo esclavo (FC=16).
Sintaxis:
modbus_write_registers(ctx, addr, nb, src);
Parámetros:
- ctx: el objeto de contexto Modbus.
- addr: la dirección inicial de los registros de retención.
- nb: el número de registros de retención que se escriben.
- src: el array de valores que se escriben en los registros de retención.
Devuelve:
Devuelve el número de registros escritos si la operación se realiza correctamente y -1 en caso contrario.
No hay comentarios por ahora.