OPC UA · BMS · DESIGO CC · Beckhoff · asyncua · MQTT PubSub · 11 min czytania

OPC UA w automatyce budynkowej: Integracja BMS, rejestracja danych i KPI

OPC UA stał się kręgosłupem integracji nowoczesnych inteligentnych budynków, zapewniając pojedynczy, neutralny względem dostawcy interfejs łączący kontrolery BMS, liczniki energii, systemy HVAC i platformy analityki chmurowej. W przeciwieństwie do BACnet lub Modbus, OPC UA osadza bezpieczeństwo i samoopisujący się model informacyjny – oznacza to, że system zarządzania energią może odkryć wszystkie dostępne punkty danych z serwera DESIGO CC lub TwinCAT bez konieczności posiadania oddzielnej mapy rejestrów lub listy punktów.

Rola OPC UA w budynkach

Typowy budynek komercyjny integruje trzy lub więcej podsystemów, które historycznie wykorzystywały niekompatybilne protokoły: system BMS oparty na BACnet/IP do HVAC i kontroli dostępu, liczniki energii Modbus RTU na magistrali szeregowej oraz CMMS (komputerowy system zarządzania utrzymaniem ruchu) do rejestrów serwisowych urządzeń. OPC UA działa jako pozioma warstwa integracyjna, zapewniając ujednolicony interfejs odczytu/zapisu/subskrypcji we wszystkich podsystemach z jednego połączenia klienckiego.

Serwer OPC UA znajduje się pomiędzy protokołami polowymi a warstwą IT. Odczytuje lub subskrybuje dane z podsystemów BACnet, Modbus i KNX za pomocą sterowników specyficznych dla protokołu, a następnie udostępnia wszystkie dane w jednej przeglądanej przestrzeni adresowej. Klienci – systemy SCADA, platformy zarządzania energią, pulpity nawigacyjne i łączniki chmurowe – łączą się z serwerem OPC UA raz i uzyskują dostęp do wszystkich danych budynku przez standardowe API, niezależnie od bazowego protokołu.

Topologia integracji OPC UA w budynku

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)

Opcje implementacji serwera OPC UA

W automatyce budynkowej dominują trzy implementacje serwera OPC UA. Każda jest dostosowana do innego ekosystemu BMS i platformy sprzętowej.

SerwerPlatformaSterowniki protokołówLicencja
Siemens DESIGO CC z OPC UAWindows Server, serwer aplikacji DESIGO CCBACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus przez sterowniki DESIGOPłatna – część licencji DESIGO CC
Schneider EcoStruxure BMS OPC UASerwer EcoStruxure Building Operation (EBO)BACnet/IP, Modbus, LON, M-Bus, DALIPłatna – licencja EBO
Serwer Beckhoff TwinCAT OPC UAKomputer z systemem Windows z uruchomionym środowiskiem TwinCAT 3TwinCAT ADS (zmienne PLC), EtherCAT I/O, Modbus przez bloki funkcyjne PLCBezpłatny z licencją TwinCAT
Kepware KEPServerEXKomputer/serwer Windows (bramka standalone)BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, 150+ sterownikówPłatne — licencjonowanie na sterownik
Pro-face Remote HMI OPC UAEmbedded Linux na GP4000/GP4600 HMIModbus TCP, EtherNet/IP, Mitsubishi MC ProtocolDołączone do HMI

Beckhoff TwinCAT OPC UA Server — bezpłatny dla integratorów: Jeśli używasz TwinCAT 3 jako środowiska wykonawczego PLC dla kontrolera budynku, serwer TwinCAT OPC UA jest dołączony bez dodatkowych kosztów. Udostępnia wszystkie zmienne PLC zadeklarowane z atrybutem {attribute 'OPC.UA.DA' := '1'} bezpośrednio jako węzły OPC UA. Jest to najtańsza ścieżka do OPC UA w nowych kontrolerach budynkowych montowanych w szafach sterowniczych.

Model informacyjny OPC UA dla budynków

IEC 62541-100 (OPC UA dla budynków) definiuje znormalizowany model informacyjny odwzorowujący koncepcje ISO 16739-1 IFC (Industry Foundation Classes) na typy obiektów OPC UA. Umożliwia to systemowi zarządzania energią nawigację po przestrzeni adresowej serwera budynku przy użyciu znanych nazw typów – SpaceType, ZoneType, HVACSystemType – zamiast ścieżek znakowych specyficznych dla dostawcy.

Struktura modelu informacyjnego budynku według 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]

Ekstrakcja KPI energii przez subskrypcję OPC UA

Zarządzanie energią wymaga niezawodnych, opatrzonych znacznikami czasu odczytów kWh z węzłów liczników. Zamiast odpytywania liczników w stałych odstępach (co może pomijać szczyty i generuje stały ruch), należy używać subskrypcji OPC UA z interwałem publikacji (PublishingInterval) dopasowanym do wymaganej szczegółowości raportowania oraz strefą nieczułości (deadband) tłumiącą raportowanie o trywialnie małych przyrostach.

KPIWęzeł OPC UAZalecany interwałStrefa nieczułości
Godzinowe zużycie kWhActiveEnergyImport (Double, kWh)PublishingInterval 60 000 msBezwzględny 0,01 kWh
15-minutowe zapotrzebowanie szczytoweActivePower (Float, kW)PublishingInterval 900 000 msBezwzględny 0,1 kW
Monitorowanie mocy w czasie rzeczywistymActivePower (Float, kW)Interwał publikacji 5 000 msProcent 1%
Dzienny odczyt licznika ciepłaThermalEnergyImport (Double, kWh th)Interwał publikacji 86 400 000 msBezwzględny 0,1 kWh
Zużycie gazuGas_Volume (Double, m³)PublishingInterval 3 600 000 msAbsolutny 0,001 m³

