Fabricación inteligente

Integración MES MQTT: órdenes, conteos y calidad orientados a eventos

Sustituye las frágiles interfaces punto a punto del MES por un namespace MQTT orientado a eventos. Aprende la estructura de topics, los contratos de payload y un adaptador funcional para órdenes, conteos y resultados de calidad.

Diagrama de integración MES MQTT con máquinas, un broker MQTT y un sistema de ejecución de manufactura intercambiando órdenes de trabajo y conteos
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

La integración MES MQTT sustituye la maraña de interfaces a medida entre un sistema de ejecución de manufactura (MES) y la planta por un único namespace orientado a eventos. Esta guía muestra cómo estructurar los topics para órdenes de trabajo, conteos de producción y resultados de calidad, qué deben contener los payloads y cómo escribir un pequeño adaptador que conecte un MES a un broker MQTT.

Por qué la integración del MES suele ser la parte más difícil

Un sistema de ejecución de manufactura registra qué se produce, en qué equipo, quién lo produce y con qué resultado. Para ello necesita datos de las máquinas y debe enviarles instrucciones de vuelta. Tradicionalmente esto se resuelve con enlaces punto a punto: una conexión OPC aquí, una tabla de base de datos consultada cada minuto allá, un archivo CSV que el PLC de una línea deja en una carpeta compartida.

Cada enlace funciona por separado, pero juntos generan problemas que cualquier ingeniero de planta reconoce:

  • Añadir un segundo consumidor (un dashboard de OEE, un sistema de mantenimiento) obliga a construir otra interfaz hacia la misma máquina.
  • El sondeo (polling) introduce retardo y carga; un conteo solo es tan reciente como la última consulta.
  • Cuando el MES se actualiza o se reemplaza, todas las interfaces se rompen a la vez.
  • Nadie tiene un único lugar donde ver qué datos fluyen realmente.

Un enfoque orientado a eventos le da la vuelta a esta situación. Las máquinas y los gateways publican lo que ocurre en el momento en que ocurre. El MES se suscribe a los eventos que necesita y publica sus propias decisiones, como una orden de trabajo liberada. Otros sistemas se suscriben a los mismos eventos sin tocar el MES. Si no tienes claro dónde se sitúa el MES respecto al ERP y al SCADA, lee primero MES vs ERP vs SCADA.

Cómo funciona la integración MES MQTT

La pieza central es un broker MQTT al que cada participante se conecta como cliente. Nadie se conecta directamente con nadie más. Tres flujos cubren la mayoría de las necesidades de un MES:

Flujo Dirección Topic de ejemplo QoS típico
Despacho de órdenes de trabajo Del MES a la línea acme/plant1/assembly/line2/mes/order/current 1, retained
Conteos de producción De la máquina al MES acme/plant1/assembly/line2/cell3/count 1
Estado de la máquina De la máquina al MES acme/plant1/assembly/line2/cell3/state 1, retained
Resultados de calidad De la estación de prueba al MES acme/plant1/assembly/line2/qc1/result 1
Confirmación de orden De la línea al MES acme/plant1/assembly/line2/mes/order/ack 1

La ruta del topic sigue la jerarquía de equipos de ISA-95 (empresa, sitio, área, línea, celda), que es la columna vertebral de un Unified Namespace. Los detalles de esa nomenclatura se explican en cómo construir un Unified Namespace.

Dos funciones de MQTT son especialmente importantes para el tráfico del MES:

  • Retained messages. La orden de trabajo actual y el estado actual de la máquina se publican como retained, de modo que una HMI que se reinicia sabe al instante qué debe fabricar sin preguntar al MES.
  • QoS 1. Los conteos y los resultados de calidad no deben perderse, así que se publican con entrega "al menos una vez". Por eso el MES debe gestionar duplicados, normalmente guardando un número de secuencia por publicador.

Contratos de payload que resisten los cambios

Los topics te dicen de dónde viene un evento; los payloads te dicen qué ocurrió. Acuerda un contrato por tipo de evento y versiónalo. Un evento de conteo en el que un MES puede confiar tiene este aspecto:

