В последних релизах Zabbix "из коробки" стал поддерживать некоторые популярные протоколы промышленного оборудования. Имея поддержку Modbus и MQTT, его использование с системами промышленной автоматизации стало чуточку проще. Но подобный подход к мониторингу такого рода оборудования не всегда возможен.
Как правило, на предприятиях используется большое количество устройств промышленной автоматики разных лет и от разных производителей, поддерживающих разные протоколы обмена. OPC серверы являются универсальным инструментом обмена данными с такими устройствами. Информация на тему интеграции Zabbix и OPC DA в сети практически отсутствует. Возможно, мой небольшой опыт в этом направлении окажется полезен.
Для чего нам Zabbix
В нашем сценарии использования Zabbix последний не является заменой имеющейся SCADA-системе. Параллельное развертывание системы мониторинга позволит иметь возможность гибкой настройки триггеров и своевременного получения оповещений о нештатных ситуациях на оборудовании. Также мы сможем создавать дополнительные информационные панели с графиками, которые смогут давать быстрое представление о ходе тех. процессов.
Взаимодействие с OPC серверами
Самой сложной задачей, которая стоит перед нами, является организация взаимодействия с OPC-серверами. В ходе поисков готового решения такого взаимодействия стало понятно, что подходящих нам вариантов не так много. Из того, что было найдено, наиболее пригодным к использованию оказался консольный клиент OpenOPC.
Установка OpenOPC
Как было сказано ранее, речь идет о стандарте OPC DA, а значит, о технологии DCOM и, соответственно, ОС Windows. В нашем случае установка OpenOPC производилась на машину с Windows XP, где и находится проприетарный OPC сервер. После завершения установки необходимо добавить путь до opc.exe в системную переменную среды PATH.
Проверим работу утилиты. Для начала выведем в консоль список доступных OPC серверов:
C:\Users\Администратор> opc.exe -q
Merz.OPC_SAIA_S-BUS.1
C:\Users\Администратор>
Теперь попробуем получить теги в удобном нам формате - csv:
C:\Users\Администратор>opc.exe -o csv -s Merz.OPC_SAIA_S-BUS.1 ATP.Register.OAT
ATP.Register.OAT,197,Good,05/24/21 07:16:15
C:\Users\Администратор>opc.exe -o csv -s Merz.OPC_SAIA_S-BUS.1 ATP.Register.OAT ATP5.Register.T_inlet ATP5.Register.T_outlet
ATP.Register.OAT,198,Good,05/24/21 07:16:41
ATP5.Register.T_inlet,627,Good,05/24/21 07:16:41
ATP5.Register.T_outlet,654,Good,05/24/21 07:16:41
C:\Users\Администратор>
Если что-то пошло не так
В ходе экспериментов с opc.exe выяснились некоторые моменты. Первое: каждый OPC клиент запускал новую копию OPC сервера, а их параллельная работа невозможна. Так как запустить используемый нами OPC сервер как службу не получилось, то через DCOM был настроен запуск OPC сервера от определенного пользователя. Все OPC клиенты - SCADA и агент Zabbix - были также настроены на запуск от этого пользователя. Второе: выявлены некоторые недостатки в работе самого OpenOPC. Например, клиент не вычитывает теги, в названии которых присутствуют символы, отличающиеся от латинских. С этим пока пришлось смириться и решать такие проблемы путем переименования тегов в OPC сервере.
Установка Zabbix агента
На ту же машину установим Zabbix агент, который сможет работать под Windows XP, например, zabbix_agent-5.2.0-windows-i386-openssl.msi. Агент будет выполнять активные проверки. Чтобы облегчить дальнейшую конфигурация агента, во время установки заполним следующие поля:
Ноst name - уникальное имя хоста, совпадающее с именем узла сети на Zabbix сервере.
Zabbix server IP/DNS - IP-адреса Zabbix сервера.
Server or Proxy for active checks - IP-адрес Zabbix сервера для активных проверок.
Конфигурирование Zabbix агента
В конфигурационный файл C:\Program Files\Zabbix Agent\zabbix_agentd.conf были внесены некоторые изменения.
Увеличено время выполнения скрипта.
### Option: Timeout # Spend no more than Timeout seconds on processing. # # Mandatory: no # Range: 1-30 # Default: # Timeout=3 Timeout=30
Создан параметр для мониторинга.
# User-defined parameter to monitor. There can be several user-defined parameters. # Format: UserParameter=<key>,<shell command> # # Mandatory: no # Default: # UserParameter= UserParameter=opc[*],opc.exe -o csv -s $1 $2
Узел сети и элементы данных на сервере Zabbix
На Zabbix сервере создадим узел сети. Имя узла сети должно совпадать с Ноst name, указанном при установке агента, интерфейс - IP-адрес агента.
Далее к созданному узлу сети добавим элемент данных c типом Zabbix агент (активный). Ключом должна являться конструкция типа: opc[<ИМЯ OPC СЕРВЕРА>, <ЗАПРАШИВАЕМЫЕ ТЕГИ ЧЕРЕЗ ПРОБЕЛ>].
Значениями элемента данных будут строки, разделенные запятыми:
ATP2.Register.OAT,273,Good,05/24/21 15:21:33
ATP2.Register.GVS.T_inlet_W,501,Good,05/24/21 15:21:33
ATP2.Register.GVS.T_outlet_W,445,Good,05/24/21 15:21:33
ATP2.Register.T_outlet_w_com,404,Good,05/24/21 15:21:33
ATP2.Register.RAD.T_outlet_W,256,Good,05/24/21 15:21:33
ATP2.Register.P_in_W_com,39,Good,05/24/21 15:21:33
ATP2.Register.P_out_W_com,36,Good,05/24/21 15:21:33
ATP2.Register.RAD.P_outlet_W,43,Good,05/24/21 15:21:33
ATP2.Register.FIRE.P_gidrant,68,Good,05/24/21 15:21:33
Зависимые элементы данных
Создадим зависимые элементы данных для того, чтобы распарсить CVS, полученный в самом элементе.
В предобработке используем JavaScript, который получит необходимую нам строку в CVS, проверит качество тега и вернет результат.
function (value){
var nr_line = 4;
var lines = value.split('\n');
var fields = lines[nr_line].split(',');
if(typeof fields[2] != "undefined" && fields[2] == "Good"){
return (typeof fields[1] != "undefined") ? fields[1] : null;
}
return null;
}
Пример визуализации полученных данных:
Заключение
Теперь, когда данные от оборудования находятся в Zabbix, можно приступить к дальнейшей организации мониторинга: создание и обработка разнообразных триггеров, генерация графиков, отчетов и т. д.