Просмотр полной версии : Установка бита/переменной при квитировании/сбросе аларма
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 уже читал. Идея понятна. Даже в принципе понятно, как через неё решить. Просто это всё равно будет в коде разнесено, а значит время/возможность человеческого фактора: там аларм добавил, тут пропустил, ищи-свищи потом :)
А про какую библиотеку говорят? Про штатную или какую-то другую?
Евгений Кислов Я тебе слал свой проект с этим кодом и очередью СМСок =)
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, дорогой, ДАЙ Я ТЕБЯ РАСЦЕЛУЮ! Когда увидел, что кроме переменной увидел возможность фб прицепить, сразу мысль пришла о том, как это было бы реализовано в С#, а потом вспомнил, что в сисе тоже интерфейсы есть, но инфы не надыбал про это )))))
Целуй! Для меня это было такое же адское открытие! Я сначала думал - юзать ли тревоги или нет. Думал, что это какая-то закрытая фигня, из которой ничего не достать. А когда попробовал с этим интерфейсом и FB - то меня адски втащило!
Сам CodeSys меня тоже тащит вовсю, потому что тут есть и массивы, и указатели, и массивы указателей - и вообще всё на мой любимый СИшник похоже =))
А ID нужных тебе тревог ты можешь в проекте в какой-нить массив констант воткнуть, чтобы он лежал где-то не посередине кода, а в удобном месте и тоже легко конфигурился. Жжом!
borgivan
16.12.2020, 00:45
Вот только в упор не понял, как соотносятся Id из AlarGroup и я IAlarm.GetId(). Я экспортнул алармы в .csv и там их порядок совпадает с айдишниками, которые возвращает метод, но никак не совпадает с айди из настроек группы алармов.
Я это не тестил, но там же есть 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
Незадокументированный метод! :)
Аааа так мы про разное же? Ты тащишь 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.
Евгений Кислов Да вроде всё норм! Ну очистку истории тревог пусть сделают. Программную.
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
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot