Scheduler Modifikation, Array Werte übergeben

Begonnen von Majaestix, 24. Oktober 2010, 16:16:40

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Majaestix

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

peewit

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 !!

Majaestix

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