Страница 2 из 13 ПерваяПервая 123412 ... ПоследняяПоследняя
Показано с 11 по 20 из 126

Тема: Логика: Распознать отдельно короткое и отдельно длинное нажатия (CodeSys v3)

  1. #11
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    тогда так и делайте, считайте импульсы (так понимаю счетчик вычитываете ?). Если через определенное время вы видите лог 1, значит кнопку держите и тут считайте время.

  2. #12
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,113

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    тогда так и делайте, считайте импульсы (так понимаю счетчик вычитываете ?). Если через определенное время вы видите лог 1, значит кнопку держите и тут считайте время.
    Зачем огород с счетчиком городить , когда таймер все это делает один
    электронщик до мозга костей и не только

  3. #13

    По умолчанию

    Так... а как в третьем CodeSys задержку на такт сделать? У меня ж не OWL сейчас.
    F_TRIG, что ли, применить?
    UPD: Не, не заработало.

    melky Ага, счётчик. И тоже дико туплю: так я ж по нему могу короткие нажатия поймать... а длинные ловлю по TON.
    Но они всё равно между собой дерутся и не блокируют друг друга.
    UPD: А, не! Не время счётчиком, а из модуля IO (Mx110) беру счётчик срабатываний входа и по нему смотрю, было ли одинарное нажатие или нет, вот так:
    Код:
    //Считаем разницу показаний счётчика импульсов на входе модуля 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);
    Это я просто ловлю щелчки с модуля IO. Ща с этим вопросов нет - у меня затуп в том, как их взаимоисключить.

    Я ещё раз прошу не смеяться: у меня за три дня поиска решения мозг замылился, и я в полном ступоре даже от очевидных вещей.
    Последний раз редактировалось Cs-Cs; 12.12.2020 в 00:09.

  4. #14

    По умолчанию

    krollcbas Ах ты ж чёрт!! Конечный автомат с состояниями!
    Вот про это я и не думал! Ловил всё на задержках и IFах, пытаясь ими состояния заблочить!

    Ща попробую этот код!

  5. #15

    По умолчанию

    krollcbas Выражаю огромную благодарность за идею и код!!
    Оно заработало!! И принцип конечного автомата мне ясен! Большое тебе спасибо! Я возьму этот код за основу, за завтра попробую наваять свой код так, чтобы он одинарные ловил и по изменению числа счётчика импульсов модуля IO, и твоим способом. И попробую это закрутить в конечный автомат.
    Если всё заведётся - то выложу сюда код!

  6. #16
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    10,583

    По умолчанию

    Cs-Cs так как модуль у вас удаленный (период опроса и время опроса влияет), то определение по счетчику коротких, а лог 1 с канала для проверки удержания.
    Но все равно это все не гуд, как реагировать на то, что был импульс на счетчике и вы опять выжидаете время для проверки держится кнопка или нет ?

    лично мне это время всегда было критично. я нажал клавишу и пошел, свет должен включиться СРАЗУ, а тут ПЛК из-за периодов опроса в 100мс проверяет еще, а не держу ли я кнопку дальше? Вот я о чем говорю и не важно как вы это реализуете в коде.
    Но это мой бзик. Вот krollcbas-а и его клиентов не бесит, что свет от HMI или кнопки включается через 200-300 мс, а меня лично такое поведение бесит

    был опыт с Carel pcO3 у которого фильтрация по входам 320 мс 320 Карл! и не отключаемые и нажатие на кнопку щита как мы привыкли не приводило ровным счетом ни к чему

  7. #17

    По умолчанию

    melky Можно (нужно) на "ты": это ж интернет всё-таки.
    Ты прав во всём. И я так же злюсь на тормоза всего и вся. И если просто обсуждать кнопки, то у себя на блоге я даже комментаторов банил и посылал жёстко, когда они говорили что хотят делать реакцию на кнопку по её отпусканию, а не по нажатию.
    Модуль не удалённый, а в щите стоит (или я не про то?). Просто CodeSys v3 сама по себе тормознее, чем CodeSys v2. У меня есть большой и дальний проект - потыкать логическим анализатором в них и посмотреть разницу. Вот штатный планировщик CodeSys v3 тупенький, и очень мутный. OCL даёт чуть более быструю и стабильную работу.
    СПКшки я выбрал из-за того, что там единая среда разработки и единый файл проекта. Один, чёрт побери, файл. И даже архив проекта можно создавать со всеми либами. И отладка удобная, и разные языки программирования, и визуализации удобно делать (не надо для Web где-то отдельно ковырять другую программу, не надо для панели оператора делать отдельный проект). Вот из-за этих удобств я за него держусь и выжимаю оттуда максимум.

    Про кнопки. У меня есть написанный блок, который определяет короткие нажатия кнопок по дельте счётчиков импульсов модуля IO. Вот с ним проблем нет. Я ж барабанщик ещё, руки у меня быстрые. Вот этот блок ловит очень быстрое нажатие на кнопку. Быстрота реакции блока зависит только от времени опроса IO и задачи, в которой он крутится.
    Про диммер. В диммере частный случай (с которым я и затупил): он МОЖЕТ и даже ДОЛЖЕН быть тормозной, потому что я не представляю как по другому понять, что от нас хочет человек, жмущий на кнопку: то ли яркость подрегулировать, то ли включить-выключить. Тут пусть будут задержки - плевать на них.
    У меня с 2010 года стоит диммер от Шнайдер Unica, обычный, в подрозетник. Там тоже есть задержка его работы по быстрому нажатию. Видать, алгоритмы похожие.
    Так как у krollcbas я увидел то, что все вовсю юзают конечный автомат (я на микроконтроллерах его юзал, а в ПЛК не догадался), то я попробую закрутить на конечном автомате отлов быстрого нажатия кнопки по счётчику импульсов модуля IO, а длинное - способом krollcbas или по TON, и посмотрю что получится.
    Если удастся сделать отлов быстрого нажатия на включение-включение диммера - то будет круто. А подержать кнопку 500 мсек, чтобы диммер начал крутить яркость - это пусть будет нормальным. Тем более что все эти задержки я выношу в проекте в константы, и их можно подстроить. Можно даже на экране в настройки вытащить.
    В общем, в моей практике диммер - это частный случай.

    Вот что лично меня бесит - так это выдача наружу мигалок! У меня во всех проектах вовсю используется мигание подсветками кнопок, чтобы показать специальные режимы работы вентиляторов, мастер-кнопок, кнопок управления тёплыми полами. Подсветка от такой кнопки выводится на отдельный выход, и ПЛК ею рулит по нужной логике.
    Например, я под один проект нафигачил классное управление тёплыми полами (электрическими). На стене ставится только кнопка с подсветкой. Температура пола настраивается через UI на СПК (по опыту на своих домашних полах я её редко меняю). На кнопку навешано пока так:
    * Одинарное нажатие включает или выключает пол
    * Подсветка не горит, если пол выключен и горит, если пол включен
    * Подсветка мигает, если пол включен и включен его нагреватель
    Это офигенски прям классная обратная связзь.

    Так вот из-за опроса модулей IO обычные BLINK ведут себя хрен как! И подсветка может мигать не меандром, а быстро мигать - это вообще ужасно.
    Я всё хочу попробовать побаловаться штатным ШИМом на модулях IO, но меня останавливает то, что на некоторые кнопки мне надо менять скорость миганий, а у модулей вроде как постоянно записывать период ШИМ в них плохо. Правда там есть защита памяти от записи и, если это означает то, что в модуль можно писать что попало, но он не будет это сохранять - то в каком-то из проектов я потом это попробую. Пусть модуль аппаратно мигает сам.

    ==========
    Всё! Сегодня под ночь буду кодить и смотреть, что получается.

  8. #18
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,113

    По умолчанию

    [QUOTE=Cs-Cs;345164]Так... а как в третьем CodeSys задержку на такт сделать? У меня ж не OWL сейчас.
    F_TRIG, что ли, применить?
    UPD: Не, не заработало.

    [/CODE]

    Элементарно -
    Изображения Изображения
    электронщик до мозга костей и не только

  9. #19

    По умолчанию

    rovki Нет, это уже как раз сложно и зависимо от времени, а не от цикла задачи.
    А речь же шла в задержке на один цикл именно задачи. То есть я к тому, что задача в ПЛК может протупить так, что 0,011 секунды уже пройдёт. И чего тогда будет?

    Я попробую докодить тот конечный автомат. Мне на конечном автомате даже больше нравится - это вообще в принципе исключит все глюки.

  10. #20
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,113

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    rovki Нет, это уже как раз сложно и зависимо от времени, а не от цикла задачи.
    А речь же шла в задержке на один цикл именно задачи. То есть я к тому, что задача в ПЛК может протупить так, что 0,011 секунды уже пройдёт. И чего тогда будет?

    Я попробую докодить тот конечный автомат. Мне на конечном автомате даже больше нравится - это вообще в принципе исключит все глюки.
    Да там TOF заменяет задержку на один цикл , время ставьте хоть 0,1 сек . Это просто блокировка ...Работает 150% , не зависит не от чего ..Не важна задержка - хоть в одном цикле ,хоть в нескольких .Главное что бы блокировка ушла позже чем сигнал с F- триггера .Ни какого шаманства ,чистая электроника .
    электронщик до мозга костей и не только

Страница 2 из 13 ПерваяПервая 123412 ... ПоследняяПоследняя

Похожие темы

  1. отключение звука нажатия СП307
    от vendor в разделе Панели оператора (HMI)
    Ответов: 2
    Последнее сообщение: 25.01.2018, 10:12
  2. Ответов: 5
    Последнее сообщение: 24.07.2017, 12:08
  3. Ответов: 0
    Последнее сообщение: 31.05.2017, 19:40
  4. Подтверждение нажатия
    от Carter в разделе Master SCADA 3
    Ответов: 9
    Последнее сообщение: 14.11.2016, 17:32
  5. Нечеткая логика в CoDeSys
    от Fallensky в разделе ПЛК1хх
    Ответов: 38
    Последнее сообщение: 09.07.2011, 14:01

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •