En un entorno donde el monitoreo y control de los procesos se vuelve crucial y donde existen las necesidades de crear la visualización de estos para una mayor facilidad en los operadores, los dispositivos de interfaz Humano-Máquina (HMI) son de gran ayuda en las operaciones diarias, y con la opción de conectarse a distintos equipos de control como PLCs usando los puertos disponibles y/o mediante algún protocolo de comunicación. Los PLCs de Controllino en sus modelos MAXI y MEGA ofrecen la ventaja de poder ser conectados con paneles HMI usando el protocolo Modbus ya sea a través de su puerto Ethernet (TCP/IP) o con el puerto RS485 (interfaz SN65HVD08) integrado en ellos.

 

 

En un blog+anterior (Poner liga de blog HMI con PLC Controllino mediante TCP/IP, aun no tiene liga, solo se pone formato de color y subrayado) se mostraron los pasos para comunicar el PLC de Controllino con el HMI usando el protocolo TCP/IP, ahora en este blog les explicaremos cómo conectar el PLC de Controllino con el HMI usando Modbus TCP/IP (Nota: se debe seleccionar la librería correcta buscando en la dirección del menú de Arduino IDE Tools->Board->Controllino MINI/MAXI/MEGA, si no encuentra el archivo deseado puede usar la esta+liga para descargarlo, ya que la necesita antes de cargar el código al PLC).

En este caso lo que va a necesitar para la configuración es: 1 equipo PLC de Controllino MAXI ó MEGA, una fuente de alimentación de 12/24 VCD (la cual deberá configurar para que el voltaje que reciban los PLC no exceda los 5 Volts, o se corre el riesgo de dañar permanentemente los equipos), el panel HMI que desea controlar y adaptador macho para puerto serial de 3 hilos (revisar en el manual del panel la asignación de pines para conectar usando RS485 al PLC de Controllino, puede ver el diagrama de conexión con los pines asignados para MAXI y MEGA dando click en este enlace y en este otro enlace).

 

Paso 1: Configuración del HMI

Primeramente se hace la configuración para el HMI desde el software designado de acuerdo con la marca y/o compatibilidad de productos, preferentemente implementa uno que cuente con las versiones y drivers más actuales. Dentro del mismo, vamos a crear los tags analógicos R0, D0, D1 y A0, realizando la configuración mostrada en la imagen debajo:

 

 

En los tags puede ver que para RTU los nodos empiezan con “5:”, esto se debe a que el PLC de Controllino tiene como id de unidad ese número para realizar la función como esclavo Modbus. Esto no es obligatorio y siempre puede cambiar este valor dentro del código que va a cargar en el dispositivo.

Una vez que hayamos creado los tags con las direcciones para Modbus RTU vamos a crear el dispositivo I/O Modbus para que se conecta al PLC de Controllino MAXI ó MEGA, en la opción de su software para dispositivos I/O vamos a crear uno nuevo, después definimos que sea de tipo Serial, luego definimos la estación como “0” (en caso de requerirlo) y por último establecemos el puerto serial que tenga definido como RS485 (debe revisar en el software que usa cuál puerto tiene este parámetro).

 

 

Paso 2: Usar ModbusRTU

Para lograr la conexión necesitamos utilizar el siguiente código, recordando el número de estación asignado al PLC Modbus esclavo y subirlo al dispositivo:

#include <Controllino.h> /* Usage of the CONTROLLINO library allows you to use CONTROLLINO_xx aliases in your sketch. */

#include “ModbusRtu.h” /* Usage of ModBusRtu library allows you to implement the Modbus RTU protocol in your sketch. */

/*

CONTROLLINO – Modbus RTU protocol Slave example for MAXI and MEGA, Version 01.00

The sketch is relevant only for CONTROLLINO variants MAXI and MEGA (because of the necessity of the RS485 interface)!

This sketch is intended as an example of the communication between devices via RS485 with utilization the

ModbusRTU protocol.

In this example the CONTROLLINO is used as the Modbus slave!

For more information about the Modbus protocol visit the website: https://modbus.org/

Modbus master device can read Modbus 16 bit registers (provided by the slave):

0 – analog CONTROLLINO_A0 value (0 – 1024)

1 – digital CONTROLLINO_D0 value (0/1)

2 – Modbus messages received

3 – Modbus messages transmitted

Modbus master device can write Modbus 16 bit registers:

4 – relay CONTROLLINO_R0 (0/1)

5 – relay CONTROLLINO_R1 (0/1)

6 – relay CONTROLLINO_R2 (0/1)

7 – relay CONTROLLINO_R3 (0/1)

To easily evaluate this example you need a second CONTROLLINO as Modbus master running DemoModbusRTUMaster

Example sketch.

Please note that both CONTROLLINOs need 12/24V external supply and you need to interconnect GND, -, + signals

of RS485 screw terminal.

Modbus Master-Slave library for Arduino (ModbusRtu.h) was taken from the website:

https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino

It was necessary to modify the setting of the PORTJ for pins DE and RE control. These pins are located at the

PORJ and on the pins PIN6(DE) and PIN5(RE).

IMPORTANT INFORMATION!

Please, select the proper target board in Tools->Board->Controllino MAXI/MEGA before Upload to your CONTROLLINO.

(Please, refer to https://github.com/CONTROLLINO-PLC/CONTROLLINO_Library if you do not see the CONTROLLINOs in

the Arduino IDE menu Tools->Board.)

Created 30 March 2017

by David

(Check https://github.com/CONTROLLINO-PLC/CONTROLLINO_Library for the latest CONTROLLINO related software stuff.)

*/

