Раз уж пошла такая пьянка, подскажите, есть ли более простой способ узнать длительность нажатия кнопки, кроме как ловить передний и задний фронты?
Сейчас у меня это так:
Как-то не изящно смотрится..Код: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
Последний раз редактировалось Yegor; 01.10.2012 в 21:17.
Очередной дурацкий вопрос - как "мигнуть" светом? Мигнуть - это не выключить-включить, а притушить на 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).Эта штука, насколько я понял, именно моргает. А мне надо "притушить" и обратно вернуть...