OPC UA · BACnet/IP · Modbus TCP · Kepware · UaExpert · Azure IoT · 11 min di lettura

Gateway OPC UA verso BACnet e Modbus: Traduzione di protocollo per l'integrazione BMS

La stragrande maggioranza dei dispositivi BMS installati — controller BACnet/IP, contatori energetici Modbus TCP e dispositivi di campo Modbus RTU — non implementa un server OPC UA. Un gateway di protocollo colma questa lacuna: si collega ai dispositivi legacy utilizzando i loro protocolli nativi ed espone tutti i punti dati scoperti come nodi OPC UA in un unico spazio di indirizzi navigabile. Kepware KEPServerEX è la scelta standard del settore per questo ruolo, supportato da Siemens, Schneider e Rockwell Automation per distribuzioni di gateway BMS multi-protocollo.

Perché è necessario un gateway

I dispositivi BACnet/IP e BACnet MS/TP espongono dati tramite i servizi oggetto BACnet (ReadProperty, SubscribeCOV) – non tramite servizi OPC UA. I dispositivi Modbus TCP e RTU espongono dati come registri numerati senza denominazione integrata, informazioni sul tipo o sicurezza. Un client OPC UA non può comunicare nativamente con nessuno dei due protocolli.

Il gateway funge da livello di traduzione. Sul lato sud interroga o sottoscrive i dispositivi utilizzando i loro protocolli nativi. Sul lato nord esegue un server OPC UA completo, mappando ogni punto dati del dispositivo a un nodo Variabile OPC UA nominato e tipizzato. Risultato: un sistema SCADA, un connettore cloud o una piattaforma di gestione energetica vede un unico endpoint OPC UA contenente tutti i dati dell'edificio, indipendentemente dal fatto che i dispositivi sottostanti parlino BACnet, Modbus, KNX o SNMP.

COV vs. polling nel gateway: Per i dispositivi BACnet che supportano le sottoscrizioni Change of Value (COV), configurare Kepware per utilizzare SubscribeCOV anziché il polling periodico ReadProperty. COV riduce il traffico di rete BACnet e garantisce che il gateway rifletta immediatamente i cambiamenti di stato invece di attendere il successivo ciclo di polling. I dispositivi Modbus richiedono sempre il polling – impostare la frequenza di scansione in base ai requisiti di aggiornamento dei dati (tipicamente 1–10 secondi per HVAC, 100–500 ms per la qualità dell'energia).

Confronto delle opzioni di gateway

GatewayServer OPC UASupporto BACnetSupporto ModbusPiattaforma
Kepware KEPServerEX 6Server UA completo (tutte le modalità di sicurezza)BACnet/IP + MS/TP; BBMD; COVModbus RTU/TCP/ASCII; 65535 registriWindows Server/PC
matrikon OPC UA TunnellerServer OPC UA + bridge DA/HDASolo tramite bridge OPC DASolo tramite bridge OPC DAWindows
Cogent DataHub OPC UAServer UA completoBACnet/IP; COV limitatoModbus TCPWindows
softing edgeConnector ModbusServer OPC UANo — solo ModbusModbus TCP + RTUDocker / Linux / Windows
softing edgeConnector BACnetServer OPC UABACnet/IP + MS/TPNoDocker / Linux / Windows
Ignition (Inductive Automation)Server OPC UA (integrato)BACnet/IP tramite modulo driverDriver Modbus TCP/RTUWindows / Linux (JVM)

Kepware KEPServerEX: configurazione driver BACnet/IP

Il driver Ethernet BACnet/IP di Kepware (concesso in licenza separatamente dal pacchetto base KEPServerEX) si connette ai dispositivi BACnet/IP sulla sottorete locale o attraverso router utilizzando un dispositivo di gestione broadcast BACnet (BBMD). Dopo aver aggiunto il canale del driver, Kepware rileva automaticamente tutti i dispositivi BACnet visibili e importa i loro elenchi di oggetti.

Configurazione driver 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

Ogni oggetto BACnet importato diventa un tag Kepware. Kepware mappa automaticamente la proprietà BACnet Present_Value sul valore primario del tag. Il nome del tag segue il modello DeviceName.ObjectType_Instance.Property, ad esempio: PXC_01.AnalogInput_1.Present_Value. Questi tag vengono immediatamente esposti come nodi variabili OPC UA sull'endpoint OPC UA integrato di KEPServerEX.

Modbus TCP a OPC UA: importazione mappa registri

I dispositivi Modbus TCP richiedono una configurazione esplicita della mappa dei registri — a differenza di BACnet, non esiste un rilevamento automatico degli oggetti. Il driver Modbus TCP/IP Ethernet di Kepware accetta un file di importazione tag CSV o una configurazione manuale dei tag che specifica indirizzo del registro, tipo di dato e conversione ingegneristica.

Configurazione tag Modbus TCP 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"

Mappatura oggetto BACnet a nodo OPC UA

Kepware mappa ogni tipo di oggetto BACnet a un nodo variabile OPC UA con il tipo di dato OPC UA appropriato. La proprietà Present_Value dell'oggetto BACnet diventa il valore del nodo OPC UA. Le proprietà Status_Flags e Reliability sono mappate al StatusCode OPC UA della variabile.

Tipo oggetto BACnetTipo Present_ValueTipo di dato OPC UAUtilizzo tipico
Ingresso analogico (AI)REAL (Float)FloatSensore di temperatura, pressione, portata
Uscita analogica (AO)REAL (Float)Float (scrivibile)Setpoint posizione valvola, velocità ventola
Valore analogico (AV)REAL (Float)Float (scrivibile)Setpoint, valore calcolato
Ingresso binario (BI)ENUMERATO (Attivo/Inattivo)BooleanoStato On/Off, stato allarme
Uscita binaria (BO)ENUMERATO (Attivo/Inattivo)Booleano (scrivibile)Comando On/Off, controllo relè
Valore binario (BV)ENUMERATO (Attivo/Inattivo)Booleano (scrivibile)Flag di modalità, stato di override
Ingresso multi-stato (MI)UNSIGNED INTInt32Lettura modalità operativa (Off=0, Riscaldamento=1, Raffreddamento=2)
Uscita multi-stato (MO)UNSIGNED INTInt32 (scrivibile)Comando modalità, gradino di velocità
Valore multi-stato (MV)UNSIGNED INTInt32 (scrivibile)Valore enum configurabile
AccumulatoreUNSIGNED INT (32 bit)UInt32Contatore di impulsi: kWh, m³, litri

Sicurezza per gateway OPC UA

Un gateway OPC UA è un dispositivo di confine IT/OT. Se compromesso, un attaccante può scrivere su uscite BACnet scrivibili (valvole, relè) o bobine Modbus tramite il servizio di scrittura OPC UA. Applicare difesa in profondità: segmentazione di rete, autenticazione basata su certificati e permessi di scrittura minimi.

Controllo di sicurezzaImplementazione
VLAN OT dedicataPosizionare il server Kepware su VLAN isolata; dispositivi BACnet e Modbus sulla stessa VLAN; nessun routing diretto verso LAN IT
Regole firewallConsentire TCP 4840 in entrata solo da IP client OPC UA noti; bloccare tutto il resto in entrata; consentire Kepware in uscita verso BACnet UDP 47808 e Modbus TCP 502
Autenticazione tramite certificatoDisabilitare Anonimo; richiedere certificati client X.509; importare i certificati client fidati nel trust store di Kepware
Controllo accesso utenti KepwareCreare un ruolo UA di sola lettura per i client di monitoraggio; un ruolo UA di lettura/scrittura solo per l'integrazione BMS; MFA sulla console di amministrazione Kepware
Protezione scrittura a livello di tagImpostare i tag Modbus su Sola lettura in Kepware dove non sono richieste scritture; tag BACnet AO/BO/MO abilitati alla scrittura solo per il ruolo SCADA
Registrazione auditAbilita il registro eventi Kepware; inoltra al registro eventi di Windows → SIEM; avvisa in caso di tentativi di scrittura non autorizzati

Porta predefinita 4840: Kepware KEPServerEX ascolta sulla porta TCP 4840 per impostazione predefinita — la porta OPC UA registrata IANA. Questa porta deve essere aperta nel firewall di Windows sull'host Kepware affinché i client OPC UA possano connettersi. Non esporre la porta 4840 a reti non affidabili. Se il server Kepware richiede OPC UA accessibile da Internet (per connettori cloud), utilizzare un proxy inverso con TLS reciproco anziché il forwarding diretto delle porte.

Test delle connessioni OPC UA con UaExpert

UaExpert (di Unified Automation) è il client OPC UA gratuito standard per commissioning e diagnostica. Fornisce un browser completo dello spazio degli indirizzi, monitoraggio dati in tempo reale, test delle sottoscrizioni e gestione dei certificati di sicurezza. Scarica da unified-automation.com (richiede registrazione gratuita).

UaExpert — passaggi di connessione e verifica

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

Integrazione cloud tramite Azure IoT Hub OPC Publisher

Azure IoT Hub OPC Publisher è il client OPC UA open source di Microsoft che si connette ai server OPC UA (incluso Kepware) e inoltra la telemetria ad Azure IoT Hub. Viene eseguito come modulo Azure IoT Edge su un host contenitore Linux nell'edificio, collegando il livello OT OPC UA ai servizi cloud Azure.

OPC Publisher — publishednodes.json per 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" }
// }

Da Azure IoT Hub, i dati di telemetria vengono instradati verso Azure Time Series Insights, Azure Data Explorer o un job personalizzato di Azure Stream Analytics per dashboard KPI energetici in tempo reale in Power BI. Il contenitore OPC Publisher gestisce la riconnessione, il buffering durante la perdita di connettività (store-and-forward configurabile) e la gestione dei certificati per la connessione OPC UA a Kepware.

Hai bisogno di un gateway BACnet o Modbus verso OPC UA per il tuo progetto?

Configuriamo e mettiamo in servizio gateway Kepware KEPServerEX che collegano dispositivi BACnet/IP, Modbus TCP e KNX a client OPC UA, piattaforme SCADA e Azure IoT Hub — con hardening completo della sicurezza e gestione dei certificati.

Richiedi un preventivo →
Caricamento in corso ...
Torna all'inizio