Cómo usar la librería Modbus TCP Slave con un controlador PLC Arduino

Los PLCs Arduino automatizan lo que sea. Aprende a hacerlo con Modbus TCP y un PLC Arduino industrial
20 de marzo de 2020 por
Cómo usar la librería Modbus TCP Slave con un controlador PLC Arduino
Bernat Garcia

Índice

Lectura previa

Librería maestra Modbus RTU para la automatización industrial

Read the 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.

Cómo usar la biblioteca Modbus TCP Slave con un controlador PLC 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.

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 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]);
// ...


Buscar en nuestro blog

Cómo usar la librería Modbus TCP Slave con un controlador PLC Arduino
Bernat Garcia 20 de marzo de 2020
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>