Es werden ein-, zwei-, und dreidimensionale Felder (Arrays) elementarer Datentypen unterstützt. Arrays können im Deklarationsteil einer POU und in den globalen Variablenlisten definiert werden. Sie können auch eine Prüfung impliziter Feldgrenzen durchführen. Sie können Arrays mit fester und mit variabler Länge deklarieren.
Der Datentyp ARRAY mit variabler Länge kann nur für VAR_IN_OUT-Variablen von Funktionsbausteinen, Methoden und Funktionen deklariert werden. Verwenden Sie die Operatoren LOWER_BOUND(<array name>,<dim>) und UPPER_BOUND(<array name>,<dim>), um die Ober- und Untergrenze des Arrays abzurufen.
Syntax der Deklaration eines Arrays mit fester Länge
<Array_Name>: ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <Elem. Typ>
ll1, ll2, ll3 identifiziert den unteren Grenzwert des Feldbereichs.
ul1, ul2 und ul3 identifizieren den oberen Grenzwert des Feldbereichs.
Diese Grenzwerte müssen ganzzahlige Werte sein.
Beispiel für die Deklaration eines Arrays mit fester Länge
Card_game: ARRAY [1..13, 1..4] OF INT;
Syntax der Deklaration eines Arrays mit variabler Länge
<Arrayname> : ARRAY [*|, *|, *] OF <Datentyp>;
Beispiel für die Deklaration eines Arrays mit variabler Länge
FUNCTION SUM: INT; // Onedimensional
arrays of variable lengths can be
passed to this addition function.
VAR_IN_OUT
A: ARRAY [*] OF INT;
END_VAR
VAR
i, sum2 : DINT;
END_VAR
sum2:= 0;
FOR i:= LOWER_BOUND(A,1) TO UPPER_BOUND(A,
1) // The length of the respective array is
determined.
sum2:= sum2 + A[i];
END_FOR;
SUM:= sum2;
Beispiel für die komplette Initialisierung eines Arrays
arr1 : ARRAY [1..5] OF INT := [1,2,3,4,5];
arr2 : ARRAY [1..2,3..4] OF INT := [1,3(7)]; (* short for 1,7,7,7 *)
arr3 : ARRAY [1..2,2..3,3..4] OF INT := [2(0),4(4),2,3];
(* short for 0,0,4,4,4,4,2,3 *)
Beispiel für die Initialisierung eines Arrays einer Struktur
Strukturdefinition
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
END_TYPE
Array-Initialisierung
ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),(p1:=14,p2:=5,p3:=112)];
Beispiel für die teilweise Initialisierung eines Arrays.
arr1 : ARRAY [1..10] OF INT := [1,2];
Elemente, denen kein Wert explizit als Initialisierungswert zugewiesen wird, werden mit dem Default-Wert des Basisdatentyps initialisiert. Im vorherigen Beispiel werden die Elemente arr1[3]...arr1[10] demzufolge mit 0 initialisiert.
Beispiel für die Initialisierung eines Arrays aus Funktionsbausteinen mit zusätzlichen Parametern in FB_Init
Beispiel eines Funktionsbausteins FB und einer Methode FB_Init mit zwei Parametern:
FUNCTION_BLOCK FB
VAR
_nId : INT;
_lrIn : LREAL;
END_VAR
METHOD FB_Init : BOOL
VAR_INPUT
bInitRetains : BOOL;
bInCopyCode : BOOL;
nId : INT;
lrIn : LREAL;
END_VAR
_nId := nId;
_lrIn := lrIN;
Beispiel für eine Array-Deklaration mit Initialisierung:
PROGRAM PLC_PRG
VAR
inst : FB(nId := 11, lrIn := 33.44);
ainst : ARRAY [0..1, 0..1] OF FB[(nId :=
12, lrIn := 11.22), (nId := 13, lrIn :=
22.33), (nId := 14, lrIn := 33.55),(nId := 15,
lrIn := 11.22)];
END_VAR
Zugreifen auf die Elemente eines Arrays
Gehen Sie für den Zugriff auf die Elemente in zweidimensionalen Arrays vor wie folgt:
<Arrayname>[Index1,Index2]
Beispiel:
Card_game [9,2]
Funktionen zur Überprüfung der Feldgrenzen
Um einen korrekten Zugriff auf Feldelemente zu gewährleisten, muss die Funktion CheckBounds im Projekt während der Laufzeit verwendet werden. Für Informationen zum Einfügen der Funktion, siehe die Beschreibung der Funktion POUs für implizite Checks.
Aufgabe dieser Überwachungsfunktion ist eine angemessene Behandlung der Verletzung von Feldgrenzen (z. B. durch Setzen eines Fehler-Flags oder durch Verändern des Index). Die Funktion wird implizit aufgerufen, sobald eine Variable des Typs ARRAY zugewiesen wird.
Beispiel für die Verwendung der Funktion CheckBounds
Standardmäßig ist die Funktion auf folgende Weise implementiert:
Deklarationsteil:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
Implementierungsteil:
// Implicitly generated code : Only an Implementation suggestion
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF
Beim Aufruf erhält die Funktion folgende Eingangsparameter:
oindex: Feldelementindex
olower: Untergrenze des Feldbereichs
oupper: Obergrenze des Feldbereichs
Rückgabewert ist der Index selbst, sofern sich dieser im gültigen Bereich befindet. Ansonsten wird je nach Verletzung des Grenzbereichs die Ober- oder Untergrenze des Feldbereichs zurückgegeben.
Im untenstehenden Programm wird die definierte Obergrenze des Arrays a überschritten:
Im folgenden Beispiel wird die Obergrenze des Arrays a überschritten:
PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b: INT:=10;
END_VAR
a[b]:=TRUE;
In diesem Fall bewirkt der vor der Zuweisung implizit erfolgte Aufruf der Funktion CheckBounds, dass der Wert des Indizes von 10 zur Obergrenze des Arrays 7 geändert wird. Demzufolge wird dem Element a[7] des Arrays der Wert TRUE zugewiesen. Auf diese Weise werden versuchte Zugriffe außerhalb des gültigen Array-Bereichs über die Funktion CheckBounds korrigiert.