Hallo. Im folgenden Code lasse ich ein 200er Ventil entsprechend der im Datenblock zugewiesenen Prioritätsreihenfolge laufen. Dann verwende ich einen DB für die Ausgabe und schreibe die Daten aus dem DB mit POKE BLK in die Q-Ausgangsfelder. Wenn ich es von der Priorität 200 auf das 1. Ventil von 196. Es beginnt vom Q-Ausgang des Ventils zu arbeiten. Wenn ich es in dem DB, den ich zwischendurch verwende, überprüfe, funktioniert es ab Ventil 200. Es schien, als gäbe es ein Problem mit dem Befehl POKE BLK, aber ich konnte es nicht lösen.
FUNCTION_BLOCK "VALVE_CONTROL_3"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Valve : Array[1..200] of Int;
END_VAR
VAR_IN_OUT
ValveControl : Array[1..200] of Bool;
START : Bool;
END_VAR
VAR
START_PE {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
i { S7_SetPoint := 'True'} : Int;
j : Int;
t : Int;
Siralama : Array[1..200] of Int;
Valve_Timer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
ValveTimer_PE {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
Valve_Timer_IN_FE {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
END_VAR
BEGIN
#START_PE(CLK := #START);
IF #START_PE.Q THEN
FOR #i := 1 TO 200 DO
FOR #j := 1 TO 200 DO
IF #Valve[#i] = #j THEN
#Siralama[#j] := #i;
END_IF;
END_FOR;
END_FOR;
#t := 1;
#ValveControl[#Siralama[#t]] := TRUE;
END_IF;
IF #START THEN
#Valve_Timer(IN := #ValveControl[#Siralama[#t]],
PT := T#1s);
#ValveTimer_PE(CLK := #Valve_Timer.Q);
IF #ValveTimer_PE.Q THEN
#ValveControl[#Siralama[#t]] := FALSE;
END_IF;
#Valve_Timer_IN_FE(CLK := #Valve_Timer.IN);
IF #Valve_Timer_IN_FE.Q THEN
#t += 1;
IF #t > 200 THEN
#START := FALSE;
ELSE
#ValveControl[#Siralama[#t]] := TRUE;
END_IF;
END_IF;
END_IF;
POKE_BLK(area_src:=16#84,
dbNumber_src:=35,
byteOffset_src:=400,
area_dest:=16#82,
dbNumber_dest:=0,
byteOffset_dest:=5,
count:=25);
END_FUNCTION_BLOCK
FUNCTION_BLOCK "VALVE_CONTROL_3"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Valve : Array[1..200] of Int;
END_VAR
VAR_IN_OUT
ValveControl : Array[1..200] of Bool;
START : Bool;
END_VAR
VAR
START_PE {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
i { S7_SetPoint := 'True'} : Int;
j : Int;
t : Int;
Siralama : Array[1..200] of Int;
Valve_Timer {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
ValveTimer_PE {InstructionName := 'R_TRIG'; LibVersion := '1.0'} : R_TRIG;
Valve_Timer_IN_FE {InstructionName := 'F_TRIG'; LibVersion := '1.0'} : F_TRIG;
END_VAR
BEGIN
#START_PE(CLK := #START);
IF #START_PE.Q THEN
FOR #i := 1 TO 200 DO
FOR #j := 1 TO 200 DO
IF #Valve[#i] = #j THEN
#Siralama[#j] := #i;
END_IF;
END_FOR;
END_FOR;
#t := 1;
#ValveControl[#Siralama[#t]] := TRUE;
END_IF;
IF #START THEN
#Valve_Timer(IN := #ValveControl[#Siralama[#t]],
PT := T#1s);
#ValveTimer_PE(CLK := #Valve_Timer.Q);
IF #ValveTimer_PE.Q THEN
#ValveControl[#Siralama[#t]] := FALSE;
END_IF;
#Valve_Timer_IN_FE(CLK := #Valve_Timer.IN);
IF #Valve_Timer_IN_FE.Q THEN
#t += 1;
IF #t > 200 THEN
#START := FALSE;
ELSE
#ValveControl[#Siralama[#t]] := TRUE;
END_IF;
END_IF;
END_IF;
POKE_BLK(area_src:=16#84,
dbNumber_src:=35,
byteOffset_src:=400,
area_dest:=16#82,
dbNumber_dest:=0,
byteOffset_dest:=5,
count:=25);
END_FUNCTION_BLOCK