Hallo Zusammen,
ich habe den Baustein SCHEDULER etwas umgeschrieben und auf meine Bedürfnisse angepasst:
FUNCTION_BLOCK SCHEDULER_3x
VAR CONSTANT
array_begin : INT := 0;
array_end : INT := 9;
END_VAR
VAR_INPUT
E : ARRAY[array_begin..array_end] OF BOOL;
T : ARRAY[array_begin..array_end] OF TIME;
END_VAR
VAR_OUTPUT
Q : ARRAY[array_begin..array_end] OF BOOL;
END_VAR
VAR
init : BOOL;
u : ARRAY[array_begin..array_end] OF TIME;
tx : TIME;
c : INT;
i : INT;
END_VAR
(* ----- read system_time ----- *)
tx := DWORD_TO_TIME(T_PLC_MS());
IF NOT init THEN
init := TRUE;
FOR i := array_begin TO array_end DO
u[i] := tx - T[i];
END_FOR;
END_IF;
FOR i := array_begin TO array_end DO
Q[i] := FALSE;
END_FOR;
IF tx - u[c] >= T[c] THEN
Q[c] := E[c];
u[c] := tx;
END_IF;
c := c + 1;
IF c = array_end THEN
c := array_begin;
END_IF;
Jetzt passiert folgendes:
Rufe ich die Instanz wie folgt auf:
FUNCTION_BLOCK scheduler_3_test
VAR_INPUT
Enable : BOOL;
END_VAR
VAR
timer : SCHEDULER_3x;
test_flag_1 : BOOL;
test_flag_2 : BOOL;
test_flag_3 : BOOL;
END_VAR
IF enable THEN
timer (E[0] := ja,
T[0] := T#5s,
Q[0] => test_flag_1
E[1] := ja,
T[1] := T#10s,
Q[1] => test_flag_2,
E[2] := ja,
T[2] := T#15s,
Q[2] => test_flag_3);
IF timer.Q[0] THEN
test_flag_1 := TRUE;
END_IF;
IF timer.Q[1] THEN
test_flag_2 := TRUE;
END_IF;
IF timer.Q[2] THEN
test_flag_3 := TRUE;
END_IF;
IF timer.Q[3] THEN
test_flag_1 := FALSE;
test_flag_2 := FALSE;
test_flag_3 := FALSE;
END_IF;
END_IF;
bekomme ich einen Kompilerfehler, etwa: timer (E[0] geht nicht oder so ähnlich.
Adressiere ich die Instanz aber so:
FUNCTION_BLOCK scheduler_3_test
VAR_INPUT
Enable : BOOL;
END_VAR
VAR
timer : SCHEDULER_3x;
test_flag_1 : BOOL;
test_flag_2 : BOOL;
test_flag_3 : BOOL;
END_VAR
IF enable THEN
timer.E[0] := ja;
timer.T[0] := T#11s;
timer.E[1] := ja;
timer.T[1] := T#17s;
timer.E[2] := ja;
timer.T[2] := T#23s;
timer.E[3] := ja;
timer.T[3] := T#5s;
(* ----- Aufruf SCHEDULER_3x ohne Parameter ----- *)
timer();
IF timer.Q[0] THEN
test_flag_1 := TRUE;
END_IF;
IF timer.Q[1] THEN
test_flag_2 := TRUE;
END_IF;
IF timer.Q[2] THEN
test_flag_3 := TRUE;
END_IF;
IF timer.Q[3] THEN
test_flag_1 := FALSE;
test_flag_2 := FALSE;
test_flag_3 := FALSE;
END_IF;
END_IF;
läuft er super.
Kann mir jemand sagen, wie ich einen Aufruf mit der Übergabe von Array-Werten an VAR_INPUT gestalten muss?
Danke für Hilfe.
Majaestix
VAR_INPUT
E : ARRAY[array_begin..array_end] OF BOOL;
T : ARRAY[array_begin..array_end] OF TIME;
END_VAR
damit definierst du , das du bei "e" und "t" ein Datenarray übergibst, also eigentlich nur zwei variablen die jeweils ein datenarray darstellen
und das datenarray solltest du natürlich vorher mit sinnvollen daten füllen
dann kannst du nicht hergehen, und plötzlich alle array-elemente einzeln als parameter übergeben
timer (E[0] := ja,
T[0] := T#5s,
Q[0] => test_flag_1
E[1] := ja,
T[1] := T#10s,
Q[1] => test_flag_2,
E[2] := ja,
T[2] := T#15s,
das entspricht nicht der definition
da muesstest du beim scheduler_3x dann folgendes machen
VAR_INPUT
E0 : BOOL;
T0 : TIME;
E1 : BOOL;
T1 : TIME;
usw... machen
END_VAR
damit du das so einzeln übergeben kannst, das ist aber ein blödsinn, weil es den code nur unnötig aufbläht, und du alle timer extra programmieren musst, und keine schleife zur abarbeitung nutzen kannst
das kann nur mit deiner zweiten variante funktionieren !!
Hallo peewit,
danke für die schnelle Antwort.
Zitatdas entspricht nicht der definition
Schade, das wäre es gewesen.
Nehme ich halt die zweite Variante, funktioniert ja auch.
Gruss
Majaestix