IoT industrial

PROFINET a MQTT: opciones de gateway para llevar datos de bus de campo a la nube

PROFINET IO es cíclico, de tiempo real y centrado en el controlador, así que no se puede sondear sin más como Modbus. Compara las formas prácticas de llevar datos PROFINET a MQTT, con un ejemplo funcional que lee un PLC Siemens y publica en un broker.

Red PROFINET con PLC, variadores y E/S y un gateway de borde que envía datos de PROFINET a MQTT a un broker en la nube
Pruébalo en tu propio broker MQTTConsigue un broker MQTT privado y gestionado con el plan Free y empieza con ejemplos de código listos para usar.
Pruébalo gratis Ejemplos de código Sin tarjeta

Pasar de PROFINET a MQTT es una pregunta que se hacen muchos equipos de automatización en cuanto quieren datos de máquina en dashboards o en la nube, y la respuesta es menos evidente que con Modbus u OPC UA. Esta guía explica por qué los datos PROFINET no se pueden sondear sin más, compara las cuatro opciones prácticas de gateway y recorre un ejemplo funcional que lee valores de proceso de un controlador Siemens S7 y los publica en un broker MQTT. Al terminar sabrás qué opción encaja en tu planta y a qué debes prestar atención.

Por qué PROFINET es diferente

PROFINET IO es un estándar de Ethernet industrial para el intercambio cíclico en tiempo real entre un IO controller (normalmente un PLC) y los IO devices (E/S remotas, variadores, terminales de válvulas, sensores). El controlador establece relaciones de aplicación con cada dispositivo según la configuración hardware de la herramienta de ingeniería y luego intercambia datos de proceso con un ciclo fijo, a menudo de pocos milisegundos. Las alarmas y los datos de registro acíclicos viajan en paralelo.

Tres propiedades importan para la integración con MQTT:

  • El controlador es el dueño de los dispositivos. Un IO device intercambia datos cíclicos con el controlador para el que se configuró. Un cliente cualquiera de la red no puede pedirle a un variador su velocidad como un maestro Modbus le pide un registro a un medidor.
  • Los datos de proceso son bytes en bruto. Los datos cíclicos son un bloque de bytes de entrada y salida cuyo significado se define en el proyecto del PLC y en los archivos de descripción del dispositivo (GSDML), no en el cable.
  • La red de tiempo real es un recurso valioso. Añadir tráfico o dispositivos a una red PROFINET debe planificarse con el ingeniero de control, nunca improvisarse.

La consecuencia práctica: en casi todos los casos, la mejor fuente de datos PROFINET es el PLC que ya controla los dispositivos, porque tiene los datos, el contexto y los nombres.

Las cuatro opciones de PROFINET a MQTT

Opción Cómo funciona Ventajas Inconvenientes Encaje típico
1. Leer el PLC desde un gateway de borde El gateway lee la memoria del PLC con su protocolo nativo o su servidor OPC UA y publica por MQTT Sin cambios en la red PROFINET; usa los nombres de tags existentes Sondeo; puede requerir cambiar ajustes del PLC (permisos de acceso, OPC UA activado) La mayoría de plantas existentes
2. El propio PLC publica MQTT Una librería cliente MQTT del fabricante se ejecuta en el programa del PLC Sin hardware adicional; datos publicados al cambiar según la lógica del PLC Esfuerzo de programación del PLC; carga de CPU y gestión de TLS en el PLC Proyectos nuevos o cuando la programación del PLC es interna
3. Gateway PROFINET device Un gateway aparece como IO device en la configuración del PLC; el PLC escribe datos en su área de E/S y el gateway publica MQTT Interfaz cíclica limpia; nadie sondea el PLC Requiere cambio de configuración hardware y una descarga al PLC Plantas que prefieren gateways hardware con una interfaz fija
4. Monitorización pasiva Un tap o puerto espejo captura tramas PROFINET para diagnóstico Sin cambios en el controlador Significado de los datos desconocido sin el proyecto; no es un método de integración de datos Solo diagnóstico de red

La opción 4 aparece porque surge en las conversaciones, pero es una técnica de diagnóstico, no una forma sólida de construir una canalización de datos. El resto de la guía se centra en las tres primeras.

Opción 1: leer el PLC desde un gateway de borde

Es el enfoque menos intrusivo y el que eligen la mayoría de equipos para empezar. El gateway se sitúa en la red de planta, lee valores del PLC y los publica por MQTT. En controladores Siemens hay dos vías de acceso habituales:

  • Servidor OPC UA. Los controladores S7-1500 (y los S7-1200 con firmware reciente) pueden ejecutar un servidor OPC UA. Lo activas en la configuración hardware y eliges qué tags exponer. Después, el gateway usa un cliente OPC UA, como en nuestro tutorial de gateway OPC UA a MQTT. Es la vía preferida cuando está disponible: segura, simbólica y con soporte.
  • Comunicación S7 (PUT/GET). Librerías de código abierto como python-snap7 leen bloques de datos por dirección. En S7-1200 y S7-1500, esto requiere activar el acceso PUT/GET en los ajustes de protección de la CPU y configurar el bloque de datos con acceso no optimizado para que los offsets de bytes sean fijos. Activar PUT/GET reduce el nivel de protección de la CPU, así que acuérdalo con quien sea responsable de la seguridad del PLC.

