OPC UA · BACnet/IP · Modbus TCP · Kepware · UaExpert · Azure IoT · 11 мин чтения

Шлюз OPC UA в BACnet и Modbus: трансляция протоколов для интеграции BMS

Подавляющее большинство устройств BMS — контроллеры BACnet/IP, счетчики энергии Modbus TCP и полевые устройства Modbus RTU — не имеют встроенного сервера OPC UA. Протокольный шлюз устраняет этот разрыв: он подключается к устаревшим устройствам через их родные протоколы и предоставляет все обнаруженные точки данных как узлы OPC UA в едином адресном пространстве. Kepware KEPServerEX — отраслевой стандарт для этой роли, поддерживаемый Siemens, Schneider и Rockwell Automation для многопротокольных шлюзов BMS.

Зачем нужен шлюз

Устройства BACnet/IP и BACnet MS/TP предоставляют данные через сервисы объектов BACnet (ReadProperty, SubscribeCOV), а не через OPC UA. Устройства Modbus TCP и RTU предоставляют данные как пронумерованные регистры без встроенных имен, типов или безопасности. Клиент OPC UA не может напрямую общаться ни с одним из этих протоколов.

Шлюз действует как уровень трансляции. На южной стороне он опрашивает или подписывается на устройства, используя их родные протоколы. На северной стороне он запускает полноценный сервер OPC UA, сопоставляя каждую точку данных устройства с именованным, типизированным узлом-переменной OPC UA. Результат: SCADA-система, облачный коннектор или платформа управления энергопотреблением видит единую конечную точку OPC UA, содержащую все данные здания, независимо от того, говорят ли базовые устройства на BACnet, Modbus, KNX или SNMP.

COV против опроса в шлюзе: Для устройств BACnet, поддерживающих подписку на изменение значения (COV), настройте Kepware на использование SubscribeCOV вместо периодического опроса ReadProperty. COV снижает сетевой трафик BACnet и гарантирует, что шлюз отражает изменения состояния немедленно, а не ждет следующего цикла опроса. Устройства Modbus всегда требуют опроса — установите частоту сканирования в соответствии с требованиями к свежести данных (обычно 1–10 секунд для HVAC, 100–500 мс для качества электроэнергии).

Сравнение вариантов шлюзов

ШлюзСервер OPC UAПоддержка BACnetПоддержка ModbusПлатформа
Kepware KEPServerEX 6Полный сервер UA (все режимы безопасности)BACnet/IP + MS/TP; BBMD; COVModbus RTU/TCP/ASCII; 65535 рег.Windows Server/ПК
matrikon OPC UA TunnellerOPC UA сервер + мост DA/HDAТолько через мост OPC DAТолько через мост OPC DAWindows
Cogent DataHub OPC UAПолноценный UA серверBACnet/IP; ограниченный COVModbus TCPWindows
softing edgeConnector ModbusСервер OPC UAНет — только ModbusModbus TCP + RTUDocker / Linux / Windows
softing edgeConnector BACnetСервер OPC UABACnet/IP + MS/TPНетDocker / Linux / Windows
Ignition (Inductive Automation)Встроенный OPC UA серверBACnet/IP через драйвер-модульДрайвер Modbus TCP/RTUWindows / Linux (JVM)

Kepware KEPServerEX: настройка драйвера BACnet/IP

Драйвер BACnet/IP Ethernet от Kepware (лицензируется отдельно от базового пакета KEPServerEX) подключается к устройствам BACnet/IP в локальной подсети или через маршрутизаторы с помощью BACnet Broadcast Management Device (BBMD). После добавления канала драйвера Kepware автоматически обнаруживает все видимые BACnet-устройства и импортирует их списки объектов.

Настройка драйвера BACnet/IP Kepware

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

Каждый импортированный BACnet-объект становится тегом Kepware. Kepware автоматически сопоставляет свойство Present_Value BACnet с основным значением тега. Имя тега следует шаблону DeviceName.ObjectType_Instance.Property, например: PXC_01.AnalogInput_1.Present_Value. Эти теги сразу же становятся доступными как узлы переменных OPC UA на встроенной конечной точке OPC UA KEPServerEX.

Modbus TCP в OPC UA: импорт карты регистров

Устройства Modbus TCP требуют явной настройки карты регистров — в отличие от BACnet, здесь нет самодокументируемого обнаружения объектов. Драйвер Modbus TCP/IP Ethernet от Kepware принимает CSV-файл импорта тегов или ручную настройку тега с указанием адреса регистра, типа данных и инженерного преобразования.

Настройка тега 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"

Сопоставление BACnet-объекта с узлом OPC UA

Kepware сопоставляет каждый тип BACnet-объекта с узлом переменной OPC UA с соответствующим типом данных OPC UA. Свойство Present_Value BACnet-объекта становится значением узла OPC UA. Свойства Status_Flags и Reliability сопоставляются с StatusCode переменной OPC UA.

