SIEMENS, DF&PD

Предыдущее посещение: Пт июн 24, 2016 13:43 Текущее время: Пт июн 24, 2016 13:43

Часовой пояс: UTC + 3 часа




 [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Отключение динамики
СообщениеДобавлено: Вт янв 29, 2008 13:05 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Подскажите, как отключить динамику кнопок и др. объектов на время выполнения скрипта, т.е. полностью блокировать интерфейс от воздействия оператора? Хотелось бы что-то вроде

DisableControls();
Что-то делаем
...
...
EnableControls();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 29, 2008 13:52 
Не в сети
Известный Писатель

Зарегистрирован: Ср авг 08, 2007 14:00
Сообщения: 418
Откуда: Старый Оскол
Всё-таки непонятно, что именно Вы хотите - отключить динамику кнопок или заблакировать интерфейс от воздействия оператора?
Если всё же хотите заблокировать кнопку (что бы на нее невозможно было нажать), для этого существует свойство "Operator-Control Enable" или для случая обращения к этому свойству из скриптов "Operation". Значение этого свойства равное FALSE - кнопка заблокирована, TRUE - сооветственно разблокированна.
Пример скрипта:
Код:
ScreenItems("Button1").Operation = False ' Кнопка "Button1" заблокированна

Что-то делаем

...

ScreenItems("Button1").Operation = True ' Кнопка "Button1" разблокированна


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт янв 29, 2008 15:40 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Как отключить динамику отдельных кнопок это понятно. Хотелось бы заблокировать интерфейс полностью от любых воздействий оператора (ввод данных в поля ввода, переключение между кадрами и т.д.). Перебирать в цикле все контролы на всех видимых кадрах не очень красиво, да и по времени выполнения наверняка накладно. Может есть какой нибудь другой способ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 30, 2008 4:50 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Проще всего привязать напрямую к свойству Operator-Control Enable нужных кнопок битовый внутренний тег с заданным при создании в Tag Manager стартовым значением 1. В начале выполняемого скрипта этот тег устанавливать в 0 для блокирования нужных элементов интерфейса , а по окончанию выполнения устанавливать его в 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 30, 2008 8:29 
Не в сети
Начинающий писатель

Зарегистрирован: Ср мар 30, 2005 8:24
Сообщения: 70
Откуда: ООО "ГидроТех Инжиниринг", г.Днепропетровск, Украина
Если позволяет поставленная задача могу предложить более "топорный", но менее трудоёмкий вариант - на время выполнения скрипта просто перекрывать окном с надписью "Идёт выполнение скрипта...".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 30, 2008 9:19 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Подробней опишите задачу, для чего при выполнении скрипта нужно блокировать интерфейс , может быть найдутся другие решения.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср янв 30, 2008 14:19 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Упрощенно задача следующая:
Имеется главное окно MainWindow, в котором при помощи кнопок навигации может отображаться Kadr1, Kadr2... (всего 6шт)
Есть Kadr1 с расположенными на нем PictureWindow (20 шт)
Есть прототип, назовем его Prototype.pdl, который отображается в каждом из 20 PictureWindow
Prototype.pdl содержит порядка 10 различных элементов управления, привязка которых к тегам осуществляется динамически при открытии Kadr1

Итак, при открытии Kadr1 прорисовка всех элементов управления во всех 20 PictureWindow занимает некоторое время (примерно около 1 секунды). Если в течение этой секунды переключиться например на Kadr2, то имеем ошибку "WinCC Runtime: PDL Run Time: Picture not selected", если же терпеливо дождаться прорисовки всех элементов управления, то все ОК.

Скрипт, вызывающий ошибку, привязан к свойству change одного из элементов управления в prototype. В нем не выполняется никаких грандиозных операций, все ограничивается вызовами SetText и SetVisible.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 5:01 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Чтобы избежать ошибки Picture Not Selected в Вашем случае можно для элемента управления, у которого по событию вызываются функции SetText() и SetVisible() к этим свойствам привязать внутренние теги и эти теги изменять по нужным событиям, например, по значениям процессных тегов (можно приивязать процессный тег, скажем, к невидимому I/O Field в кадре-прототипе и обрабатывать событие OutputValueChange, в котором устанавливать нужные значения внутренних тегов, по которым, в свою очередь будет меняться Текст и Видимость Вашего элемента управления). Тогда прямого обращения к свойствам объектов не будет и даже если кадры не успеют прорисоваться, ошибки не возникнет.

Если у Вас используется Tag_Prefix, то создайте 2 внутренних тега для для прототипа и 20х2 внутренних тегов с нужными префиксами.

Поскольку скрипты в WinCC исполняются из очереди, и объект, к которому обращается скрипт , может быть на момент исполнения уже не в кадре, лучше динамику делать через теги и несложные Dynamic Dialog.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 8:16 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
У меня Tag_Prefix не используется. В кадре-прототипе есть I/O Field (невидимый) и Button. По событию OutputValueChange как-раз и выполняется SetVisible(lpszPictureName, "Button", 1) для Button и еще 4-х элементов управления, что и вызывает ошибку.
Если делать через внутренние теги, тогда получается, что для 6 кадров на каждом из которых по 20 экземпляров prototype для управления свойством Visible кнопки нужно 20*6=120 тегов?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 8:55 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Если к невидимому I/O Field привязан процессный тег, то можно этот процессный тег использовать в Dynamic Dialog для всех пяти элементов управления, задав нужные условия для динамики. Весь вопрос состоит в том, насколько сложны условия для динамизации Ваших объектов. Как я понимаю, Ваш Button отображается при каком-то наборе значений привязанного к невидимому полю тега, здесь подойдёт тип динамического диалога Direct или Analog. Расшифруйте, при каких условиях отображается кнопка и динамизируются другие объекты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 9:51 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Невидимый I/O Field в prototype это просто идентификатор экземпляра, его OutputValue к тегам не привязан и формируется при открытии Kadr1 посредством InitializeFixedInstance (из стандартного PicBlck.h).
Далее в OutputValueChange происходит привязка к тегам посредством LinkInstance (так же из PicBlck.h). Такая реализация описана в многочисленных примерах по организации нескольких PID регуляторов в одном кадре.
После этого необходимо скрыть (или показать) некоторые элементы управления. Условия для этого берутся из глобального массива, определенного и инициализированного ранее.
Этот массив как раз и описывает все 6*20=120 экземпляров этого prototype.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 12:38 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Если используете Picture Modules, то структурный тег для прототипа необходимо дополнить внутренними тегами для элементов, например дав элементам структуры имена Internal_Tag1..Internal_TagN.

Затем необходимо в InstanceName дополнить структуру TypeConnectionTable привязками внутренних тегов .Internal_Tag1..N к свойствам Visible элементов управления.

Затем в InstanceName останется из массива считать информацию о конфигурации конкретного экземпляра окна регулятора и записать её в теги ИМЯ_ЭКЗЕМПЛЯРА.Internal_Tag1.. ИМЯ_ЭКЗЕМПЛЯРА.Internal_TagN.

Как вариант, если массив статический и не будет изменяться, то можно отказаться от него и инициализировать внутренние теги для каждого экземпляра начальными значениями, используя, например WinCC Configuration Tool.

Количество и тип внутренних тегов зависит от данных в вашем глобальном конфигурационном массиве.

В целом, для конфигурации окон-прототипов вместо Picture Modules гораздо удобнее использовать TagPrefix.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт янв 31, 2008 15:05 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Цитата:
Если используете Picture Modules, то структурный тег для прототипа необходимо дополнить внутренними тегами для элементов, например дав элементам структуры имена Internal_Tag1..Internal_TagN.

Затем необходимо в InstanceName дополнить структуру TypeConnectionTable привязками внутренних тегов .Internal_Tag1..N к свойствам Visible элементов управления.

Затем в InstanceName останется из массива считать информацию о конфигурации конкретного экземпляра окна регулятора и записать её в теги ИМЯ_ЭКЗЕМПЛЯРА.Internal_Tag1.. ИМЯ_ЭКЗЕМПЛЯРА.Internal_TagN.

Спасибо за совет, завтра попробую
Цитата:
Как вариант, если массив статический и не будет изменяться, то можно отказаться от него и инициализировать внутренние теги для каждого экземпляра начальными значениями, используя, например WinCC Configuration Tool.

Это был бы идеальный вариант, но как я понял, в WinCC невозможно создать структурный тип, который в свою очередь содержал бы элемент еще одного структурного типа и т.д. Только стандартные типы данных.
Цитата:
В целом, для конфигурации окон-прототипов вместо Picture Modules гораздо удобнее использовать TagPrefix.

При использовании TagPrefix я не разобрался как в контексте окна-прототипа из скрипта получить значение НЕ структурного тега (GetTagByte("Pic_No") обращается к тегу Motor1.Pic_No)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 01, 2008 4:37 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
Если проект типа Multi-User Project , то при использовании TagPrefix игнорировать префикс можно добавив к имени тега внутри окна с экземпляром прототипа префикс @local:: . Так, вызов GetTagByte("@local::Pic_No") запросит значение тега Pic_No.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 01, 2008 6:47 
Не в сети

Зарегистрирован: Вт янв 29, 2008 12:38
Сообщения: 7
Откуда: Омск
Еще раз спасибо за оперативный ответ. Попробовал ваш вариант, все работает. Единственный момент:
TypeConnectionTable = { ... } и LinkInstance создают привязку свойства объекта напрямую к тегу, а как можно из скрипта создать динамику типа Dynamic Dialog?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт фев 01, 2008 7:49 
Не в сети
Известный Писатель

Зарегистрирован: Пт янв 14, 2005 9:29
Сообщения: 152
Откуда: Новокузнецк
В TypeConnectionTable = { ... } динамический диалог указать нельзя, это ограничение структуры MULTILINK , ровно как и функций PDLRTSetMultiLink и Set Link , в которых типы привязок можно задавать лишь константами BUBRT_LT_VARIABLE_DIRECT и BUBRT_LT_VARIABLE_INDIRECT - прямая и косвенная привязки. Если условие для динамического диалога несложное, например, изменение цвета объекта, то сгенерированный код цвета можно так же записывать во внутренний тег и привязывать его напрямую в TypeConnectionTable.

Динамический диалог любого типа без проблем работает в прототипах, использующих Tag Prefix.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
 [ Сообщений: 16 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: MixAlex и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group