Реализация SMS-информирования персонала средствами ScriptWorX64

В статье описывается процесс организации SMS-информирования оперативного персонала с помощью компонента ScriptWorX64 из пакета ICONICS GENESIS64. Раскрываются ключевые моменты разработки и приводятся исходные тексты разработанных скриптов.

Солдатов Сергей, Наранов Кирилл

199
В ЗАКЛАДКИ

Компания «Инсайт-НГ» – молодая на рынке услуг автоматизации, тем не менее, задачи, которые её команда успешно решает, зачастую весьма нетривиальные. Одной из них была организация SMS-информирования оперативного персонала об аварийных событиях в SCADA-системе ICONICS GENESIS64.
Задача возникла на этапе внедрения на одном из объектов компании, но условия её решения были осложнены, поскольку пакет программных средств по согласованию с заказчиком был уже приобретён. Закупка каких-то новых специализированных программных средств была затруднительна и нежелательна, поэтому провели анализ документации на приобретённый комплект ICONICS GENESIS64, по итогам которого приняли решение воспользоваться для организации SMS-информирования компонентом ScriptWorX64. 
ScriptWorX64 – это сервер приложения на основе скриптов. Он используется для запуска VBA-скриптов по расписанию или как реакции на определённые события (триггеры) и представляет собой многопоточный сервис, предназначенный для работы 24 часа в сутки, готовый выполнить созданные разработчиком сценарии в любой момент.
Далее поэтапно описан процесс конфигурирования Script-WorX64 и разработки необходимых скриптов для организации SMS-информирования. Данная статья не ставит своей целью подменить руководство ICONICS, поэтому ряд моментов был сознательно опущен, например, описание стандартных процедур в коде VBA-скриптов. 

Предварительные настройки 

Разработка велась в системе следующей конфигурации:
  • Windows 7 Professional x64;
  • ICONICS GENESIS64 v.10.71, HotFixPack 1, ServicePack 1, ServicePack 2. 
В Unified Data Manager (UDM) были предварительно созданы регистры, а в AlarmWorX64 Server – аварийные сигналы, связанные с регистрами UDM, и Area – объекты для группировки аварийных сигналов, например, для разных объектов.
Поскольку ScriptWorX64 является опциональным компонентом GENESIS64, необходимо выполнить его установку. После установки, к сожалению, выяснилось, что не хватает одной библиотеки – AlarmOle.dll. Выражалось это в невозможности настроить в ScriptWorX64 Configurator подписку на аварийные события. Проблема была успешно решена совместно с сотрудниками компании ПРОСОФТ, они выслали недостающую библиотеку и описали процесс её установки.
На этом этап предварительной настройки завершён, и можно перейти к настройке триггеров ScriptWorX64 на аварийные события.

Настройка триггеров аварийных событий в ScriptWorX64

После установки ScriptWorX64 необходимо запустить ScriptWorX64 Configurator и создать новый проект (рис. 1).

Внутри проекта создаётся объект Thread, в котором создаётся объект Script (рис. 2).

Теперь можно перейти непосредственно к созданию триггера аварийных событий. На экранной форме под списком скриптов надо нажать кнопку New напротив Trigger Name, откроется приложение UDMConfig (рис. 3). В нём необходимо выбрать раздел Event Triggers->Alarm Triggers. Триггеры аварийных событий основаны на отслеживании аварийных событий от заданного сервера (сервер аварий). Связь с сервером аварий называется подпиской. Для создания новой подписки необходимо выбрать в контекстном меню пункт New->Alarm Trigger Subscription (рис. 3).

Необходимо будет задать имя подписки, а затем выполнить связку с сервером аварий, для этого нажать кнопку Subscribe/Edit OPC Subscriptions. В открывшемся диалоговом окне (рис. 4) на вкладке Server надо нажать кнопку Browse и выбрать в открывшемся окне сервер аварий. Далее на вкладке Types (рис. 4) был выбран диапазон Severity – уровней аварийных событий, для которых должен срабатывать триггер. 

На этом можно было бы и завершить создание подписки триггера, теперь через него будут проходить все аварии с сервера. Но в случае сложного технического объекта, скорее всего, аварии далеко не всех объектов требуют SMS-информирования. На вкладке Areas необходимо выбрать интересующие нас Area на сервере аварий, в которых заранее сгруппированы нужные аварийные сигналы. При необходимости можно задать и остальные настройки.
Теперь надо открыть существующую подписку на аварийные события и создать объект Alarm Trigger Item (рис. 5): задать имя триггера, а на вкладке Alarm Trigger Options в поле Alarm Filter прописать x=1.

Это означает, что будут обрабатываться все аварийные события, на которые выполнена подписка. При необходимости можно прописывать расширенные условия, по которым срабатывают триггеры в поле Alarm Filter, их примеры есть в документации на UDMConfig. Альтернативой фильтру будет задание части условий при настройке подписки. Теперь можно всё сохранить и закрыть UDMConfig. Остаётся только связать VBA-скрипт и триггер, для этого на экранной форме, показанной на рис. 2, под списком скриптов нужно нажать кнопку «…» напротив Triger Name и выбрать созданный триггер алармов (рис. 6). 

Теперь можно приступить к созданию VBA-скриптов.

Создание VBA-скриптов

SMS-сообщения возможно отправлять с компьютера различными средствами:
  • с использованием GSM-модема;
  • с использованием SMS-сервисов в сети Интернет. 
В первом случае требуется приобрести модем, установить внешнюю антенну (внутренней антенны при использовании модема внутри помещения может быть недостаточно), приобрести SIM-карту выбранного оператора сотовой связи и разработать скрипты для взаимодействия с модемом.
Второй вариант сводит процесс к двум шагам: выбрать сервис для отправки SMS-сообщений и приобрести пакет SMS-сообщений в Интернете; написать скрипт взаимодействия с сервисом. Важную роль в выборе средства отправки SMS-сообщений сыграло расположение объекта управления на берегу моря, потому что погодные условия могли периодически негативно сказываться на качестве GSM-связи. В то же время для связи с сетью Интернет был проложен в земле оптоволоконный кабель, что гарантировало практически круглосуточную доступность канала связи.
Итак, был выбран вариант с использованием SMS-сервисов в сети Интернет. В русскоязычном сегменте можно найти множество подобных сервисов. Не вдаваясь в детали их различий (в основном отличия в ценовой политике), можно смело сказать, что описанный далее скрипт применим к большинству из них. В данном проекте выбран сервис SMS Aero.
На рис. 7 приведена структурная схема разработанного средства отправки SMS-сообщений.

Как видно из неё, при формировании аварийного сообщения срабатывает триггер и запускается скрипт, выполняющий отправку запроса на SMS-сервис. Далее SMS-сервис по своим каналам связи отправляет SMS-сообщение оператору сотовой связи, который рассылает сообщение по указанным номерам (берутся из переменной, созданной в UDM). При возникновении ошибки в ходе работы скрипта выставляется бит, который заранее создаётся в UDM, а в текстовую переменную, также предварительно созданную, пишется последнее аварийное сообщение, помимо этого, сообщение об ошибке в скрипте пишется в консоль MonitorWorX.
Интерфейс API (Application Programming Interface) SMS-сервиса в общем случае основан на отправке запросов GET или POST по HTTP-протоколу на сервер SMS-сервиса.
В строке запроса указываются имя и пароль клиента SMS-сервиса, номер телефона, на который идёт отправка, текст сообщения и имя отправителя (задаётся в личном кабинете клиента).
Поскольку используемый в ScriptWorX64 язык VBA (Visual Basic for Applications) частично является объектно-ориентированным (полноценное наследование классов, к сожалению, не реализовано), то была предложена схема скрипта, представленная на рис. 8. 

Был создан базовый класс – SMSbyHTTP, который выполняет отправку запросов SMS-сервису по протоколу HTTP. Для работы класса необходимо добавить в VBA-проект ссылку на объект Microsoft WinHTTP Services, version 5.1 (рис. 9).