{
  "schema": "count/v1",
  "ts": "2026-10-16T08:42:13.512Z",
  "seq": 18233,
  "orderId": "WO-2026-04417",
  "material": "HSG-220-B",
  "good": 1,
  "scrap": 0,
  "source": "cell3-plc"
}

Unas pocas reglas mantienen estos contratos robustos:

  1. Envía incrementos o totales, no ambos. Los incrementos con número de secuencia son fáciles de deduplicar; los totales son fáciles de recuperar tras un hueco. Elige uno por señal y documéntalo.
  2. Incluye el ID de la orden. La línea ya conoce la orden activa gracias al topic retenido de la orden, así que estamparlo en cada evento le ahorra al MES una consulta y evita conteos mal atribuidos en el cambio de orden.
  3. Pon la marca de tiempo en el origen, en UTC y con milisegundos.
  4. Incluye un campo de esquema para que los consumidores puedan gestionar count/v2 sin romperse.

Un adaptador MES funcional en Python

La mayoría de los productos MES exponen una API REST o una interfaz de base de datos, no MQTT. Un pequeño adaptador hace de puente entre ambos: se suscribe a los eventos de planta y llama al MES, y publica las decisiones del MES de vuelta en el namespace. El ejemplo siguiente usa paho-mqtt 2.x y una función de marcador post_to_mes que debes sustituir por la llamada a la API de tu MES.

import json
import uuid

import paho.mqtt.client as mqtt

LINE = "connectmq/demo/mes-5c21/line2"   # en producción, usa la ruta ISA-95 completa
last_seq = {}

def post_to_mes(kind, event):
    # Sustitúyelo por una llamada a la API de tu MES, p. ej. requests.post(...)
    print(f"MES <- {kind}: {event}")

def release_order(client, order_id, material, quantity):
    order = {"schema": "order/v1", "orderId": order_id,
             "material": material, "quantity": quantity, "status": "RELEASED"}
    client.publish(f"{LINE}/mes/order/current", json.dumps(order), qos=1, retain=True)

def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(f"{LINE}/+/count", qos=1)
    client.subscribe(f"{LINE}/+/state", qos=1)
    client.subscribe(f"{LINE}/+/result", qos=1)
    client.subscribe(f"{LINE}/mes/order/ack", qos=1)
    release_order(client, "WO-2026-04417", "HSG-220-B", 500)

def on_message(client, userdata, msg):
    event = json.loads(msg.payload)
    kind = msg.topic.rsplit("/", 1)[-1]
    source = msg.topic.split("/")[-2]
    seq = event.get("seq")
    if seq is not None:
        key = (source, kind)
        if seq <= last_seq.get(key, -1):
            return  # duplicado por una reentrega QoS 1
        last_seq[key] = seq
    post_to_mes(kind, {"source": source, **event})

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
                     client_id=f"mes-adapter-{uuid.uuid4().hex[:8]}")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=30)
client.loop_forever()

Pruébalo contra el servidor MQTT público gratuito publicando un conteo desde la línea de comandos:

mosquitto_pub -h broker.connectmq.com -p 1883 -i cell3-test-5c21 -q 1 \
  -t "connectmq/demo/mes-5c21/line2/cell3/count" \
  -m '{"schema":"count/v1","seq":1,"orderId":"WO-2026-04417","good":1,"scrap":0}'

Publica el mismo mensaje dos veces y el adaptador lo reenviará solo una. Recuerda que cualquiera puede leer el servidor público, así que usa únicamente números de orden inventados y nunca datos de producción.

En producción, guarda el estado de deduplicación (last_seq) en un almacenamiento duradero, ejecuta el adaptador con una sesión persistente para que reciba los eventos encolados mientras se reinicia y dale sus propias credenciales.

Patrones de integración y errores habituales

Los comandos necesitan confirmaciones. Cuando el MES libera una orden, la línea debe publicar una confirmación con el ID de la orden y su estado (aceptada, rechazada, iniciada). Sin ella, el MES no puede saber si la orden llegó. El patrón request/response de MQTT 5, con response topic y correlation data, formaliza este esquema.

