Protocolos y datos

OPC UA frente a MQTT y Modbus

Compara OPC UA, MQTT y Modbus: modelos de datos, estado, marcas temporales, seguridad, puertos, una lectura en los tres y pruebas de fallo de puesta en marcha.

Una lectura de potencia activa puede atravesar los tres protocolos antes de llegar a una plataforma energética. Sale del contador como dos registros Modbus sin unidad, hora ni estado. Un PLC puede presentarla como un nodo OPC UA con tipo de datos, StatusCode y dos marcas temporales. Sale de la instalación como mensaje MQTT en un formato acordado de antemano entre emisor y receptor. Cada tramo puede perder parte de ese significado, y los fallos de puesta en marcha descritos abajo ocurren en alguno de ellos.

Comparación

ModbusOPC UAMQTT
Modelo de comunicaciónPetición y respuesta. Un maestro por bus RTU; los dispositivos TCP limitan las conexiones simultáneasPetición y respuesta en una sesión; también existe PubSub (parte 14)Publicación y suscripción mediante un broker
Modelo de datosCuatro tablas: bobinas, entradas discretas, registros de entrada y registros de retención (16 bits)Nodos tipados en un espacio de direcciones, relacionados entre síNinguno; la carga útil puede contener cualquier secuencia de bytes
Significado del valorEn el mapa de registros del dispositivoTipo y nombre en el nodo; unidades de ingeniería solo si el servidor ofrece la propiedad opcionalAcordado entre publicador y suscriptor, o definido por Sparkplug
Hora y calidadNo forman parte del protocoloStatusCode y marcas temporales de origen y servidor en cada valorMQTT no las define; inclúyalas en la carga útil
DescubrimientoNingunoNavegación por el espacio de direccionesNinguno. Las suscripciones comodín solo muestran temas publicados o retenidos; los mensajes de nacimiento de Sparkplug declaran métricas
SeguridadNinguna; se protege con el diseño de redCertificados de aplicación, firma, cifrado y autenticación de usuariosTLS hacia el broker y control de acceso del broker
Puerto predeterminado502 (TCP)4840 (TCP)1883, o 8883 con TLS
Uso habitualContadores, variadores, inversores y controladores pequeñosPLC, servidores SCADA y controladores de plantaDel Gateway a la plataforma, entre aplicaciones
NormaModbus OrganizationOPC Foundation OPC 10000, también IEC 62541OASIS; Sparkplug de Eclipse Foundation, también ISO/IEC 20237

Registros Modbus y sus mapas

Casi todos los contadores eléctricos, inversores y variadores tienen una interfaz Modbus. El protocolo define cuatro tablas: bobinas y entradas discretas (1 bit), y registros de entrada y de retención (16 bits). Las entradas discretas y los registros de entrada son de solo lectura. Las bobinas y los registros de retención permiten lecturas y escrituras cuando el dispositivo las admite. La función 03 lee registros de retención y la 04 registros de entrada, hasta 125 registros contiguos por petición. Una respuesta no indica qué significan los bits. La unidad, escala, tipo de datos y orden de palabras proceden del mapa de registros del fabricante; el protocolo no lleva marca temporal ni estado. La guía de mapas de registros Modbus explica qué documentar para cada punto.

En RS-485, Modbus RTU es lo bastante lento como para tener que dimensionar la lista de consultas. Con 8 bits de datos, paridad par y 1 bit de parada, cada carácter ocupa 11 bits. Una lectura de dos registros utiliza una petición de 8 bytes y una respuesta de 9. A 9.600 baudios, los 17 caracteres tardan 19,5 ms en el cable. Añada un intervalo de silencio de 3,5 caracteres (4,0 ms) después de cada trama y el retardo de respuesta del contador indicado en su ficha técnica. Si cada transacción tarda 60 ms, 20 contadores con 4 lecturas cada uno requieren 4,8 s por ciclo. Un bus RTU solo puede tener un maestro que consulte.