OPC UA PubSub: przesyłanie danych budynku do brokera MQTT w chmurze

OPC UA PubSub (IEC 62541-14) rozszerza model klient-serwer o wzorzec publikuj-subskrybuj z wykorzystaniem MQTT lub multiemisji UDP jako transportu. Zamiast platformy chmurowej odpytywania serwera OPC UA, serwer wysyła DataSetMessages do brokera MQTT w skonfigurowanym interwale publikacji WriterGroup. Jest to zalecany wzorzec integracji z chmurą, gdy serwer OPC UA znajduje się za NAT lub zaporą blokującą przychodzący TCP 4840.

OPC UA PubSub – konfiguracja Kepware do brokera 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)

Przykład klienta OPC UA w Pythonie z asyncua

Biblioteka asyncua (dawniej opcua-asyncio) jest zalecanym klientem OPC UA w Pythonie do tworzenia skryptów automatyki budynkowej. Obsługuje async/await, wszystkie tryby bezpieczeństwa, certyfikaty X.509 i subskrypcje. Instalacja za pomocąpip install asyncua.

asyncua — łącz, przeglądaj, czytaj, subskrybuj

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 dla HVAC: przykłady Siemens i Beckhoff

Dwie popularne platformy sterowników budynkowych natywnie udostępniają serwery OPC UA. Siemens DESIGO jest przeznaczony dla dużych budynków komercyjnych ze scentralizowanym BMS; Beckhoff TwinCAT jest przeznaczony dla sterowników szafowych z bezpośrednim I/O.

Serwer OPC UA Siemens DESIGO CC: Włączany przez licencję dodatku DESIGO CC Management Platform. Serwer udostępnia wszystkie punkty danych DESIGO (w tym obiekty BACnet zaimportowane z kontrolerów PXC) jako zmienne OPC UA w hierarchii odpowiadającej strukturze folderów stacji zarządzania DESIGO. Domyślny punkt końcowy: opc.tcp://<desigo-server>:4840. Obsługuje Sign+Encrypt z Basic256Sha256 i certyfikatami klienta X.509. Warunki alarmowe i zdarzeniowe z DESIGO są udostępniane jako węzły OPC UA AlarmCondition.

Beckhoff TwinCAT OPC UA Server (TC3 OPC UA): Bezpłatny z każdą licencją uruchomieniową TwinCAT 3. Zmienne PLC oznaczone atrybutem OPC UA w deklaracji STRUKTURALNEGO TEKSTU są automatycznie publikowane. Obsługuje do 5000 monitorowanych elementów z interwałem próbkowania 10 ms na IPC ze standardowym procesorem. Seria sterowników pomieszczeniowych DESIGO RXB zawiera również wbudowany serwer OPC UA (domyślnie port 48040) z bezpośrednim dostępem do temperatury pomieszczenia, wartości zadanej, zaworu wentylatora i stanu czujnika obecności.

Wzmocnienie bezpieczeństwa serwerów OPC UA w budynkach

Serwery OPC UA w budynkach są punktami zbieżności IT/OT i stanowią cele o wysokiej wartości. Zastosuj następujące kroki wzmacniania podczas uruchamiania:

Krok wzmacnianiaDziałanie konfiguracyjne
Wyłącz uwierzytelnianie anonimoweUsuń AnonymousIdentityToken z konfiguracji punktu końcowego; wymuś nazwę użytkownika lub X.509
Wyłącz przestarzałe zasady bezpieczeństwaUsuń punkty końcowe Basic128Rsa15 i Basic256; włącz tylko Basic256Sha256 i Aes256Sha256RsaPss
Wymuś Sign+EncryptUstaw minimalny MessageSecurityMode = SignAndEncrypt na wszystkich punktach końcowych produkcyjnych
Lista zaufanych certyfikatówImportuj tylko znane certyfikaty klienta do listy zaufania serwera; odrzuć wszystkie inne
Ślad audytuWłącz zdarzenia audytu OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); przekaż do SIEM
Reguły zapory sieciowejZezwalaj na przychodzący TCP 4840 tylko ze znanych adresów IP klientów w sieci VLAN OT; blokuj z sieci LAN IT
Monitorowanie wygaśnięcia certyfikatówSkonfiguruj alerty, gdy certyfikaty serwera lub klienta zbliżają się do wygaśnięcia (ostrzeżenie 90-dniowe)
TwinCAT: przestrzeń nazw tylko do odczytuZadeklaruj zmienne monitorujące jako VAR_OUTPUT lub użyj roli UA, aby ograniczyć zapis

Wymaganie IEC 62443-3-3 Poziom bezpieczeństwa 2: W przypadku budynków objętych normą EN 50159 (kolej) lub zakresem BMS ISO 27001, norma IEC 62443-3-3 SL-2 wymaga, aby wszystkie zdalne połączenia zarządzające wykorzystywały wzajemne uwierzytelnianie oparte na certyfikatach X.509. Anonimowe i tylko z nazwą użytkownika punkty końcowe muszą być wyłączone na wszystkich produkcyjnych serwerach OPC UA.

Potrzebujesz integracji OPC UA BMS dla swojego projektu budowlanego?

Integrujemy podsystemy BACnet, Modbus, KNX i M-Bus w jednolitą warstwę OPC UA – łącząc liczniki energii, sterowniki HVAC i SCADA z analityką w chmurze i platformami zarządzania energią.

Poproś o wycenę →
Loading...
Back to top