OPC UA en la automatización de edificios: Integración BMS, registro de datos y KPI
OPC UA se ha convertido en la columna vertebral de integración para edificios inteligentes modernos, proporcionando una interfaz única y neutral al proveedor que conecta controladores BMS, medidores de energía, equipos HVAC y plataformas de análisis en la nube. A diferencia de BACnet o Modbus, OPC UA incorpora seguridad y un modelo de información autodescriptivo, lo que significa que un sistema de gestión de energía puede descubrir todos los puntos de datos disponibles de un servidor DESIGO CC o TwinCAT sin requerir un mapa de registros o una lista de puntos separada.
Rol de OPC UA en edificios
Un edificio comercial típico integra tres o más subsistemas que históricamente utilizaban protocolos incompatibles: un sistema BMS BACnet/IP para HVAC y control de acceso, medidores de energía Modbus RTU en un bus serie y un CMMS (Sistema Computarizado de Gestión de Mantenimiento) para registros de servicio de equipos. OPC UA actúa como capa de integración horizontal, proporcionando una interfaz unificada de lectura/escritura/suscripción a través de todos los subsistemas desde una única conexión de cliente.
El servidor OPC UA se sitúa entre los protocolos de campo y la capa de TI. Consulta o se suscribe a datos de los subsistemas BACnet, Modbus y KNX utilizando controladores específicos del protocolo, luego expone todos los datos en un único espacio de direcciones navegable. Los clientes — sistemas SCADA, plataformas de gestión de energía, paneles de control y conectores en la nube — se conectan una vez al servidor OPC UA y acceden a todos los datos del edificio a través de una API estándar, independientemente del protocolo subyacente.
Topología de integración OPC UA en edificios
Field layer (field protocols)
BACnet/IP: Siemens PXC200, Distech EC-Net controllers
Modbus TCP: Schneider PM5xxx energy meters, Janitza UMG 96
KNX/IP: WEINZIERL KNX IP Interface 731
M-Bus: heat meters, gas meters (IEC 62056)
↓ protocol drivers (inside BMS or gateway)
OPC UA Server layer
Siemens DESIGO CC with OPC UA server module
└── exposes BACnet objects as OPC UA Variables
└── exposes alarm conditions as OPC UA AlarmCondition
Beckhoff TwinCAT OPC UA Server
└── exposes PLC variables directly from ADS runtime
Kepware KEPServerEX
└── multi-protocol gateway (BACnet + Modbus → OPC UA)
↓ opc.tcp:// or opc.wss://
Clients (standard OPC UA)
Energy management platform (Schneider PME, EcoStruxure)
SCADA / MES (Ignition, WinCC OA, Aveva)
Cloud connector (Azure IoT OPC Publisher, AWS Greengrass)
Analytics / dashboards (Grafana OPC UA plugin, Power BI)Opciones de implementación del servidor OPC UA
Para la automatización de edificios, dominan tres implementaciones de servidor OPC UA. Cada una es adecuada para un ecosistema BMS y una plataforma de hardware diferente.
| Servidor | Plataforma | Controladores de protocolo | Licencia |
|---|---|---|---|
| Siemens DESIGO CC con OPC UA | Windows Server, servidor de aplicaciones DESIGO CC | BACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus a través de controladores DESIGO | De pago – parte de la licencia DESIGO CC |
| Schneider EcoStruxure BMS OPC UA | Servidor EcoStruxure Building Operation (EBO) | BACnet/IP, Modbus, LON, M-Bus, DALI | De pago – licencia EBO |
| Servidor Beckhoff TwinCAT OPC UA | PC con Windows ejecutando runtime TwinCAT 3 | TwinCAT ADS (variables PLC), EtherCAT I/O, Modbus mediante bloques de función PLC | Gratuito con licencia TwinCAT |
| Kepware KEPServerEX | PC/servidor Windows (puerta de enlace independiente) | BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, más de 150 controladores | De pago — licencia por controlador |
| Pro-face Remote HMI OPC UA | Linux embebido en GP4000/GP4600 HMI | Modbus TCP, EtherNet/IP, Mitsubishi MC Protocol | Incluido con la HMI |
Servidor Beckhoff TwinCAT OPC UA — gratuito para integradores: Si utiliza TwinCAT 3 como runtime PLC para un controlador de edificio, el servidor TwinCAT OPC UA está incluido sin costo adicional. Expone todas las variables PLC declaradas con el atributo {attribute 'OPC.UA.DA' := '1'} directamente como nodos OPC UA. Esta es la ruta de menor costo hacia OPC UA en nuevos controladores de edificio montados en armario.
Modelo de información OPC UA para edificios
IEC 62541-100 (OPC UA para edificios) define un modelo de información estandarizado que asigna los conceptos de ISO 16739-1 IFC (Industry Foundation Classes) a los tipos de objeto de OPC UA. Esto permite que un sistema de gestión energética navegue por el espacio de direcciones de un servidor de edificio utilizando nombres de tipo bien conocidos – SpaceType, ZoneType, HVACSystemType – en lugar de rutas de cadena específicas del proveedor.
Estructura del modelo de información del edificio según IEC 62541-100
BuildingType (ns=2;s=Building_Alpha_Tower)
├── SiteType (ns=2;s=Site_Riga_01)
│ ├── BuildingStoreyType (ns=2;s=Floor_03)
│ │ ├── SpaceType (ns=2;s=Office_3A) ← IFC IfcSpace mapping
│ │ │ ├── AirTemperature [Variable, Float, °C]
│ │ │ ├── CO2Concentration [Variable, UInt16, ppm]
│ │ │ └── OccupancyState [Variable, Boolean]
│ │ └── SpaceType (ns=2;s=Meeting_3B)
│ └── BuildingStoreyType (ns=2;s=Floor_04)
├── HVACSystemType (ns=2;s=AHU_Main_01) ← IFC IfcSystem mapping
│ ├── SupplyAirTemperature [Variable, Float, °C]
│ ├── ExhaustAirTemperature [Variable, Float, °C]
│ ├── HeatingCoilValve [Variable, Byte, 0–100%]
│ ├── CoolingCoilValve [Variable, Byte, 0–100%]
│ ├── FanSpeed [Variable, UInt16, RPM]
│ └── OperatingMode [Variable, Enum: Off/Auto/Heating/Cooling/Night]
└── EnergyMeterType (ns=2;s=MainMeter_kWh) ← IEC 62056 meter
├── ActiveEnergyImport [Variable, Double, kWh]
├── ActivePower [Variable, Float, kW]
└── Timestamp [Variable, DateTime]Extracción de KPI energéticos mediante suscripción OPC UA
La gestión energética requiere lecturas de kWh fiables y con marca de tiempo desde los nodos de contadores. En lugar de consultar los contadores a intervalos fijos (lo que puede pasar por alto picos y genera tráfico constante), utilice suscripciones OPC UA con un PublishingInterval acorde a su granularidad de reporte, y una banda muerta (deadband) para suprimir el reporte de incrementos triviales.
| KPI | Nodo OPC UA | Intervalo recomendado | Banda muerta |
|---|---|---|---|
| Consumo horario de kWh | ActiveEnergyImport (Double, kWh) | PublishingInterval 60 000 ms | Absoluto 0,01 kWh |
| Demanda máxima de 15 minutos | ActivePower (Float, kW) | PublishingInterval 900 000 ms | Absoluto 0,1 kW |
| Monitoreo de potencia en tiempo real | ActivePower (Float, kW) | Intervalo de publicación 5 000 ms | Porcentaje 1% |
| Lectura diaria del contador de calor | ThermalEnergyImport (Double, kWh th) | Intervalo de publicación 86 400 000 ms | Absoluto 0,1 kWh |
| Consumo de gas | Gas_Volume (Double, m³) | PublishingInterval 3 600 000 ms | Absoluto 0,001 m³ |
OPC UA PubSub: enviar datos del edificio a un broker MQTT en la nube
OPC UA PubSub (IEC 62541-14) extiende el modelo cliente-servidor con un patrón de publicación-suscripción utilizando MQTT o multidifusión UDP como transporte. En lugar de que una plataforma en la nube consulte al servidor OPC UA, el servidor envía DataSetMessages a un broker MQTT en un PublishingInterval configurado en WriterGroup. Este es el patrón recomendado para la integración en la nube cuando el servidor OPC UA está detrás de un NAT o un cortafuegos que bloquea el puerto TCP 4840 entrante.
OPC UA PubSub — configuración de Kepware a broker MQTT
# Kepware IoT Gateway Plugin — OPC UA PubSub to MQTT
Agent type: MQTT Client (Publisher)
Broker URL: mqtts://iot.yourdomain.com:8883
Client ID: kepware-building-01
TLS: enabled (CA cert + client cert for mutual TLS)
Published datasets (JSON encoding, UA-JSON):
Topic: building/01/hvac/ahu01
Payload (DataSetMessage, JSON):
{
"MessageId": "uuid-xxx",
"PublisherId": "kepware-building-01",
"DataSetWriterId": 1001,
"Timestamp": "2025-03-14T10:30:00Z",
"Payload": {
"SupplyAirTemperature": { "Value": 18.4, "StatusCode": "Good", "SourceTimestamp": "..." },
"FanSpeed": { "Value": 1450, "StatusCode": "Good" },
"HeatingCoilValve": { "Value": 72, "StatusCode": "Good" }
}
}
Topic: building/01/energy/main-meter
PublishingInterval: 60000 ms
QueueSize: 1 (latest value only)Ejemplo de cliente OPC UA Python con asyncua
La asyncua biblioteca (anteriormente opcua-asyncio) es el cliente OPC UA Python recomendado para la creación de scripts de automatización de edificios. Admite async/await, todos los modos de seguridad, certificados X.509 y suscripciones. Instalar conpip install asyncua.
asyncua — conectar, navegar, leer, suscribir
import asyncio
from asyncua import Client
from asyncua.crypto.security_policies import SecurityPolicyBasic256Sha256
from asyncua.ua import MessageSecurityMode
class SubHandler:
"""Callback invoked for each subscription notification."""
def datachange_notification(self, node, val, data):
print(f" DataChange: {node} = {val} status={data.monitored_item.Value.StatusCode}")
async def main():
url = "opc.tcp://192.168.10.50:4840/freeopcua/server/"
async with Client(url=url) as client:
# --- Security: Sign + Encrypt, Basic256Sha256, X.509 cert ---
await client.set_security(
SecurityPolicyBasic256Sha256,
certificate="client_cert.pem",
private_key="client_key.pem",
server_certificate="server_cert.pem",
mode=MessageSecurityMode.SignAndEncrypt,
)
print("Connected. Server namespaces:")
for i, ns in enumerate(await client.get_namespace_array()):
print(f" ns={i}: {ns}")
# --- Browse Objects root ---
objects = client.get_objects_node()
children = await objects.get_children()
for child in children:
name = await child.read_browse_name()
print(f" Object: {name.Name}")
# --- Read a specific variable by NodeId ---
temp_node = client.get_node("ns=1;s=AHU_01.SupplyAirTemperature")
temp_value = await temp_node.read_value()
print(f"Supply air temperature: {temp_value:.1f} °C")
# --- Read EngineeringUnits property ---
eu = await temp_node.read_data_value()
print(f"StatusCode: {eu.StatusCode}")
# --- Subscribe to multiple nodes ---
handler = SubHandler()
subscription = await client.create_subscription(500, handler) # 500 ms publishing
nodes = [
client.get_node("ns=1;s=AHU_01.SupplyAirTemperature"),
client.get_node("ns=1;s=AHU_01.FanSpeed"),
client.get_node("ns=1;s=Meter.kWh"),
]
await subscription.subscribe_data_change(nodes)
print("Subscribed. Waiting 30 seconds for notifications...")
await asyncio.sleep(30)
await subscription.delete()
asyncio.run(main())OPC UA para HVAC: ejemplos Siemens y Beckhoff
Dos plataformas comunes de controladores de edificios exponen servidores OPC UA de forma nativa. Siemens DESIGO está dirigido a grandes edificios comerciales con BMS centralizado; Beckhoff TwinCAT está dirigido a controladores montados en panel con E/S directa.
Servidor OPC UA Siemens DESIGO CC: Habilitado mediante la licencia adicional DESIGO CC Management Platform. El servidor expone todos los puntos de datos DESIGO (incluidos los objetos BACnet importados de los controladores PXC) como variables OPC UA en una jerarquía que coincide con la estructura de carpetas de la estación de gestión DESIGO. Endpoint predeterminado: opc.tcp://<desigo-server>:4840. Admite Sign+Encrypt con Basic256Sha256 y certificados de cliente X.509. Las condiciones de alarma y evento de DESIGO se exponen como nodos OPC UA AlarmCondition.
Servidor Beckhoff TwinCAT OPC UA (TC3 OPC UA): Gratuito con cualquier licencia de ejecución de TwinCAT 3. Las variables PLC marcadas con el atributo OPC UA en la declaración de TEXTO ESTRUCTURADO se publican automáticamente. Admite hasta 5000 elementos monitoreados con un intervalo de muestreo de 10 ms en un IPC con un procesador estándar. La serie de controladores de sala DESIGO RXB también incluye un servidor OPC UA integrado (puerto 48040 por defecto) con acceso directo a la temperatura ambiente, punto de consigna, válvula del ventilador y estado del detector de presencia.
Endurecimiento de seguridad para servidores OPC UA de edificios
Los servidores OPC UA de edificios son puntos de convergencia IT/OT y son objetivos de alto valor. Aplique los siguientes pasos de endurecimiento durante la puesta en marcha:
| Paso de endurecimiento | Acción de configuración |
|---|---|
| Deshabilitar autenticación anónima | Eliminar AnonymousIdentityToken de la configuración del endpoint; forzar Username o X.509 |
| Deshabilitar políticas de seguridad obsoletas | Eliminar endpoints Basic128Rsa15 y Basic256; habilitar solo Basic256Sha256 y Aes256Sha256RsaPss |
| Forzar Sign+Encrypt | Establecer MessageSecurityMode mínimo = SignAndEncrypt en todos los endpoints de producción |
| Lista de confianza de certificados | Importar solo certificados de cliente conocidos en la lista de confianza del servidor; rechazar todos los demás |
| Pista de auditoría | Habilitar eventos de auditoría OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); reenviar a SIEM |
| Reglas de firewall | Permitir TCP 4840 entrante solo desde direcciones IP de clientes conocidas en la VLAN OT; bloquear desde la LAN IT |
| Monitoreo de caducidad de certificados | Configurar alertas cuando los certificados del servidor o del cliente se acerquen a la caducidad (aviso de 90 días) |
| TwinCAT: espacio de nombres de solo lectura | Declarar variables de monitoreo como VAR_OUTPUT o usar un rol UA para restringir escrituras |
Requisito IEC 62443-3-3 Nivel de seguridad 2: Para edificios sujetos a EN 50159 (ferrocarril) o al alcance BMS ISO 27001, IEC 62443-3-3 SL-2 requiere que todas las conexiones de gestión remota utilicen autenticación mutua basada en certificados X.509. Los endpoints anónimos y solo con nombre de usuario deben deshabilitarse en todos los servidores OPC UA de producción.
¿Necesita integración OPC UA BMS para su proyecto de construcción?
Integramos subsistemas BACnet, Modbus, KNX y M-Bus en una capa OPC UA unificada — conectando medidores de energía, controladores HVAC y SCADA a análisis en la nube y plataformas de gestión energética.
Solicitar presupuesto →