Sidebar Left

OPC и BACnet: справочник разработчика

OPC и BACnet стоят на верхнем этаже автоматизации: здесь данные не столько снимают с датчика, сколько передают между программами, контроллерами и системами — вместе с их описанием, единицами измерения и правами доступа. Оба отвечают на вопрос, на который обычный опрос устройства не отвечает: как система узнаёт, что у неё есть, и что с этим можно делать.

Этот раздел — практическая выжимка для интеграторов: из чего состоит адресное пространство OPC UA, как устроена объектная модель BACnet, чем OPC Classic отличается от UA, почему BACnet-устройства «не видны» из соседней подсети и что из этого применимо к нашему оборудованию.

Два разных мира
Названия часто ставят рядом, но родословная у них разная. OPC — это интерфейс между приложениями: сервер OPC берёт данные из оборудования тем протоколом, который понимает конкретный прибор, и отдаёт их клиентам — SCADA, историзатору, MES — в едином виде. Само устройство по OPC обычно не разговаривает: разговаривает сервер, который стоит рядом с ним или внутри контроллера.

BACnet — наоборот, полноценный протокол обмена, на котором говорят сами приборы: контроллеры вентиляции, приводы заслонок, счётчики тепла, пожарные и охранные панели. Он родом из автоматизации зданий (ASHRAE 135, международный стандарт ISO 16484-5) и в промышленности встречается там, где инженерные системы здания смыкаются с технологическими.

OPC Classic OPC UA BACnet
Что это Интерфейс обмена между программами в Windows Интерфейс обмена между системами, независимый от платформы Протокол и объектная модель самого устройства
Кто «говорит» Сервер рядом с оборудованием, не сам прибор Сервер — программа или встроенный в контроллер модуль Сами приборы: контроллеры, приводы, счётчики
Модель данных Плоский список тегов, иерархия — только в именах Дерево узлов с типами, ссылками и методами Набор объектов устройства со стандартными свойствами
Как узнать состав Просмотр пространства имён сервера Обход дерева сервисом Browse Who-Is → список объектов устройства
Транспорт COM/DCOM, порт 135 и динамический диапазон opc.tcp (4840), HTTPS, MQTT/AMQP в режиме PubSub UDP 47808, RS-485 (MS/TP), WebSocket поверх TLS (BACnet/SC)
Безопасность Права Windows и настройки DCOM Сертификаты X.509, подпись и шифрование, вход по логину или сертификату Исторически без защиты; шифрование появилось в BACnet/SC
Типичная область Унаследованные системы на Windows Верхний уровень и обмен между системами, встраиваемые серверы Инженерные системы зданий: вентиляция, тепло, освещение

OPC Classic: DA, HDA и A&E
Первое поколение OPC построено на технологии Microsoft COM/DCOM и живёт только в Windows. Спецификаций три, и путать их не стоит:

  • OPC DA (Data Access, версии 2.05a и 3.0) — текущие значения: клиент подписывается на группу тегов и получает обновления с заданным интервалом. У каждого значения три части: значение, метка времени и качество (good / bad / uncertain). Качество читают редко, а зря: именно оно отличает «ноль, потому что так и есть» от «ноль, потому что связи нет».
  • OPC HDA (Historical Data Access, версия 1.20) — архивы: выборка за интервал, агрегаты, вставка и правка исторических значений.
  • OPC A&E (Alarms & Events, версия 1.10) — события и тревоги с подтверждением оператором.

Главная боль Classic — DCOM. Обмен идёт через порт 135 и динамический диапазон портов, аутентификация завязана на учётные записи Windows, а при отсутствии общего домена настройка превращается в подбор прав в dcomcnfg. Стандартные симптомы: «сервер не найден» при верных настройках, обрыв связи после перезагрузки клиента, минутные тайм-ауты вместо мгновенного отказа. Лечится это либо туннелированием (пара агентов, между собой общающихся по обычному TCP), либо переходом на OPC UA.

Наш OPC HDA сервер отдаёт клиентам архивы электроэнергетики, которые хранятся в памяти контроллеров: данные технического и коммерческого учёта, мощность и параметры качества электроэнергии. Поддерживается спецификация OPC HDA 1.20, работа возможна в режиме локального или удалённого сервера, клиентом выступает SCADA или прикладная программа — страница OPC HDA сервера.

OPC UA: адресное пространство
OPC UA (стандарт IEC 62541) — не «новая версия DA», а другая архитектура: без COM, кроссплатформенная, со встроенной безопасностью и с моделью данных, которую клиент может обойти сам.

