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.serviceAntes 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-librpiplcAbre Node-RED en el navegador en http://<PLC-IP>:1880 (usa https solo si has activado TLS). La primera vez verás el editor:

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

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.

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:

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.

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

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.

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 mosquittoAquí 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í:
6.4. Configuración de los nodos
- Button: configura el payload con la cadena
Hello. - 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.

- MQTT in: Action Subscribe to single topic, Topic
testTopic, QoS 2, Output a String. El servidor ya está definido por el nodo anterior. - 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 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.
No hay comentarios por ahora.