Das hier ist von mir. Hier mache ich genau etwas ziemlich gefährliches. Man kann ein mir von der Grösse nicht bekanntes Array anhängen. Welches dann element für element abgearbeitet wird.
Ist beim Roten teil das erste Element erfüllt, dann ist der Baustein ziemlich schnell beendet. Aber im Extremfall kann es ja auch 5 mal das Array durchlaufen und nix finden.
Für mich funktioniert das jetzt da die Arrays eh nur aus wenigen 100 Elementen bestehen. Aber wenn man das nicht beachtet kann bei solchen Konstruktionen aus dem Nichts eine Zykluszeitüberschreitung passieren.
Das ist auch so ein Typisches Beispiel. Schnell geschrieben, leicht zu verstehen aber nicht optimal.
Code:
FUNCTION "GesamtBetriebsart" : Int
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
BA_Array : Array
[*] of Int; // Hier Array mit allen Objektbetriebsarten anlegen
P1_Mode : Int; // Betriebsart mit höchster Anzuzeigender Priorität (Revision = 4)
P2_Mode : Int;
P3_Mode : Int;
P4_Mode : Int;
P5_Mode : Int; // Betriebsart mit niedrigster Prio (Automatik = -1)
END_VAR
VAR_TEMP
Lower : DInt;
Upper : DInt;
index : DInt;
END_VAR
BEGIN
#GesamtBetriebsart := -1;
#Lower := LOWER_BOUND(ARR := #BA_Array, DIM := 1);
#Upper := UPPER_BOUND(ARR:= #BA_Array, DIM:= 1);
[COLOR=#ff0000] FOR #index := #Lower TO #Upper DO[/COLOR]
[COLOR=#ff0000] IF #BA_Array[#index] = #P1_Mode THEN[/COLOR]
[COLOR=#ff0000] #GesamtBetriebsart := #P1_Mode;[/COLOR]
[COLOR=#ff0000] GOTO Ende;[/COLOR]
[COLOR=#ff0000] END_IF;[/COLOR]
[COLOR=#ff0000] END_FOR;[/COLOR]
FOR #index := #Lower TO #Upper DO
IF #BA_Array[#index] = #P2_Mode THEN
#GesamtBetriebsart := #P2_Mode;
GOTO Ende;
END_IF;
END_FOR;
FOR #index := #Lower TO #Upper DO
IF #BA_Array[#index] = #P3_Mode THEN
#GesamtBetriebsart := #P3_Mode;
GOTO Ende;
END_IF;
END_FOR;
FOR #index := #Lower TO #Upper DO
IF #BA_Array[#index] = #P4_Mode THEN
#GesamtBetriebsart := #P4_Mode;
GOTO Ende;
END_IF;
END_FOR;
FOR #index := #Lower TO #Upper DO
IF #BA_Array[#index] = #P5_Mode THEN
#GesamtBetriebsart := #P5_Mode;
GOTO Ende;
END_IF;
END_FOR;
Ende:;
END_FUNCTION