Вход

Просмотр полной версии : ПЛК73. Как различить долгое и короткое нажатие кнопки



Melix
19.02.2018, 15:03
Здравствуйте!

Я покамест новичок в программировании плк, поэтому застопорился на казалось бы простой задаче. Как в программе обработать короткое и длинной нажатие одной и той же кнопки, например "Пуск/Стоп"? Нужно сделать так, чтобы программа в зависимости от длительности нажатия пошла по разным ветвям кода. Проектик прилагаю.
35711

Как задумано:
Долгое нажатие запускает / останавливает процесс
Короткое нажатие ставит / снимает с паузы (но не останавливает процесс).

На деле получается, что когда я задумал жать долго, срабатывает "недотриггер" R_TRIG на короткое нажатие.

В общем, я впал в ступор... Помогите, камрады!

melky
19.02.2018, 15:05
делайте обработку по заднему фронту нажатия. То есть сразу не применяйте действие по переднему фронту нажатия.

capzap
19.02.2018, 15:06
зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим

Melix
19.02.2018, 15:39
делайте обработку по заднему фронту нажатия. То есть сразу не применяйте действие по переднему фронту нажатия.

Если просто поменять триггер на F_TRIG, то тоже не работает - триггер срабатывает и при долгом нажатии, на спаде сигнала (на отжатии кнопки).

Melix
19.02.2018, 15:43
зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим

Спасибо за наводку. Посмотрю.

melky
19.02.2018, 15:59
Я не подскажу как это сделать в ST, не силен. На CFC делал легко. Таймер, который отслеживает длительное нажатие блокирует ветку короткого нажатия после отпускания кнопки или даже раньше.

Melix
19.02.2018, 16:22
зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим

Кажется разобрался. Может быть кому-то окажется полезным.
Создал ф. блок (навеяно ф. блоком CLICK_MODE):


FUNCTION_BLOCK ClickKey
VAR_INPUT
bIn : BOOL;
timLong : TIME := t#2000ms;
END_VAR
VAR_OUTPUT
bSingle : BOOL;
bLong : BOOL;
END_VAR
VAR
timer : TP;
ft1 : F_TRIG;
ft2 : F_TRIG;
END_VAR

timer(in := bIn, pt := timLong);

ft1(clk := bIn);
bSingle := ft1.Q AND timer.Q;

ft2(clk := timer.Q);
bLong := ft2.Q AND bIn;

END_FUNCTION_BLOCK

На соответствующих выходах выдаёт однотактные импульсы. Для того, чтобы нажатие считалось долгим, нужно жать более 2 сек (по умолчанию).

Пример для проверки:


PROGRAM PLC_PRG
VAR CONSTANT
KEY_START_STOP : WORD := 32;
END_VAR
VAR
bInit : BOOL := TRUE;
bRun : BOOL := FALSE;
bPause : BOOL := FALSE;
click : ClickKey;
END_VAR

IF bInit THEN
ClearScreen(0);
ShowString(0, 0, 0, 'Stopped. ');
bInit := FALSE;
END_IF;

click(bIn := wKbrd = KEY_START_STOP);
IF click.bSingle THEN
IF bPause THEN
bPause := FALSE;
ShowString(0, 0, 0, 'Running... ');
ELSE
bPause := TRUE;
ShowString(0, 0, 0, 'Paused. ');
END_IF
END_IF

IF click.bLong THEN
IF bRun THEN
bRun := FALSE;
ShowString(0, 0, 0, 'Stopped. ');
ELSE
bRun := TRUE;
ShowString(0, 0, 0, 'Running... ');
END_IF
END_IF