Просмотр полной версии : Однократное нажатие кнопки
ВладимирЛ
19.06.2022, 11:06
Добрый день!
Подскажите, пожалуйста, надо на визуализации реализовать простейший счетчик, чтобы при нажатии на кнопку к переменной прибавлялось 1.
Дело в том, что при нажатие на кнопку BOOL меняется на TRUE и он начинает плюсовать сколькое ему влезет.
Я обошел это вписав в IF, возврат на FALSE. Но есть ли какие-то более изящные способы настроить кнопку на визуализации так, чтобы она давала разовый сигнал?
Изображение приложил.
61292
Спасибо.
Нужно использовать блок R_TRIG в коде. Это блок, который один раз выдаёт на выход TRUE при начале длинного перехода из False в True.
То есть:
0) Объявляемя экземпляр R_TRIG в переменных как и другого любого FB
а) Переменную от кнопки подаём на вход этого экземпляра (IN:=..)
б) В твой IF подставляем не переменную от кнопки, а выход этого FB (IF ....Q = TRUE)
Вот тогда код в IF будет выполнен однократно при нажатии на кнопку на UI.
ВладимирЛ
20.06.2022, 11:31
Спасибо.
Кода стало больше, но я так понимаю это более правильный подход.
Counter: INT;
Counter_PLUS: BOOL;
CounterR : R_TRIG;
CounterR(CLK:= Counter_PLUS);
IF CounterR.Q=TRUE
THEN Counter:=Counter+1;
END_IF;
keysansa
20.06.2022, 14:31
Counter в Codesys считает только фронт. Зачем тригер еще?
Counter в Codesys считает только фронт. Зачем тригер еще?
Здесь Counter: INT - простая переменная, а не ФБ
Вариант без IF
VAR
Counter: INT;
Counter_PLUS: BOOL;
CounterR : R_TRIG;
END_VAR
CounterR(CLK:= Counter_PLUS);
Counter:=Counter + BOOL_TO_INT(CounterR.Q);
keysansa
20.06.2022, 15:28
Здесь Counter: INT - простая переменная, а не ФБ
Зачем изобретать велосипед?
ВладимирЛ
20.06.2022, 17:15
Вариант без IF
VAR
Counter: INT;
Counter_PLUS: BOOL;
CounterR : R_TRIG;
END_VAR
CounterR(CLK:= Counter_PLUS);
Counter:=Counter + BOOL_TO_INT(CounterR.Q);
А вот это - изящно!
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot