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.
| Serwer | Platforma | Sterowniki protokołów | Licencja |
|---|---|---|---|
| Siemens DESIGO CC z OPC UA | Windows Server, serwer aplikacji DESIGO CC | BACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus przez sterowniki DESIGO | Płatna – część licencji DESIGO CC |
| Schneider EcoStruxure BMS OPC UA | Serwer EcoStruxure Building Operation (EBO) | BACnet/IP, Modbus, LON, M-Bus, DALI | Płatna – licencja EBO |
| Serwer Beckhoff TwinCAT OPC UA | Komputer z systemem Windows z uruchomionym środowiskiem TwinCAT 3 | TwinCAT ADS (zmienne PLC), EtherCAT I/O, Modbus przez bloki funkcyjne PLC | Bezpłatny z licencją TwinCAT |
| Kepware KEPServerEX | Komputer/serwer Windows (bramka standalone) | BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, 150+ sterowników | Płatne — licencjonowanie na sterownik |
| Pro-face Remote HMI OPC UA | Embedded Linux na GP4000/GP4600 HMI | Modbus TCP, EtherNet/IP, Mitsubishi MC Protocol | Dołą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.
| KPI | Węzeł OPC UA | Zalecany interwał | Strefa nieczułości |
|---|---|---|---|
| Godzinowe zużycie kWh | ActiveEnergyImport (Double, kWh) | PublishingInterval 60 000 ms | Bezwzględny 0,01 kWh |
| 15-minutowe zapotrzebowanie szczytowe | ActivePower (Float, kW) | PublishingInterval 900 000 ms | Bezwzględny 0,1 kW |
| Monitorowanie mocy w czasie rzeczywistym | ActivePower (Float, kW) | Interwał publikacji 5 000 ms | Procent 1% |
| Dzienny odczyt licznika ciepła | ThermalEnergyImport (Double, kWh th) | Interwał publikacji 86 400 000 ms | Bezwzględny 0,1 kWh |
| Zużycie gazu | Gas_Volume (Double, m³) | PublishingInterval 3 600 000 ms | Absolutny 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 wzmacniania | Działanie konfiguracyjne |
|---|---|
| Wyłącz uwierzytelnianie anonimowe | Usuń AnonymousIdentityToken z konfiguracji punktu końcowego; wymuś nazwę użytkownika lub X.509 |
| Wyłącz przestarzałe zasady bezpieczeństwa | Usuń punkty końcowe Basic128Rsa15 i Basic256; włącz tylko Basic256Sha256 i Aes256Sha256RsaPss |
| Wymuś Sign+Encrypt | Ustaw minimalny MessageSecurityMode = SignAndEncrypt na wszystkich punktach końcowych produkcyjnych |
| Lista zaufanych certyfikatów | Importuj tylko znane certyfikaty klienta do listy zaufania serwera; odrzuć wszystkie inne |
| Ślad audytu | Włącz zdarzenia audytu OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); przekaż do SIEM |
| Reguły zapory sieciowej | Zezwalaj 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ów | Skonfiguruj alerty, gdy certyfikaty serwera lub klienta zbliżają się do wygaśnięcia (ostrzeżenie 90-dniowe) |
| TwinCAT: przestrzeń nazw tylko do odczytu | Zadeklaruj 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ę →