PDA

Просмотр полной версии : Установка бита/переменной при квитировании/сбросе аларма



borgivan
15.12.2020, 20:05
Здравствуйте, коллеги.
Есть ли механизм в CodeSys, который позволяет устанавливать биты или записывать переменные при подтверждении или сбросе тревог штатными методами? Сработал аларм, оператор квитирует его в визуализации, через какое-то время аларм уходит, и в этот момент система пишет бит в какой-нибудь in_out ПЛК или хотя бы BOOL. Или такую роскошь придется делать руками?

Евгений Кислов
15.12.2020, 20:48
Добрый день.

Это можно сделать на уровне класса тревог.

52495

borgivan
15.12.2020, 21:51
Добрый день.

Это можно сделать на уровне класса тревог.


Спасибо за наводку, посмотрел, работает! Но я так понял, что с помощью этого механизма осуществляется действие при исчезновении любой тревоги? А я хотел (ох уж эта недосказанность вечная), чтобы при сбросе конкретного аларма выставлялся конкретный бит: аларм генерится триггером var1, после снятия var1 и квитирования записывается переменная, ну например, var1rst, аларм генерится триггером var2, после снятия var2 и квитирования записывается переменная var2rst, и т.д.

Евгений Кислов
15.12.2020, 21:56
Спасибо за наводку, посмотрел, работает! Но я так понял, что с помощью этого механизма осуществляется действие при исчезновении любой тревоги? А я хотел (ох уж эта недосказанность вечная), чтобы при сбросе конкретного аларма выставлялся конкретный бит: аларм генерится триггером var1, после снятия var1 и квитирования записывается переменная, ну например, var1rst, аларм генерится триггером var2, после снятия var2 и квитирования записывается переменная var2rst, и т.д.

Да, этот функционал влияет сразу на все тревоги данного класса.
В принципе, если в проекте их условные несколько десятков (а не сотни) - то можно для каждой создать свой класс.
Если тревог много - то проще будет делать руками, но возникнут сложности с квитированием (мы не знаем, какая строка в таблице выделена при нажатии кнопки квитирования - если только не оставлена лишь кнопка Квитировать все).
В теории, описанную задачу можно решить через библиотеку AlarmManager, но это тоже будет не слишком просто - хорошего описания нет, пример поясняет далеко не все, и все равно придется писать много дополнительного кода:
https://ftp.owen.ru/CoDeSys3/21_Examples/01_3.5.11.5/02_Visu/04_3S/AlarmManager.package

borgivan
15.12.2020, 22:07
Про библиотечку AlarmManager уже читал. Идея понятна. Даже в принципе понятно, как через неё решить. Просто это всё равно будет в коде разнесено, а значит время/возможность человеческого фактора: там аларм добавил, тут пропустил, ищи-свищи потом :)

Cs-Cs
15.12.2020, 22:57
А про какую библиотеку говорят? Про штатную или какую-то другую?
Евгений Кислов Я тебе слал свой проект с этим кодом и очередью СМСок =)

borgivan
Там надо в таблицу действия класса воткнуть вызов своего FB, наследованного от IAlarmNotifier.
И когда класс сработает, то в наш FB передаётся инфа о том, какая тревога, какой ID, какой класс что сделала (активировалась, деактивировалась) и так далее. И нам останется только поставить IFы на нужную. Я так себе SMS-уведомления делаю в проекте: когда срабатывает любая тревога, я знаю про это, и отсылаю СМСку.
А ID тревог берутся из их таблицы. Ща, делаю кучу скриншотов. Это можно прям в FAQ =))

