За алгоритм спасибо, но это малость не то, что мне надо... :) В общем, оставил пока так...
Вид для печати
Раз уж пошла такая пьянка, подскажите, есть ли более простой способ узнать длительность нажатия кнопки, кроме как ловить передний и задний фронты?
Сейчас у меня это так:
Как-то не изящно смотрится.. :)Код:VAR
Btn : BOOL;
Fr: R_TRIG;
Bk: F_TRIG;
In: TIME;
Out:TIME;
Long : TIME;
END_VAR
Btn := DI1;
Fr(CLK:=Btn); (* Передний фронт *)
Bk(CLK:=Btn); (* Задний фронт *)
IF Fr.Q THEN
In := TIME();
END_IF
IF Bk.Q THEN
Out := TIME();
END_IF
Long := Out - In;
Угумс:Ну или вариант для тех, кого в детстве пугали таймерами:Код:VAR
stopwatch: TON;
result: TIME;
btn: BOOL;
END_VAR
IF NOT btn AND stopwatch.IN THEN
result := stopwatch.ET;
END_IF
stopwatch(IN := btn, PT := DWORD_TO_TIME(NOT 0));
Код:VAR
timestamp, result: TIME;
btn: BOOL;
END_VAR
IF btn AND timestamp = T#0s THEN
timestamp := TIME();
ELSIF NOT btn AND timestamp <> T#0s THEN
result := TIME() - timestamp;
timestamp := T#0s;
END_IF
Очередной дурацкий вопрос - как "мигнуть" светом? Мигнуть - это не выключить-включить, а притушить на 30% и вернуть обратно... Или при малой яркости прибавить 30% и вернуть.. Проблема - в скорости цикла. Т.е. если в одном цикле я уменьшаю яркость, а в следующем увеличиваю - лампа не успевает отработать. Пропускать некоторое количество циклов счетчиком - не самый удачный вариант, но другие пока не лезут в голову... А как два раза мигнуть?
Я себе для «морзянки» лампочками и зумерами вот чо написал:Код:FUNCTION_BLOCK BLINK_SEQ (* Custom sequence blinker *)
VAR_INPUT
SEQ: ARRAY [0..15] OF TIME; (* The sequence to blink upon (even are ON times, odd are OFF times) *)
ENABLED: BOOL; (* Rising edge starts blinking *)
END_VAR
VAR_OUTPUT
OUT: BOOL;
END_VAR
VAR
i: INT;
starter: R_TRIG;
sequencer: TON;
END_VAR
starter(CLK := ENABLED);
IF starter.Q THEN
i := 0;
END_IF
IF ENABLED AND i < 15 THEN
sequencer(IN := TRUE, PT := SEQ[i]);
IF sequencer.Q THEN
i := i + 1;
WHILE SEQ[i] = T#0s AND i < 15 DO i := i + 1; END_WHILE
sequencer(IN := FALSE);
END_IF
OUT := (i MOD 2 = 0) AND ENABLED AND SEQ[MAX(0, i - 1)] > T#0s;
ELSE
OUT := FALSE;
END_IF
Ну, т.е.
Но, поскольку это происходит в пределах одного цикла, то ничего не происходит. А как это растянуть во времени - не понимаю... :(Код:VAR
Light : INT; (*яркость в %*)
Light_temp : INT; (*яркость в % для запоминания*)
OUT : INT; (*это то, что передается в лампочку*)
EN : BOOL; (* Включалка *)
END_VAR
==========================================================
Light_temp := Light;
IF EN THEN
IF Light < 70 THEN
Light := Light + 30;
Out := Light;
ELSIF Light >= 70 THEN
Light := Light - 30;
Out := Light;
END_IF
OUT := Light_temp;
==========================================================
Из «моргать» сделать «тушить» можно одной строчкой. А в простейшем случае — одним оператором (SEL).Цитата:
Эта штука, насколько я понял, именно моргает. А мне надо "притушить" и обратно вернуть...