PDA

Просмотр полной версии : Однократное нажатие кнопки



ВладимирЛ
19.06.2022, 11:06
Добрый день!

Подскажите, пожалуйста, надо на визуализации реализовать простейший счетчик, чтобы при нажатии на кнопку к переменной прибавлялось 1.
Дело в том, что при нажатие на кнопку BOOL меняется на TRUE и он начинает плюсовать сколькое ему влезет.
Я обошел это вписав в IF, возврат на FALSE. Но есть ли какие-то более изящные способы настроить кнопку на визуализации так, чтобы она давала разовый сигнал?
Изображение приложил.

61292

Спасибо.

Cs-Cs
19.06.2022, 20:13
Нужно использовать блок 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 считает только фронт. Зачем тригер еще?

petera
20.06.2022, 15:19
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);

А вот это - изящно!