PDA

Просмотр полной версии : Открытие всплывающего окна по состоянию тэга



Hemann
06.05.2023, 17:19
Коллеги, добрый день!

Подскажите, пожалуйста, как можно открыть всплывающее окно когда некий тэг типа BOOL переходит из нуля в единицу? Что-то сам никак не раскопал...

Hemann
07.05.2023, 09:30
Я сделал открытие всплывающего окна через механизм "Триггер окна", все работает. Но у этого механизма есть недостаток - чтобы он работал, должно быть открыто окно внутри которого прописан триггер. В моем случае я вовсе не уверен что всегда будет так. Поэтому прошу подсказать более универсальное решение

Hemann
07.05.2023, 10:56
И еще прошу подсказать, как можно отслеживать состояние окна (открыто, закрыто)? Что-то событий "Открытие окна" и "Закрытие окна" я не нахожу...

Ready
09.05.2023, 00:50
Выделяете нужное окно: Легенда -> Вкладка 'События' -> Слева (+)

Hemann
09.05.2023, 21:47
Выделяете нужное окно: Легенда -> Вкладка 'События' -> Слева (+)

Спасибо! Только где тут события "Открытие окна" и "Закрытие окна" (или их аналоги)?
67779

Ready
10.05.2023, 08:51
Эти события есть в версии MS4D 1.3, в версии 1.3.1.31444 точно есть. По умолчанию они скрыты, добавляются ч/з "+".
67780

Ready
10.05.2023, 09:48
Я сделал открытие всплывающего окна через механизм "Триггер окна", все работает. Но у этого механизма есть недостаток - чтобы он работал, должно быть открыто окно внутри которого прописан триггер. В моем случае я вовсе не уверен что всегда будет так. Поэтому прошу подсказать более универсальное решение

"Триггер окна" можно установить на главное окно, которое, обычно, открыто всегда. Если есть разграничение по ролям (например: диспетчер, оператор) и у каждой роли свое окно, и всплывающее окно необходимо для каждой роли, то "Триггер окна" нужно установить на каждое главное окно роли. Если есть окна, которые открываются в новой вкладке браузера, то также необходим этот триггер (при условии, что там нужно "Всплывающее окно"). И не забываем, что триггер необходимо сбросить, например, ч/з событие "Закрыть окно" или иным способом, в зависимости от логики.
Другие способы есть, но несколько сложнее, нужно использовать программу, которая в результате также реализует триггер. Например, вместо "Всплывающего окна" использовать обычное окно и управлять его видимостью ч/з параметр. Есть нюанс, у окна не будет "Drag-and-drop".

Hemann
10.05.2023, 14:39
Спасибо! Но, опять же, есть еще нюанс. Если всплывающее окно открыто, а триггер сработает снова, то окно закрывается. И, соответственно, нужно как-то контролировать "открытость" окна. Уточню, что пока что разработку веду в версии 1.2. Ставил 1.3, долго плевался, и вынужден был вернуться на 1.2

Ready
10.05.2023, 20:53
Если всплывающее окно открыто, а триггер сработает снова, то окно закрывается.

Нет. Окно не закроется. Или у Вас условие такое? Триггер будет работать только на открытие "Всплывающего окна". Если некий тэг перешел в состояние 'True', то сработал триггер, открылось "Всплывающее окно". Если тэг перешел обратно в 'False', триггер сбросился, но окно при этом остается открытым. Даже, если тэг снова перейдет в 'True', а потом снова в 'False', окно также будет открытым, т.к. данный триггер работает только на открытие "Всплывающего окна". Закрыть окно можно ч/з другой триггер, программу, (х) в интерфейсе, отдельную кнопку. Но при закрытии окна необходимо учитывать состояние тэга. Если он в 'True', то по логике окно закрывать нельзя, иначе оно не откроется до следующего срабатывания триггера. Разумеется, если это необходимо по условию. В версии MS4D 1.2 событие клика на (х), т.е. обычное закрытие "Всплывающего окна", отследить нельзя, но можно отключить этот (х) в действиях "Открыть всплывающее окно" -> "Разрешить закрытие", установить 'False'. А на замену можно разместить в окне кнопку / текст / что-либо еще, повесить событие клика мыши, в действиях выбрать "Закрыть окно" и условие закрытия, при котором тэг находится в состоянии 'False'.

Hemann
11.05.2023, 07:51
Может мы говорим о разных механизмах, но у меня повторное срабатывание триггера окна закрывает открытое. В прикреплении пробный проект, с которым я "играюсь". Кнопка "Управление_картинкой_1" пока отключена от открывания окон.

Ready
11.05.2023, 15:28
повторное срабатывание триггера окна закрывает открытое.

Да, Вы правы, это действительно так. Мой косяк, не разобравшись поспешил с ответом.


Если всплывающее окно открыто, а триггер сработает снова, то окно закрывается. И, соответственно, нужно как-то контролировать "открытость" окна.

Можете пояснить что требуется?
1. окно должно оставаться открытым при повторном срабатывании триггера
2. окно должно открываться/закрываться по триггеру
3. пользователь может открывать/закрывать окно
4. нужно отслеживать состояние открытости/закрытости окна вне зависимости от того, было ли оно открыто/закрыто пользователем или триггером

Hemann
11.05.2023, 19:30
Можете пояснить что требуется?
1. окно должно оставаться открытым при повторном срабатывании триггера
2. окно должно открываться/закрываться по триггеру
3. пользователь может открывать/закрывать окно
4. нужно отслеживать состояние открытости/закрытости окна вне зависимости от того, было ли оно открыто/закрыто пользователем или триггером

1. Да, оно должно оставаться открытым при повторном срабатывании триггера
2. Окно должно открываться по триггеру, закрывать его должен пользователь
3. Да, пользователь может открывать и закрывать окна
4. Да, я думаю, что не важно кто или что открыло/закрыло окно
Вкратце обрисую задачу. Есть диспетчер, который сидит у компьютера и наблюдает за некоторым рядом объектов, открывая и закрывая окна (не обязательно, конечно, "серфить" по окнам объектов, но может ему от скуки придет такое в голову). Если на объекте происходит тревожное событие, то должен открыться соответствующий экран и подсветиться та часть схемы объекта, где произошла тревога. В общем случае, на одном и том же объекте последовательно могут произойти несколько тревожных событий, а диспетчер может успеть закрыть окно между событиями, а может и не успеть.
Тут еще всплывает вопрос. А если одновременно на двух объектах произойдет тревожное событие (маловероятно, но возможно), то как откроются окна? Не будут ли мешать друг другу?

imaex
12.05.2023, 08:26
Если на объекте происходит тревожное событие, то должен открыться соответствующий экран и подсветиться та часть схемы объекта, где произошла тревога.


А диспетчер тем временем занят разбором ситуации на другом объекте. Очень Вы ему поможете, очень. Сами же дальше правильные вопросы задаёте. Это порочный подход, если коротко.

У меня нет знаний по организации окон/экранов конкретно в мастерскаде, потому общие соображения. Наличие общей для всех экранов области, в которой выводится список активных алармов. Т.е. на всех окнах/экранах (за исключением pop-up) должна быть зона вывода активных алармов в определенном порядке (время возникновения, приоритет и т.п.). При выборе конкретного аларма из этого списка диспетчер сам должен определиться с действиями - просто квитировать, перейти на экран объекта, связанный с этим алармом, ничего не делать, что-то ещё.

Hemann
12.05.2023, 17:57
ХЗ. Пока постановка задачи заказчиком такая. А от списка аварий с цветовой дифференциацией приоритетов никто не отказывается в любом случае.

Ready
13.05.2023, 16:15
1. Да, оно должно оставаться открытым при повторном срабатывании триггера
2. Окно должно открываться по триггеру, закрывать его должен пользователь
3. Да, пользователь может открывать и закрывать окна
4. Да, я думаю, что не важно кто или что открыло/закрыло окно
Вкратце обрисую задачу. Есть диспетчер, который сидит у компьютера и наблюдает за некоторым рядом объектов, открывая и закрывая окна (не обязательно, конечно, "серфить" по окнам объектов, но может ему от скуки придет такое в голову). Если на объекте происходит тревожное событие, то должен открыться соответствующий экран и подсветиться та часть схемы объекта, где произошла тревога. В общем случае, на одном и том же объекте последовательно могут произойти несколько тревожных событий, а диспетчер может успеть закрыть окно между событиями, а может и не успеть.
Тут еще всплывает вопрос. А если одновременно на двух объектах произойдет тревожное событие (маловероятно, но возможно), то как откроются окна? Не будут ли мешать друг другу?

Вот, что получилось: 67828 Вроде по всем пунктам отрабатывает. По тэгу окно только открывается. Закрывать может только пользователь. Даже, если пользователь закрыл окно, а тэг все еще в 'True', окно не откроется до следующего 'True' тэга. Но пользователь всегда может открывать/закрывать окно. Пришлось отключить "Разрешить закрытие" у окна и добавить отдельную кнопку, иначе не отследить закрытие. Заголовок у окна теперь полностью пустой, нужен только для "drag-and-drop"а. Сами увидите. Вынес все в библиотеку, чтобы было удобно разместить сразу несколько экземпляров. Управление вынес в программу на ST, иначе получается нагромождение параметров и условий (легко запутаться). Триггер срабатывает по двум условиям ("Открытие окна по тэгу" ИЛИ "Ручное открытие окна"). Окно будет открытым/закрытым даже, если обновить страницу.


Тут еще всплывает вопрос. А если одновременно на двух объектах произойдет тревожное событие (маловероятно, но возможно), то как откроются окна? Не будут ли мешать друг другу?

Откроются все сразу, если иного условия нет. Во вложенном проекте сразу откроются, т.к. каждое окно находится в своем экземпляре и работает независимо от других. Если окна большие, то да, будут мешать. В примере большие и мешают, но я сделал их открытие со смещением от элемента. Стало немного лучше. Чем больше будет открытых окон, тем сильнее будет страдать UI и UX. Автоматически всплывающие окна это хорошо, но в меру по количеству и их размерам. Вообще для тревожных событий, в том числе, существуют журналы, индикаторы событий. В MS4D это есть. Их можно фильтровать и настраивать под определенные тревоги и события. Например, на главное окно можно вывести текущий журнал и настроить его на все критически важные тревоги/события, на клик по ячейке повесить любое действие.
У MS4D на YouTube-канале есть видео по журналам и сообщениям: MasterSCADA 4D–платформа для автоматизации и диспетчеризации. Работа с журналами и системой сообщений (https://youtu.be/2Y2AqNCAB7I)

Hemann
14.05.2023, 10:56
Спасибо большущее! Буду разбираться. Правда, скорее всего, завтра - сегодня хочется отдохнуть. Еще раз спасибо!!!