Índice
Lectura previa
Librería maestra Modbus RTU para la automatización industrial
Para poder seguir fácilmente la explicación de nuestras bibliotecas Modbus TCP para PLC industrial Arduino, en primer lugar sería interesante echar un vistazo a la publicación Modbus RTU para comprender mejor las características y configuraciones de este tipo de comunicación en dispositivos industriales Arduino.

Introducción
En este post, te presentaremos nuestras bibliotecas para poder implementar el modo Modbus TCP / IP Slave cuando trabajes con controladores lógicos programables. Básicamente, funciona de la misma manera que el Modbus RTU con algunas excepciones.
- TCP - Protocolo de Control de Transmisión.
- IP - Protocolo de internet.
Esta es una variante Modbus utilizada para las comunicaciones a través de redes TCP / IP en controladores industriales para la automatización Arduino, conectando a través del puerto 502. No requiere un cálculo de suma de verificación, ya que las capas inferiores ya proporcionan protección de suma de verificación.
Detalles técnicos
Modbus TCP encapsula los paquetes de datos de solicitud y respuesta Modbus RTU en un paquete TCP transmitido a través de redes Ethernet estándar. El número de unidad todavía se incluye y su interpretación varía según la aplicación: la dirección de la unidad o del esclavo no es el medio principal de direccionamiento en TCP. La dirección más importante aquí es la dirección IP. Como dijimos antes, el puerto estándar para Modbus TCP es 502, pero el número de puerto a menudo se puede reasignar si lo deseas.
El campo de suma de comprobación que normalmente se encuentra al final de un paquete RTU se omite del paquete TCP. Ethernet maneja la suma de verificación y el manejo de errores en el caso de Modbus TCP.
La versión TCP de Modbus sigue el Modelo de Referencia de Red OSI. Modbus TCP define las capas de presentación y la aplicación en el modelo OSI. Este tipo de transmisión hace que la definición de maestro y esclavo sea menos obvia porque Ethernet permite la comunicación entre pares. El significado de cliente y servidor son entidades más conocidas en redes basadas en Ethernet. En este contexto, el esclavo se convierte en servidor y el maestro en cliente. Puede haber más de un cliente obteniendo datos del servidor. En otras palabras, podemos decir que esto significa que puede haber múltiples maestros así como múltiples esclavos. En lugar de definir el maestro y el esclavo dispositivo por dispositivo, el diseñador tendrá que crear asociaciones lógicas entre el maestro y el esclavo para definir los roles.
Software para el controlador lógico programable PLC
Esclavo Modbus TCP con Arduino IDE
The Modbus TCP Slave module implements the Modbus TCP Slave functionality.
#include <ModbusTCPSlave.h> ModbusTCPSlave slave;
El puerto TCP por defecto es el 502, pero puedes cambiarlo con:
// Set the TCP listening port to 510 instead of 502 ModbusTCPSlave slave(510);
To map the coils, discrete inputs, holding registers and input registers addresses with the desired variables values, the module uses four variables arrays:
bool coils[NUM_COILS]; bool discreteInputs[NUM_DISCRETE_INPUTS]; uint16_t holdingRegistesr[NUM_HOLDING_REGISTERS]; uint16_t inputRegisters[NUM_INPUT_REGISTERS];
The lengths of these arrays depend on the application and the register's usages. Obviously, the names of the arrays also depend on your preferences.
Para asociar las matrices de registros con la biblioteca, es posible utilizar sus funciones en setup
:
slave.setCoils(coils, NUM_COILS); slave.setDiscreteInputs(discreteInputs, NUM_DISCRETE_INPUTS); slave.setHoldingRegisters(holdingRegisters, NUM_HOLDING_REGISTERS); slave.setInputRegisters(inputRegisters, NUM_INPUT_REGISTERS);
No es necesario tener todo tipo de registros de asignación para trabajar, sólo el utilizado por la aplicación.
begin
después de la asignación de registros. También es posible llamar a la función begin
antes de la asignación de registros. Recuerde empezar el Ethernet antes del objeto Modbus TCP Slave en setup
. // Init the Ethernet Ethernet.begin(mac, ip); // Init the ModbusTCPSlave object slave.begin();
En este momento el servidor Modbus TCP está funcionando y lo único importante que hay que hacer es actualizar el objeto Modbus TCP Slave a menudo en la función lllll y tratar los valores de mapeo de los registros para actualizar las variables, entradas y salidas.
// Update discrete inputs and input registers values discreteInputs[0] = digitalRead(I0_7); inputRegisters[0] = analogRead(I0_0); // ... // Update the ModbusTCPSlave object slave.update(); // Update coils and holding registers digitalWrite(Q0_0, coils[0]); // ...
Consulta otros posts sobre Modbus
Modbus TCP Master con PLC industriales basados en Arduino
Leer el post >>>
Librería Master Modbus RTU para automatización industrial
Leer el post >>>
Cómo conectar un PLC basado en Arduino usando Modbus TCP / IP
Leer el post >>>
Comunicación por MODBUS RTU a través de una interfaz serie RS485 (módulo Seneca Z-D-in)
Cómo usar la librería Modbus TCP Slave con un controlador PLC Arduino