Продолжаем разбирать коммуникационные возможности системы WinCC OA. Но этот раз рассмотрим подключение к контроллеру «гражданской» автоматизации (AKA автоматизация зданий) Siemens PXC12 по протоколу Bacnet, который и был разработан аккурат для автоматизации зданий.
С ним я никогда не работал, но он очень интересный. Во-первых, данные тут представлены в виде набора стандартных структур (или «объектов», как это ныне модно говорить, хотя с точки зрения объектно-ориентированного программирования, это никакие не объекты). Например AI0.HiLimit, или же «аналоговый вход 0».верхний предел измерения. Во-вторых, если я все правильно понял, он реализован сразу и для IP, и для последовательных каналов. В-третьих, в протоколе предусмотрены некие «шлюзы», благодаря которым можно построить сеть разнородных устройств Bacnet с применением разной «физики».
Данный пример демонстрирует простейшее подключение по Bacnet. Одно устройство по протоколу TCP/IP, никаких шлюзов. Не используется лицензия объектов Bacnet. Не используется готовое WinCC OA Bacnet Application (расположена в установочной директории):
Ни среды разработки, ни прикладного ПО для этого контроллера у меня нет, мне известен только ip-адрес: 192.168.0.10. Для начала настраиваю один из проводных интерфейсов своего компьютера и проверяю обычный ping.
Еще можно найти бесплатную программу Yet another bacnet explorer (сокращенно - yabe, но я бы назвал ее yet another bacnet ultimate terminal, исключительно из любви к искусству) и просмотреть полные данные моего ПЛК. Хорошая программа, благодаря которой можно, указав лишь интерфейс ПК, который «смотрит» на сеть bacnet, получить имеющееся в сети устройство, его bacnet id, его порт и список его переменных.
Теперь приступаем к реальной работе. Не забудьте только закрыть yabe. Мы же сейчас будем подключаться к тому же порту, что и yabe. При активном yabe что-то может пойти не так. Напоминаю, что это простейший пример, поэтому диапазоны портов, открытые на ПЛК для коннекта, не рассматриваем, у нас все примитивно. Казалось бы, в первую очередь добавляем драйвер в консоль, но нет. Для некоторых драйверов есть «нулевой» шаг, который называется «добавить строчки в главный config-файл проекта).
Дописываем следующее (помним, что последняя строка файла должна быть пустой).
[bacnet]
net = 1 "IP" "" "" 47808 "" 0 120 0
Что означает эта строка конфига - добро пожаловать в документацию на драйвер. Скажу лишь, что для штатного подключения к ПЛК этого достаточно. Ну, а теперь можно и драйвер в консоль добавить. Естественно, указывая номер драйвер опцией -num X, где X в нашем случае будет 2.
После запуска драйвера смотрим новые строчки в логах. Сейчас у нас все хорошо, драйвер запущен в демо-режиме.
Следующий шаг - открываем модуль управления системой и настраиваем соединение с контроллером по нужному протоколу.
Все, что надо ввести - это ID устройство, которое мы определили в программе yabe (которую, напомню, лучше к этому моменту закрыть).
Ставим галочку Active, применяем и… ничего не происходит.
Пробуем изменить настройки привязки адреса с динамики на статику.
Все равно, не работает, состояние связи - оффлайн. Похоже, ничего не работает. Расходимся. Not so fast! Вспоминаем, что некоторые драйвера нашей SCADA сообщают о наличии коннекта только после настройки адресного конфига хотя бы одной точки данных. Например, modbus. Похоже, что это правило относится ко всем драйверам, у которых номер драйвера в системе указывается не в настройках коннекта, а только в настройках точки данных. Оставляем эту интересную теорию в стороне и открываем модуль para, создаем точку данных типа ExampleDP (я их сильно люблю для проверки коммуникаций) и настраиваем ее адресный конфиг.
Не забываем указать номер драйвера (2), выбираем тип объекта - аналоговый вход, номер объекта - 1 (это можно подсмотреть в yabe), свойство объекта - верхний предел измерения. Почему не значение сигнала? Потому, что сигнал не расключен. Не забываем, что надо еще создать группу опроса и сделать ее активной. Делаем адресный конфиг активным, и связь появляется. Это видно и по значению сигнала в para, и по надписи в свойствах коннекта, и в системном журнале.
Еще один эксперимент. Перейдем от статических настроек коннекта к динамическим. Сменим настройку, заглушим проект целиком и даже перегрузим ПЛК, тем самым постаравшись добиться максимальной чистоты эксперимента.
После перезапуска связь установилась.
«За кадром» я провел два эксперимента.
В первом я оставил динамическую привязку в настройках соединения, создал адресный конфиг точки данных, и все заработало.
Второй аналогичен первому, только настройки связи были со статической привязкой. Оба эксперимента проводились через создание нового проекта. В обоих случаях связь появлялась только после настройки первой точки данных, квот эррат демонстрандум!