Ir al contenido

Node-RED en el Raspberry PLC: flujos, E/S y dashboard MQTT

Lección 5: Node-RED en el Raspberry PLC

Node-RED te permite construir lógica de automatización conectando nodos en un navegador en lugar de escribir código. En un Raspberry PLC es una forma rápida de leer E/S, comunicarse por Modbus o MQTT y publicar un dashboard para el operador. En esta lección construyes tres flujos de complejidad creciente, desde un primer flujo "hello" hasta un dashboard conectado a un broker MQTT.

Al final de esta lección sabrás:

  • Explicar los nodos, los flujos y los mensajes, los tres conceptos en los que se basa toda aplicación de Node-RED.
  • Leer y escribir las E/S digitales y analógicas del PLC desde un flujo.
  • Construir un dashboard que publica y se suscribe a través de un broker MQTT.
  • Proteger el editor de Node-RED antes de llevarlo a una planta.

1. ¿Qué es Node-RED?

Node-RED es una herramienta de programación visual de código abierto. Creas flujos conectando nodos que representan dispositivos, API y servicios, en una interfaz gráfica que se ejecuta en el navegador. Se usa mucho en automatización industrial, procesamiento de datos e IIoT, y es especialmente útil cuando tienes que integrar distintos dispositivos y servicios con poco o ningún código.

Hay tres conceptos importantes:

  • Nodo: el bloque básico. Tiene como máximo una entrada y tantas salidas como necesite. Se ejecuta cuando recibe un mensaje o un evento externo (un temporizador, un clic) y puede enviar un mensaje a su salida.
  • Flujo: un espacio del editor donde organizas nodos y conexiones y defines la secuencia de acciones de tu aplicación.
  • Mensaje: el objeto que se pasa entre nodos. Transporta la información que los nodos usan para actuar, decidir o transformar datos.

2. El objetivo de esta lección

Crearás tres flujos. El primero es una introducción con un nodo Inject, uno Function y uno Debug. El segundo lee y escribe las E/S del PLC. El tercero crea un dashboard que usa MQTT como back end, mucho más cercano a una aplicación real.

3. Cómo instalar Node-RED

Node-RED ya está instalado si ejecutaste el script install.sh. Comprueba que se está ejecutando:

systemctl status nodered.service

Antes que nada, la librería C++ rpiplc debe estar instalada en tu Raspberry PLC (github.com/Industrial-Shields/rpiplc-lib). Para usar las E/S desde Node-RED también necesitas el paquete @industrial-shields/node-red-librpiplc:

cd ~/.node-red
npm install @industrial-shields/node-red-librpiplc

Abre Node-RED en el navegador en http://<PLC-IP>:1880 (usa https solo si has activado TLS). La primera vez verás el editor:

Editor de Node-RED con la paleta de nodos, las pestañas de flujos y el área de trabajo

  • A la izquierda, la Node Palette contiene todos los nodos; usa la barra de búsqueda para encontrar uno rápidamente.
  • Arriba, las pestañas organizan tus flujos y subflujos, para que puedas tener un flujo por proyecto o escenario.
  • En el centro, el Flow Workspace es el lienzo donde construyes y configuras tus flujos arrastrando y soltando.

Protege el editor antes de un despliegue real. Por defecto, cualquiera que llegue al puerto 1880 puede editar los flujos y, por tanto, controlar tus salidas. En ~/.node-red/settings.js activa adminAuth con una contraseña cifrada con bcrypt (la genera el comando node-red-admin hash-pw) y mantén el puerto dentro de la red de control, detrás de un firewall.

4. El primer flujo

4.1. El objetivo

Crearás un mensaje con el número 0 en su payload. Un nodo Function le suma uno y lo envía a un nodo Debug, que imprime el resultado.

  • Nodo Inject: inyecta un mensaje al hacer clic. Aquí inyecta 0 como payload.
  • Nodo Function: ejecuta JavaScript personalizado sobre el mensaje. Aquí suma uno al payload y devuelve el mensaje.
  • Nodo Debug: muestra en el panel de depuración los mensajes que le llegan.

Parece sencillo, pero contiene los bloques básicos de cualquier automatización más compleja.

4.2. Construcción del flujo

Arrastra un nodo Inject, uno Function y uno Debug desde la paleta al área de trabajo. Conecta la salida de Inject a la entrada de Function, y la salida de Function a la entrada de Debug:

Primer flujo: un nodo Inject conectado a un nodo Function conectado a un nodo Debug

4.3. Configuración de los nodos

Haz doble clic en el nodo Inject. Envía un mensaje con un topic (vacío) y un payload (una marca de tiempo). Abre el desplegable del tipo de payload, elige number y escribe 0. El nodo también puede enviar mensajes a intervalos o con propiedades adicionales, que ahora no necesitamos.

Nodo Inject configurado con un payload numérico de 0

Haz doble clic en el nodo Function. Tiene cuatro pestañas:

  • Setup: cambia el número de salidas e importa módulos de JavaScript.
  • On Start: código que se ejecuta una vez cuando el nodo se inicia.
  • On Message: código que se ejecuta cada vez que el nodo recibe un mensaje.
  • On Stop: código que se ejecuta cuando el nodo se detiene o se vuelve a desplegar.

Pon este código en On Message:

msg.payload += 1;
return msg;

El nodo Debug no necesita configuración: imprime el payload por defecto. Abre el panel de depuración, haz clic en Deploy y pulsa el botón a la izquierda del nodo Inject. Deberías ver un 1 en el panel derecho.

Panel de depuración con el valor 1 tras pulsar el botón de Inject

5. El segundo flujo: entradas y salidas del PLC

5.1. El objetivo

