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:
- 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.
- 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.
- Gestión de la reconexión. El programa debe gestionar con elegancia las desconexiones del broker sin bloquear la lógica de control.
- 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:
- ¿Tiene el PLC un servidor OPC UA que puedas activar? Usa la opción 1 con OPC UA.
- ¿Es aceptable PUT/GET según tu política de seguridad? La opción 1 con comunicación S7 es rápida y barata.
- ¿Necesitas datos dirigidos por eventos definidos en la lógica del PLC? Opción 2.
- ¿Están bloqueados los ajustes del controlador pero se acepta un cambio de hardware? Opción 3.
- ¿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.



