Так... а как в третьем 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. Ща с этим вопросов нет - у меня затуп в том, как их взаимоисключить.
Я ещё раз прошу не смеяться: у меня за три дня поиска решения мозг замылился, и я в полном ступоре даже от очевидных вещей.