Всё, что есть на сервере, — это узлы (nodes) и ссылки между ними. Узел бывает нескольких классов: Object — папка или физическая сущность, Variable — значение, Method — вызываемая функция, ObjectType и VariableType — описания типов. У каждого узла есть адрес NodeId — пара «номер пространства имён + идентификатор»: ns=2;i=1043 (числовой) или ns=2;s=Line1.Motor.Speed (строковый). Пространство имён — не украшение: индекс ns может поменяться при перезапуске сервера, поэтому запоминать в конфигурации нужно не индекс, а URI пространства имён и разрешать его при подключении.

Обход дерева выполняется сервисом Browse от корня Objects; связи между узлами задаются типами ссылок (Organizes, HasComponent, HasTypeDefinition). Отсюда главное практическое правило: обходить дерево — дорого, делайте это один раз при настройке и сохраняйте найденные NodeId, а в работе читайте по ним напрямую.

OPC UA: сервисы, подписки и безопасность
Основных сервисов немного:

  • Read / Write — разовое чтение и запись атрибутов узлов (значение, качество, метка времени — это атрибуты одного узла).
  • CreateSubscription + CreateMonitoredItems — подписка. У подписки свой publishing interval (как часто сервер шлёт пакет уведомлений), у каждого элемента — свой sampling interval (как часто сервер смотрит на источник), deadband (порог изменения, ниже которого уведомление не шлётся) и queue size. Правильно настроенная подписка снимает с линии почти весь опросный трафик; ошибка здесь — самая частая причина «UA тормозит».
  • Call — вызов метода на сервере (сброс, команда, запуск процедуры).
  • HistoryRead — исторические данные, преемник OPC HDA. Alarms & Conditions — преемник A&E.

Транспорт — обычно двоичный opc.tcp:// (порт по умолчанию 4840), реже HTTPS. Поверх соединения строится secure channel, а внутри него — session: разрыв канала не обязательно рвёт сессию, клиент может к ней вернуться.

Безопасность в UA обязательна к пониманию, потому что именно на ней спотыкается первое подключение. Сервер и клиент обмениваются сертификатами X.509, и каждый должен положить чужой сертификат в доверенные — иначе соединение отклоняется с BadCertificateUntrusted. Режим задаётся двумя независимыми настройками: Security Mode (None / Sign / SignAndEncrypt) и Security Policy (None, Basic256Sha256, Aes128_Sha256_RsaOaep и другие; старые Basic128Rsa15 и Basic256 объявлены устаревшими). Отдельно выбирается способ входа пользователя: анонимно, логин с паролем или по сертификату. Частая ошибка — выставить SignAndEncrypt и оставить политику None: такой набор сервер не примет.

Для встраиваемых устройств существуют профили — Nano, Micro, Embedded, Standard: контроллеру не обязательно реализовывать весь стандарт, достаточно профиля, который покрывает нужные сервисы. А для обмена «один ко многим» и жёсткого реального времени в UA есть PubSub: публикация UADP по UDP multicast либо JSON через MQTT/AMQP, без сессий и подтверждений.

BACnet: объекты и свойства
В BACnet устройство описывает себя само. Каждое устройство — это объект Device с уникальным номером экземпляра (0…4194302) и списком собственных объектов. Объект имеет тип и номер, вместе они дают идентификатор вида Analog Input 3 или Binary Output 12.

Основные типы объектов:

  • Analog Input / Output / Value и Binary Input / Output / Value — аналоговые и дискретные величины: измерение, команда, внутренняя переменная.
  • Multi-state Input / Output / Value — состояние из перечня (например, режим «стоп / малая / большая скорость»).
  • Schedule и Calendar — расписания и календари, Trend Log — архив значений, Notification Class — адресация уведомлений, Loop — ПИД-контур.

Свойства объекта тоже стандартизованы: Object_Identifier, Object_Name, Present_Value (текущее значение), Units (единицы измерения из перечня стандарта), Status_Flags (in-alarm, fault, overridden, out-of-service), Out_Of_Service и Reliability. Именно поэтому клиенту не нужна карта регистров: он спрашивает у устройства список объектов и читает у каждого имя, значение и единицы.

Отдельного внимания заслуживает запись. Управляемые объекты (выходы) имеют Priority_Array — шестнадцать уровней приоритета. Команда пишется на свой уровень, а действует та, что записана на самом высоком (1 — самый высокий). Уровень 8 по традиции отдан ручному управлению оператором, уровень 6 зарезервирован под минимальное время включения/выключения. Чтобы «отпустить» управление, на свой уровень пишут NULL; если не записан ни один уровень, действует Relinquish_Default. Классическая ошибка интегратора — записать команду на приоритет 1 «чтобы точно сработало» и навсегда заблокировать локальную автоматику.