Otros fabricantes con controladores PROFINET ofrecen opciones similares, normalmente un servidor OPC UA o un protocolo de lectura propio.

Ejemplo: de bloque de datos S7 a MQTT con python-snap7

Supongamos que el programador del PLC ha creado un bloque de datos no optimizado DB10 que reúne los valores a compartir, un patrón habitual y recomendado llamado bloque de interfaz:

Offset Nombre Tipo
0.0 LineSpeed Real
4.0 MotorCurrent Real
8.0 GoodCount DInt
12.0 Running Bool
12.1 Fault Bool
pip install python-snap7 "paho-mqtt>=2.0"
# s7_profinet_mqtt.py - read an S7 interface DB and publish to MQTT
import json, logging, time, uuid
import paho.mqtt.client as mqtt
import snap7
from snap7.util import get_real, get_dint, get_bool

logging.basicConfig(level=logging.INFO)
log = logging.getLogger("s7")

PLC_IP, RACK, SLOT = "192.168.0.10", 0, 1   # S7-1200/1500: rack 0, slot 1 is typical
DB_NUMBER, DB_SIZE = 10, 14
TOPIC_ROOT = "connectmq/demo/p3x8/plant1/assembly/line3"   # your own random id
MQTT_HOST, MQTT_PORT = "broker.connectmq.com", 1883        # production: 8883 with TLS
MQTT_USER, MQTT_PASS = None, None                          # production: "YOUR_USERNAME", "YOUR_PASSWORD"
CLIENT_ID = f"s7-bridge-{uuid.uuid4().hex[:8]}"            # production: "YOUR_CLIENT_ID"


def decode(buf):
    return {
        "line_speed": round(get_real(buf, 0), 2),
        "motor_current": round(get_real(buf, 4), 2),
        "good_count": get_dint(buf, 8),
        "running": get_bool(buf, 12, 0),
        "fault": get_bool(buf, 12, 1),
    }


def main():
    mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
    if MQTT_USER:
        mq.username_pw_set(MQTT_USER, MQTT_PASS)
        mq.tls_set()
    mq.will_set(f"{TOPIC_ROOT}/bridge", "offline", qos=1, retain=True)
    mq.on_connect = lambda c, u, f, rc, p: c.publish(f"{TOPIC_ROOT}/bridge", "online", qos=1, retain=True)
    mq.connect(MQTT_HOST, MQTT_PORT, keepalive=30)
    mq.loop_start()

    plc = snap7.client.Client()
    last = {}
    while True:
        try:
            if not plc.get_connected():
                plc.connect(PLC_IP, RACK, SLOT)
                log.info("connected to PLC %s", PLC_IP)
            values = decode(plc.db_read(DB_NUMBER, 0, DB_SIZE))
            ts = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
            for name, value in values.items():
                if last.get(name) != value:            # publish on change only
                    mq.publish(f"{TOPIC_ROOT}/{name}",
                               json.dumps({"value": value, "ts": ts}), qos=1, retain=True)
                    last[name] = value
        except Exception as exc:                       # snap7 raises RuntimeError on comms errors
            log.error("PLC read failed: %s", exc)
            plc.disconnect()
            time.sleep(5)
        time.sleep(1)


if __name__ == "__main__":
    main()

Para valores analógicos que fluctúan constantemente, añade una banda muerta para que el puente no publique cada cambio mínimo; nuestra guía de report by exception muestra cómo hacerlo. Para ver el resultado, suscríbete en el servidor MQTT público gratuito, teniendo en cuenta que cualquiera puede leerlo, así que usa solo datos de prueba:

mosquitto_sub -h broker.connectmq.com -p 1883 -i s7-viewer-p3x8 -t "connectmq/demo/p3x8/#" -v

Opción 2: dejar que el PLC publique MQTT directamente

Varios fabricantes de PLC ofrecen bloques de función de cliente MQTT. En Siemens S7-1500 y S7-1200, por ejemplo, existe para TIA Portal una librería de cliente MQTT que se apoya en la comunicación abierta (open user communication) de la CPU con soporte TLS. El programa del PLC decide entonces exactamente cuándo publicar, lo que es ideal para datos dirigidos por eventos, como finalizaciones de lote o alarmas.

Aspectos que hay que planificar:

  1. Certificados. Para TLS, la CPU debe confiar en la CA del broker. El broker usa un certificado de Let's Encrypt, así que carga el certificado raíz correspondiente en el almacén de certificados del PLC.
  2. Carga de CPU y de comunicación. Publicar muchos valores a alta frecuencia desde el PLC compite con las tareas de control. Publica resúmenes y eventos, no cada ciclo de escaneo.
  3. Gestión de la reconexión. El programa debe gestionar con elegancia las desconexiones del broker sin bloquear la lógica de control.
  4. Gestión de cambios. Cada cambio de topic o de payload implica una descarga al PLC. Mantén sencillo el lado del PLC y haz el mapeo más pesado aguas abajo.

Nuestro artículo Siemens S7 MQTT profundiza en la configuración del lado del PLC.

Opción 3: un gateway PROFINET device

Varios fabricantes venden gateways hardware que actúan como IO device PROFINET por un lado y como cliente MQTT por el otro. Importas el archivo GSDML del gateway en la herramienta de ingeniería, lo añades a la configuración hardware y mapeas los datos del PLC en su área cíclica de entradas/salidas. El gateway convierte esos bytes en mensajes MQTT según su propia configuración.

Esto proporciona una interfaz limpia y determinista: el PLC simplemente copia valores en el área de salida del gateway en cada ciclo y nadie sondea el PLC. Las contrapartidas son un cambio de hardware, una descarga al PLC para añadir el dispositivo y un segundo lugar (la interfaz web del gateway) donde vive el mapeo de datos. Encaja en plantas con normas estrictas que prohíben activar PUT/GET u OPC UA en los controladores.

Cómo elegir la opción adecuada

Usa esta lista con el ingeniero de control:

  1. ¿Tiene el PLC un servidor OPC UA que puedas activar? Usa la opción 1 con OPC UA.
  2. ¿Es aceptable PUT/GET según tu política de seguridad? La opción 1 con comunicación S7 es rápida y barata.
  3. ¿Necesitas datos dirigidos por eventos definidos en la lógica del PLC? Opción 2.
  4. ¿Están bloqueados los ajustes del controlador pero se acepta un cambio de hardware? Opción 3.
  5. ¿Es un piloto en una sola línea? Empieza con la opción 1; siempre podrás pasar a la 2 o la 3 al escalar.

Elijas lo que elijas, da a los datos una estructura de topics de estilo ISA-95 para que los valores procedentes de PROFINET convivan con los de Modbus, EtherNet/IP y OPC UA en un mismo namespace; consulta nuestra guía de topics MQTT ISA-95.

El lado del broker

Las tres opciones terminan con un cliente MQTT publicando en un broker, así que la elección del broker es independiente del protocolo de campo. Un broker MQTT gestionado como ConnectMQ admite MQTT 3.1.1 y 5.0 sobre TLS en el 8883, detecta topics ISA-95 y de Unified Namespace y los muestra en un explorador de topics en vivo y en una vista de dispositivos organizada por niveles ISA-95. Las reglas de alerta por umbral pueden avisar de un bit de fallo o de una corriente de motor por encima de su límite sin código adicional. Con los datos de la línea ya en un namespace ISA-95, alimentar un gemelo digital 3D de una planta en Querétaro o en Bilbao es cuestión de suscribirse a los mismos topics. Para la arquitectura de referencia completa, lee la guía de MQTT para IoT industrial.

Empieza con ConnectMQ

Elige tu vía PROFINET y deja que el broker sea la parte fácil. Regístrate en app.connectmq.com, elige el plan Serverless gratuito (sin tarjeta de crédito), crea un broker y usa el usuario, la contraseña y el client ID generados en tu gateway o en el cliente MQTT del PLC. Los datos de tu línea serán visibles en el portal de ConnectMQ en cuestión de minutos.

Preguntas frecuentes

¿Puede un gateway MQTT leer directamente dispositivos PROFINET?

No como un maestro Modbus sondea un medidor. Los IO devices PROFINET intercambian datos cíclicos con su controlador configurado, así que los gateways o bien leen el controlador o bien se configuran ellos mismos como IO devices.

¿Es seguro activar PUT/GET en un S7-1200 o S7-1500?

Reduce la protección de acceso de la CPU, así que debe ser una decisión deliberada y documentada, con segmentación de red. Cuando está disponible, el servidor OPC UA del PLC es la alternativa más segura.

¿Necesito archivos GSDML para un gateway de PROFINET a MQTT?

Solo para la opción 3, en la que el gateway se añade a la configuración hardware del PLC como IO device. Leer el PLC mediante OPC UA o comunicación S7 no los requiere.

¿Leer el PLC afecta al rendimiento de tiempo real de PROFINET?

Las lecturas van a la interfaz de comunicación de la CPU, no al intercambio cíclico de E/S, y un sondeo moderado tiene poco impacto. Mantén frecuencias de sondeo razonables y lee bloques de interfaz compactos.

Artículos relacionados

Todos los artículos →

Tu broker MQTT privado, a unos pocos clics

Crea una cuenta, obtén las credenciales de tu broker y conecta tu primer dispositivo, sin servidores que instalar, parchear ni escalar.