Modbus TCP elimina el límite de baudios, pero introduce un límite de conexiones. Muchos contadores aceptan pocas conexiones TCP simultáneas; algunos, solo una. Si un BMS y un Gateway consultan el mismo contador, uno puede perder la conexión o agotar el tiempo de espera sin un error claro.

Espacio de direcciones, estado y seguridad de OPC UA

OPC UA, definido en la serie OPC 10000 (IEC 62541), representa un sistema como un espacio de direcciones de nodos. Un cliente puede navegar desde una bomba hasta su velocidad, horas de funcionamiento y alarmas. Cada lectura de una variable devuelve un DataValue: valor, tipo de datos, StatusCode, marca temporal de origen del dispositivo o PLC y marca temporal del servidor OPC UA.

Los dos bits superiores del StatusCode indican su gravedad (parte 4, 7.38.1): Good es 00, Uncertain 01 y Bad 10. Por ejemplo, UncertainLastUsableValue (0x40900000) indica que se ha detenido la fuente que actualizaba el valor. BadCommunicationError (0x80050000) indica que el servidor perdió su fuente. Un cliente que conserva el valor y descarta el StatusCode convierte ambos en lecturas normales.

No todos los nodos tienen unidades de ingeniería. La parte 8 define EngineeringUnits como propiedad opcional de las variables analógicas. Muchos servidores ofrecen variables simples sin unidad; entonces debe tomarse de la lista de puntos.

OPC UA protege cada conexión mediante certificados de aplicación. El servidor ofrece endpoints, cada uno con política de seguridad y modo None, Sign o SignAndEncrypt. Los usuarios acceden de forma anónima, con nombre y contraseña, o con certificado. Desactive el endpoint None en el servidor. Si permanece activo, un cliente configurado para aceptar cualquier endpoint puede conectarse sin firma ni cifrado.

La guía de identidad de nodos OPC UA explica NodeIds y espacios de nombres; la guía de migración de OPC DA trata el paso desde OPC Classic.

Brokers, temas y contratos de carga útil MQTT

MQTT es un transporte. Un publicador envía un mensaje a un tema del broker, que lo entrega a cada cliente suscrito. El publicador y los suscriptores no se conectan entre sí. El broker se convierte en el componente al que todos deben poder llegar y debe protegerse. Un publicador no sabe si un suscriptor recibió el mensaje; necesita una confirmación de aplicación o un mensaje de estado.

MQTT ofrece opciones de entrega (QoS 0, 1 y 2), mensajes retenidos y un mensaje de última voluntad. Si el intervalo keep-alive es distinto de cero y el broker no recibe ningún paquete de control MQTT de un cliente durante 1,5 veces ese intervalo, cierra la conexión. Si se registró un mensaje de última voluntad, se publica después del cierre, sujeto a las reglas de retardo de voluntad y de sesión; no tiene por qué aparecer al alcanzar el límite de keep-alive. La guía de QoS de MQTT explica la entrega y la guía de MQTTS cubre TLS y los permisos sobre temas.

MQTT no define el contenido del mensaje. MQTT 5 añade un indicador de formato de carga útil, un tipo de contenido y propiedades de usuario, pero no nombres de campos ni unidades. Cada integración necesita un contrato de carga útil: estructura de temas, nombres de campos, unidades, formato temporal y representación de datos no válidos. Si la plataforma receptora exige su propio formato, obtenga su especificación de temas y carga útil antes de poner en marcha la instalación.

Dos normas definen contratos sobre MQTT. Sparkplug B (Eclipse Foundation, ISO/IEC 20237:2023) utiliza temas de la forma spBv1.0/group/message_type/edge_node/device y una carga útil Protocol Buffers. NBIRTH y DBIRTH declaran cada métrica con su tipo de datos. NDEATH se registra como testamento del nodo. Los mensajes de datos (NDATA, DDATA) se publican con QoS 0 y un número de secuencia de 0 a 255 permite al host detectar una pérdida y solicitar un nuevo mensaje de nacimiento. OPC UA PubSub (parte 14) también puede utilizar un broker MQTT como transporte, con codificación UADP o JSON. Con MQTT 3.1.1, los suscriptores deben conocer la codificación de antemano.

