84. Создание тревог для однотипных объектов (RaiseEvent)

Поделиться
HTML-код
  • Опубликовано: 15 ноя 2024

Комментарии • 30

  • @kattysakh
    @kattysakh 5 месяцев назад +1

    Евгений, добрый день! Подписана на вас с тех самых пор, как пару лет назад начала свой путь в cds 3.5. Большое вам спасибо за ваши видео и за ответы на форуме! Вы спасли невообразимое количество моих нервных клеток и времени, что ушло бы на решение большинства связанных с cds вопросов :D Ваш вклад в сообщество неоценим

    • @CodesysOneLove
      @CodesysOneLove  5 месяцев назад +1

      Спасибо за добрые слова.

    • @kattysakh
      @kattysakh 5 месяцев назад

      @@CodesysOneLove Спасибо за то, что вы делаете :) Хотела бы еще уточнить по теме видео. Можно ли вытаскивать в события тексты из перечислений (например, если у меня коды ошибок хранятся в перечислении (enum) с поддержкой текстов) или нужно создавать отдельный список текстов?

    • @CodesysOneLove
      @CodesysOneLove  5 месяцев назад

      @@kattysakh Можно. В этой статье объясняется, как считать информацию из списка текстов в коде программы:
      ftp.owen.ru/CoDeSys3/98_Books/CodesysTextLists.pdf
      Для перечислений с поддержкой списка текстов такой подход тоже подойдет.

  • @Alexandr_Nazarov
    @Alexandr_Nazarov 3 месяца назад

    Хорошо учиться на примерах, а на качественных сам Бог велел!

  • @megachel70
    @megachel70 8 месяцев назад +1

    Спасибо. Как раз столкнулся с проблемой, как прописать для 18 объектов список тревог, в каждом по 5 аварий.

  • @darkwarior174
    @darkwarior174 Год назад +1

    Вообще - повторять код более двух раз - это моветон и обезьянья работа. Такой код очень сложно читать.
    Но по тревогам - согласен, если объектов штук 5, то можно не париться по поводу повторений, а вот если бы я открыл код и увидел там тревогу "ошибка модуля Х" 500 раз, то я бы, наверное, "застрелил" такого программиста на месте😅
    Некоторые ещё любят в одном ф-блоке, например "Насосы", делать 50 нетворков с одинаковыми входными и выходными параметрами, и разными только номерами насосов) Таких вообще очень "люблю"❤

  • @marsNearby
    @marsNearby Месяц назад

    Лайфхак, как открывать csv без импорта в Excel. Нужно первой строчкой в csv файле указать строку sep=; (где ; - это разделитель в csv, бывает запятая, бывает точка с запятой)

  • @Иван-ш5т3ж
    @Иван-ш5т3ж Год назад +1

    Добрый день. Про Узел OwenRTC, а именно привязку "событий/действий" к праздничному дню календаря и добавления/удаления дней через WEB-панель можете подробнее рассказать?

    • @CodesysOneLove
      @CodesysOneLove  Год назад

      Добрый день. Это отличная тема, но так просто рассказать о ней не получится. Я надеюсь, в будущем мы разработаем специальный ФБ и фрейм для работы с суточным расписанием - вот тогда я обязательно сделаю об этом видео.

  • @sergeybugaev7559
    @sergeybugaev7559 Год назад +1

    Добрый день! Спасибо за очень интересный и информативный канал. Очень много полезного и подаётся наглядно и понятно.
    Вопрос по теме ролика - а можно ли как-то параметризировать вызов g_AlarmHandler.RaiseEvent и g_AlarmHandler.AcknowledgeOneOfGroup? В смысле, подавать ему на вход не выбранные по F2 ID группы (в принципе, не обязательно) и ID конкретной тревоги, а в цикле, в зависимости он параметра? У меня несколько источников и они генерируют несколько видов тревог. Хотелось бы и тут красоту навести, а не по CASE вызывать одинаковые строки, отличающиеся только одной цифрой в ID. И ещё вопрос для понимания - почему подчеркивается, g_AlarmHandler нужно из основного кода вызывать? Почему нельзя его вызвать прямо внутри ФБ по факту обнаружения условия возникновения или снятия тревоги?

    • @CodesysOneLove
      @CodesysOneLove  Год назад +1

      Добрый день. Начну со второго вопроса - не помню, чтобы я прям это отдельно подчеркивал, но вообще это кажется разумным подходом. Внести вызов RaiseEvent внутрь ФБ, конечно, можно. Но, например, если подобные ФБ будут вызываться в контексте разных задач, то может произойти одновременный вызов метода из разных потоков - и тут сложно заранее предположить, не приведет ли это к каким-то проблемам. Например, часть функций визуализации не являются потоко-безопасными и их вызов в рамках разных задач явным образом запрещается в документации. Документации на библиотеку AlarmManager довольно мало - так что в ней много пятен.
      С другой стороны, при разумной организации проекта вполне можно вызывать g_AlarmHandler внутри нужных ФБ
      По первому вопросу - да, можно передавать в качестве аргументов методов значения типа UINT. В принципе, выбранные по F2 ID - это константы, и их значения известны еще на этапе создания проекта.

    • @sergeybugaev7559
      @sergeybugaev7559 Год назад

      @@CodesysOneLove Спасибо за оперативный ответ. Теперь другая проблема вылезла. Похоже, тревоги с одним ID не стекируются. У меня метод подтверждения ACK, и получается что если на двух устройствах прошла одна и та же тревога (скажем, отключили питание) - то записывается только одна тревога, от одного устройства, которое первым отреагировало, от второго новая тревога не взводится. Гасится она тоже от любого устройства, которое первым обнаружило, что проблема решилась. Плодить кучу групп тревог по количеству контролируемых устройств не хочется, иначе придём к тому, от чего плясали в начале ролика. Есть красивое решение? Или это только для информационных сообщений (REP) работать будет корректно?

    • @CodesysOneLove
      @CodesysOneLove  Год назад

      @@sergeybugaev7559 да, только для REP (в ролике я некорректно упомянул ACK).

    • @sergeybugaev7559
      @sergeybugaev7559 Год назад

      @@CodesysOneLove Печально, конечно. Тогда поставим задачу по-другому: есть ли способ "погасить" взведённое g_AlarmHandler.RaiseEvent событие при методе REP? При "обычной" настройке для REP оно записывает и выводит в таблицу тревог время начала и конца тревоги (timestamp active и timestamp inactive), для ACK время начала тревоги и время подтверждения(timestamp active и timestamp Acknowledge). При способе, описанном в ролике для REP отловить timestamp inactive не выходит, не нахожу команду для этого. g_AlarmHandler.Acknowledge* работает только с ACK, но у него проблема, описанная выше.

    • @CodesysOneLove
      @CodesysOneLove  Год назад

      @@sergeybugaev7559 Насколько я знаю - способа деактировать из кода тревогу, активированную с помощью RaiseEvent, не существует.

  • @АлександрКруглов-з8щ

    Можно ли вызывать RaiseObject изнутри самого блока SomeObject?

  • @NoName-vd1cs
    @NoName-vd1cs Год назад

    Жаль что сообщение о тревоге нельзя отправить в самом "RaiseEvent"

  • @kharit74
    @kharit74 6 месяцев назад

    Столкнулся с проблемой при реализации. Похоже LATCH переменная имеет ограничение по размеру строки в менеджере тревог, в связи с чем в таблице тревог отображается не весь текст аварии триггерной переменной. Как можно обойти это ограничение или увеличить размер LATCH переменной? Спасибо!

    • @CodesysOneLove
      @CodesysOneLove  6 месяцев назад

      Добрый день. В библиотеке AlarmManager есть список параметров AlarmParams, а в нем - параметр PLACEHOLDER_VALUE_LENGTH. Вам нужно изменить его значение (это делается прямо в менеджере библиотек). Описание здесь: content.helpme-codesys.com/en/libs/AlarmManager/Current/Globals/AlarmParams.html

    • @kharit74
      @kharit74 6 месяцев назад

      Все получилось! Чтобы работала, пришлось в явном виде указать размер триггерной переменной.

  • @ОООСТС-к2с
    @ОООСТС-к2с 5 месяцев назад

    Евгений, каким образом можно из программы сбросить историю. Не могу сбросить по коду из документации по codesys 3.5

    • @CodesysOneLove
      @CodesysOneLove  5 месяцев назад

      Добрый день. Код из документации рабочий. Можете связаться со мной по почте (e.kislov@owen.ru) и показать по AnyDesk, что у вас происходит.

  • @viktorcooper5675
    @viktorcooper5675 2 года назад

    Насколько я понял событие не совсем то что тревога (ошибка). То есть тревога возникла и "висит" некоторое время потом может быть и сама исчезнет (существует пока какой либо бит = true) соответственно это и будет видно в окне тревог. то есть если ошибка (тревога) есть то сообщение показывается. Событие в данном случае инициализируетия фронтом тревоги. то есть мы увидим в окне тревог время возникновения ошибки, а когда эта ошибка исчезнет? Это получается второе событие по второму фронту и новое сообщение типа "ошибки больше нет". так получается? Не совсем удобно. Я могу и ошибаться сам код не пробовал.

    • @CodesysOneLove
      @CodesysOneLove  2 года назад

      В таблице тревог можно отображать и время исчезновения тревоги - достаточно добавить соответствующий столбец. Если нужно, чтобы при исчезновении тревоги появлялось отдельное сообщение - то придется внести незначительные изменения в код примера.

    • @viktorcooper5675
      @viktorcooper5675 2 года назад

      @@CodesysOneLove , тревоги - да. тут же речь о событиях (о попытке заместить тревогу событием) и сообщение о событии в окне формируется передним фронтом тревоги.

    • @CodesysOneLove
      @CodesysOneLove  2 года назад

      @@viktorcooper5675 в моем понимании, тревоги и события - это условные названия крайне схожих вещей. Тревога - это признак нештатной ситуации, событие - штатной. Принципы формирования тревог и событий (по фронту или как-то еще) могут быть разными. В общем, я не очень понял, вашу мысль, извините. =(

    • @viktorcooper5675
      @viktorcooper5675 2 года назад

      @@CodesysOneLove да это я плохо изъясняюсь ). вот у нас аварийная кнопка приходит на дискретный вход. я привязываю к нему тревогу с сообщением "нажата аварийная кнопка". нажимаю и в окне тревог вижу сообщение. оно висит пока кнопка нажата. кнопка отжимается - сообщение пропадает. если есть соответствующие поля то в истории в одной строке сообщения об этой тревоге видно два события когда кнопку нажали и когда отжали. а насколько я понял (может быть и не правильно) по вашей методе в окне тревог появится строка "нажата аварийная кнопка" и время возникновения этого события. и если дополнить код - рядом второе сообщение (вполне можно привязать другое, например "отжата аварийная кнопка" и время когда это произошло. соответственно глядя на окно тревог нельзя понять нажата сейчас эта кнопка или нет. то есть висит тревога или ее уже нет. нужно скролить и искать "пары" вот нажали, а вот отжали - значит кнопка не нажата. я так понял )

    • @CodesysOneLove
      @CodesysOneLove  2 года назад

      @@viktorcooper5675 теперь понял. В этой ситуации, по-моему, проще воспользоваться другим вариантом, который я описывал - добавить в таблицу столбец с типом "Временная отметка неактивна" (перевод так себе, в реальности это означает "метка времени деактивации"). То есть в таблице появится строка "нажата аварийная кнопка", время возникновения и время деактивации (отжатия). Пока кнопка не будет отжата - в ячейке времени деактивации будет пустая строка, и визуально очень легко понять, что событие сейчас активно. И в коде для этого вообще не придется ничего менять.