Busca en nuestro Blog. Encontrarás múltiples aplicaciones, soluciones, ejemplos de código. Navega utilizando la nube de etiquetas o busca utilizando criterios específicos

Cómo usar la biblioteca Modbus TCP Slave con un controlador PLC Arduino

Lectura previa

Biblioteca master Modbus RTU para automatización industrial

Lee el post >>

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 presentarmos 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.

 How to use Modbus TCP Slave library with a plc controller arduino


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 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 mejor conocidas en redes basadas en Ethernet. En este contexto, el esclavo se convierte en el servidor y el maestro se convierte en el 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 maestro y esclavo en un dispositivo físico por dispositivo, el diseñador tendrá que crear asociaciones lógicas entre maestro y esclavo para definir los roles.

Software

Esclavo TCP Modbus con 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.

Para iniciar el servidor Modbus TCP, llame a la función de  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 se está ejecutando y lo único importante 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

Lee el post >>


Biblioteca master Modbus RTU para automatización industrial

Lee el post >>


Cómo conectar un PLC basado en Arduino usando Modbus TCP / IP

Lee el post >>


Comunicación por MODBUS RTU a través de una interfaz serie RS485 (módulo Seneca Z-D-in)

Lee el post >>


¿Quieres más información?

Con la tecnología Open Source, puedes ejecutar tus propias instalaciones.

Rellena el formulario y contactaremos contigo lo más pronto posible.

Enviar  Por favor, completa el formulario correctamente.