Una lectura a través de los tres protocolos

Un contador mide 200,5 kW de potencia activa. Su mapa sitúa el valor en los registros de retención 0 y 1 como número IEEE 754 de 32 bits con la palabra más significativa primero.

En Modbus, el Gateway lee los dos registros y recibe 0x4348 y 0x8000. Juntos, con la palabra más significativa primero, forman 0x43488000, equivalente a 200,5. Si el Gateway coloca primero la palabra menos significativa, obtiene 0x80004348, unos −2,4 × 10⁻⁴¹. Un panel lo muestra como cero y el fallo parece una carga inactiva. El decodificador de registros Modbus muestra los cuatro órdenes posibles de un par.

En OPC UA, un PLC que lee el mismo contador puede presentarlo como nodo ns=2;s=Meter1.ActivePower. Una lectura devuelve 200,5 como Float, StatusCode Good (0x00000000), la hora en que el PLC lo muestreó y la hora de respuesta del servidor. Si el PLC pierde el contador, el servidor puede seguir devolviendo 200,5 con UncertainLastUsableValue. El valor solo es válido mientras el estado sea Good.

En MQTT, un contrato JSON puede transmitirlo como {"point":"meter1/active_power","value":200.5,"unit":"kW","ts":"2026-09-24T10:15:00Z","quality":"good"}. En Sparkplug B, el mismo valor es una métrica Float en un mensaje DDATA del tema spBv1.0/site-a/DDATA/gateway-1/meter-1, con marca temporal en milisegundos desde la época Unix. Sparkplug no tiene un campo estándar para el StatusCode de OPC UA. Acuerde cómo se envía un valor Uncertain o Bad, por ejemplo como métrica nula, antes de poner en marcha la instalación.

Fallos que conviene probar en la puesta en marcha

SíntomaCausa probableCómo comprobarlo
Valores próximos a cero o muy grandes de un contador correctoOrden de palabras, tipo de datos o escala incorrectosCompare una lectura con la pantalla del contador bajo carga
Tiempos de espera Modbus TCP intermitentesDos clientes consultan un contador que solo acepta una conexiónConsulte el límite de conexiones en la ficha técnica. Deje que un cliente consulte y sirva a los demás
Errores CRC y respuestas perdidas en RS-485Dos maestros en un bus RTU o consultas más rápidas que la capacidad del busCalcule el tiempo de ciclo. Confirme que solo hay un maestro
Conexión OPC UA rechazada al primer intentoEl certificado del cliente no está reconocido (BadCertificateUntrusted, 0x801A0000)Confíe en el certificado del cliente en el servidor y en el del servidor en el cliente
Falla la seguridad OPC UA tras reiniciarReloj del Gateway o del servidor incorrecto; un certificado queda fuera de su periodo de validezCompare ambos relojes con un servidor horario
Valor congelado publicado como actualEl Gateway descartó el StatusCode de OPC UADesconecte la fuente y observe qué publica el Gateway
Huecos tras una interrupción del broker o la redMensajes QoS 0 o falta de almacenamiento y envío diferido en el publicadorBloquee el broker durante diez minutos y compare los recuentos recibidos y esperados

La guía de pasarelas de protocolos explica qué especificar para cada punto traducido. La guía de hora de origen y de llegada explica qué marca temporal conservar.

Elección

PreguntaOrientación
¿Qué interfaz ofrece el equipo?Utilice la que ya tiene. No sustituya un contador Modbus funcional solo para conseguir OPC UA
¿Quién recibe los datos?Las plataformas suelen aceptar MQTT o HTTPS. SCADA y BMS suelen aceptar OPC UA, Modbus o BACnet; algunos BMS solo Modbus TCP
¿Deben acompañar al valor el estado y la hora?OPC UA incluye ambos. En MQTT, incorpórelos al contrato de carga útil. En Modbus, el cliente añade su propia hora de lectura
¿La red es compartida o no es de confianza?Use OPC UA con SignAndEncrypt o MQTT sobre TLS. Mantenga Modbus en una red protegida
¿Deben recibir los mismos datos muchos consumidores?MQTT mediante un broker u OPC UA PubSub