Leerás una entrada digital y una analógica y copiarás su estado a las salidas correspondientes, imprimiendo los valores con nodos Debug. Es la misma lógica que en la Lección 2, ahora sin escribir código.

5.2. Construcción del flujo

Arrastra estos nodos al área de trabajo: 1 Inject, 1 Digital Read, 1 Digital Write, 1 Analog Read, 1 Analog Write, 1 Range, 2 Template y 2 Debug.

Los nodos Read y Write vienen del paquete node-red-librpiplc instalado al principio de la lección. Un nodo Read lee la entrada seleccionada cada vez que recibe un mensaje y envía el resultado como payload; un nodo Write fija la salida seleccionada al valor del payload que recibe. El nodo Range escala linealmente entre dos rangos (aquí, de 0-4095 a 0-10 V), y los nodos Template dan formato al payload. Conéctalos como en la imagen:

Segundo flujo con los nodos Digital y Analog Read y Write conectados

5.3. Configuración de los nodos

Configura el nodo Inject para que envíe un mensaje cada 5 segundos (selecciona interval en la casilla Repeat).

Haz doble clic en el nodo Digital Read. Aparece una casilla roja con el texto Add new rpiplc-config; haz clic en el icono del lápiz que hay al lado.

Nodo Digital Read con la casilla rpiplc-config por añadir

En la casilla vacía Model selecciona el modelo de tu PLC y haz clic en Add.

Desplegable Model del nodo rpiplc-config

Ahora elige los pines de cada nodo:

  • Digital Read: I0.0
  • Digital Write: Q0.0
  • Analog Read: I0.7
  • Analog Write: A0.5

En el nodo Range asigna el rango de entrada de 0 a 4095 al rango de destino de 0 a 10. Los nodos Template contienen Digital: {{ payload }} (el superior) y Analog: {{ payload }}V (el inferior).

Despliega el flujo. El panel de depuración muestra los valores digital y analógico, y las salidas siguen a las entradas.

Segundo flujo terminado con el panel de depuración mostrando lecturas digitales y analógicas

Seguridad: un flujo desplegado gobierna salidas reales, así que prueba con las cargas desconectadas.

6. El tercer flujo: dashboard MQTT

6.1. El objetivo

Crearás un dashboard sencillo que usa MQTT como back end. Muestra el último mensaje recibido en el topic testTopic y la hora a la que llegó (en UTC), muestra una notificación cada vez que llega un mensaje y tiene un botón que envía "Hello" al broker. Es el patrón que se usa para llevar datos del PLC a un dashboard de planta.

6.2. Requisitos

Necesitas un broker MQTT. Instala Mosquitto, un broker de código abierto, en el Raspberry PLC:

sudo apt update && sudo apt upgrade
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable mosquitto

Aquí el broker y Node-RED se ejecutan en el mismo PLC, así que Node-RED se conecta a localhost. Si otras máquinas se van a conectar a este broker, exige usuario y contraseña como se explica en la Lección 1.

6.3. Construcción del flujo

Arrastra estos nodos: 1 MQTT in, 1 MQTT out, 1 Button, 2 Text, 1 Show Notification y 1 Change.

Si no encuentras Button, Text y Show Notification, instala la extensión node-red-dashboard: abre el menú, elige Manage palette, ve a la pestaña Install, busca node-red-dashboard e instálala. Aparece un nuevo grupo de nodos Dashboard. (FlowFuse Dashboard, @flowfuse/node-red-dashboard, es el sucesor con mantenimiento activo; sus nodos tienen otros nombres, pero la idea es la misma.)

Los nodos MQTT envían y reciben el payload, y Node-RED gestiona la conexión con el broker. En el dashboard, el nodo Button envía un mensaje cada vez que se hace clic en él, los nodos Text muestran el payload que reciben y el nodo Show Notification muestra una ventana emergente con el mensaje. El nodo Change modifica un payload o añade propiedades; aquí genera la marca de tiempo del último mensaje. Conecta los nodos así:

Tercer flujo: un Button publica en testTopic; un nodo MQTT in alimenta dos nodos Text y una notificación, uno de ellos a través de un nodo Change que añade la marca de tiempo

6.4. Configuración de los nodos

  1. Button: configura el payload con la cadena Hello.
  2. MQTT out: Topic testTopic, QoS 2, Retain true. Haz clic en el icono del lápiz junto a Server y configura el broker como en la figura.

Configuración del broker MQTT en Node-RED

  1. MQTT in: Action Subscribe to single topic, Topic testTopic, QoS 2, Output a String. El servidor ya está definido por el nodo anterior.
  2. Change: crea dos reglas como en la figura. El valor de la segunda regla es $moment(payload).tz("UTC").format('DD-MM-YYYY HH:mm:ss').

Nodo Change con dos reglas para construir la marca de tiempo

  1. Nodo Text conectado a Change: configura Value format como UTC: {{msg.payload}}. El otro nodo Text y el nodo Notification pueden mantener sus valores por defecto.

Despliega el flujo, abre el dashboard y haz clic en el botón: el mensaje va al broker, vuelve a través de la suscripción y aparece con su marca de tiempo.

7. Resolución de problemas

Si Node-RED no arranca desde el terminal e indica que la dirección ya está en uso (EADDRINUSE, puerto 1880), ya hay una instancia en ejecución, normalmente el servicio que se inicia en el arranque. Detenlo con node-red-stop y vuelve a ejecutar node-red, o gestiona el servicio con sudo systemctl restart nodered.service.

Siguiente paso

Has pasado de los fundamentos del PLC a Modbus, MQTT y un dashboard. Combínalos para llevar los datos de campo a tu SCADA, y elige el hardware que se ajuste a tu proyecto en la gama Raspberry PLC en www.industrialshields.com.

Calificación
0 0

No hay comentarios por ahora.

para ser el primero en comentar.