Ir al contenido

← Todas las funcionalidades

Seguidores solares de dos ejesRaspberry PLC 21TCP socketComunicación

Unir un lazo de control en Python con Node-RED por sockets TCP locales

Cuando la lógica de control vive en Python y el HMI vive en Node-RED en el mismo PLC, necesitas un puente limpio entre los dos procesos. Este ejemplo, procedente de un despliegue real de seguidor solar de dos ejes, usa dos sockets TCP locales en un Raspberry PLC 21: el puerto 8181 transmite las posiciones de los encoders al dashboard de Node-RED una vez por segundo, mientras que el puerto 8182 recibe los comandos start, stop y exit desde los botones del dashboard — sin broker, sin ficheros y sin polling.

Dos puertos, dos direcciones

Mezclar telemetría y comandos en un solo socket te obliga a multiplexar y parsear en ambos sentidos. Separarlos mantiene cada lado trivial: el servidor de datos solo escribe y el servidor de comandos solo lee. Ambos se enlazan a 127.0.0.1, así que nada es accesible desde fuera del PLC — la exposición de red de este mecanismo entre procesos es exactamente cero, sin reglas de firewall que mantener.

Un protocolo de un carácter

Cada muestra de encoder es una línea como e1234 o a567: un prefijo para el eje (elevación o azimut) seguido de la posición bruta y un salto de línea. En Node-RED, un nodo switch sobre el primer carácter enruta cada flujo a su indicador. El texto orientado a líneas se depura con netcat desde cualquier terminal y es inmune a los problemas de lecturas parciales gracias al framing por salto de línea en ambos extremos.

Hilos y eventos compartidos

Cada servidor corre en su propio hilo daemon, y el lazo de control lee dos flags threading.Event: uno para seguimiento activo y otro para apagado. Los comandos que llegan por TCP simplemente activan o desactivan estos eventos, de modo que el dashboard nunca toca directamente la lógica del motor. La reconexión se resuelve simplemente aceptando de nuevo tras un broken pipe, así que el puente sobrevive sin problemas a los reinicios y redespliegues de Node-RED.

Un fragmento de la implementación

Tal cual del ejemplo desplegado en el Raspberry PLC 21 — cópialo libremente:

def read_elevation_encoder():
    """Stub: on the real tracker, encoder.sdo['position_value'].raw."""
    return int(time.time()) % 750          # simulation 0..749 (0..75.0 deg)

El ejemplo completo es un programa entero — cabecera de conexionado, setup y bucle principal — listo para adaptar a tu aplicación.

Preguntas frecuentes

¿Por qué sockets TCP en lugar de MQTT entre Python y Node-RED?

Ambos procesos corren en la misma máquina, así que un broker añade una dependencia y un modo de fallo sin aportar ningún beneficio. TCP en localhost es un import en Python y un nodo integrado en Node-RED, con latencias de microsegundos.

¿Cómo parsea Node-RED los mensajes e1234?

Un nodo tcp-in en modo stream con delimitador de salto de línea emite un mensaje por línea. Un nodo function o switch comprueba el primer carácter para distinguir elevación de azimut, y el resto de la cadena es la posición numérica.

¿Qué le pasa al lazo de control si el dashboard se desconecta?

Nada. El hilo de datos captura el broken pipe, cierra la conexión y espera al siguiente accept, mientras el seguimiento continúa. El dashboard es un observador y una fuente de comandos, nunca una dependencia de la lógica de seguridad.

Funcionalidades relacionadas