Lectura previa
Biblioteca 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
Modbus TCP Slave with Arduino IDE
El módulo Modbus TCP Slave implementa la funcionalidad Modbus TCP Slave.
#include <ModbusTCPSlave.h> ModbusTCPSlave slave;
El puerto TCP predeterminado es el 502 , pero puedes cambiarlo con:
// Set the TCP listening port to 510 instead of 502 ModbusTCPSlave slave(510);
Para asignar las bobinas, las entradas discretas, los registros de retención y las direcciones de registros de entrada con los valores de variables deseados, el módulo utiliza cuatro matrices de variables:
bool coils[NUM_COILS]; bool discreteInputs[NUM_DISCRETE_INPUTS]; uint16_t holdingRegistesr[NUM_HOLDING_REGISTERS]; uint16_t inputRegisters[NUM_INPUT_REGISTERS];
Las longitudes de estas matrices dependen de la aplicación y los registros de usos. Obviamente, los nombres de las matrices también dependen de sus preferencias.
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();
// 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 la publicación >>>
Biblioteca master Modbus RTU para automatización industrial
Leer la publicación >>>
Cómo conectar un PLC basado en Arduino usando Modbus TCP / IP
Leer la publicación >>>
Comunicación por MODBUS RTU a través de una interfaz serie RS485 (módulo Seneca Z-D-in)