Показано с 1 по 7 из 7

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

  1. #1

    По умолчанию ПЛК73. Как различить долгое и короткое нажатие кнопки

    Здравствуйте!

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

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

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

    В общем, я впал в ступор... Помогите, камрады!
    Вложения Вложения
    • Тип файла: pro test.pro (55.0 Кб, Просмотров: 13)

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

    По умолчанию

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

  3. #3
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,225

    По умолчанию

    зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  4. #4

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    делайте обработку по заднему фронту нажатия. То есть сразу не применяйте действие по переднему фронту нажатия.
    Если просто поменять триггер на F_TRIG, то тоже не работает - триггер срабатывает и при долгом нажатии, на спаде сигнала (на отжатии кнопки).

  5. #5

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    зайдите на oscat.de скачайте библиотеку building откройте ПОУ CLICK_MODE и сравните их код с Вашим
    Спасибо за наводку. Посмотрю.

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

    По умолчанию

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

  7. #7

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    зайдите на 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
    Последний раз редактировалось Melix; 20.02.2018 в 09:06.

Похожие темы

  1. ПЛК73 (Функциональные кнопки)
    от necro в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 18.05.2022, 10:03
  2. Ответов: 3
    Последнее сообщение: 04.12.2013, 09:05
  3. МВА8 входы: короткое замыкание
    от Sunnytommi в разделе Мх110
    Ответов: 1
    Последнее сообщение: 18.08.2011, 09:17
  4. МВА8 входы: короткое замыкание
    от Sunnytommi в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 18.08.2011, 09:17
  5. СП270 и двойное нажатие
    от Stenvel в разделе Панели оператора (HMI)
    Ответов: 0
    Последнее сообщение: 20.04.2011, 17:37

Ваши права

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