Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Вышедшая в свет WinCC Unified зацепила сразу. Обладая, с точки зрения прикладного программиста, функционалом, близким к WinCC Professional, она продается за цену, сопоставимую с WinCC Advanced.
Полноценная работа со скриптами, полноценная подсистема алармов, клиент-серверная архитектура «из коробки», не требующая дополнительной лицензии, а так же многое другое — это прекрасно. Однако, как это часто бывает с абсолютно новым софтом, некоторые вещи поначалу вызывают легкое недоумение.
И как раз организация визуализации «мигания», при котором цвет графического объекта меняется с определенной частотой (например, с серого на зеленый при визуализации запуска двигателя) вызывает это самое недоумение. Дело в том, что цвет объекта можно динамизировать тэгом, скриптом или «миганием», но, несмотря на то, что Flashing относится с точки зрения редактора, к динамизации, оно задается статически.
В этой динамизации задается основной и «альтернативный» цвет, частота мигания и условия — «никогда», «всегда» и «нарушение диапазона» (range violation). Какое нарушение — непонятно. В общем, в настоящий момент имеется некоторое весьма досадное ограничение в системе, которое приходится обходить посредством старых-добрых костылей.
Для упрощения представим отображение состояния технологического агрегата в следующей цветовой гамме:
-отключен: серый (с контроллера приходит тэг StateRunning, если истина, то включен, если ложь, то отключен)
-включен: зеленый
-включается (тэг Starting с контроллера) или отключается (тэг Stopping): мигает серым и зеленым.
Да, я знаю, что надо еще добавить аварию и, возможно, неготовность и режим «обслуживание», да и состояние включен/отключен можно отображать двумя тэгами, но это учебный, а не боевой пример.
Для мнемознака насоса я применяю Dynamic Widget «Pumps → HeavyDutyPlasticCentrifugalPump» из штатной библиотеки, он мне очень нравится.
Объекты этого типа позволяют задавать основной цвет
Первый способ решить поставленную задачу — попроще в реализации и пришел в голову сразу. Необходимо создать несколько копий одного объекта, статикой задать его цвет или мигание, а показывать на мнемосхеме единомоментно только один, самый актуальный. Ну, к примеру, если мотор запускается, то мы должны отображать копию с настроенным BasicColor = flashing, а остальные прятать, играя свойством Visible.
Вот настроенные три объекта.
Далее свойство «видимость» (visibility) каждого объекта необходимо динамизировать посредством следующих скриптов.
Для каждого из скриптов не забываем указывать триггеры для срабатывания.
Разместить все три графических объекта друг над другом и можно запускать проверку:
https://vk.com/video183956096_456239051
Второй способ — менее очевидный, но мне кажется более красивым. Он заключается в использовании дополнительной переменной, значение которой меняется через равные промежутки времени (с истины на ложь и обратно). Планировщик задач (он же scheduler, он же «шедуллер») в WinCC Unified позволяет выполнять задачи с периодом от 100 миллисекунд, но нам подойдет и секундный цикл. Заводим внутреннюю переменную типа BOOL
Создаем скрипт, выполняющийся каждую секунду.
Берем один экземпляр SVG, применяемый в первом примере и динамизирвуем свойство BasicColor следующим скриптом.
Триггер этого скрипта следующий:
Данный способ имеет как достоинства, так и недостатки. К достоинствам относится, разумеется, использование всего лишь одного графического объекта вместо нескольких копий с разными статическими свойствами. Недостатки — лишняя вычислительная нагрузка. С учетом того, что «секундный» тэг является триггером для скрипта, весь скрипт будет исполняться каждую секунду вне зависимости от того, изменилось ли фактическое состояние оборудования или нет.