Просмотр полной версии : ПЛК73. Как различить долгое и короткое нажатие кнопки
Здравствуйте!
Я покамест новичок в программировании плк, поэтому застопорился на казалось бы простой задаче. Как в программе обработать короткое и длинной нажатие одной и той же кнопки, например "Пуск/Стоп"? Нужно сделать так, чтобы программа в зависимости от длительности нажатия пошла по разным ветвям кода. Проектик прилагаю.
35711
Как задумано:
Долгое нажатие запускает / останавливает процесс
Короткое нажатие ставит / снимает с паузы (но не останавливает процесс).
На деле получается, что когда я задумал жать долго, срабатывает "недотриггер" R_TRIG на короткое нажатие.
В общем, я впал в ступор... Помогите, камрады!
делайте обработку по заднему фронту нажатия. То есть сразу не применяйте действие по переднему фронту нажатия.
зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим
делайте обработку по заднему фронту нажатия. То есть сразу не применяйте действие по переднему фронту нажатия.
Если просто поменять триггер на F_TRIG, то тоже не работает - триггер срабатывает и при долгом нажатии, на спаде сигнала (на отжатии кнопки).
зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим
Спасибо за наводку. Посмотрю.
Я не подскажу как это сделать в ST, не силен. На CFC делал легко. Таймер, который отслеживает длительное нажатие блокирует ветку короткого нажатия после отпускания кнопки или даже раньше.
зайдите на 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
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot