[Промышленное программирование, SCADA] Самоучитель по WinCC OA. Часть 3. Глобальные скрипты (control scripts)
Автор
Сообщение
news_bot ®
Стаж: 6 лет 4 месяца
Сообщений: 27286
Запрограммированое в предыдущей части поведение задвижки… нелогично. В обработчике нажатия кнопки «Открыть» или «Закрыть» мы непосредственно задавали значение элемента под названием Position. При том, что в самом DPT у нас уже предусмотрены команды «Открыть» и «Закрыть».![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/379bdcdccc7bfa901cc415ab6f73f269.png)
Datapoint type «Flap»Разумеется, в реальной жизни для управления каким-либо агрегатом мы, как правило, задаем значение соответсвующей команды, представленной в виде переменной контроллера. Поскольку реального контроллера в этом workshop пока нет, мы будем имитировать поведение технологического оборудования посредством скрипта.Но для начала изменим обработчик нажатия на кнопки «Открыть» и «Закрыть».![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/dc7a4815baff2188d9b7f033f6e55219.png)
Скрипт на нажатие кнопки «Open»Меняем на
main(mapping event)
{
dpSet("System1:Flap1.Commands.Open", 1, "System1:Flap1.Commands.Close", 0);
}
![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/4e396145dfdc3357327e0e90e9fda896.png)
Измененный скрипт кнопки «Open»Обратите внимание, что этот скрипт задает значение двум DPE, но, как было сказано в конце прошлой части, это выполняется одним сообщением. Выставляется команда «Открыть» и сбрасывается команда «Закрыть», это своего рода «защита от дурака» (которая, в принципе, должна и так быть в прикладной программе контроллера, но мы перестраховываемся).Аналогично поступаем со скриптом кнопки «Close»![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/717c6ed9d3bf1efd3c414c14d2b1dca1.png)
Проверим выполнение скрипта нажатия кнопок, меняются ли переменные команд в модуле Para![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/bfddfbf88725bab636d23ffad89e4e07.png)
Нажатие кнопки «Open»![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/10dc701ce95bc51c359a48e4fc3cd8ca.png)
Нажатие кнопки «Close»Разумеется, в настоящий момент положение заслонки не меняется, так как нет обработчика команд. По нажатию кнопок сейчас должны менять свои значения тэги open и close соответствующей точки данных.Для создания скрипта мы должны в gedi найти в дереве проекта Scripts, нажать правую кнопку мыши и выбрать Add New CTRL Script![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/f0cb000cc6fc3819c634ffc4899d0836.png)
Дадим осмысленное имя файла скрипта, я его назвал Model![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/a9043b0c770a2c00ce9c471e3363742f.png)
После нажатия ОК скрипт появляется в дереве проекта![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/a30a0d898daa7d6881bf20af5c0b7ca7.png)
Далее двойным кликом на файле открываем скрипт для редактирования. Теперь необходимо продумать поведение модели и структуру самого скрипта. С учетом ярко-выраженного событийного поведения всей системы WinCC OA, этот скрипт должен вызывает функцию dpConnect, завязанную на одну из переменных команд управления задвижкой. Разберемся по шагам.
- Вызываем dpConnect на изменение значения переменной команды. В данном случае у нас очень упрощенная модель, защита от дурака реализована в скриптах нажатия кнопки, поэтому достаточно будет привязаться и к одной команде.
- Создаем callback функцию на изменение значения команды в рамках модели поведения.
Другие варианты поведения модели неверны с точки зрения идеалогии WinCC OA. Если в самом «глобальном» скрипте вызывать dpGet для чтения значения переменной команды, то этот скрипт надо вызывать постоянно, с определенной периодичностью.Напоминаю, что у функции dpConnect есть два аргумента. Первый аргумент — имя callback-функции (я назвал ее OnOpen_CB), второй — имя точки данных, на которую происходит подписка. Итого, в упрощенном виде, без каких-либо проверок функция main скрипта Model выглядит так:
main()
{
dpConnect("OnOpen_CB", "System1:Flap1.Commands.Open");
}
Далее напишем саму callback-функцию. У нее тоже два аргумента — имя точки данных (тип данных string) и «новое» значение этой точки данных (должно соответствовать типу данных «исходной» точки). Получается вот такая заготовка.
void OnOpen_CB(string dp1, bool bNewValue)
{
;
}
Дописываем обработчик, он очень простой. Если значение команды «открыть» равно «истина», то задаем положение задвижки, равное 90. Если значение равно «ложь», то значение — 0.
void OnOpen_CB(string dp1, bool bNewValue)
{
if (bNewValue) {
dpSet("System1:Flap1.Inputs.Position", 90);
} else {
dpSet("System1:Flap1.Inputs.Position", 0);
}
}
Теперь этот созданный скрипт необходимо как-то вызвать. Для исполнения «глобальных» скриптов используется Control Manager. Следовательно, требуется добавить в список менеджеров системы вызов еще одного менеджера (Control), где в качестве параметра задается имя исполняемого скрипта. В системе есть уже один вызов Control. И его трогать не следует во избежание нехороших последствий. Разве что, вы работаете с системой на уровне эксперта, но тогда зачем вам читать эти заметки?![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/6e522324a65efab5ec264aad71e674db.png)
Существующий список менеджеровВ консоли WinCC OA нажимаем кнопку Append new manager, выбираем в появившемся окне менеджер Control. Для первого запуска свежесозданного скрипта имеет смысл выбрать режим запуска (Start mode) ручной (manual), чтобы не наблюдать попытки перезапуска в случае ошибок в самом скрипте. В качестве параметров вызова менеджера необходимо указать его номер в системе. В нашем случае это будет номер 2. Почему 2? Потому что менеджер с номером 1 в системе уже существует. Менеджеры одного типа в системе должны запускаться со своим уникальным номером. Именно одного типа. Это значит, что в системе может быть ui с номером 1 и ctrl с номером 1, а вот два ui (или ctrl) с одним и тем же номером быть не должны. Поэтому в качестве агрумента запуска я указываю строку «-num 2». Кроме того, требуется передать имя исполняемого скрипта. Вызов нового менеджера выглядит следующим образом:![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/984cabbe1512cc9f6cc36111baba749c.png)
Свойства Control менеджера для симуляции задвижкиОстается нажать кнопку ОК и запустить менеджер вручную кнопкой Manager Start либо мышью через вспывающее меню (новый менеджер при этом должен быть выделен в списке). Если все сделано правильно, то добавленный менеджер позеленеет и примет статус 2.![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/80b35aee9528c49916d1fc6034929ad1.png)
Скрипт симуляции успешно запущенТеперь остается проверить работу симуляции.![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/02114eff91a475d6f72f52a93d3f768a.png)
По нажатию кнопки Open визуализируется открытие![Клик для увеличения](https://linkme.ufanet.ru/box/200x100/92d3faa67ba0d6641df313a12b3d0199.png)
Кнопка Close визуализирует закрытиеСледует обратить внимание на то, что Control Manager запускает скрипт (точнее, свою функцию main) один раз при старте. После выполнения функции main() необходимые callback функции продолжают находится в памяти ПК, они исполняются при выполнении условий, указанных в dpConnect (по изменению значения переменной). Однако, если в сам скрипт были внесены изменения, то необходимо вручную остановить соответствующий экземпляр control-менеджера и запустить его заново. Без останова-запуска изменения не будут приняты.Сам control manager при запуске создает свой отдельный процесс. Его функция main выполняется в отдельной нитке (потоке, thread). Callback функция (в нашем случае OnOpen_CB) так же запускается в отдельном потоке. После выполнения функция main перестает работать, но callback продолжает находится в памяти ПК (в своем потоке) и вызывается при изменениях «подписанной» переменной.
===========
Источник:
habr.com
===========
Похожие новости:
- [Промышленное программирование, Разработка робототехники, Программирование микроконтроллеров, Разработка под Arduino, Производство и разработка электроники] Портирование ModBus Slave RTU/ASCII на IAR AVR v3
- [Программирование, C#, ООП, Промышленное программирование] Методы без аргументов — зло для неизменяемых объектов, и вот как его полечить
- [Промышленное программирование] Модели и алгоритмы построения цифровой платформы CNCIOT для сбора данных с оборудования
- [Программирование, Java, Apache, Промышленное программирование] Spring Boot app with Apache Kafka in Docker container (перевод)
- [.NET, Промышленное программирование, Разработка робототехники, Управление проектами, Робототехника] Роботы. Часть два. Крылатые качели
- [Промышленное программирование, Разработка робототехники, Управление проектами] Роботы. Часть раз. Вводная
- [C#, Промышленное программирование] Как я при помощи Google сделал OPC2WEB клиент
- [Анализ и проектирование систем, Проектирование и рефакторинг, Математика, Параллельное программирование, Промышленное программирование] Что сказал-то?
- [Промышленное программирование, Разработка робототехники, Программирование микроконтроллеров, Производство и разработка электроники] ModBus Slave RTU/ASCII без смс и регистрации. Версия 3
- [Анализ и проектирование систем, Проектирование и рефакторинг, Математика, Промышленное программирование] То что ясно всем
Теги для поиска: #_promyshlennoe_programmirovanie (Промышленное программирование), #_scada, #_wincc, #_siemens, #_scada, #_promyshlennoe_programmirovanie (
Промышленное программирование
), #_scada
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 02-Июл 19:55
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 4 месяца |
|
Запрограммированое в предыдущей части поведение задвижки… нелогично. В обработчике нажатия кнопки «Открыть» или «Закрыть» мы непосредственно задавали значение элемента под названием Position. При том, что в самом DPT у нас уже предусмотрены команды «Открыть» и «Закрыть». ![]() Datapoint type «Flap»Разумеется, в реальной жизни для управления каким-либо агрегатом мы, как правило, задаем значение соответсвующей команды, представленной в виде переменной контроллера. Поскольку реального контроллера в этом workshop пока нет, мы будем имитировать поведение технологического оборудования посредством скрипта.Но для начала изменим обработчик нажатия на кнопки «Открыть» и «Закрыть». ![]() Скрипт на нажатие кнопки «Open»Меняем на main(mapping event)
{ dpSet("System1:Flap1.Commands.Open", 1, "System1:Flap1.Commands.Close", 0); } ![]() Измененный скрипт кнопки «Open»Обратите внимание, что этот скрипт задает значение двум DPE, но, как было сказано в конце прошлой части, это выполняется одним сообщением. Выставляется команда «Открыть» и сбрасывается команда «Закрыть», это своего рода «защита от дурака» (которая, в принципе, должна и так быть в прикладной программе контроллера, но мы перестраховываемся).Аналогично поступаем со скриптом кнопки «Close» ![]() Проверим выполнение скрипта нажатия кнопок, меняются ли переменные команд в модуле Para ![]() Нажатие кнопки «Open» ![]() Нажатие кнопки «Close»Разумеется, в настоящий момент положение заслонки не меняется, так как нет обработчика команд. По нажатию кнопок сейчас должны менять свои значения тэги open и close соответствующей точки данных.Для создания скрипта мы должны в gedi найти в дереве проекта Scripts, нажать правую кнопку мыши и выбрать Add New CTRL Script ![]() Дадим осмысленное имя файла скрипта, я его назвал Model ![]() После нажатия ОК скрипт появляется в дереве проекта ![]() Далее двойным кликом на файле открываем скрипт для редактирования. Теперь необходимо продумать поведение модели и структуру самого скрипта. С учетом ярко-выраженного событийного поведения всей системы WinCC OA, этот скрипт должен вызывает функцию dpConnect, завязанную на одну из переменных команд управления задвижкой. Разберемся по шагам.
main()
{ dpConnect("OnOpen_CB", "System1:Flap1.Commands.Open"); } void OnOpen_CB(string dp1, bool bNewValue)
{ ; } void OnOpen_CB(string dp1, bool bNewValue)
{ if (bNewValue) { dpSet("System1:Flap1.Inputs.Position", 90); } else { dpSet("System1:Flap1.Inputs.Position", 0); } } ![]() Существующий список менеджеровВ консоли WinCC OA нажимаем кнопку Append new manager, выбираем в появившемся окне менеджер Control. Для первого запуска свежесозданного скрипта имеет смысл выбрать режим запуска (Start mode) ручной (manual), чтобы не наблюдать попытки перезапуска в случае ошибок в самом скрипте. В качестве параметров вызова менеджера необходимо указать его номер в системе. В нашем случае это будет номер 2. Почему 2? Потому что менеджер с номером 1 в системе уже существует. Менеджеры одного типа в системе должны запускаться со своим уникальным номером. Именно одного типа. Это значит, что в системе может быть ui с номером 1 и ctrl с номером 1, а вот два ui (или ctrl) с одним и тем же номером быть не должны. Поэтому в качестве агрумента запуска я указываю строку «-num 2». Кроме того, требуется передать имя исполняемого скрипта. Вызов нового менеджера выглядит следующим образом: ![]() Свойства Control менеджера для симуляции задвижкиОстается нажать кнопку ОК и запустить менеджер вручную кнопкой Manager Start либо мышью через вспывающее меню (новый менеджер при этом должен быть выделен в списке). Если все сделано правильно, то добавленный менеджер позеленеет и примет статус 2. ![]() Скрипт симуляции успешно запущенТеперь остается проверить работу симуляции. ![]() По нажатию кнопки Open визуализируется открытие ![]() Кнопка Close визуализирует закрытиеСледует обратить внимание на то, что Control Manager запускает скрипт (точнее, свою функцию main) один раз при старте. После выполнения функции main() необходимые callback функции продолжают находится в памяти ПК, они исполняются при выполнении условий, указанных в dpConnect (по изменению значения переменной). Однако, если в сам скрипт были внесены изменения, то необходимо вручную остановить соответствующий экземпляр control-менеджера и запустить его заново. Без останова-запуска изменения не будут приняты.Сам control manager при запуске создает свой отдельный процесс. Его функция main выполняется в отдельной нитке (потоке, thread). Callback функция (в нашем случае OnOpen_CB) так же запускается в отдельном потоке. После выполнения функция main перестает работать, но callback продолжает находится в памяти ПК (в своем потоке) и вызывается при изменениях «подписанной» переменной. =========== Источник: habr.com =========== Похожие новости:
Промышленное программирование ), #_scada |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 02-Июл 19:55
Часовой пояс: UTC + 5