OPC UA · BMS · DESIGO CC · Beckhoff · asyncua · MQTT PubSub · 11 мин чтения

OPC UA в автоматизации зданий: интеграция BMS, сбор данных и KPI

OPC UA стал основой интеграции для современных интеллектуальных зданий, предоставляя единый, независимый от вендора интерфейс, который соединяет контроллеры BMS, счетчики энергии, оборудование HVAC и облачные аналитические платформы. В отличие от BACnet или Modbus, OPC UA включает безопасность и самодокументируемую информационную модель — это означает, что система управления энергопотреблением может обнаружить все доступные точки данных с сервера DESIGO CC или TwinCAT без необходимости в отдельной карте регистров или списке точек.

Роль OPC UA в зданиях

Типичное коммерческое здание объединяет три или более подсистем, которые исторически использовали несовместимые протоколы: BACnet/IP BMS для HVAC и контроля доступа, счетчики энергии Modbus RTU на последовательной шине и CMMS (компьютеризированная система управления обслуживанием) для записей об обслуживании оборудования. OPC UA действует как горизонтальный интеграционный слой, предоставляя единый интерфейс чтения/записи/подписки для всех подсистем через одно клиентское подключение.

Сервер OPC UA находится между полевыми протоколами и IT-уровнем. Он опрашивает или подписывается на данные из подсистем BACnet, Modbus и KNX с помощью специальных драйверов, а затем предоставляет все данные в едином адресном пространстве для просмотра. Клиенты — SCADA-системы, платформы управления энергопотреблением, панели мониторинга и облачные коннекторы — подключаются к серверу OPC UA один раз и получают доступ ко всем данным здания через стандартный API, независимо от базового протокола.

Топология интеграции OPC UA в здании

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)

Варианты реализации сервера OPC UA

Для автоматизации зданий доминируют три реализации сервера OPC UA. Каждая подходит для разных экосистем BMS и аппаратных платформ.

СерверПлатформаДрайверы протоколовЛицензия
Siemens DESIGO CC с OPC UAWindows Server, сервер приложений DESIGO CCBACnet/IP, BACnet MS/TP, KNX, Modbus, M-Bus через драйверы DESIGOПлатная — часть лицензии DESIGO CC
Schneider EcoStruxure BMS OPC UAСервер EcoStruxure Building Operation (EBO)BACnet/IP, Modbus, LON, M-Bus, DALIПлатно — лицензия EBO
Сервер Beckhoff TwinCAT OPC UAПК с Windows, работающий под управлением TwinCAT 3 runtimeTwinCAT ADS (переменные ПЛК), EtherCAT I/O, Modbus через функциональные блоки ПЛКБесплатно с лицензией TwinCAT
Kepware KEPServerEXПК/сервер с Windows (автономный шлюз)BACnet/IP, Modbus RTU/TCP, OPC DA, SNMP, EtherNet/IP, более 150 драйверовПлатно — лицензирование на драйвер
Pro-face Remote HMI OPC UAВстроенный Linux на HMI GP4000/GP4600Modbus TCP, EtherNet/IP, протокол Mitsubishi MCВходит в состав HMI

Beckhoff TwinCAT OPC UA Server — бесплатно для интеграторов: Если вы используете TwinCAT 3 в качестве среды выполнения ПЛК для контроллера здания, сервер TwinCAT OPC UA предоставляется без дополнительной платы. Он отображает все переменные ПЛК, объявленные с атрибутом {attribute 'OPC.UA.DA' := '1'} напрямую как узлы OPC UA. Это самый экономичный способ внедрения OPC UA в новых панельных контроллерах здания.

Информационная модель OPC UA для зданий

Стандарт IEC 62541-100 (OPC UA для зданий) определяет стандартизированную информационную модель, отображающую концепции ISO 16739-1 IFC (Industry Foundation Classes) на типы объектов OPC UA. Это позволяет системе управления энергопотреблением навигировать по адресному пространству сервера здания, используя общеизвестные имена типов — SpaceType, ZoneType, HVACSystemType — вместо специфических для вендора строковых путей.

Структура информационной модели здания 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]

Извлечение KPI энергопотребления через подписку OPC UA

Для управления энергопотреблением нужны надёжные показания кВт·ч с метками времени от узлов учёта. Вместо опроса счётчиков через фиксированные интервалы (что может пропустить пики и создаёт постоянный трафик) используйте подписки OPC UA с PublishingInterval, соответствующим нужной детализации, и зоной нечувствительности (deadband), чтобы не передавать незначительные изменения.

KPIУзел OPC UAРекомендуемый интервалЗона нечувствительности
Часовое потребление кВт·чActiveEnergyImport (Double, кВт·ч)PublishingInterval 60 000 мсАбсолютная 0,01 кВт·ч
Пиковая нагрузка за 15 минActivePower (Float, кВт)PublishingInterval 900 000 мсАбсолютная 0,1 кВт
Мониторинг мощности в реальном времениActivePower (Float, кВт)PublishingInterval 5 000 мсПроцентная 1%
Суточные показания теплосчётчикаThermalEnergyImport (Double, кВт·ч тепл.)PublishingInterval 86 400 000 мсАбсолютная 0,1 кВт·ч
Потребление газаGas_Volume (Double, м³)PublishingInterval 3 600 000 мсАбсолютное 0,001 м³

