В ролике разбирается способ упростить создание тревог для однотипных объектов в CODESYS V3.5 с помощью тревог типа «событие» и метода RaiseEvent. Показано, как отказаться от ручного заполнения таблицы тревог, формировать сообщения в коде и генерировать тревоги программно. Демонстрируется пример с массивом функциональных блоков, настройка триггерной переменной, получение номера экземпляра через атрибут и проверка работы в визуализации и истории.
- 00:00 Проблема ручного создания тревог для однотипных объектов
- 04:08 Способ наблюдения события и триггерная переменная для тревог
- 06:16 Формирование статической части сообщения об ошибке
- 08:41 Получение номера экземпляра блока через атрибут и функцию Between
- 11:44 Формирование сообщения тревоги и конвертация в WSTRING
- 14:13 Генерация тревог типа EVENT и переход к единичным импульсам
- 19:48 Проверка генерации тревог в визуализации и истории
- CODESYS V3.5
- RaiseEvent
Кому полезно: Инженерам АСУ ТП, программистам ПЛК, работающим с тревогами в CODESYS
Описание составлено автоматически по расшифровке речи в ролике.
Расшифровка видео
0:00 Добрый день, коллеги, мы продолжаем говорить про КДСиз 3 5. На днях 1 из пользователей нашего форума Кирилл Спарягин оставил комментарий О. Том, как непросто создавать в кондиссист конфигурацию тревог, если этих тревог много и при этом, даже если это идентичные тревоги одинаковых. Программных объектов это это действительно интересный вопрос и видео. Я хотел бы немножко обсудить эту тему, показать, с чем столкнулся Кирилл. И какими способами можно упростить создание тревог, если действительно этой тревоги одинаковых объектов? Для начала я начну с простого примера. В котором покажу проблему, с которой столкнулся Кирилл. У меня в проекте объявлен массив функциональных блоков, этот блок представляет собой. Некий абстрактный объект, система автоматизации, в нем почти нет никакой логики, потому что в рамках видео на неинтересном в нем просто. Происходит генерация сигналов тревог, соответственно, вход Икс. Ней был определяет работу блока, пока этот блок, пока этот вход имеет значение. Тру блок находится в работе, и пока блок находится в работе с периодом т. Аларм период на выходе Иксалар генерируются прямоугольные импульсы.
1:16 Соответственно, в программе у меня просто в цикле производится вызов элементов массива таких функциональных блоков и, кроме того, есть простой код. Инициализации, в котором я формирую, как в котором я этим различным экземпляром этого блока передаю различные интервалы генерации, тревог в конфигурации. В конфигурации тревог. Своей группе стрелок соответственно я привязываю выходы и к Соларм этих блоков. Для каждого экземпляра требуется указать свою строку в таблице В. Ней будет отличие только в индексах массивов и в сообщении в сообщении передается номер объектов. Собственно, он в примере совпадает с индексом. Массива соответственно пока этих тревог там 5 10 действительно бить их руками довольно не сложно. Если, например, объектов 100 это уже будет 100. Строк, если у каждого объекта по 5 тревог, то это уже 500 строк. И это действительно долго и монотонная работа, которая требует довольно много времени.
2:21 1 Из вариантов, которые приходят в голову и который, собственно, упомянул сам Кирилл. Это экспортировать этот список в эксель и как то потом его в Экселе, макросами обработать, растиражировать и так далее. Давайте, кстати, посмотрим, как это будет выглядеть в Экселе.
2:49 Ну, примерно вот таким образом это будет выглядеть. К сожалению, здесь нужно было корректно, корректные импортные, не просто открывать, а импортировать ЦС, чтобы. Все это отобразилось по столбцам, проще, наверное, открыть в текстовом редакторе и показать общую структуру этого файла. Действительно, вы можете написать ряд. Каких то скриптов, которые будут обрабатывать этот файл, тиражировать строки и так далее? Но это опять таки затраты времени, и кроме того, это более менее. Неплохо на начальном этапе, когда нужно просто растиражировать, например, 1 тревогу. Но если вы уже в середине работы над проектом хотите внести в список какие? То изменения, то действительно это может занять много времени, поэтому несмотря на то, что действительно экспорт импорт тревог в ЦСВ есть не всегда он. Оказывается, настолько уж полезным я бы хотел показать другой способ, который позволяет непосредственно в программе КДХС упростить создание конфигурации тревог. Именно повторюсь, для однотипных объектов для этого мы удаляем все те строки, которые у нас есть сейчас, и добавляем всего лишь 1 тревогу со способом наблюдения. События тревоги с таким способом наблюдения формируются непосредственно в ходе программы с помощью вызова специального метода. Давайте зададим ей класс.
4:08 И нужно задать сообщение соответственно. В нашем случае сообщение не может быть фиксированным, потому что объектов много у всех, у них различные номера и сообщения тревоги. Нам придется как то генерировать в коде, а потом передавать, передавать. Непосредственно тревоги через так называемую триггерную переменную плач переменную. Давайте сразу Абеев программе, перемены у которого будет, которая будет олицетворять вот это наше текущее сообщение тревоги. Назовем ее, просто леч, Фар.
4:43 Привязываем ее к 1 триггерной переменной. И в сообщении использован специальный заполнитель 1. Этот заполнитель означает следующее. В тот момент, когда тревога будет сформирована в программном коде, то в качестве ее сообщения подставиться текущее значение нашей строковой переменной ВС леч ВАР соответственно. Если бы мы использовали 2 переменную, мы бы. Могли еще использовать, заполнять и лечь 2 Лайтч 3 и так далее. Важно, что стоит сказать про способ наблюдения события. Он подходит только для тревог, у которых способ подтверждения реп или Ак для других, для тревог с другим способом подтверждения он не подойдет.
5:36 Теперь нам необходимо внести наши изменения. Изменения в нашу программу я отмечу, что я буду использовать функции из библиотеки Овен Стринг Утилс. Она уже добавлена у меня в менеджеры библиотек. Если у вас этой библиотеки нет, то вы можете скачать ее с нашего сайта и установить в КДС через. Репозиторий библиотек и добавить уже в конкретно ваш проект через менеджеров библиотек вот таким образом. И теперь давайте перейдем к модификации нашего кода. Во 1 нам необходимо на уровне объекта и внутри самого объекта формировать сообщение об ошибке.
6:16 У этого сообщения есть статичная часть, мы помним, что наше сообщение выглядело объект, например, там объект, 1 тревога, соответственно, объект это имя объекта. Простите за цитология, давайте просто объем константов. И Назовем ее, например, Си ВС, облик Нейм. Ну, Ну, И просто соответственно зовем объект в. В вашем случае вы, конечно, можете использовать название вашего конкретного объекта. Например, там котел горел горел горелка и так далее, дальше нам потребуется текст. Сообщения об ошибке их может быть несколько. Если у вас генерируется несколько ошибок вашим объектом в рамках моего примера, соответственно, ошибка только 1.
7:25 Обратите внимание, что я стараюсь воссоздать то, как это выглядело прежде. То есть у меня были сообщения в стиле? Объект 1 Ошибка соответственно вот эта часть это имя объекта. Давайте я сразу, кстати, поставлю пробел, чтобы потом просто приклеить номер, который тоже генерирую в блоке, а вот. Это соответственно, это уже мы считаем текст ошибки, который включает 2 точи пробел после двоеточия и непосредственно текст текст, который описывает, что произошло я.
8:03 Это что касается статической чаще сообщение об ошибке, но есть динамическое, это непосредственно номер самого объекта и внутри блока. Нам бы хотелось как то этот номер получить в В. своем примере, как я уже говорил, у меня объявлен массив таких объектов и в качестве номера объекта. Я буду использовать индекс этого массива, и для этого внутри блока нужно понимать.
8:30 Какой каким номером массива он стал, но речь сейчас уже о конкретном экземпляре, какой номер массива имеет конкретный экземпляр блока? Для этого используется специальный атрибут. Этот атрибут называется инстинкт пас, и он позволяет в коде в коде блока получить путь к этому блоку. То есть, например, там девайс, точка апликэшен, точка + и прг и так далее, включая в том числе индекс массива и соответственно. Сначала мы должны весь наш блок украсить атрибутом рефлекшен, а далее объявите строку перемена со специальными 2 атрибутами и спас и ноу и нет. Давайте я такую перемену объявлю, соответственно, это уже локальная переменная блока.
9:15 И при его вызове в Нью Йорк, а точнее при его. При его инициализации автоматически в нее. Будет помещен путь к этому блоку. Включая все его пространство имен, так ну соответственно никакого начального значения от перемен не будет, потому что она вот будет инициализирована компилятором. И теперь теперь давайте давайте формируем сообщение об ошибке. Это будет достаточно сделать в 1 раз при 1 вызове блока. Соответственно, объявляем переменную х нет.
9:55 По умолчанию она имеет значение, Фолс, и если она имеет такое значение, то мы выполняем некий код и присваиваем ей значение. Тру, чтобы больше этот код не выполнять в этом коде, мы должны сформировать некое сообщение об ошибке. Давайте я еще объявлю переменную, которая будет представлять собой как раз номер номер нашего объекта. Как я уже говорил, это, по сути, его индекс в массиве. Соответственно, вряд ли у нас будет больше, там вряд ли номер объекта будет представлять собой пятизначное число, скорее всего, 4 цифр нам. Хватит, скорее всего, даже хватит 3 цифр в большинстве случаев. Вот ну давайте сдадим ограничение на 4 для начала, нам необходимо, используя уже. Имеющиеся у нас перемены определить, определить номер нашего объекта, то есть его позиции в массиве. Как я уже говорил, в перемену Спаунэйм за. Счет атрибутов будет записан полный путь к экземпляру блока, включая, включая его индекс. И соответственно, мы можем воспользоваться функцией.
11:02 Напомню, я добавил ее заранее манжет библиотек и напомню, что у нее пространство имен осу. Соответственно, я ввожу пространство именно библиотеки. Нажимаю точку и убираю нужную. Мне функцию нужно, меня функция называется. Битвин, она позволяет вырезать фрагмент из, она позволяет вырезать из строки некую подстроку, размещенную между Префиксом и постфексом. Соответственно, моя исходная строка, это вот это. Исполняем путь к моему экземпляру, и я знаю, что индекс массива размещается в квадратных. Скобках, поэтому постфикс у меня это открывающаяся квадратная скобка. Префикс, прошу прощения, апостокс, это закрывающийся квадратная скобка.
11:44 Кроме того, поскольку функция возвращает значение в виде типа стринг, то нам потребуется конвертировать в стринг. Потому что мы же будем отображать текст нашего сообщения в таблице. Стрелок визуализации, а а для наших контроллеров для большинства контроллеров поддержки рельсы доступны только при использовании типа Вэстринг, в котором кодировка Ютэф 16.
12:10 Надо сказать, что если бы что это все подходит для вот нашего случая, если бы случай был чуть более сложным. Например, если бы у нас наш массив блоков был бы объявлен в каком то другом массиве, то и был бы массив массивов, то у нас в пути было бы 2 пары. квадратных скобок, и поэтому функция Парченко стало бы чуть сложнее, но тем не менее важно понять сам принципы для нашего случая. Он совершенно подходит и более того, что когда у вас массив массивов функциональных блоков, это не такая уж частая ситуация.
12:48 И теперь, зная номер нашего блока в массиве, мы можем сформировать сообщение тревоги целиком. Давайте, кстати, объявим специальный выход для этого нашего блока. И просто склеим его из уже имеющихся частей с помощью функции. Канкад 4 из той же самой библиотеки Овен Стринг Утилс. Точнее, в конкат, потому что у нас тип. В Стринг Вакан к 4 соответственно сначала передаем имя объекта. Дальше к нему приклеиваем наш номер и дальше к нему приклеиваем и сообщение об ошибке.
13:31 Так тут немножко интересным моментом функции на самом деле 4 входа. Но в серых ящиках к дефис появилась так называемая поддержка опциональных входов, то есть если. У вас у входов есть уже какие то значения цивилизации, то можно их вызови. Функции не передавать, если они вам не нужны, как в нашем случае это довольно удобно.
13:52 Итак, сообщение мы сформировали. И все, что осталось сделать, это внести некоторые изменения уже в нашу программу. Как я говорил, для событий типа Эванд требуется формировать тревогу непосредственно в коде. И делать это надо в течение 1 цикла, потому что если, например, вы вот код формирования тревоги удержите в несколько циклов в течение нескольких циклов контроллера, то тревога будет сформирована. Несколько раз я напоминаю у меня в исходной программе. Для генерации, для генерации тревог использовался в качестве имитатора блинк. Блин генерирует прямоугольные импульсы. Почему я это сделал, потому что почему, точнее, не единичные пульса, генерирую? Дело в том, что весь этот код вызывается в задача. Майн Таск, у которой интервал вызвать 10 миллиардекунд, обработка тревог, происходит задача Алар, менеджер Таску, который интервал вызова другой. И соответственно, если у вас будет единичный импульс длиной в 10 миль секунд, то в этой задаче вы его. Просто пропустите, потому что она вызывается гораздо реже, в 5 раз реже. Поэтому на самом деле, чтобы Алар менеджер отловил эти тревоги, нужно, чтобы время, в течение которого сигнал тревоги удерживается. Я имею в виду сигнал тревоги, привязаны вот.
15:17 В конфигурации тревог. То в этом случае сигнал тревоги должен удерживаться не менее времени цикла. Задача, но именно тревог с способом наблюдения Эван это не касается, их можно. Генерировать единичными импульсами, и более того, это нужно так делать, чтобы не добавлять и не добавлять в тревогу, не добавлять в таблицу стрелок лишних сообщений.
15:45 Поэтому нужно перейти от прямоугольных импульсов к единичным импульсам. Для этого я объявлю массив блоков р 3 из библиотеки стандарт. На самом деле можно было бы, конечно, внести вот этот код непосредственно в наш функциональный блок и там генерирует единичный импульс. Или вы могли вобить структуру, в которой? Поместить и наш блок объекта, и наш Триггер, и объявить бы мощи в таких структур варианты разные. Я просто показываю, какой то 1 из них просто объявили еще 1 массив триггеров.
16:27 Соответственно. В цикле Я обращаюсь к этому массиву, и для каждого блока я активирую соответствующий. Эртригер, передавая ему на вход выход и к Соларам. Если этот выход принял значение ТРУ, то, соответственно, действительно была сформирована тревога. Давайте мы это обработаем. То есть у нас реально случилась тревога и что мы должны сделать? Ну, во 1 мы должны в наш врач переменную скопировать значение свыше до конкретного экземпляра блоков. Так что так?
17:18 Во 2 сгенерировать тревогу с помощью специального метода вводим имя библиотеки Алар менеджера. Нажимаем точку, выбираем объект Джи Аларм Хендлер. Это глобальный обработчик тревог всего приложения. И нажимаем точку и убираем метод Райз Эванд. Это как раз программная генерация тревоги типа события. Здесь есть 2 аргумента, 1 это Айди группы, тревог и 2 Айди конкретной тревоги. Проще всего их выбрать с помощью ассистента ввода, я нажимаю ф 2. И раскрываю узел аппликэшен, сначала мне нужно найти Айди моей группы тревог, поэтому выбираю вот строку. Аларм группс Айди, вот вижу, Айди Май, Аларм групп. Значит, май Аларм групп, это имя моей группы тревог в дереве, проекты выбираю ее.
18:14 Ставлю запятую опять нажимаю в 2, и теперь мне нужно нужно найти Айди конкретной тревоге. Значит, теперь раскрываю папку Аларм, класс интернал Айди, раскрываю свою. Группу тревог и в ней нахожу Айди, 0 потому что действительно у меня только 1 тревога. Сейчас в проекте в моей моей группе Май Аларм группы действительно у нее Айди 0.
18:40 Собственно, на этом доработка программного кода завершена. У меня всего в примере пока что 3 экземпляра моего объекта в 1 тревога генерируется каждые 10. Секунд во 2 кале 20 секунд в 3 каждые 40 соответственно, спустя после спустя 20 секунд после запуска у меня уже сгенерируется одновременно и 1 2 ну, точнее. Спустя 10 секунд сначала сгенерируется 1 спустя 20 секунд и 1, 2 спустя 30 секунд. Опять 1 потому, что на гигиен искать 10 секунд и спустя 40 сгенерируется все. 3 Тревоги и дальше это будет именно в цикле. В общем, то продолжаешь генерироваться. Давайте мы вообще то загрузим в контроллер и посмотрим, как оно работает.
19:48 Переходим визуализация. Переходим в историю сразу. Ждем 10 секунд до того момента, когда будет сгенерирована 1 тревога, вот она тревога по объекту. 1 Спустя еще 10 секунд будут сгенерированные. Тревоги по объекту 1 и по объекту 2 спустя еще 10 секунд будет опять сгенерирована тревога по объекту. 1 Потому что она генерируется к 10 секунд.
20:18 Вот она и спустя еще 10 секунд уже пройдет 40 секунд, и все тревоги будут сгенерированы. Одновременно И случилось. Дальше, соответственно, это будет дальше циклически генерироваться. Потому что у меня просто вот, по сути, сейчас проект представляет собой имитатор тревог. И обратите внимание на основное преимущество этого способа у нас объектов. Может быть, произвольное количество, а тревога для них только 1. Ну, соответственно, если бы у нас было бы 5 стрелок для каждого бега, то в таблице был 5 строк. Это не так много, и если бы у нас, например, был 100 объектов, то. Все, что нам бы потребовалось, это вот изменить эту константу. Код полностью зависит от нее в обработке, тревогу ничего менять не пришлось. Поэтому если у вас много адаптивных объектов, то, как мне кажется, гораздо проще отказаться. От варианта добавления каждой тревоги в ручную и Кирилл прав, что это довольно трудоемкий процесс. А воспользоваться тревогами со способом наблюдения, события и генерировать их в ходе программы с помощью метода Райз Эванд.
21:31 Все, что хотел про тревоги рассказать, я рассказал. Надеюсь, для Кирилла и для других пользователей будет интересна моя информация. И хотел бы еще добавить пару слов о предстоящих событиях во 1 и прошедших событиях во 1 в конце. Сентент мы на платформе Степик опубликовали бесплатный онлайн курс по программированию в количестве. 5 Если вы хотите познакомиться с этой средой, то по моему это довольно хорошая точка входа. Ссылку на него я оставлю в описании.
22:03 И еще 1 момент, о котором бы хотелось сказать в ближайшие несколько месяцев, не стоит ждать новых видео. До конца года осталось 2 месяца у меня. Остался месяц отпуска в этом году, я еще ни разу не был в отпуске, и поэтому поэтому в ближайшее время видео ждать не стоит, но я постараюсь. Сделать еще 1 видео в самом конце декабря, и если у вас есть какие то пожелания по поводу того, чтобы вы хотели в нем увидеть, то я буду очень рад. Их услышать точно так же, как и пожелание по другим идеям о том, что можно было бы еще показать видеороликов по программированию в калечис 3 5.
22:41 Спасибо вам за внимание и еще увидимся.
Расшифровка сделана автоматически (Yandex SpeechKit) и может содержать ошибки в терминах.
Исходный пост на форуме:
https://owen.ru/forum/showthread.php?t=33572&p=391821&viewfull=1
Ссылка на пример из видео:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/02_Visu/03_Additional/Example_TypicalAlarms_3517v1.projectarchive
Бесплатный онлайн-курс по CODESYS V3.5 на платформе Stepik:
https://stepik.org/course/123987/promo