FUNCTION_BLOCK "BlinkSeq_FB"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Select : Bool;
END_VAR
VAR_OUTPUT
Lampe : Bool;
END_VAR
VAR
Seq : Array[0..9] of Time;
SeqMax : Int;
TP_Pulse : TP_TIME;
Pulse : Bool;
Step : Int;
END_VAR
BEGIN
IF #Step = 0 THEN //Werte nur übernehmen, wenn die Sequenz neu startet
IF #Select THEN //Ablauf bei Eingang True
#Seq[0] := t#1s;
#Seq[1] := t#1s500ms;
#Seq[2] := t#1s;
#Seq[3] := t#1s500ms;
#Seq[4] := t#4s;
#Seq[5] := t#1s500ms;
#SeqMax := 5;
ELSE //Anlauf bei Eingang False
#Seq[0] := t#500ms;
#Seq[1] := t#2s;
#Seq[2] := t#500ms;
#Seq[3] := t#2s;
#Seq[4] := t#500ms;
#Seq[5] := t#2s;
#Seq[6] := t#500ms;
#Seq[7] := t#4s;
#SeqMax := 7;
END_IF;
END_IF;
//Pulse erzeugen
#TP_Pulse(IN := NOT #Pulse,
PT := #Seq[#Step],
Q => #Pulse);
//Wenn Puls zu Ende gehe in den nächsten Schritt
IF (NOT #Pulse) THEN
#Step += 1;
END_IF;
//Wenn Maximum erreicht, dann von vorne
IF #Step > #SeqMax THEN
#Step := 0;
END_IF;
//Lampe nur in den geraden Schritten einschalten, daher Modulo mit 2 auf 0 abgefragt.
#Lampe := #Pulse AND #Step MOD 2 = 0;
END_FUNCTION_BLOCK