Тип BACnet-объектаТип Present_ValueТип данных OPC UAТипичное применение
Аналоговый вход (AI)REAL (Float)FloatДатчик температуры, давления, расхода
Аналоговый выход (AO)REAL (Float)Float (записываемый)Уставка положения клапана, скорость вентилятора
Аналоговое значение (AV)REAL (Float)Float (записываемый)Уставка, расчетное значение
Дискретный вход (BI)ENUMERATED (Активен/Неактивен)ЛогическийСтатус вкл/выкл, состояние тревоги
Дискретный выход (BO)ENUMERATED (Активен/Неактивен)Логический (доступен для записи)Команда вкл/выкл, управление реле
Дискретное значение (BV)ENUMERATED (Активен/Неактивен)Логический (доступен для записи)Флаг режима, состояние принудительного управления
Многосостояний вход (MI)UNSIGNED INTInt32Чтение режима работы (Выкл=0, Нагрев=1, Охлаждение=2)
Многосостояний выход (MO)UNSIGNED INTInt32 (доступен для записи)Команда режима, шаг скорости
Многосостояний значение (MV)UNSIGNED INTInt32 (доступен для записи)Настраиваемое перечисляемое значение
НакопительUNSIGNED INT (32-бит)UInt32Счетчик импульсов: кВт·ч, м³, литры

Безопасность для шлюзов OPC UA

Шлюз OPC UA — это пограничное устройство между IT и OT. Если его взломать, злоумышленник может через сервис записи OPC UA управлять BACnet-выходами (клапаны, реле) или Modbus-катушками. Применяйте эшелонированную защиту: сегментация сети, аутентификация по сертификатам, минимальные права на запись.

Мера безопасностиРеализация
Выделенная OT VLANПоместите сервер Kepware в изолированную VLAN; BACnet и Modbus устройства — в ту же VLAN; без прямого маршрута в IT-сеть
Правила брандмауэраРазрешить TCP 4840 входящие только с известных IP OPC UA клиентов; заблокировать все остальные входящие; разрешить Kepware исходящие на BACnet UDP 47808 и Modbus TCP 502
Аутентификация по сертификатамОтключить анонимный доступ; требовать X.509 клиентские сертификаты; импортировать доверенные сертификаты клиентов в хранилище Kepware
Управление доступом пользователей KepwareСоздать роль UA только для чтения для клиентов мониторинга; роль UA чтение-запись только для интеграции с BMS; MFA на консоли администратора Kepware
Защита от записи на уровне теговУстановить теги Modbus только для чтения в Kepware, если запись не требуется; BACnet AO/BO/MO теги с правом записи только для роли SCADA
Журнал аудитаВключить журнал событий Kepware; перенаправлять в Windows Event Log → SIEM; оповещать о несанкционированных попытках записи

Порт по умолчанию 4840: Kepware KEPServerEX по умолчанию слушает TCP порт 4840 — зарегистрированный IANA порт OPC UA. Этот порт должен быть открыт в брандмауэре Windows на хосте Kepware для подключения OPC UA клиентов. Не открывайте порт 4840 в ненадёжные сети. Если серверу Kepware требуется доступ к OPC UA через интернет (для облачных коннекторов), используйте обратный прокси с взаимным TLS, а не прямое перенаправление портов.

Тестирование OPC UA подключений с UaExpert

UaExpert (от Unified Automation) — это стандартный бесплатный OPC UA клиент для пусконаладки и диагностики. Он предоставляет полный обзор адресного пространства, мониторинг данных в реальном времени, тестирование подписок и управление сертификатами безопасности. Скачать с unified-automation.com (требуется бесплатная регистрация).

UaExpert — шаги подключения и проверки

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

Облачная интеграция через Azure IoT Hub OPC Publisher

Azure IoT Hub OPC Publisher — это клиент OPC UA с открытым исходным кодом от Microsoft, который подключается к серверам OPC UA (включая Kepware) и передает телеметрию в Azure IoT Hub. Он работает как модуль Azure IoT Edge на контейнере Linux в здании, связывая уровень OT OPC UA с облачными сервисами Azure.

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

Из Azure IoT Hub телеметрия направляется в Azure Time Series Insights, Azure Data Explorer или пользовательское задание Azure Stream Analytics для создания панелей мониторинга энергоэффективности в реальном времени в Power BI. Контейнер OPC Publisher обрабатывает переподключение, буферизацию при потере связи (настраиваемое хранилище и пересылка) и управление сертификатами для соединения OPC UA с Kepware.

Нужен шлюз BACnet или Modbus к OPC UA для вашего проекта?

Мы настраиваем и вводим в эксплуатацию шлюзы Kepware KEPServerEX, подключающие устройства BACnet/IP, Modbus TCP и KNX к клиентам OPC UA, SCADA-платформам и Azure IoT Hub — с полным усилением безопасности и управлением сертификатами.

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