Gateway: ESP8266 Modbus RTU MQTT + HMI Industrial Panasonic

Dado el crecimiento de aplicaciones IoT utilizando el protocolo MQTT como base y la plataforma Node-RED, hemos creado una posibilidad para dispositivos industriales o dispositivos que utilicen protocolo Modbus RTU (RS232 o RS485) para interactuar con las aplicaciones o plataformas IoT que utilicen MQTT en este caso Node-RED.






En la industra existen gran cantidad de Dispositivos de Monitoreo y control que cuentan con Modbus RTU tales como Contadores, Medidores (Flujo, consumo electrico, Temperatura, Humedad, etc), Controladores Industriales PLC, PAC, Pantallas HMI, Variadores de velocidad entre otros,  para los cuales la unica posibilidad de extraer y concentrar datos atravez de servidores OPC.

Hemos configurado un Modulo ESP8266 12E NodeMCU como Maestro Modbus RTU serial via RS232 (CHIP MAX232) para solicitar y enviar datos a una Pantalla Industrial GT01 Marca panasonic, la referencia que tengo se alimenta a 5V, El mismo modulo ESP esta configurado como cliente MQTT, la rutina creada en Arduino IDE realiza un puente entre registros de lectura y escritura Modbus en este caso “Holding Registers” y por la parte MQTT topicos de suscripcion y publicacion.

trialcommand.com

Dado que el modulo ESP8266 cuenta con un  puerto serial, hemos utilizado la libreria softwareserial para crear un segundo puerto que se utilizara solo para Modbus RTU permitiendo la programacion y depuracion sin interrumpir fisicamente  la comunicacion modbus, adicionamos un integrado MAX232 para la conversion del protocolo a RS232.

Referencias Recomendadas

trialcommand.com

En este caso especifico la prueba que realizaremos tendrá como base utilizar un dispositivo industrial, conectaremos una Pantalla  HMI GT01 marca Panasonic configurada como esclavo Modbus RTU (RS232) con software GTWIN, por que una pantalla? seria muy aburrido y simple utilizar un simulador y queremos implementar hardware real.

Referencias Recomendadas

trialcommand.com

Pruebas

Hemos realizado 2 pruebas una para presentación y otra para explicación :

1 – Prueba Rapida HMI Panasonic y Node-RED Dashboard

  • Utilizamos solo 2 registros modbus 1 para lectura y otro para escritura.
  • Realizamos visualización y control con dashboard.

2- Explicación Completa y prueba 10 Lectura 10 escritura

  • Utilizaremos 10 registros de lectura y 10 de escritura entre Node-RED y la HMI.
  • Explicaremos los métodos de envió y recepción en Node-red.

Prueba Rapida HMI Panasonic y Node-RED Dashboard

En este ejemplo la HMI esta configurada como esclavo modbus rtu solo utilizaremos  2 registros disponibles:

  • Holding Register[0] – Leer
  • Holding Register[10] – Escribir

En Node-RED se ha creado un dashboard y  se han configurado previamente 2 nodos MQTT asignados a Topicos de envio y recepción ajustado al codigo en ESP8266.

El valor ingresado en la pantalla sera enviado a un Topico MQTT y el valor enviado desde Node-RED por un tópico llegara a un registro de la pantalla.

Descargas: codigo arduino en la parte inferior

Node-RED

Recepcion de  Registros Holding Register desde MQTT

Se recibe el Holding Register[0] en un nodo de suscripcion MQTT y el valor de manera individual y se envia a 2  Widgets Nodo Text y Nodo Gauge para visualizacion en Dashboard.

Nota: Explicación completa mas  mas abajo “Recepcion Node-RED desde HMI Panasonic

Envio de Registros via MQTT hacia Holding Registers

Agregamos un widget Nodo slider configurado para envia un valor de 0 a 1000 el cual conecta con el nodo de publicacion MQTT para enviar el valor en el Holding register [10] y conecta con el nodo Gauge para visualizar el cambio desde el dashboard.

Nota: Explicación completa mas  mas abajo “Envio desde Node-RED Hacia HMI Panasonic”

Configuracion Dashboard

Orden de widgets para visualizacion y control.

Node-RED Dashboard

trialcommand.com

Explicación Completa

El siguiente vídeo realizara la explicación completa de la conexión utilizando 20 registros:

 

Diseño HMI GT01 Panasonic en GTWIN

La pantalla esta configurada como esclava Modbus RTU conexion RS232, Previamente en la Pantalla GT01 se han diseñado 2 pantallas el software de Configuracion GTWIN :

  1.  Lectura de 3 Holding Registers [0][1][2] desde 3 registros MQTT.
  2. Escritura de 3 Holding Registers [10][11][12] hacia 3 registros MQTT.

trialcommand.com

Node-RED

En la prueba anterior solo utilizamos 2 registros en este nuevo caso utilizaremos 10 registros de lectura y 10 registros de escritura

Configuración de Cliente MQTT en Node-RED

En este caso previamente hemos instalado el Broker MQTT “Mosquitto” instalado en mi servidor (Lubuntu) Linux, a ese broker MQTT conectan Node-RED y el modulo ESP8266.

Esta es la configuración de la conexion MQTT de Node-red  para conectar con mosquito y por ende con el ESP8266.

trialcommand.com

Envio desde Node-RED Hacia HMI Panasonic

Se ha utilizado un Nodo inject “Send 10 Registers” el cual contiene un 10 valores separados por comas“,”   ejemplo:“1,2,3,4,5,6,7,8,9,10,”  Nota: tener en cuenta que modbus maneja enteros de 16 bits para no enviar valores de mayor tamaño.