La guía de BACnet frente a Modbus trata el lado del edificio.

OPC UA, MQTT y Modbus con Edge

Edge en el Gateway ZGW-20 actúa como pasarela. Lee equipos Modbus TCP y RTU. También es un cliente OPC UA que lee nodos de variables a intervalos configurados entre 1 s y 86.400 s. Admite los modos de seguridad None, Sign y SignAndEncrypt, con acceso anónimo, nombre de usuario o certificado. Mantenga correcto el reloj del Gateway, porque de él depende la validación de certificados. Los dispositivos inalámbricos EpiSensor, sensores LoRaWAN y controladores BACnet/IP se integran en el mismo modelo de datos.

Edge lee OPC UA mediante consultas periódicas. No usa suscripciones OPC UA ni PubSub, por lo que tampoco usa bandas muertas del servidor y puede perder cambios más breves que el intervalo de consulta. Cada punto recibe una marca temporal de la hora de lectura programada, no la marca de origen de OPC UA. El punto almacenado no conserva el StatusCode de OPC UA. El indicador de calidad de Edge representa la proporción de lecturas esperadas recibidas en una ventana móvil de 15 minutos, que es una medida distinta. Pruebe cómo aparecen en Edge los valores Uncertain y Bad del servidor antes de depender de ellos.

Edge envía datos a sistemas remotos por MQTTS o HTTPS. También puede ofrecer puntos mapeados a un BMS como registros Modbus TCP, en su propio puerto 10502, no en el 502.

Preguntas frecuentes

¿Qué diferencia hay entre OPC UA y MQTT?

OPC UA es un protocolo cliente-servidor con modelo de información: cada valor es un nodo tipado con StatusCode y marcas temporales, y el cliente puede explorar el servidor. MQTT es un transporte de publicación y suscripción mediante un broker. Admite cualquier carga útil y no define un modelo de datos. También pueden combinarse: OPC UA PubSub (OPC 10000-14) puede usar un broker MQTT con codificación UADP o JSON.

¿Cuándo debo usar OPC UA en vez de Modbus?

Use OPC UA cuando el origen sea un PLC o servidor SCADA que ya lo ofrezca, cuando el receptor necesite estado y marca temporal de origen con cada valor o cuando los datos atraviesen una red que no controla. En los contadores eléctricos, Modbus suele ser la única interfaz disponible: léalos mediante Modbus.

¿Qué puertos utilizan OPC UA, MQTT y Modbus?

OPC UA binario sobre TCP usa por defecto el puerto 4840. MQTT utiliza 1883, o 8883 sobre TLS. Modbus TCP usa 502. Fabricantes e instalaciones pueden cambiarlos; confirme el puerto de cada dispositivo.

¿Qué es Sparkplug B?

Es una especificación de Eclipse Foundation, publicada también como ISO/IEC 20237:2023, que define nombres de temas, carga útil Protocol Buffers y mensajes de estado sobre MQTT. Los temas empiezan por spBv1.0. NBIRTH y DBIRTH declaran las métricas, NDEATH avisa de que un nodo se ha desconectado, y los mensajes de datos llevan un número de secuencia para detectar pérdidas y solicitar un nuevo mensaje de nacimiento.

¿Puede funcionar OPC UA sobre MQTT?

Sí. OPC 10000-14 define un transporte MQTT para OPC UA PubSub. El cuerpo se codifica en UADP (binario) o JSON. MQTT 3.1.1 no tiene un campo para indicar la codificación, por lo que los suscriptores deben configurarse previamente; MQTT 5 puede indicarla en las propiedades del mensaje.