тогда так и делайте, считайте импульсы (так понимаю счетчик вычитываете ?). Если через определенное время вы видите лог 1, значит кнопку держите и тут считайте время.
тогда так и делайте, считайте импульсы (так понимаю счетчик вычитываете ?). Если через определенное время вы видите лог 1, значит кнопку держите и тут считайте время.
Так... а как в третьем CodeSys задержку на такт сделать? У меня ж не OWL сейчас.
F_TRIG, что ли, применить?
UPD: Не, не заработало.
melky Ага, счётчик. И тоже дико туплю: так я ж по нему могу короткие нажатия поймать... а длинные ловлю по TON.
Но они всё равно между собой дерутся и не блокируют друг друга.
UPD: А, не! Не время счётчиком, а из модуля IO (Mx110) беру счётчик срабатываний входа и по нему смотрю, было ли одинарное нажатие или нет, вот так:
Это я просто ловлю щелчки с модуля IO. Ща с этим вопросов нет - у меня затуп в том, как их взаимоисключить.Код://Считаем разницу показаний счётчика импульсов на входе модуля IO. Она всегда считается iPulseDiff := ABS(InPulses - iPrevPulses); //Считаем по модулю, так как счётчик может переполниться //Смотрим, что нам дали по разнице показаний и решаем, какие нажатия надо выдавать на выход //Последовательность проверки очень важна для того, чтобы не путать двойные и одинарные нажатия IF (iPulseDiff > 1) THEN //Больше одного - значит два нажатия было bSingle := FALSE; bDouble := TRUE; ELSIF (iPulseDiff = 1) AND (NOT tmDoubleDetect.Q) THEN //Ровно одно нажатие bSingle := TRUE; bDouble := FALSE; ELSE //Не было нажатий bSingle := FALSE; bDouble := FALSE; END_IF //Если мы нашли одинарный щелчок, то стартуем таймер задержки, чтобы поймать двойной //Ловля двойного щелчка означает то, что на некоторое время (пока работает таймер) мы перестаём //обновлять дельту числа нажатий, давая возможность блоку подсчитать другие нажатия tmDoubleDetect(IN:= bSingle, PT:= VarsRetain.Sys_BtnDBClickDly);
Я ещё раз прошу не смеяться: у меня за три дня поиска решения мозг замылился, и я в полном ступоре даже от очевидных вещей.
Последний раз редактировалось Cs-Cs; 12.12.2020 в 00:09.
krollcbas Ах ты ж чёрт!! Конечный автомат с состояниями!
Вот про это я и не думал! Ловил всё на задержках и IFах, пытаясь ими состояния заблочить!
Ща попробую этот код!
krollcbas Выражаю огромную благодарность за идею и код!!
Оно заработало!! И принцип конечного автомата мне ясен! Большое тебе спасибо! Я возьму этот код за основу, за завтра попробую наваять свой код так, чтобы он одинарные ловил и по изменению числа счётчика импульсов модуля IO, и твоим способом. И попробую это закрутить в конечный автомат.
Если всё заведётся - то выложу сюда код!
Cs-Cs так как модуль у вас удаленный (период опроса и время опроса влияет), то определение по счетчику коротких, а лог 1 с канала для проверки удержания.
Но все равно это все не гуд, как реагировать на то, что был импульс на счетчике и вы опять выжидаете время для проверки держится кнопка или нет ?
лично мне это время всегда было критично. я нажал клавишу и пошел, свет должен включиться СРАЗУ, а тут ПЛК из-за периодов опроса в 100мс проверяет еще, а не держу ли я кнопку дальше? Вот я о чем говорю и не важно как вы это реализуете в коде.
Но это мой бзик. Вот krollcbas-а и его клиентов не бесит, что свет от HMI или кнопки включается через 200-300 мс, а меня лично такое поведение бесит
был опыт с Carel pcO3 у которого фильтрация по входам 320 мс 320 Карл! и не отключаемые и нажатие на кнопку щита как мы привыкли не приводило ровным счетом ни к чему![]()
melky Можно (нужно) на "ты": это ж интернет всё-таки.
Ты прав во всём. И я так же злюсь на тормоза всего и вся. И если просто обсуждать кнопки, то у себя на блоге я даже комментаторов банил и посылал жёстко, когда они говорили что хотят делать реакцию на кнопку по её отпусканию, а не по нажатию.
Модуль не удалённый, а в щите стоит (или я не про то?). Просто CodeSys v3 сама по себе тормознее, чем CodeSys v2. У меня есть большой и дальний проект - потыкать логическим анализатором в них и посмотреть разницу. Вот штатный планировщик CodeSys v3 тупенький, и очень мутный. OCL даёт чуть более быструю и стабильную работу.
СПКшки я выбрал из-за того, что там единая среда разработки и единый файл проекта. Один, чёрт побери, файл. И даже архив проекта можно создавать со всеми либами. И отладка удобная, и разные языки программирования, и визуализации удобно делать (не надо для Web где-то отдельно ковырять другую программу, не надо для панели оператора делать отдельный проект). Вот из-за этих удобств я за него держусь и выжимаю оттуда максимум.
Про кнопки. У меня есть написанный блок, который определяет короткие нажатия кнопок по дельте счётчиков импульсов модуля IO. Вот с ним проблем нет. Я ж барабанщик ещё, руки у меня быстрые. Вот этот блок ловит очень быстрое нажатие на кнопку. Быстрота реакции блока зависит только от времени опроса IO и задачи, в которой он крутится.
Про диммер. В диммере частный случай (с которым я и затупил): он МОЖЕТ и даже ДОЛЖЕН быть тормозной, потому что я не представляю как по другому понять, что от нас хочет человек, жмущий на кнопку: то ли яркость подрегулировать, то ли включить-выключить. Тут пусть будут задержки - плевать на них.
У меня с 2010 года стоит диммер от Шнайдер Unica, обычный, в подрозетник. Там тоже есть задержка его работы по быстрому нажатию. Видать, алгоритмы похожие.
Так как у krollcbas я увидел то, что все вовсю юзают конечный автомат (я на микроконтроллерах его юзал, а в ПЛК не догадался), то я попробую закрутить на конечном автомате отлов быстрого нажатия кнопки по счётчику импульсов модуля IO, а длинное - способом krollcbas или по TON, и посмотрю что получится.
Если удастся сделать отлов быстрого нажатия на включение-включение диммера - то будет круто. А подержать кнопку 500 мсек, чтобы диммер начал крутить яркость - это пусть будет нормальным. Тем более что все эти задержки я выношу в проекте в константы, и их можно подстроить. Можно даже на экране в настройки вытащить.
В общем, в моей практике диммер - это частный случай.
Вот что лично меня бесит - так это выдача наружу мигалок! У меня во всех проектах вовсю используется мигание подсветками кнопок, чтобы показать специальные режимы работы вентиляторов, мастер-кнопок, кнопок управления тёплыми полами. Подсветка от такой кнопки выводится на отдельный выход, и ПЛК ею рулит по нужной логике.
Например, я под один проект нафигачил классное управление тёплыми полами (электрическими). На стене ставится только кнопка с подсветкой. Температура пола настраивается через UI на СПК (по опыту на своих домашних полах я её редко меняю). На кнопку навешано пока так:
* Одинарное нажатие включает или выключает пол
* Подсветка не горит, если пол выключен и горит, если пол включен
* Подсветка мигает, если пол включен и включен его нагреватель
Это офигенски прям классная обратная связзь.
Так вот из-за опроса модулей IO обычные BLINK ведут себя хрен как! И подсветка может мигать не меандром, а быстро мигать - это вообще ужасно.
Я всё хочу попробовать побаловаться штатным ШИМом на модулях IO, но меня останавливает то, что на некоторые кнопки мне надо менять скорость миганий, а у модулей вроде как постоянно записывать период ШИМ в них плохо. Правда там есть защита памяти от записи и, если это означает то, что в модуль можно писать что попало, но он не будет это сохранять - то в каком-то из проектов я потом это попробую. Пусть модуль аппаратно мигает сам.
==========
Всё! Сегодня под ночь буду кодить и смотреть, что получается.
[QUOTE=Cs-Cs;345164]Так... а как в третьем CodeSys задержку на такт сделать? У меня ж не OWL сейчас.
F_TRIG, что ли, применить?
UPD: Не, не заработало.
[/CODE]
Элементарно -
электронщик до мозга костей и не только
rovki Нет, это уже как раз сложно и зависимо от времени, а не от цикла задачи.
А речь же шла в задержке на один цикл именно задачи. То есть я к тому, что задача в ПЛК может протупить так, что 0,011 секунды уже пройдёт. И чего тогда будет?
Я попробую докодить тот конечный автомат. Мне на конечном автомате даже больше нравится - это вообще в принципе исключит все глюки.
Да там TOF заменяет задержку на один цикл , время ставьте хоть 0,1 сек . Это просто блокировка ...Работает 150% , не зависит не от чего ..Не важна задержка - хоть в одном цикле ,хоть в нескольких .Главное что бы блокировка ушла позже чем сигнал с F- триггера .Ни какого шаманства ,чистая электроника .
электронщик до мозга костей и не только