Благодарю! Только что попробовал. Моя проблема с стандартным BLINK решена.
Нужно потестить в моей среде, проверить на подводные камни.
Вид для печати
Я сталкивался с такой проблемой BLINK-а, выходил из положения просто: блинк ставил как генератор а в CTU делал выход, тем самым увеличил размер временной переменной и стало по барабану как где блин этот застрял.
Только он даже не импортируется.
можно и проще
Код:FUNCTION_BLOCK blnk
VAR_INPUT
start: BOOL; (*разрешение работы блока*)
hi: TIME:=t#3s; (*продолжительность включенного выхода*)
lo: TIME:=t#1s; (*продолжительность отключенного выхода*)
END_VAR
VAR_OUTPUT
q: BOOL; (*выход*)
END_VAR
VAR
b0,b: BLINK;
END_VAR
------
b := SEL(start, b0, b);
b(ENABLE := start, TIMELOW := lo, TIMEHIGH := hi, OUT => q);
OSCAT-овский генератор, можно скорректировать под себя:
Код:FUNCTION_BLOCK GEN_PULSE
VAR_INPUT
ENQ : BOOL := TRUE;
PTH : TIME;
PTL : TIME;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
tx: TIME;
tn: TIME;
init: BOOL;
END_VAR
(*
version 1.5 8. apr. 2011
programmer hugo
tested by oscat
GEN_PULSE uses the internal sps timer to generate a continuous output waveform with programmable high and low time.
the accuracy of gen_pulse is depending on the system timer.
when time is 0 the high and low times are exactly one cycle.
ENQ = TRUE will start and ENQ = FALSE will stop the generator.
*)
IF enq THEN
tx := TIME();
IF NOT init THEN init := TRUE; tn := tx; Q := TRUE; END_IF; // можно изменить на нужное состояние Q при запуске
IF PTL <= t#0s THEN Q := TRUE;
ELSE
IF tx - tn >= SEL(Q, PTL, PTH) THEN
tn := tn + SEL(Q, PTL, PTH);
Q := NOT Q;
END_IF;
END_IF;
ELSE
Q := FALSE;
init := FALSE;
END_IF;
(* revision history
hm 29. jun. 2008 rev 1.0
original version
hm 23. nov. 2008 rev 1.1
set default for enq to be true
hm 18. jul. 2009 rev 1.2
improved performance
hm 13. nov. 2009 rev 1.3
corrected error
hm 16. feb. 2011 rev 1.4
corrected an error when timer overflows
hm 8. apr. 2011 rev 1.5
ptl and pth was exchanged
1exan 05042024
for 0 PTL, Q is on
*)