Итак, вот инфа более детально.
1. Создаём свой FB с наследованием: 52496
Сам блок должен иметь пустой код (он ничего не делает), но должен иметь метод "Execute" с определёнными типами и количеством параметров, вот такой: 52497
у меня там красивые комментарии, по которым всё-всё понятно. Однако, нам передают:
а) Текущее состояние тревоги (eCurrTranslition). Это то, в какое состояние тревога перешла.
б) Объект самой тревоги (itfAlarm). Это ВЕСЬ объект тревоги со всеми классами, группами, текстами, переменными и их значениями.
В коде я из них вытаскиваю состояние, в которое приходит тревога, сообщение тревоги, класс тревоги. А потом собираю это в текстовую строку и кидаю СМСку в очередь на отправку.
2. Узнать о том, что как зовётся и что нам доступно можно в менеджере библиотек. Смотрим там, и видим:
а) Описалово состояний тревоги: 52498
б) Описалово объекта тревоги со всеми методами и свойствами: 52499
Вот как раз тебе нужны будут фильтры по ID конкретной тревгои, класса или группы
3. Чтобы наш FB вызывался, где-нибудь в проекте делаем переменную его типа, вот так: 52500
И дальше в класс тревоги вписываем вызов нашего FB: 52501

Вуаля! Теперь при сработке любой тревоги из класса, в котором вставлен вызов, будет вызываться наш FB, в который будет поступать ВСЯ инфа о текущей тревоге и её статусе. А дальше с этим можно делать что хочется (отфильтроав нужное) - биты ставить, СМСки/Мыла слать.

borgivan
15.12.2020, 23:15
Cs-Cs, дорогой, ДАЙ Я ТЕБЯ РАСЦЕЛУЮ! Когда увидел, что кроме переменной увидел возможность фб прицепить, сразу мысль пришла о том, как это было бы реализовано в С#, а потом вспомнил, что в сисе тоже интерфейсы есть, но инфы не надыбал про это )))))

Cs-Cs
15.12.2020, 23:37
Целуй! Для меня это было такое же адское открытие! Я сначала думал - юзать ли тревоги или нет. Думал, что это какая-то закрытая фигня, из которой ничего не достать. А когда попробовал с этим интерфейсом и FB - то меня адски втащило!
Сам CodeSys меня тоже тащит вовсю, потому что тут есть и массивы, и указатели, и массивы указателей - и вообще всё на мой любимый СИшник похоже =))

А ID нужных тебе тревог ты можешь в проекте в какой-нить массив констант воткнуть, чтобы он лежал где-то не посередине кода, а в удобном месте и тоже легко конфигурился. Жжом!

borgivan
16.12.2020, 00:45
Вот только в упор не понял, как соотносятся Id из AlarGroup и я IAlarm.GetId(). Я экспортнул алармы в .csv и там их порядок совпадает с айдишниками, которые возвращает метод, но никак не совпадает с айди из настроек группы алармов.

Cs-Cs
16.12.2020, 01:36
Я это не тестил, но там же есть GetID, а есть GetInternalID - может быть как раз это InternalID и будет.
Ща... тестану =)) У меня CodeSys на втором компе, и я сегодня для этой темы его то включаю, то выключаю постоянно =))

Так, что накопал (почитай прям в библиотеке описание GetID/GetInternalID):
1. GeID даёт некий порядковый номер из списка. Хер какой =)
2. GetInternalID даёт вроде то, что мы ищем - ID из списка тревог, который мы задаём.
Проверил, вроде так. В брейкпоинте посмотрел на одну из тревог, и потом сравнил с тем, что в списке: 52502 52503
3. ВООБЩЕ, КСТАТИ, мы оба идиоты! Можно же ВООБЩЕ КРУТО СДЕЛАТЬ! Потому что ещё же у каждый тревоги есть два поля для LATCH-переменных. И их тоже можно получать через GetLatchVar1Value()/GetLatchVar2Value() - то есть можно попробовать обмануть систему так чтобы вписать в эти поля нужные числа и в Execute ловить по схеме "если GetLatchVar2Value() > 0" - то ставим бит с номером, который в LATCH2 записан.

В общем, поизучай этот itfAlarm как следует!

