PDA

Просмотр полной версии : Всплывающее окно только на определённой WEB-визуализации



aaaSashaMGGU
29.05.2024, 19:10
Добрый день!
По определённому условию хочу сделать появляющееся окно с уведомлением и кнопкой ОК (не на весь экран, а, например, посередине). По нажатию на этот ОК - окно должно закрыться.
Такое окно должно появляться ТОЛЬКО на определённой WEB-визуализации. А на всех прочих WEB-визуализациях оно появляться не должно
Это реально сделать? Если да - то есть, где посмотреть пример?

Спасибо!

Евгений Кислов
29.05.2024, 19:14
Добрый день!
По определённому условию хочу сделать появляющееся окно с уведомлением и кнопкой ОК (не на весь экран, а, например, посередине). По нажатию на этот ОК - окно должно закрыться.
Такое окно должно появляться ТОЛЬКО на определённой WEB-визуализации. А на всех прочих WEB-визуализациях оно появляться не должно
Это реально сделать? Если да - то есть, где посмотреть пример?

Спасибо!

Добрый день.
Если клиента этой определённой WEB-визуализации можно как-то однозначно идентифицировать (например, по IP-адресу) - то можно.
См. п. 1 здесь:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysVisuIecCode.pdf

МихаилГл
29.05.2024, 19:15
Вместо окна можете просто нарисовать прямоугольник с кнопкой и менять его бит видимости в программе. Я так делаю отображение статусов.

Зачем вы всё усложняете?

aaaSashaMGGU
29.05.2024, 20:01
Вместо окна можете просто нарисовать прямоугольник с кнопкой и менять его бит видимости в программе. Я так делаю отображение статусов.

Зачем вы всё усложняете?

Вот у меня 1 контроллер и 2 ПК: один зашёл на 192.168.1.10:8080/webvisu1.htm, второй зашёл на 192.168.1.10:8080/webvisu2.htm
Как сделать так, чтобы у ПК1 бит невидимости был true, а у ПК2 бит он же был false?

aaaSashaMGGU
29.05.2024, 20:03
Добрый день.
Если клиента этой определённой WEB-визуализации можно как-то однозначно идентифицировать (например, по IP-адресу) - то можно.
См. п. 1 здесь:
https://ftp.owen.ru/CoDeSys3/98_Books/CodesysVisuIecCode.pdf

Отличительной особенностью визуализации CODESYS является возможность ее
отображения на нескольких клиентах визуализации одновременно. Например, представим себе
следующую ситуацию: на производственной линии некоторой фабрики используется панельный
контроллер с поддержкой web-визуализации. Оператор производственной линии взаимодействует
с экраном контроллера (таргет-визуализацией) – наблюдает за значениями параметров
технологического процесса, переключает экраны, вводит значения уставок и т. д. В это же время с
web-визуализацией контроллера работают один или даже несколько сотрудников отдела
аналитики – формируют отчеты, просматривают историю сообщений и т. д. В этот момент на линии
завершается изготовление очередной партии продукции, и программа контроллера должна
уведомить об этом оператора – например, отобразив диалоговое окно с соответствующим
сообщением. Должно ли «всплыть» это же окно у аналитиков? Ответ, конечно, может отличаться в
зависимости от конкретной ситуации – но вообще, вряд ли аналитики заинтересованы в подобного
рода оперативной информации; их, скорее, интересуют показатели оптимальности работы
оборудования, количество произведенной продукции за определенный интервал времени,
длительность периодов простоя линии из-за поломок и т. д. Соответственно, возникает задача не
просто «сделать что-то из кода», а «сделать что-то из кода для конкретного клиента
визуализации». Для этого нужно как-то идентифицировать конкретного клиента – и именно для
этого используется функциональный блок FbIterateClients. Получив информацию о клиентах
визуализации – можно по каким-то критериям (например, типу визуализации или IP-адресу
устройства, на котором открыта web-визуализация) выделить среди них интересующих вас и
выполнить для этих какое-то действие с помощью одного из блоков библиотеки (например,
FbOpenDialog).

Спасибо, во вступлении прям 100% то, что нужно. Будем смотреть

МихаилГл
29.05.2024, 20:10
Вы говорите о разных веб страницах, но почему-то об одном бите... Вы же всплывающее окно хотите видеть или не видеть? Или именно определённую веб? Согласно первого сообщения одно, согласно второго - другое. Для второго варианта вам выше ответили.

ПС Если у оператора одна веб, а у аналитика другая, то прямоугольник, будь он не ладен, будет у вас нарисован только на нужной вам вебке, и следовательно оно выскочит только у одного. Но это вроде только на таргет будет работать, иначе будет как vnc, что у одного, то и у другого. Вроде так.

aaaSashaMGGU
30.05.2024, 10:08
Всё получилось. Убрал всё лишнее, осталось совсем мало:

Основная программа

PROGRAM P160_WindowsTest //Всплывающее окно
VAR
//Условие запуска
xExecute: BOOL := FALSE;

//Блок-фильтр клиентов
fbClientFilter: VisuClientFilter;

//Блок для вызова окна
fbOpenFeedbackDialog: VU.FbOpenDialog;
END_VAR


//Вызываем окно 'window' только у клиентов, указанных в ФБ fbClientFilter
fbOpenFeedbackDialog
(
xExecute := xExecute, //Запуск блока
itfClientFilter := fbClientFilter, //Блок-фильтр клиентов
sDialogName := 'window', //Имя окошка
xModal := FALSE, //Можно менять главные мнемосхемы
pTopLeftPosition := , //Позиция окна
);

ФБ для фильтра по IP:

//Блок-фильтр клиентов для вызова всплывающих окон
FUNCTION_BLOCK VisuClientFilter IMPLEMENTS VU.IVisualizationClientFilter

Метод ФБ:

//Метод проверки, что у нас нужный клиент
METHOD IsAccepted: BOOL
VAR_INPUT
//Даже не спрашивайте... Типа какой-то клиент визуализации
itfClient: VU.IVisualizationClient;
END_VAR
VAR CONSTANT
//IP нашего нужного клиента, т.е., панель Siemens оператора
IP: STRING(15) := '192.168.4.231';
END_VAR

Код метода

//Получаем текущий IP и сравниваем его с нашей константой
IsAccepted := (itfClient.GetIPv4Address() = IP);

Mikhail_NNT
22.01.2026, 09:52
Здравствуйте.
Необходимо переключать визуализацию на 10-ти мониторах одновременно в определенное время: мониторы 1, 2, 3 - визуализация 1; мониторы 4, 5, 6, 7, 8 - визуализация 2, мониторы 9, 10 - визуализация 3.
ФБ Фильтр клиентов

FUNCTION_BLOCK Group_Client_Filter IMPLEMENTS VU.IVisualizationClientFilter
VAR_INPUT
eGroupVisuClient: GroupVisuClient; //Перечисление групп клиентов WEB-визуализации
END_VAR
VAR_OUTPUT
END_VAR
VAR
END_VAR

Метод ФБ Фильтр клиентов

(* For every client can be desided, if it is accepted.

``TRUE``: Client is accepted*)
METHOD IsAccepted : BOOL
VAR_INPUT
(* The client, to check*)
itfClient: VU.IVisualizationClient;
END_VAR
VAR
END_VAR
VAR CONSTANT
IP_70: STRING:='192.168.1.70';
IP_71: STRING:='192.168.1.71';
IP_72: STRING:='192.168.1.72';
IP_73: STRING:='192.168.1.73';
IP_74: STRING:='192.168.1.74';
IP_75: STRING:='192.168.1.75';
IP_76: STRING:='192.168.1.76';
IP_77: STRING:='192.168.1.77';
IP_78: STRING:='192.168.1.78';
IP_79: STRING:='192.168.1.79';
END_VAR

Код:
//IP-адрес клиента визуализации
TargetVars.sVisuClientIP:=itfClient.GetIPv4Address ();

CASE TargetVars.iGroupVisuClient OF
1: IsAccepted:=(TargetVars.sVisuClientIP=IP_70);
IsAccepted:=(TargetVars.sVisuClientIP=IP_71);
IsAccepted:=(TargetVars.sVisuClientIP=IP_72);

2: IsAccepted:=(TargetVars.sVisuClientIP=IP_73);
IsAccepted:=(TargetVars.sVisuClientIP=IP_74);
IsAccepted:=(TargetVars.sVisuClientIP=IP_75);
IsAccepted:=(TargetVars.sVisuClientIP=IP_76);
IsAccepted:=(TargetVars.sVisuClientIP=IP_77);

3: IsAccepted:=(TargetVars.sVisuClientIP=IP_78);
IsAccepted:=(TargetVars.sVisuClientIP=IP_79);
END_CASE
Перечисление Группа клиентов

{attribute 'qualified_only'}
{attribute 'strict'}
TYPE GroupVisuClient :
(
GroupVisuClient_1 :=1, //Клиенты WEB-визуализации Участка сборки шасси 192.168.1.70-72
GroupVisuClient_2 :=2, //Клиенты WEB-визуализации Участка сборки автомобилей 192.168.1.73-77
GroupVisuClient_3 :=3 //Клиенты WEB-визуализации Линии сборки кабин 192.168.1.78-79
);
END_TYPE

PLC_PRG

//Передний фронт времени переключения визуализаций
R_TRIG_MainVisuMonitor(CLK:=TargetVars.stRTC.sGetF ormatTime=TargetVars.sStartShift1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndLun ch1 OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak11
OR TargetVars.stRTC.sGetFormatTime=TargetVars.sEndBre ak12 OR TargetVars.stRTC.sGetFormatTime='08:27:00');

//Проверка IP клиента на соответствие определенной группе, если совпадает, присваиваем номер группы и переключаем визуализацию на определенных клиентах
IF TargetVars.sVisuClientIP='192.168.1.70' OR TargetVars.sVisuClientIP='192.168.1.71' OR TargetVars.sVisuClientIP='192.168.1.72'
THEN TargetVars.iGroupVisuClient:=1;
fbChangeVisuMainChassis.xExecute:=R_TRIG_MainVisuM onitor.Q;
END_IF

IF TargetVars.sVisuClientIP='192.168.1.73' OR TargetVars.sVisuClientIP='192.168.1.74' OR TargetVars.sVisuClientIP='192.168.1.75' OR TargetVars.sVisuClientIP='192.168.1.76' OR TargetVars.sVisuClientIP='192.168.1.77'
THEN TargetVars.iGroupVisuClient:=2;
fbChangeVisuMainCar.xExecute:=R_TRIG_MainVisuMonit or.Q;
END_IF

IF TargetVars.sVisuClientIP='192.168.1.78' OR TargetVars.sVisuClientIP='192.168.1.79'
THEN TargetVars.iGroupVisuClient:=3;
fbChangeVisuMainCabin.xExecute:=R_TRIG_MainVisuMon itor.Q;
END_IF

//Вызов ФБ Переключение WEB-визуализации Участок сборки шасси (Главный экран)
fbChangeVisuMainChassis (xExecute:=R_TRIG_MainVisuMonitor.Q,
itfClientFilter:=fbGroupClientFilter,
sVisuName:='Main_screen_Chassis_section');

//Вызов ФБ Переключение WEB-визуализации Участок сборки автомобилей (Главный экран)
fbChangeVisuMainCar (xExecute:=R_TRIG_MainVisuMonitor.Q,
itfClientFilter:=fbGroupClientFilter,
sVisuName:='Main_screen_Car_section');

//Вызов ФБ Переключение WEB-визуализации Участок сборки шасси (Главный экран)
fbChangeVisuMainCabin (xExecute:=R_TRIG_MainVisuMonitor.Q,
itfClientFilter:=fbGroupClientFilter,
sVisuName:='Main_screen_Cabin_line');

Результат: присвоение номера группы везде 1, вместо 1, 2, 3, и не происходит переключение визуализаций на определенных клиентах.
87624
Предполагаю, что проблема либо в коде метода ФБ Фильтр клиентов, либо в формировании сигнала на переключение визуализаций (один одновременный сигнал на несколько ФБ).

Евгений Кислов
22.01.2026, 10:09
Добрый день.
Пожалуйста, оставьте в проекте только то, что касается рассматриваемой вами проблемы и отправьте его на support@owen.ru вместе с ссылкой на ваш пост из этой темы.

Mikhail_NNT
29.01.2026, 13:28
Добрый день. Проект отправил на support@owen.ru, оперативно ответили и указали на недостатки.

Может кому пригодится, ссылка на проект https://share.owen.ru/u/ChangeVisu.projectarchive
Работоспособность проверялась на трех устройствах. Изменения:
1) В FB Group_Client_Filter объявить вход группа клиентов iGroupVisuClient типа INT
2) В PLC_PRG три экземпляра данного блока (по числу групп)
3) Для каждого экземпляра FB в коде задать номер группы
4) При вызове экземпляра визуализации, указать экземпляр FB
5) Запуск происходит при помощи xTest.