BACnet: сервисы и каналы связи
Сервисов в стандарте много, но в обиходе используется десяток:

  • Who-Is / I-Am — поиск устройств в сети и ответ с номером экземпляра, Who-Has / I-Have — поиск объекта по имени.
  • ReadProperty и ReadPropertyMultiple — чтение одного или сразу нескольких свойств; второй экономит трафик в разы и на MS/TP это решающе.
  • WriteProperty / WritePropertyMultiple — запись, с указанием приоритета для управляемых объектов.
  • SubscribeCOV — подписка на изменение значения: устройство само шлёт COVNotification, когда значение изменилось больше заданного порога. Подписка имеет срок жизни и требует продления.
  • TimeSynchronization, AtomicReadFile / AtomicWriteFile (журналы и файлы), ReinitializeDevice.

Канальных уровней несколько, и от выбора зависит почти вся диагностика:

  • BACnet/IP — UDP, порт 47808 (0xBAC0). Обнаружение устройств идёт широковещательными запросами, поэтому через маршрутизатор Who-Is не проходит. Для связи подсетей применяется BBMD (BACnet Broadcast Management Device) и регистрация «чужих» узлов как Foreign Device. Если устройства видны локально, но не видны с сервера — почти всегда дело в этом.
  • MS/TP — по RS-485, скорости от 9600 до 115 200 бод, доступ к линии по эстафете маркера. Ключевой параметр — Max_Master: мастер перебирает адреса до этого значения, и если оставить 127 при четырёх устройствах на линии, опрос будет тратить время на поиск несуществующих. Второй — Max_Info_Frames, сколько кадров устройство успевает отправить, удерживая маркер.
  • BACnet/SC (Secure Connect) — современное дополнение: обмен по WebSocket поверх TLS через хаб, без широковещания и без BBMD. Постепенно вытесняет BACnet/IP там, где сеть не своя, а корпоративная.

Как это связано с нашим оборудованием и ПО
Наши контроллеры и УСПД применяются в системах телемеханики и учёта энергоресурсов. Что касается протоколов этой статьи:

  • OPC DA и OPC UA входят в список поддерживаемых протоколов контроллеров ТК16L и E-422; режим сервера OPC UA и DA поставляется по запросу — способ реализации и лицензирование уточняются в технической поддержке.
  • OPC HDA сервері — отдельная программа, отдающая архивы электроэнергетики из памяти контроллеров в SCADA по спецификации HDA 1.20.
  • BACnet — когда на объекте инженерные системы здания уже говорят по этому протоколу, их связывают с системой телемеханики одним из двух способов: шлюзом-преобразователем (устройство BACnet выставляется наружу как набор регистров в протоколе опроса, которым контроллер уже пользуется, — чаще всего это Modbus) либо на верхнем уровне — SCADA с драйверами обоих протоколов, где BACnet-контур и телемеханический контур сводятся в одном проекте. Второй путь надёжнее, когда с BACnet нужны не только значения, но и расписания, тревоги и команды с приоритетами.

Типовые ошибки

Симптом Где искать
OPC Classic: «сервер не найден» при верных настройках DCOM: права на запуск и доступ, учётные записи по обе стороны, порт 135 и динамический диапазон в межсетевом экране
OPC UA: соединение обрывается сразу после подключения Сертификаты не в доверенных (BadCertificateUntrusted) либо несочетаемые Security Mode и Security Policy
OPC UA: клиент работает, но данные обновляются рывками Publishing interval подписки и sampling interval элементов; deadband, из-за которого малые изменения не доходят
OPC UA: после перезапуска сервера «пропали» теги В конфигурации сохранён индекс ns, а не URI пространства имён
BACnet: устройства не находятся с сервера, но видны локально Широковещательные Who-Is не проходят через маршрутизатор: нужен BBMD или регистрация Foreign Device
BACnet: два устройства «мигают» в списке Совпадающие номера экземпляров Device — они должны быть уникальны во всей сети
BACnet MS/TP: опрос медленный, растут тайм-ауты Max_Master больше реального числа устройств; неверные Max_Info_Frames, скорость или согласование линии RS-485
BACnet: команда записалась, а оборудование не реагирует Приоритет записи ниже уже занятого уровня в Priority_Array; либо объект в Out_Of_Service

С чего начать
Для OPC UA порядок такой: подключиться любым клиентом OPC UA в режиме None без шифрования, обойти дерево, найти нужные узлы и записать их NodeId вместе с URI пространства имён. Затем включить Sign&Encrypt, обменяться сертификатами и убедиться, что соединение поднимается. И только после этого настраивать подписки — с интервалами, которые нужны процессу, а не «раз в секунду на всё подряд».

Для BACnet: определить канальный уровень (IP или MS/TP), запустить сканирование Who-Is в той же подсети, получить список устройств с номерами экземпляров, прочитать у нужного устройства список объектов, а у объектов — Object_Name, Present_Value и Units. Управление подключать в последнюю очередь, заранее договорившись с наладчиком об уровне приоритета, на котором вы пишете.

Style Selector

Primary Color

Direction