borgivan
16.12.2020, 01:47
Я тоже думал так сначала, но не прокатило. Я уже не знаю как, похоже из космоса высосал ссылку на какую-то страницу в интернете, и там нашел, как это делается:
52504
А теперь ВНИМАНИЕ! менеджер библиотек:
52505
Незадокументированный метод! :)

Cs-Cs
16.12.2020, 01:56
Аааа так мы про разное же? Ты тащишь ID группы, а тебе про ID тревоги говорил )
Ну, уже разобрались! Ты всё-таки саму эту библиотеку тревог в менеджере библиотек поизучай - там куча интерфейсов под все части Alarm Manager есть, и там ещё куча фич есть!

borgivan
16.12.2020, 02:07
То, что я написал, возвращает индекс из окна настроек тревог, лол :) InternalId ни разу не соответствует, вот прям отвечаю, видимо айди тревог завязано на последовательности их заведения в менеджер. А чтобы получить правильный айдишник, который мы видим в окне что ты прислал, как раз и получается при вызове метода на IAlarmGroup с параметром, получаемым из IAlarm.GetId().

https://faq.codesys.com/display/CDSFAQ/Reading+the+Alarm+ID

В этот айди в окне настройки алармов можно вводить строковые айдишники, так что в моем случае приведение к UINT сработало по чистой сслучайности :)))))

П.С. Пристрелите меня, верните мне TiaPortal!

Евгений Кислов
16.12.2020, 09:21
Если кто-то может в виде ТЗ сформулировать, чего ему не хватает при работе с тревогами (с примерами, как это будет использоваться и описанием, как это должно быть реализовано) - я могу переслать пожелания разработчикам CODESYS.

Cs-Cs
17.12.2020, 00:35
Евгений Кислов Да вроде всё норм! Ну очистку истории тревог пусть сделают. Программную.

borgivan А я как раз в ID вот и плаваю вовсю, и ни разу их не получал =))

d_leushev
22.09.2023, 13:39
Подскажите пожалуйста, а вы знаете как получить значение Latch переменной используя метод GetLatchVar1Value.? Данный метод возвращает значение с типом ITypedValue, а как из этого типа получить значение в справке не нашел.

Евгений Кислов
22.09.2023, 13:53
Подскажите пожалуйста, а вы знаете как получить значение Latch переменной используя метод GetLatchVar1Value.? Данный метод возвращает значение с типом ITypedValue, а как из этого типа получить значение в справке не нашел.

Метод GetValue возвращает указатель на значение. Тип значения вы должны знать, так как сами настраиваете конфигурацию тревог.

70397

d_leushev
22.09.2023, 14:12
У меня переменна типа BOOl. Написал такой вариант, но не работает. 70399

Евгений Кислов
22.09.2023, 14:13
У меня переменна типа BOOl. Написал такой вариант, но не работает. 70399

Как вы это определяете?
Как получаете доступ к bVar за пределами метода?

d_leushev
22.09.2023, 14:17
Так, понял что указатель можно изменить на BOOl. В такой конфигурации работает. Проверяю через точку останова
70400

d_leushev
22.09.2023, 14:25
Евгений, пока вы на связи, может подскажите сразу.) Есть сигналы в одном классе, но с разной конфигурацией: с подтверждением и без подтверждения сигнала. Конфигурация выбирается оператором. Соответственно, в журнале нужно отображать только активные сигналы и те, которые нужно квитировать. В Latch переменной присваиваю значение конфигурации сигнала(с подтверждением/без подтверждения). По деактивации сигнала, проверять, нужно ли сигнал подтверждать, и если нет, то квитировать его. С вашей помощью теперь могу проверять по Latch переменной конфигурации сигнала., можно ли из кода программы квитировать сигнал.?

UPD: Реализовал

Евгений Кислов
22.09.2023, 18:12
можно ли из кода программы квитировать сигнал.?

UPD: Реализовал


На всякий случай для будущих читателей этой темы:
https://content.helpme-codesys.com/en/libs/AlarmManager/Current/Interfaces/IAlarmHandler.html