Se conecta  al nodo de publicación MQTT“MQTT_Holding_Array- Holding Registers [0] – Holdin Registers [9]”   y se enviaran 10 valores a los 10 primeros holding registers en la pantalla.

Recepcion Node-RED desde HMI Panasonic

Hemos creado 2 metodos de recepción de datos desde el Modulo ESP8266:

Recepcion grupal 10 registros  un solo topico MQTT

En este caso para la recepción se utiliza un Nodo de suscripción MQTT “Holding_to_MQTT_Array  – Holding Register [10] … Holding Register [19]”  y el topico Holding_to_MQTT_Array  y recibira todos los 10 registros de la siguiente forma 1,2,3,4,5,6,7,8,9,10.

Recepcion individual 1 registro 1 topico MQTT

Dado que en ciertos casos se requiere que un valor se actualice mas rapido que otros, se ha creado manera que el ESP8266 envie en 1 solo topico el valor de 1 solo holding register en especifico, cada nodo de suscripcion MQTT solicitara de manera individual, ejemplo Nodo “Holding Register [10]” y el topico  “”Holding_to_MQTT_1.

 Arduino IDE

El codigo integra 2 tutoriales realizados anteriormente, ESP8266 como cliente MQTT y ESP8266 como Maestro Modbus RTU Via RS232.

  1. El primer caso requiere la libreria < PubSubClient > la que permite ser cliente MQTT.
  2. El segundo caso requiere la libreria < ModbusMaster232. > para modbus y la libreria  < SoftwareSerial.h < para emular el puerto serial para modbus.

Nota Importante: Para conprender correctamente el siguiente código recomendamos primero ver los siguientes tutoriales:

Este ejemplo envia Lee 10 registros y escribe en 10 registros Modbus RTU,

NOTA:En la parte interior Link de descargas de codigo Arduino IDE.

Recepcion MQTT y envio a Esclavo Modbus RTU

la recepción de topicos MQTT desde Node-red es realizado por la funcion callback , en resumen:

  1. Esp8266 se suscribe al topico ” MQTT_Holding_Array”.
  2. Node-RED  publica en el topico “Holding_to_MQTT_Array” y envia 1,2,3,4,5,6,7,8,9,10, en un String.
  3. funcion callback recibe String y un bucle for divide los valores separados por comas”,” y almacena cada valor en el array de Strings MQTT_to_Holding[ ].
  4. el valor en el array se convierte a int y se envia al esclavo modbus de la siguiente manera ejemplo  node.writeSingleRegister(0, MQTT_to_Holding[0].toInt()); para el Holding Register[0] .

Fragmento de codigo funcion callback

Lectura de Registros Modbus y envio MQTT

Se realiza una unica lectura de registros pero existen 2 metodos de envio MQTT (individual y grupal) mencionados anteriormente en “Recepcion Node-RED desde HMI Panasonic”.

Se debe tener en cuenta que para la lectura Modbus se utilizan unos delay para lectura de los registros delay(tdelay); de 5 ms este valor variara dependiendo de la cantidad de registros a solicitar.

Combinamos 2 pasos:

  1.  Lectura de registros  Modbus (Holding Registers).
  2.  Envio via topico MQTT grupal ej: “Holding_to_MQTT_Array” y envio via topicos MQTT individuales  ej: “Holding_to_MQTT_1”.

Fragmento de código Lectura de Holding Register [10] y envio MQTT topico “Holding_to_MQTT_1”

Código Completo





Conexiones

ESP8266 12E NodeMCU Lolin (Conexion a MAX232)

 

trialcommand.com

Convertidor MAX232 (RS232)

trialcommand.com

Recomendaciones para implementacion

  • Utilizar velocidad de Comunicación Serial 9600 bauds.
  •  Dependiendo de la cantidad de registros modbus leidos se debe modificar la variable tdelay, la cual dada un tiempo para la lectura y borrado del buffer modbus,  si se presentan fallos de lectura modbus, no superar 10 registros solicitados, aun estamos optimizando las lecturas modbus y tener en cuenta que se utiliza softwareserial emula un puerto serial.
  • Existe otra posibilidad de fallo en este caso estamos realizando un envio constante de registros tanto mqtt como modbus, seria recomendable  solo enviar o recibir registros MQTT de requerirse, no en todo momento como en este caso.

Conclusiones

En la industrial hemos visto dispositivos tales como ejemplo medidores de consumo electrico Modbus RTU , y  agregando un ESP8266 y un convertidor TTL a (RS232 RS485 o RS485 ) podriamos monitorear nuestros valor de consumo electrico sin requerir un OPC u Hardware especifico, como mencionamos anteriormente el protocolo MQTT ha sido implementado en gran variedad de aplicaciones IoT y  en la actualidad existen una gran variedad de plataformas  tanto locales como en la Nube que podrian albergar nuestros datos.

Para tener en cuenta, si se quieren implementar las pruebas realizadas  descritas arriba en un proyecto real, detallamos no hemos realizado pruebas 24/7 al hardware  esp8266 , se debe tener en cuenta materiales (pcb, soldadura,cableado), protecciones electricas, aislamiento electrico, temperatura del ambiente, potencia señal Wifi, entre otras variables, pero consideramos que para  aplicaciones de automatización  basica  teniendo en cuenta lo mencionado anteriormente funcionaria correctamente.

Referencias

Descargas

Codigo Arduino IDE
Node RED




 

Deja un comentario