int D0 = CONTROLLINO_D0;

int D1 = CONTROLLINO_D1;

int R0 = CONTROLLINO_R0;

int A0_ = CONTROLLINO_A0;

// This MACRO defines a Modbus slave address.

// For any Modbus slave devices are reserved addresses in the range from 1 to 247.

// Important note only address 0 is reserved for a Modbus master device!

#define SlaveModbusAdd 5

// This MACRO defines the number of the comport that is used for the RS 485 interface.

// For MAXI and MEGA RS485 is reserved UART Serial3.

#define RS485Serial 3

// The object ControllinoModbuSlave of the class Modbus is initialized with three parameters.

// The first parameter specifies the address of the Modbus slave device.

// The second parameter specifies type of the interface used for communication between devices – in this sketch

// is used RS485.

// The third parameter can be any number. During the initialization of the object this parameter has no effect.

Modbus ControllinoModbusSlave(SlaveModbusAdd, RS485Serial, 0);

// This uint16 array specified internal registers in the Modbus slave device.

// Each Modbus device has particular internal registers that are available for the Modbus master.

// In this example sketch internal registers are defined as follows:

// (ModbusSlaveRegisters 0 – 3 read only and ModbusSlaveRegisters 4 – 7 write only from the Master perspective):

// ModbusSlaveRegisters[0] – Read an analog value from the CONTROLLINO_A0 – returns value in the range from 0 to 1023.

// ModbusSlaveRegisters[1] – Read an digital value from the CONTROLLINO_D0 – returns only the value 0 or 1.

// ModbusSlaveRegisters[2] – Read the number of incoming messages – Communication diagnostic.

// ModbusSlaveRegisters[3] – Read the number of outcoming messages – Communication diagnostic.

// ModbusSlaveRegisters[4] – Sets the Relay output CONTROLLINO_R0 – only the value 0 or 1 is accepted.

// ModbusSlaveRegisters[5] – Sets the Relay output CONTROLLINO_R1 – only the value 0 or 1 is accepted.

// ModbusSlaveRegisters[6] – Sets the Relay output CONTROLLINO_R2 – only the value 0 or 1 is accepted.

// ModbusSlaveRegisters[7] – Sets the Relay output CONTROLLINO_R3 – only the value 0 or 1 is accepted.

uint16_t ModbusSlaveRegisters[8];

// The setup function runs once when you press reset (CONTROLLINO RST button) or connect the CONTROLLINO to the PC

// In the setup function is carried out port setting and initialization of communication of the Modbus slave protocol.

void setup()

{

delay(5000);

Serial.begin(9600);

Serial.println(“Started”);

pinMode(D0, OUTPUT);

pinMode(D1, INPUT);

pinMode(R0, OUTPUT);

pinMode(A0_, INPUT);

ControllinoModbusSlave.begin( 19200 ); // Start the communication over the ModbusRTU protocol. Baud rate is set at 19200.

Serial.begin(9600);

}

// The loop function runs over and over again forever

void loop()

{

// This instance of the class Modbus checks if there are any incoming data.

// If any frame was received. This instance checks if a received frame is Ok.

// If the received frame is Ok the instance poll writes or reads corresponding values to the internal registers

// (ModbusSlaveRegisters).

// Main parameters of the instance poll are address of the internal registers and number of internal registers.

ControllinoModbusSlave.poll(ModbusSlaveRegisters, 8);

// While are not received or sent any data, the Modbus slave device periodically reads the values of analog and

// digital outputs.

// Also it updates the other values of registers.

analogWrite(D0, ModbusSlaveRegisters[0]);

digitalWrite(R0, ModbusSlaveRegisters[2]);

ModbusSlaveRegisters[1] = digitalRead(D1);

ModbusSlaveRegisters[3] = analogRead(A0_);

}

 

Finalmente asegurarnos de que los dispositivos están conectados como se muestra en el diagrama de la primera imagen de este blog y realizar la prueba.

 

En Logicbus contamos con información amplia para lograr expandir las aplicaciones en las que puede usar sus PLCs de Controllino. Esperamos con mucho gusto sus dudas y agradecemos su atención.

 

Contáctanos

ventas@logicbus.com | soporte@logicbus.com | 55-5431-67-18 | Iniciar conversación

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *