Puerta de enlace OPC UA a BACnet y Modbus: Traducción de protocolo para integración BMS
La gran mayoría de los dispositivos BMS instalados — controladores BACnet/IP, medidores de energía Modbus TCP y dispositivos de campo Modbus RTU — no implementan un servidor OPC UA. Una puerta de enlace de protocolo cierra esta brecha: se conecta a los dispositivos heredados utilizando sus protocolos nativos y expone todos los puntos de datos descubiertos como nodos OPC UA en un único espacio de direcciones navegable. Kepware KEPServerEX es la opción estándar de la industria para este rol, respaldado por Siemens, Schneider y Rockwell Automation para implementaciones de puertas de enlace BMS multiprotocolo.
Por qué se necesita una puerta de enlace
Los dispositivos BACnet/IP y BACnet MS/TP exponen datos a través de servicios de objetos BACnet (ReadProperty, SubscribeCOV), no mediante servicios OPC UA. Los dispositivos Modbus TCP y RTU exponen datos como registros numerados sin nombres incorporados, información de tipo ni seguridad. Un cliente OPC UA no puede comunicarse de forma nativa con ninguno de los dos protocolos.
La puerta de enlace actúa como una capa de traducción. En el lado sur, consulta o se suscribe a los dispositivos utilizando sus protocolos nativos. En el lado norte, ejecuta un servidor OPC UA completo, mapeando cada punto de datos del dispositivo a un nodo de Variable OPC UA nombrado y tipado. Resultado: un sistema SCADA, un conector en la nube o una plataforma de gestión de energía ve un único endpoint OPC UA que contiene todos los datos del edificio, independientemente de si los dispositivos subyacentes hablan BACnet, Modbus, KNX o SNMP.
COV vs. sondeo en la puerta de enlace: Para dispositivos BACnet que admiten suscripciones Change of Value (COV), configure Kepware para usar SubscribeCOV en lugar del sondeo periódico ReadProperty. COV reduce el tráfico de red BACnet y garantiza que la puerta de enlace refleje los cambios de estado inmediatamente, en lugar de esperar al siguiente ciclo de sondeo. Los dispositivos Modbus siempre requieren sondeo: ajuste la tasa de escaneo según sus requisitos de actualización de datos (típicamente 1–10 segundos para HVAC, 100–500 ms para calidad de energía).
Comparación de opciones de puerta de enlace
| Puerta de enlace | Servidor OPC UA | Soporte BACnet | Soporte Modbus | Plataforma |
|---|---|---|---|---|
| Kepware KEPServerEX 6 | Servidor UA completo (todos los modos de seguridad) | BACnet/IP + MS/TP; BBMD; COV | Modbus RTU/TCP/ASCII; 65535 registros | Windows Server/PC |
| matrikon OPC UA Tunneller | Servidor OPC UA + puente DA/HDA | Solo mediante puente OPC DA | Solo mediante puente OPC DA | Windows |
| Cogent DataHub OPC UA | Servidor UA completo | BACnet/IP; COV limitado | Modbus TCP | Windows |
| softing edgeConnector Modbus | Servidor OPC UA | No — solo Modbus | Modbus TCP + RTU | Docker / Linux / Windows |
| softing edgeConnector BACnet | Servidor OPC UA | BACnet/IP + MS/TP | No | Docker / Linux / Windows |
| Ignition (Inductive Automation) | Servidor OPC UA (integrado) | BACnet/IP a través del módulo controlador | Controlador Modbus TCP/RTU | Windows / Linux (JVM) |
Kepware KEPServerEX: configuración del controlador BACnet/IP
El controlador Ethernet BACnet/IP de Kepware (con licencia separada del paquete base KEPServerEX) se conecta a dispositivos BACnet/IP en la subred local o a través de enrutadores utilizando un dispositivo de gestión de difusión BACnet (BBMD). Después de agregar el canal del controlador, Kepware descubre automáticamente todos los dispositivos BACnet visibles e importa sus listas de objetos.
Configuración del controlador Kepware BACnet/IP
Channel settings (Connectivity > BACnet/IP Ethernet): Network adapter: 192.168.10.5 (Kepware server OT NIC) UDP port: 47808 (BAC0 — standard BACnet/IP port) BACnet device instance: 1001 (Kepware gateway identity on BACnet network) BBMD address: 192.168.10.1 (router acting as BBMD for cross-subnet discovery) BBMD UDP port: 47808 Foreign device registration: enabled (for devices on other subnets) Auto-discovery: Tools > Device Discovery > BACnet/IP Scan range: all subnets registered on BBMD Result: discovered 47 BACnet devices with object counts Import: select all → creates Kepware device entries with all objects COV subscription (preferred over polling): Device property > Subscriptions > Use COV: Enabled Lifetime: 3600 seconds (re-subscribe hourly) COV increment for Analog Values: 0.5 (only report if change > 0.5 units) Fallback poll rate (if COV not supported): 5000 ms
Cada objeto BACnet importado se convierte en una etiqueta de Kepware. Kepware asigna automáticamente la propiedad BACnet Present_Value al valor principal de la etiqueta. El nombre de la etiqueta sigue el patrón DeviceName.ObjectType_Instance.Property, por ejemplo: PXC_01.AnalogInput_1.Present_Value. Estas etiquetas se exponen inmediatamente como nodos de variable OPC UA en el endpoint OPC UA integrado de KEPServerEX.
Modbus TCP a OPC UA: importación del mapa de registros
Los dispositivos Modbus TCP requieren una configuración explícita del mapa de registros — a diferencia de BACnet, no hay descubrimiento de objetos auto-descriptivo. El controlador Modbus TCP/IP Ethernet de Kepware acepta un archivo de importación de etiquetas CSV o una configuración manual de etiquetas que especifica la dirección del registro, el tipo de datos y la conversión de ingeniería.
Configuración de etiquetas Modbus TCP de Kepware
Channel: Modbus TCP/IP Ethernet Network adapter: 192.168.10.5 Port: 502 (standard Modbus TCP port) Request timeout: 1000 ms Failure count before error: 3 Device: Schneider_PM5100 IP address: 192.168.10.21 Unit ID (slave address): 1 Scan rate: 1000 ms (1 second) Tags (imported from Schneider PM5100 register map): Tag name | Address | Data type | Scaling ActivePower_Total | 400593 (HR593) | Float (4B) | ×1 → kW ActiveEnergy_Import | 400001 (HR001) | DWord (4B) | ×0.1 → kWh Voltage_L1_N | 400003 (HR003) | Float (4B) | ×1 → V Current_L1 | 400013 (HR013) | Float (4B) | ×1 → A PowerFactor_Total | 400085 (HR085) | Float (4B) | ×1 (dimensionless) Frequency | 400073 (HR073) | Float (4B) | ×1 → Hz # Tag addressing format for Kepware Modbus driver: # Holding Register 40001 → address "400001" or "4:1" # Input Register 30001 → address "300001" or "3:1" # Coil 1 → address "000001" or "0:1" # Discrete Input 10001 → address "100001" or "1:1"
Mapeo de objeto BACnet a nodo OPC UA
Kepware mapea cada tipo de objeto BACnet a un nodo de variable OPC UA con el tipo de datos OPC UA apropiado. La propiedad Present_Value del objeto BACnet se convierte en el valor del nodo OPC UA. Las propiedades Status_Flags y Reliability se mapean al StatusCode OPC UA de la variable.
| Tipo de objeto BACnet | Tipo de Present_Value | Tipo de datos OPC UA | Uso típico |
|---|---|---|---|
| Entrada analógica (AI) | REAL (Float) | Float | Sensor de temperatura, presión, caudal |
| Salida analógica (AO) | REAL (Float) | Float (escribible) | Punto de consigna de posición de válvula, velocidad del ventilador |
| Valor analógico (AV) | REAL (Float) | Float (escribible) | Punto de consigna, valor calculado |
| Entrada binaria (BI) | ENUMERADO (Activo/Inactivo) | Booleano | Estado de encendido/apagado, estado de alarma |
| Salida binaria (BO) | ENUMERADO (Activo/Inactivo) | Booleano (escribible) | Comando On/Off, control de relé |
| Valor binario (BV) | ENUMERADO (Activo/Inactivo) | Booleano (escribible) | Indicador de modo, estado de anulación |
| Entrada multiestado (MI) | UNSIGNED INT | Int32 | Lectura del modo de funcionamiento (Off=0, Calor=1, Frío=2) |
| Salida multiestado (MO) | UNSIGNED INT | Int32 (grabable) | Comando de modo, paso de velocidad |
| Valor multiestado (MV) | UNSIGNED INT | Int32 (grabable) | Valor de enumeración configurable |
| Acumulador | UNSIGNED INT (32 bits) | UInt32 | Contador de pulsos: kWh, m³, litros |
Seguridad para puertas de enlace OPC UA
Una puerta de enlace OPC UA es un dispositivo frontera IT/OT. Si se ve comprometida, un atacante puede escribir en salidas BACnet escribibles (válvulas, relés) o bobinas Modbus a través del servicio de escritura OPC UA. Aplique defensa en profundidad: segmentación de red, autenticación basada en certificados y permisos de escritura mínimos.
| Control de seguridad | Implementación |
|---|---|
| VLAN OT dedicada | Colocar el servidor Kepware en una VLAN aislada; dispositivos BACnet y Modbus en la misma VLAN; sin enrutamiento directo a la LAN de TI |
| Reglas de cortafuegos | Permitir TCP 4840 entrante solo desde IPs de clientes OPC UA conocidas; bloquear todo otro tráfico entrante; permitir Kepware saliente hacia BACnet UDP 47808 y Modbus TCP 502 |
| Autenticación mediante certificado | Deshabilitar Anónimo; requerir certificados de cliente X.509; importar certificados de cliente de confianza en el almacén de confianza de Kepware |
| Control de acceso de usuarios de Kepware | Crear un rol UA de solo lectura para clientes de monitoreo; un rol UA de lectura/escritura solo para integración BMS; MFA en la consola de administración de Kepware |
| Protección de escritura a nivel de etiqueta | Establecer etiquetas Modbus como Solo lectura en Kepware donde no se requieran escrituras; etiquetas BACnet AO/BO/MO habilitadas para escritura solo para el rol SCADA |
| Registro de auditoría | Habilitar el registro de eventos de Kepware; reenviar al registro de eventos de Windows → SIEM; alertar sobre intentos de escritura no autorizados |
Puerto predeterminado 4840: Kepware KEPServerEX escucha en el puerto TCP 4840 por defecto — el puerto OPC UA registrado por IANA. Este puerto debe estar abierto en el Firewall de Windows en el host de Kepware para que los clientes OPC UA puedan conectarse. No exponga el puerto 4840 a redes no confiables. Si el servidor Kepware requiere OPC UA accesible desde Internet (para conectores en la nube), use un proxy inverso con TLS mutuo en lugar de reenvío directo de puertos.
Prueba de conexiones OPC UA con UaExpert
UaExpert (de Unified Automation) es el cliente OPC UA gratuito estándar para puesta en marcha y diagnóstico. Proporciona un navegador completo del espacio de direcciones, monitoreo de datos en tiempo real, pruebas de suscripción y gestión de certificados de seguridad. Descargue desde unified-automation.com (se requiere registro gratuito).
UaExpert — pasos de conexión y verificación
1. Add server: Server menu > Add > Advanced > Enter URL: opc.tcp://192.168.10.50:4840 Security policy: Basic256Sha256 Message security mode: SignAndEncrypt Authentication: Certificate (browse to client_cert.pem + client_key.pem) 2. First connection — certificate exchange: UaExpert generates a self-signed client cert on first run Server will show certificate as "untrusted" initially On Kepware: OPC UA Configuration > Trusted Clients > Move cert to Trusted On UaExpert: OPC UA > Manage Certificates > Trust the server cert 3. Browse address space: Expand Root > Objects > (your channel name) > (device name) Locate BACnet tags: PXC_01 > AnalogInput_1 > Present_Value Locate Modbus tags: Schneider_PM5100 > ActivePower_Total 4. Read values: Double-click any Variable node to open Data Monitor Verify values match expected engineering units and range Check StatusCode column — should show "Good (0x00000000)" StatusCode "Bad_NoCommunication" → check BACnet/Modbus connectivity from Kepware 5. Create subscription: Data Access View panel (bottom): drag Variable nodes from address space Set PublishingInterval 1000 ms Watch values update in real time — confirms subscription pipeline is working 6. Test write (writable tags only): Right-click Variable node > Write Value Enter test value within EU range Verify change reflected on BACnet device Present_Value Note: writes on Kepware require the connecting client to have write permission in UA role
Integración en la nube mediante Azure IoT Hub OPC Publisher
Azure IoT Hub OPC Publisher es el cliente OPC UA de código abierto de Microsoft que se conecta a servidores OPC UA (incluyendo Kepware) y reenvía telemetría a Azure IoT Hub. Se ejecuta como un módulo de Azure IoT Edge en un host de contenedor Linux en el edificio, puenteando la capa OT OPC UA con los servicios en la nube de Azure.
OPC Publisher — publishednodes.json para Kepware
// publishednodes.json — defines which OPC UA nodes to publish to Azure IoT Hub
[
{
"EndpointUrl": "opc.tcp://192.168.10.50:4840",
"UseSecurity": true,
"OpcAuthenticationMode": "UsernamePassword",
"OpcAuthenticationUsername": "azure-publisher",
"OpcAuthenticationPassword": "<from keyvault>",
"OpcNodes": [
{
"Id": "ns=2;s=Channel1.PXC_01.AnalogInput_1.Present_Value",
"DisplayName": "AHU01_SupplyAirTemp",
"OpcPublishingInterval": 10000,
"OpcSamplingInterval": 5000,
"HeartbeatInterval": 60
},
{
"Id": "ns=2;s=Channel1.Schneider_PM5100.ActivePower_Total",
"DisplayName": "MainMeter_ActivePower_kW",
"OpcPublishingInterval": 5000,
"OpcSamplingInterval": 2000
},
{
"Id": "ns=2;s=Channel1.Schneider_PM5100.ActiveEnergy_Import",
"DisplayName": "MainMeter_Energy_kWh",
"OpcPublishingInterval": 60000,
"OpcSamplingInterval": 30000,
"SkipFirst": true
}
]
}
]
// Azure IoT Hub receives JSON telemetry:
// {
// "NodeId": "ns=2;s=Channel1.Schneider_PM5100.ActivePower_Total",
// "DisplayName": "MainMeter_ActivePower_kW",
// "Value": { "Value": 47.3, "StatusCode": "Good", "SourceTimestamp": "2025-03-14T10:30:00Z" }
// }Desde Azure IoT Hub, los datos de telemetría se enrutan a Azure Time Series Insights, Azure Data Explorer o un trabajo personalizado de Azure Stream Analytics para paneles de KPI energéticos en tiempo real en Power BI. El contenedor OPC Publisher gestiona la reconexión, el almacenamiento en búfer durante la pérdida de conectividad (store-and-forward configurable) y la gestión de certificados para la conexión OPC UA a Kepware.
¿Necesita una pasarela BACnet o Modbus a OPC UA para su proyecto?
Configuramos y ponemos en marcha pasarelas Kepware KEPServerEX que conectan dispositivos de edificio BACnet/IP, Modbus TCP y KNX con clientes OPC UA, plataformas SCADA y Azure IoT Hub — con endurecimiento completo de seguridad y gestión de certificados.
Solicitar presupuesto →