OPC UA PubSub: отправка данных здания в облачный MQTT брокер

OPC UA PubSub (IEC 62541-14) расширяет модель клиент-сервер шаблоном публикации-подписки через MQTT или UDP multicast. Вместо опроса сервера OPC UA облачной платформой, сервер сам отправляет DataSetMessages в MQTT брокер с заданным интервалом WriterGroup PublishingInterval. Это рекомендуемый способ интеграции с облаком, когда сервер OPC UA находится за NAT или файрволом, блокирующим входящий TCP 4840.

OPC UA PubSub — настройка Kepware для 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)

Python OPC UA клиент — пример с asyncua

Библиотека asyncua (ранее opcua-asyncio) — рекомендуемый Python OPC UA клиент для автоматизации зданий. Поддерживает async/await, все режимы безопасности, X.509 сертификаты и подписки. Установка черезpip install asyncua.

asyncua — подключение, обзор, чтение, подписка

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 для систем отопления и вентиляции: примеры Siemens и Beckhoff

Две популярные платформы контроллеров зданий имеют встроенную поддержку OPC UA. Siemens DESIGO ориентирован на крупные коммерческие здания с централизованной BMS; Beckhoff TwinCAT — на панельные контроллеры с прямым вводом/выводом.

Сервер OPC UA Siemens DESIGO CC: Включается через дополнительную лицензию DESIGO CC Management Platform. Сервер предоставляет все точки данных DESIGO (включая BACnet-объекты, импортированные из контроллеров PXC) как переменные OPC UA в иерархии, соответствующей структуре папок станции управления. Конечная точка по умолчанию: opc.tcp://<desigo-server>:4840. Поддерживает Sign+Encrypt с Basic256Sha256 и клиентскими сертификатами X.509. События тревог и условий DESIGO отображаются как узлы OPC UA AlarmCondition.

Сервер OPC UA Beckhoff TwinCAT (TC3 OPC UA): Бесплатно с любой лицензией TwinCAT 3 runtime. Переменные ПЛК, помеченные атрибутом OPC UA в объявлении STRUCTURED TEXT, публикуются автоматически. Поддерживается до 5000 отслеживаемых элементов с интервалом выборки 10 мс на IPC со стандартным процессором. Контроллеры DESIGO RXB также имеют встроенный сервер OPC UA (порт 48040 по умолчанию) с прямым доступом к температуре в помещении, заданной температуре, клапану фанкойла и состоянию датчика присутствия.

Усиление безопасности серверов OPC UA в зданиях

Серверы OPC UA в зданиях — точки пересечения IT и OT, поэтому они являются привлекательными целями. Примените следующие меры защиты во время ввода в эксплуатацию:

Шаг усиленияДействие по настройке
Отключить анонимную аутентификациюУдалите AnonymousIdentityToken из конфигурации конечной точки; используйте Username или X.509
Отключите устаревшие политики безопасностиУдалите конечные точки Basic128Rsa15 и Basic256; оставьте только Basic256Sha256 и Aes256Sha256RsaPss
Принудительно включите Sign+EncryptУстановите минимальный MessageSecurityMode = SignAndEncrypt на всех рабочих конечных точках
Список доверенных сертификатовИмпортируйте только известные сертификаты клиентов в список доверия сервера; отклоняйте все остальные
Журнал аудитаВключите события аудита OPC UA (AuditActivateSessionEvent, AuditWriteUpdateEvent); отправляйте в SIEM
Правила брандмауэраРазрешите входящие TCP 4840 только с известных IP-адресов клиентов в OT VLAN; заблокируйте из IT LAN
Мониторинг срока действия сертификатовНастройте оповещение при приближении срока действия сертификатов сервера или клиента (предупреждение за 90 дней)
TwinCAT: пространство имен только для чтенияОбъявите переменные мониторинга как VAR_OUTPUT или используйте роль UA для ограничения записи

Требование IEC 62443-3-3 Уровень безопасности 2: Для зданий, подпадающих под EN 50159 (железная дорога) или ISO 27001 BMS, IEC 62443-3-3 SL-2 требует, чтобы все удаленные управляющие соединения использовали взаимную аутентификацию на основе сертификатов X.509. Анонимные конечные точки и конечные точки только с именем пользователя должны быть отключены на всех рабочих OPC UA серверах.

Нужна интеграция OPC UA BMS для вашего строительного проекта?

Мы интегрируем подсистемы BACnet, Modbus, KNX и M-Bus в единый слой OPC UA — подключая счетчики энергии, контроллеры HVAC и SCADA к облачной аналитике и платформам управления энергопотреблением.

Запросить цену →
Загрузка ...
Наверх