Mantén el MES fuera del lazo de control de la máquina. Los enclavamientos y la lógica de seguridad se quedan en el PLC. MQTT transporta eventos e instrucciones, no control en tiempo real estricto.

No dejes que el MES se convierta en el namespace. Si todos los consumidores leen los datos a través del MES, vuelves a la integración punto a punto. Publica los eventos en bruto en el broker y deja que el MES sea un suscriptor más, junto a las herramientas de captura de datos de planta, los dashboards de OEE y los historiadores. Esos mismos eventos pueden alimentar también un gemelo digital 3D de la línea sin tocar el MES.

Planifica los cambios de orden. La mayoría de los conteos mal atribuidos se producen en los segundos alrededor de un cambio de orden. Haz que la línea estampe el ID de la orden en cada conteo y que el MES cierre una orden solo cuando reciba un evento de fin explícito.

Error habitual Efecto Prevención
Sin números de secuencia Conteos dobles tras reconexiones seq por publicador, deduplicación en el adaptador
Orden no retenida La HMI no muestra nada tras reiniciar Publicar la orden actual con retain
Client IDs compartidos Los adaptadores se desconectan entre sí ID único por instancia
Broker en un único PC de planta La integración se detiene cuando se apaga el PC Usar un broker MQTT gestionado

El namespace en un broker MQTT gestionado

En cuanto el MES, los gateways y los dashboards dependen del broker, su disponibilidad y su seguridad pasan a ser la disponibilidad y la seguridad de tu integración. Un broker MQTT gestionado te quita la carga de parchear, renovar certificados y monitorizar un broker por tu cuenta. ConnectMQ ofrece MQTT 3.1.1 y 5.0 sobre TLS (8883) y WebSocket seguro (8084), credenciales vinculadas a client IDs y un portal con un explorador de topics en vivo y una vista de dispositivos organizada por niveles ISA-95, lo que facilita comprobar que los conteos y los estados llegan bajo la línea y la celda correctas.

Si tus máquinas hablan Sparkplug B, ConnectMQ puede decodificarlo y volver a publicar los datos en topics ISA-95 legibles, de modo que el adaptador del MES se suscriba a rutas JSON sencillas en lugar de Protobuf. Para la visión arquitectónica completa, consulta la guía de manufactura inteligente y el resumen de lo que ofrece un broker MQTT en la nube.

Conecta tu MES a ConnectMQ

Regístrate en app.connectmq.com, crea un broker en el plan gratuito Serverless sin tarjeta de crédito y apunta el adaptador anterior hacia él con YOUR_USERNAME, YOUR_PASSWORD y YOUR_CLIENT_ID obtenidos en el portal.

Preguntas frecuentes

¿Mi MES necesita soporte nativo de MQTT?

No. Muchas integraciones usan un pequeño adaptador que habla MQTT por un lado y la API o la base de datos del MES por el otro. El soporte nativo simplemente elimina el adaptador.

¿Debe el MES publicar las órdenes de trabajo como retained messages?

Sí. La orden actual de cada línea es un estado, no un evento, así que retenerla permite que cualquier cliente que se conecte más tarde sepa qué se está produciendo. El historial de órdenes pertenece a la base de datos del MES.

¿Cómo evito los conteos dobles con QoS 1?

Añade a cada evento de conteo un número de secuencia por publicador y descarta cualquier secuencia que el adaptador ya haya procesado. Como alternativa, publica totales acumulados y calcula los deltas en el lado del MES.

¿Es MQTT lo bastante seguro para el tráfico del MES?

Con TLS, credenciales únicas por cliente y un broker que aplique la vinculación de client IDs, MQTT es adecuado para el tráfico del MES entre planta y nube. Mantén la lógica de seguridad y de enclavamientos en el PLC.

Artículos relacionados

OEE vs TEEP vs OOE: ¿qué indicador deberías usar?

OEE, OOE y TEEP comparten los mismos factores de rendimiento y calidad, pero se miden frente a bases de tiempo distintas. Esta comparativa resuelve un único ejemplo y enumera las señales MQTT que necesita cada indicador.

8 min de lectura

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.