Евгений, добрый день! Подписана на вас с тех самых пор, как пару лет назад начала свой путь в cds 3.5. Большое вам спасибо за ваши видео и за ответы на форуме! Вы спасли невообразимое количество моих нервных клеток и времени, что ушло бы на решение большинства связанных с cds вопросов :D Ваш вклад в сообщество неоценим
@@CodesysOneLove Спасибо за то, что вы делаете :) Хотела бы еще уточнить по теме видео. Можно ли вытаскивать в события тексты из перечислений (например, если у меня коды ошибок хранятся в перечислении (enum) с поддержкой текстов) или нужно создавать отдельный список текстов?
@@kattysakh Можно. В этой статье объясняется, как считать информацию из списка текстов в коде программы: ftp.owen.ru/CoDeSys3/98_Books/CodesysTextLists.pdf Для перечислений с поддержкой списка текстов такой подход тоже подойдет.
Вообще - повторять код более двух раз - это моветон и обезьянья работа. Такой код очень сложно читать. Но по тревогам - согласен, если объектов штук 5, то можно не париться по поводу повторений, а вот если бы я открыл код и увидел там тревогу "ошибка модуля Х" 500 раз, то я бы, наверное, "застрелил" такого программиста на месте😅 Некоторые ещё любят в одном ф-блоке, например "Насосы", делать 50 нетворков с одинаковыми входными и выходными параметрами, и разными только номерами насосов) Таких вообще очень "люблю"❤
Лайфхак, как открывать csv без импорта в Excel. Нужно первой строчкой в csv файле указать строку sep=; (где ; - это разделитель в csv, бывает запятая, бывает точка с запятой)
Добрый день. Про Узел OwenRTC, а именно привязку "событий/действий" к праздничному дню календаря и добавления/удаления дней через WEB-панель можете подробнее рассказать?
Добрый день. Это отличная тема, но так просто рассказать о ней не получится. Я надеюсь, в будущем мы разработаем специальный ФБ и фрейм для работы с суточным расписанием - вот тогда я обязательно сделаю об этом видео.
Добрый день! Спасибо за очень интересный и информативный канал. Очень много полезного и подаётся наглядно и понятно. Вопрос по теме ролика - а можно ли как-то параметризировать вызов g_AlarmHandler.RaiseEvent и g_AlarmHandler.AcknowledgeOneOfGroup? В смысле, подавать ему на вход не выбранные по F2 ID группы (в принципе, не обязательно) и ID конкретной тревоги, а в цикле, в зависимости он параметра? У меня несколько источников и они генерируют несколько видов тревог. Хотелось бы и тут красоту навести, а не по CASE вызывать одинаковые строки, отличающиеся только одной цифрой в ID. И ещё вопрос для понимания - почему подчеркивается, g_AlarmHandler нужно из основного кода вызывать? Почему нельзя его вызвать прямо внутри ФБ по факту обнаружения условия возникновения или снятия тревоги?
Добрый день. Начну со второго вопроса - не помню, чтобы я прям это отдельно подчеркивал, но вообще это кажется разумным подходом. Внести вызов RaiseEvent внутрь ФБ, конечно, можно. Но, например, если подобные ФБ будут вызываться в контексте разных задач, то может произойти одновременный вызов метода из разных потоков - и тут сложно заранее предположить, не приведет ли это к каким-то проблемам. Например, часть функций визуализации не являются потоко-безопасными и их вызов в рамках разных задач явным образом запрещается в документации. Документации на библиотеку AlarmManager довольно мало - так что в ней много пятен. С другой стороны, при разумной организации проекта вполне можно вызывать g_AlarmHandler внутри нужных ФБ По первому вопросу - да, можно передавать в качестве аргументов методов значения типа UINT. В принципе, выбранные по F2 ID - это константы, и их значения известны еще на этапе создания проекта.
@@CodesysOneLove Спасибо за оперативный ответ. Теперь другая проблема вылезла. Похоже, тревоги с одним ID не стекируются. У меня метод подтверждения ACK, и получается что если на двух устройствах прошла одна и та же тревога (скажем, отключили питание) - то записывается только одна тревога, от одного устройства, которое первым отреагировало, от второго новая тревога не взводится. Гасится она тоже от любого устройства, которое первым обнаружило, что проблема решилась. Плодить кучу групп тревог по количеству контролируемых устройств не хочется, иначе придём к тому, от чего плясали в начале ролика. Есть красивое решение? Или это только для информационных сообщений (REP) работать будет корректно?
@@CodesysOneLove Печально, конечно. Тогда поставим задачу по-другому: есть ли способ "погасить" взведённое g_AlarmHandler.RaiseEvent событие при методе REP? При "обычной" настройке для REP оно записывает и выводит в таблицу тревог время начала и конца тревоги (timestamp active и timestamp inactive), для ACK время начала тревоги и время подтверждения(timestamp active и timestamp Acknowledge). При способе, описанном в ролике для REP отловить timestamp inactive не выходит, не нахожу команду для этого. g_AlarmHandler.Acknowledge* работает только с ACK, но у него проблема, описанная выше.
Столкнулся с проблемой при реализации. Похоже LATCH переменная имеет ограничение по размеру строки в менеджере тревог, в связи с чем в таблице тревог отображается не весь текст аварии триггерной переменной. Как можно обойти это ограничение или увеличить размер LATCH переменной? Спасибо!
Добрый день. В библиотеке AlarmManager есть список параметров AlarmParams, а в нем - параметр PLACEHOLDER_VALUE_LENGTH. Вам нужно изменить его значение (это делается прямо в менеджере библиотек). Описание здесь: content.helpme-codesys.com/en/libs/AlarmManager/Current/Globals/AlarmParams.html
Насколько я понял событие не совсем то что тревога (ошибка). То есть тревога возникла и "висит" некоторое время потом может быть и сама исчезнет (существует пока какой либо бит = true) соответственно это и будет видно в окне тревог. то есть если ошибка (тревога) есть то сообщение показывается. Событие в данном случае инициализируетия фронтом тревоги. то есть мы увидим в окне тревог время возникновения ошибки, а когда эта ошибка исчезнет? Это получается второе событие по второму фронту и новое сообщение типа "ошибки больше нет". так получается? Не совсем удобно. Я могу и ошибаться сам код не пробовал.
В таблице тревог можно отображать и время исчезновения тревоги - достаточно добавить соответствующий столбец. Если нужно, чтобы при исчезновении тревоги появлялось отдельное сообщение - то придется внести незначительные изменения в код примера.
@@CodesysOneLove , тревоги - да. тут же речь о событиях (о попытке заместить тревогу событием) и сообщение о событии в окне формируется передним фронтом тревоги.
@@viktorcooper5675 в моем понимании, тревоги и события - это условные названия крайне схожих вещей. Тревога - это признак нештатной ситуации, событие - штатной. Принципы формирования тревог и событий (по фронту или как-то еще) могут быть разными. В общем, я не очень понял, вашу мысль, извините. =(
@@CodesysOneLove да это я плохо изъясняюсь ). вот у нас аварийная кнопка приходит на дискретный вход. я привязываю к нему тревогу с сообщением "нажата аварийная кнопка". нажимаю и в окне тревог вижу сообщение. оно висит пока кнопка нажата. кнопка отжимается - сообщение пропадает. если есть соответствующие поля то в истории в одной строке сообщения об этой тревоге видно два события когда кнопку нажали и когда отжали. а насколько я понял (может быть и не правильно) по вашей методе в окне тревог появится строка "нажата аварийная кнопка" и время возникновения этого события. и если дополнить код - рядом второе сообщение (вполне можно привязать другое, например "отжата аварийная кнопка" и время когда это произошло. соответственно глядя на окно тревог нельзя понять нажата сейчас эта кнопка или нет. то есть висит тревога или ее уже нет. нужно скролить и искать "пары" вот нажали, а вот отжали - значит кнопка не нажата. я так понял )
@@viktorcooper5675 теперь понял. В этой ситуации, по-моему, проще воспользоваться другим вариантом, который я описывал - добавить в таблицу столбец с типом "Временная отметка неактивна" (перевод так себе, в реальности это означает "метка времени деактивации"). То есть в таблице появится строка "нажата аварийная кнопка", время возникновения и время деактивации (отжатия). Пока кнопка не будет отжата - в ячейке времени деактивации будет пустая строка, и визуально очень легко понять, что событие сейчас активно. И в коде для этого вообще не придется ничего менять.
Евгений, добрый день! Подписана на вас с тех самых пор, как пару лет назад начала свой путь в cds 3.5. Большое вам спасибо за ваши видео и за ответы на форуме! Вы спасли невообразимое количество моих нервных клеток и времени, что ушло бы на решение большинства связанных с cds вопросов :D Ваш вклад в сообщество неоценим
Спасибо за добрые слова.
@@CodesysOneLove Спасибо за то, что вы делаете :) Хотела бы еще уточнить по теме видео. Можно ли вытаскивать в события тексты из перечислений (например, если у меня коды ошибок хранятся в перечислении (enum) с поддержкой текстов) или нужно создавать отдельный список текстов?
@@kattysakh Можно. В этой статье объясняется, как считать информацию из списка текстов в коде программы:
ftp.owen.ru/CoDeSys3/98_Books/CodesysTextLists.pdf
Для перечислений с поддержкой списка текстов такой подход тоже подойдет.
Хорошо учиться на примерах, а на качественных сам Бог велел!
Спасибо. Как раз столкнулся с проблемой, как прописать для 18 объектов список тревог, в каждом по 5 аварий.
Вообще - повторять код более двух раз - это моветон и обезьянья работа. Такой код очень сложно читать.
Но по тревогам - согласен, если объектов штук 5, то можно не париться по поводу повторений, а вот если бы я открыл код и увидел там тревогу "ошибка модуля Х" 500 раз, то я бы, наверное, "застрелил" такого программиста на месте😅
Некоторые ещё любят в одном ф-блоке, например "Насосы", делать 50 нетворков с одинаковыми входными и выходными параметрами, и разными только номерами насосов) Таких вообще очень "люблю"❤
Лайфхак, как открывать csv без импорта в Excel. Нужно первой строчкой в csv файле указать строку sep=; (где ; - это разделитель в csv, бывает запятая, бывает точка с запятой)
Добрый день. Про Узел OwenRTC, а именно привязку "событий/действий" к праздничному дню календаря и добавления/удаления дней через WEB-панель можете подробнее рассказать?
Добрый день. Это отличная тема, но так просто рассказать о ней не получится. Я надеюсь, в будущем мы разработаем специальный ФБ и фрейм для работы с суточным расписанием - вот тогда я обязательно сделаю об этом видео.
Добрый день! Спасибо за очень интересный и информативный канал. Очень много полезного и подаётся наглядно и понятно.
Вопрос по теме ролика - а можно ли как-то параметризировать вызов g_AlarmHandler.RaiseEvent и g_AlarmHandler.AcknowledgeOneOfGroup? В смысле, подавать ему на вход не выбранные по F2 ID группы (в принципе, не обязательно) и ID конкретной тревоги, а в цикле, в зависимости он параметра? У меня несколько источников и они генерируют несколько видов тревог. Хотелось бы и тут красоту навести, а не по CASE вызывать одинаковые строки, отличающиеся только одной цифрой в ID. И ещё вопрос для понимания - почему подчеркивается, g_AlarmHandler нужно из основного кода вызывать? Почему нельзя его вызвать прямо внутри ФБ по факту обнаружения условия возникновения или снятия тревоги?
Добрый день. Начну со второго вопроса - не помню, чтобы я прям это отдельно подчеркивал, но вообще это кажется разумным подходом. Внести вызов RaiseEvent внутрь ФБ, конечно, можно. Но, например, если подобные ФБ будут вызываться в контексте разных задач, то может произойти одновременный вызов метода из разных потоков - и тут сложно заранее предположить, не приведет ли это к каким-то проблемам. Например, часть функций визуализации не являются потоко-безопасными и их вызов в рамках разных задач явным образом запрещается в документации. Документации на библиотеку AlarmManager довольно мало - так что в ней много пятен.
С другой стороны, при разумной организации проекта вполне можно вызывать g_AlarmHandler внутри нужных ФБ
По первому вопросу - да, можно передавать в качестве аргументов методов значения типа UINT. В принципе, выбранные по F2 ID - это константы, и их значения известны еще на этапе создания проекта.
@@CodesysOneLove Спасибо за оперативный ответ. Теперь другая проблема вылезла. Похоже, тревоги с одним ID не стекируются. У меня метод подтверждения ACK, и получается что если на двух устройствах прошла одна и та же тревога (скажем, отключили питание) - то записывается только одна тревога, от одного устройства, которое первым отреагировало, от второго новая тревога не взводится. Гасится она тоже от любого устройства, которое первым обнаружило, что проблема решилась. Плодить кучу групп тревог по количеству контролируемых устройств не хочется, иначе придём к тому, от чего плясали в начале ролика. Есть красивое решение? Или это только для информационных сообщений (REP) работать будет корректно?
@@sergeybugaev7559 да, только для REP (в ролике я некорректно упомянул ACK).
@@CodesysOneLove Печально, конечно. Тогда поставим задачу по-другому: есть ли способ "погасить" взведённое g_AlarmHandler.RaiseEvent событие при методе REP? При "обычной" настройке для REP оно записывает и выводит в таблицу тревог время начала и конца тревоги (timestamp active и timestamp inactive), для ACK время начала тревоги и время подтверждения(timestamp active и timestamp Acknowledge). При способе, описанном в ролике для REP отловить timestamp inactive не выходит, не нахожу команду для этого. g_AlarmHandler.Acknowledge* работает только с ACK, но у него проблема, описанная выше.
@@sergeybugaev7559 Насколько я знаю - способа деактировать из кода тревогу, активированную с помощью RaiseEvent, не существует.
Можно ли вызывать RaiseObject изнутри самого блока SomeObject?
Да, можно.
Жаль что сообщение о тревоге нельзя отправить в самом "RaiseEvent"
Столкнулся с проблемой при реализации. Похоже LATCH переменная имеет ограничение по размеру строки в менеджере тревог, в связи с чем в таблице тревог отображается не весь текст аварии триггерной переменной. Как можно обойти это ограничение или увеличить размер LATCH переменной? Спасибо!
Добрый день. В библиотеке AlarmManager есть список параметров AlarmParams, а в нем - параметр PLACEHOLDER_VALUE_LENGTH. Вам нужно изменить его значение (это делается прямо в менеджере библиотек). Описание здесь: content.helpme-codesys.com/en/libs/AlarmManager/Current/Globals/AlarmParams.html
Все получилось! Чтобы работала, пришлось в явном виде указать размер триггерной переменной.
Евгений, каким образом можно из программы сбросить историю. Не могу сбросить по коду из документации по codesys 3.5
Добрый день. Код из документации рабочий. Можете связаться со мной по почте (e.kislov@owen.ru) и показать по AnyDesk, что у вас происходит.
Насколько я понял событие не совсем то что тревога (ошибка). То есть тревога возникла и "висит" некоторое время потом может быть и сама исчезнет (существует пока какой либо бит = true) соответственно это и будет видно в окне тревог. то есть если ошибка (тревога) есть то сообщение показывается. Событие в данном случае инициализируетия фронтом тревоги. то есть мы увидим в окне тревог время возникновения ошибки, а когда эта ошибка исчезнет? Это получается второе событие по второму фронту и новое сообщение типа "ошибки больше нет". так получается? Не совсем удобно. Я могу и ошибаться сам код не пробовал.
В таблице тревог можно отображать и время исчезновения тревоги - достаточно добавить соответствующий столбец. Если нужно, чтобы при исчезновении тревоги появлялось отдельное сообщение - то придется внести незначительные изменения в код примера.
@@CodesysOneLove , тревоги - да. тут же речь о событиях (о попытке заместить тревогу событием) и сообщение о событии в окне формируется передним фронтом тревоги.
@@viktorcooper5675 в моем понимании, тревоги и события - это условные названия крайне схожих вещей. Тревога - это признак нештатной ситуации, событие - штатной. Принципы формирования тревог и событий (по фронту или как-то еще) могут быть разными. В общем, я не очень понял, вашу мысль, извините. =(
@@CodesysOneLove да это я плохо изъясняюсь ). вот у нас аварийная кнопка приходит на дискретный вход. я привязываю к нему тревогу с сообщением "нажата аварийная кнопка". нажимаю и в окне тревог вижу сообщение. оно висит пока кнопка нажата. кнопка отжимается - сообщение пропадает. если есть соответствующие поля то в истории в одной строке сообщения об этой тревоге видно два события когда кнопку нажали и когда отжали. а насколько я понял (может быть и не правильно) по вашей методе в окне тревог появится строка "нажата аварийная кнопка" и время возникновения этого события. и если дополнить код - рядом второе сообщение (вполне можно привязать другое, например "отжата аварийная кнопка" и время когда это произошло. соответственно глядя на окно тревог нельзя понять нажата сейчас эта кнопка или нет. то есть висит тревога или ее уже нет. нужно скролить и искать "пары" вот нажали, а вот отжали - значит кнопка не нажата. я так понял )
@@viktorcooper5675 теперь понял. В этой ситуации, по-моему, проще воспользоваться другим вариантом, который я описывал - добавить в таблицу столбец с типом "Временная отметка неактивна" (перевод так себе, в реальности это означает "метка времени деактивации"). То есть в таблице появится строка "нажата аварийная кнопка", время возникновения и время деактивации (отжатия). Пока кнопка не будет отжата - в ячейке времени деактивации будет пустая строка, и визуально очень легко понять, что событие сейчас активно. И в коде для этого вообще не придется ничего менять.