Disclaimer. Написанное относится к 16ой версии и публикуется очень запоздало. В версии 17 функционал был расширен, и добавлена возможность мигания как минимум динамическим диалогом свойства background color или interface -> basic color.
Вышедшая в свет WinCC Unified зацепила сразу. Обладая, с точки зрения прикладного программиста, функционалом, близким к WinCC Professional, она продается за цену, сопоставимую с WinCC Advanced.
Полноценная работа со скриптами, полноценная подсистема алармов, клиент-серверная архитектура «из коробки», не требующая дополнительной лицензии, а так же многое другое — это прекрасно. Однако, как это часто бывает с абсолютно новым софтом, некоторые вещи поначалу вызывают легкое недоумение.
И как раз организация визуализации «мигания», при котором цвет графического объекта меняется с определенной частотой (например, с серого на зеленый при визуализации запуска двигателя) вызывает это самое недоумение. Дело в том, что цвет объекта можно динамизировать тэгом, скриптом или «миганием», но, несмотря на то, что Flashing относится с точки зрения редактора, к динамизации, оно задается статически.
В этой динамизации задается основной и «альтернативный» цвет, частота мигания и условия — «никогда», «всегда» и «нарушение диапазона» (range violation). Какое нарушение — непонятно. В общем, в настоящий момент имеется некоторое весьма досадное ограничение в системе, которое приходится обходить посредством старых-добрых костылей.
Для упрощения представим отображение состояния технологического агрегата в следующей цветовой гамме:
-отключен: серый (с контроллера приходит тэг StateRunning, если истина, то включен, если ложь, то отключен)
-включен: зеленый
-включается (тэг Starting с контроллера) или отключается (тэг Stopping): мигает серым и зеленым.
Да, я знаю, что надо еще добавить аварию и, возможно, неготовность и режим «обслуживание», да и состояние включен/отключен можно отображать двумя тэгами, но это учебный, а не боевой пример.
Для мнемознака насоса я применяю Dynamic Widget «Pumps → HeavyDutyPlasticCentrifugalPump» из штатной библиотеки, он мне очень нравится.
Объекты этого типа позволяют задавать основной цвет
Первый способ решить поставленную задачу — попроще в реализации и пришел в голову сразу. Необходимо создать несколько копий одного объекта, статикой задать его цвет или мигание, а показывать на мнемосхеме единомоментно только один, самый актуальный. Ну, к примеру, если мотор запускается, то мы должны отображать копию с настроенным BasicColor = flashing, а остальные прятать, играя свойством Visible.
Вот настроенные три объекта.
Далее свойство «видимость» (visibility) каждого объекта необходимо динамизировать посредством следующих скриптов.
Для каждого из скриптов не забываем указывать триггеры для срабатывания.
Второй способ — менее очевидный, но мне кажется более красивым. Он заключается в использовании дополнительной переменной, значение которой меняется через равные промежутки времени (с истины на ложь и обратно). Планировщик задач (он же scheduler, он же «шедуллер») в WinCC Unified позволяет выполнять задачи с периодом от 100 миллисекунд, но нам подойдет и секундный цикл. Заводим внутреннюю переменную типа BOOL
Создаем скрипт, выполняющийся каждую секунду.
Берем один экземпляр SVG, применяемый в первом примере и динамизирвуем свойство BasicColor следующим скриптом.
Триггер этого скрипта следующий:
Данный способ имеет как достоинства, так и недостатки. К достоинствам относится, разумеется, использование всего лишь одного графического объекта вместо нескольких копий с разными статическими свойствами. Недостатки — лишняя вычислительная нагрузка. С учетом того, что «секундный» тэг является триггером для скрипта, весь скрипт будет исполняться каждую секунду вне зависимости от того, изменилось ли фактическое состояние оборудования или нет.
Комментарии (6)
EnerelStain
17.02.2022 14:11+1Контекста задачи, версии железа и ПО... больше всего вопросов вызывает сама постановка задачи и оформление кода в виде... скриншота? На Хабре? Серьёзно?
Если вам нужно чем-то помигать - путей десятки разных, обвешивать скриптами весьма болезенно. Чем вам не угодил стандартный функционал Animations => Display => Appereance => Flashing YES/NO для выбранного состояния?akcount Автор
18.02.2022 08:54+1Признаю, получилась халтура.
В 16ой версии flashing был именно такой, как описано выше.
В 17ой версии функционал был расширен, но я это бездарно проморгал.
EnerelStain
18.02.2022 14:10Возможно для Unified это добавили именно с 17 версии. К сожалению у меня не установлен Unified для проверки, но предполагаю что они идут путём максимальной унификации функционала между Comfort/Basic и Unified.
В контексте "сделайте мне красиво" предложил бы плавное изменение зелёного тона в коде RGB с дискретизацией 0.1с, но сие хорошо только для 1-2 элементов на экране (или синхронно по общему фоновому скрипту, либо опустить в ПЛК и выкрутить частоту опроса только для этого тега), чтобы не перегрузить систему. Рантаймы TIA чрезвычайно требовательны к железу, увы.
Вообще, в целом, отвлекшись от конкретной задачи, я бы предложил ознакомиться с концепцией High Performance HMI/SCADA, потому что изобилие "красивых" SVG элементов сильно засоряет визуально мнемосхему и усложняет считывание информации оператором. Буквально сегодня наткнулся на внятное описание концепции того стиля, которому всегда пытался следовать сам.)
Sap_ru
А нельзя один скрипт на все моменты сделать с одной переменной, а остальные состояния привязать к смене её состояния? А то у вас по секрету на каждый потенциально мигающий элемент?
А вообще, этот ваш WinCC - жуть жуткая.
EnerelStain
Классический WinCC 7.x - весч прекрасная, научившись которой - научишься всему. А вот всякие ОА, Unified... согласен, жуть полная.
akcount Автор
Одним скриптом, который в шедуллере?