Создание объекта Microsoft WinHTTP Services проводится при инициализации класса SMSbyHTTP. По сути, разработанный класс выполняет подготовку запроса по HTTP-протоколу и возвращает результат – ответ сервера SMS-сервиса. Он имеет только функцию POST, код которой приведён в листинге 1. Поскольку при отправке сообщений возможны нештатные ситуации, разработана процедура обработки аварийных сообщений ErrHandlerSub (листинг 2), аналогичная процедура используется и в других классах. ErrHandlerSub использует объект g типа SWXRuntimeLib.Global из основного кода скрипта. 

Далее был создан зависимый от SMSbyHTTP класс – SMSAero, который определяет порядок взаимодействия уже с конкретным SMS-сервисом, в данном случае SMS Aero.
У класса есть свойство ListNumbers, оно представляет собой массив номеров, по которым должна быть сделана рассылка. При присвоении свойству строки, содержащей мобильные номера, разделённые «;», происходит автоматический разбор строки и формирование массива номеров. Также в классе SMSAero есть поле Message – собственно отправляемое сообщение. В классе реализованы две процедуры: SendSMS отправляет сообщение Message на заданный номер, SendSMSAll рассылает сообщение Message по всем номерам, содержащимся в ListNumbers, для этого используется процедура SendSMS. Код процедуры SendSMS класса SMSAero приведён в листинге 3.
Основной код скрипта размещён в модуле SMS_sender, в нём создана процедура SendSMS. Именно её надо указать в поле Script на экранной форме под списком скриптов в ScriptWorX64 Configurator. Данная процедура получает в качестве параметра объект TriggerData, содержимое которого зависит от типа триггера. Для процедуры SendSMS требуется только атрибут № 3 (нумерация атрибутов идёт с 0), он содержит текстовое описание аварии, получаемое из AlarmWorX64 Server. Время аварии из TriggerData брать нежелательно, поскольку оно хранится без учёта часового пояса. Код процедуры  SendSMS из модуля SMS_sender приведён в листинге 4. Также в модуле SMS_sender при инициализации скрипта происходит получение списка номеров для рассылки (листинг 5).
После окончания разработки остаётся проверить состав VBA-проекта (рис. 10) и сохранить его. 

Названия переменных в UDM, с которыми работает приведённый скрипт, следующие:
  • SMS_config.SMS_Numbers – строка, содержащая номера, на которые делаем рассылку, они разделены точкой с запятой;
  • SMS_config.SMS_Alarmlog – строка, содержащая последнее аварийное сообщение от скрипта;
  • SMS_config.SMS_Alarm – бит, установленный в 1, если произошла авария при работе скрипта. 
После сохранения результатов разработки необходимо выполнить запуск скрипта в ScriptWorX64. Для этого надо выбрать созданный скрипт в ScriptWorX64 Configurator и нажать кнопку в виде светофора на панели вверху (рис. 2), чтобы он стал зелёным, при этом запустится ScriptWorX Runtime.
Ход работы скрипта можно отслеживать в MonitorWorX, там будут следующие типы сообщений:
  1. сообщения об ошибке в работе скрипта;
  2. сообщение об отправке SMS-сообщения;
  3. сообщение об успешной отправке SMS-сообщения. 
Примеры полученных сообщений приведены на рис. 11, они содержат всю необходимую информацию: время и дату возникновения аварийного события и его описание. 

Заключение

Результатом работы стало создание простого и прозрачного механизма SMS-информирования оперативного персонала. При этом были использованы только встроенные средства ICONICS GENESIS64, что лишний раз показывает широчайшие возможности данной SCADA-системы. 
Разработанный код является во многом универсальным и может быть легко модернизирован для организации отправки SMS-сообщений через любой известный SMS-сервис. ● 

E-mail: ssa-company@rambler.ru



ПОДПИСАТЬСЯ НА НОВОСТИ

Будьте всегда в курсе самых свежих новостей
и узнавайте первыми о содержании нового номера

Подписка на новости