Datentyp: ARRAY OF
Ein Array ist eine Sammlung von Datenelementen des gleichen Datentyps. Es werden ein- und mehrdimensionale Arrays von fester oder variabler Länge unterstützt.
Eindimensionales Array mit fester Länge
Sie können Arrays im Deklarationsteil einer POU oder in globalen Variablenlisten deklarieren.
Syntax der Deklaration eines eindimensionalen Arrays:
<variable name> : ARRAY[ <dimension> ] OF <data type> := <initialization> ;
| Name des Arrays Beispiel: |
| Dimension (unterer bis obere Indexgrenze) Beispiel: Eine Dimension kann beliebig viele indizierte Elemente haben, bestimmt durch die untere und die obere Indexgrenze Die Indexgrenzen sind ganzzahlige Zahlen, maximal des Datentyps |
| Datentyp eines Elements:
TippReferenzen und Pointer auf |
| Optional Initialwerte des Arrays |
VAR aiCounter : ARRAY[0..9] OF INT; END_VAR
Untere Indexgrenze: 0
Obere Indexgrenze: 9
Initialisierung für die 10 Elemente:
aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];
Datenzugriff
iLocalVariable := aiCounter[2];
Der lokalen Variablen wird der Wert 20 zugewiesen.
Mehrdimensionales Array fester Länge
<variable name> : ARRAY[ <1st dimension> , <next dimensions> ] OF <data type> := <initialization> ;
<variable name> [ <index of 1st dimension> , <index of next dimensions> ]
| Erste Dimension (unterer Indexgrenze bis obere Indexgrenze) |
| Die nächsten Dimensionen (durch Komma separiert) |
Syntax bei Datenzugriff
| Indexgrenze der ersten Dimension |
| Indexgrenze der nächsten Dimensionen |
VAR aiCardGame : ARRAY[1..2, 3..4] OF INT; END_VAR
1te Dimension: 1 bis 2 (2 Arrayelemente)
2te Dimension: 3 bis 4 (2 Arrayelemente)
Initialisierung für die 2 * 2 Elemente:
aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // Short notation for [10, 10, 20, 20]
Datenzugriff
iLocal_1 := aiCardGame[1, 3]; // Assignment of 10 iLocal_2 := aiCardGame[2, 4]; // Assignment of 20
VAR aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT; END_VAR
1te Dimension: 1 bis 2
2te Dimension: 3 bis 4
3te Dimension: 5 bis 6
2 * 2 * 2 = 8 Arrayelemente
Initialisierung
aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [10, 20, 30, 40, 50, 60, 70, 80];
Datenzugriff
iLocal_1 := aiCardGame[1, 3, 5]; // Assignment of 10 iLocal_2 := aiCardGame[2, 3, 5]; // Assignment of 20 iLocal_3 := aiCardGame[1, 4, 5]; // Assignment of 30 iLocal_4 := aiCardGame[2, 4, 5]; // Assignment of 40 iLocal_5 := aiCardGame[1, 3, 6]; // Assignment of 50 iLocal_6 := aiCardGame[2, 3, 6]; // Assignment of 60 iLocal_7 := aiCardGame[1, 4, 6]; // Assignment of 70 iLocal_8 := aiCardGame[2, 4, 6]; // Assignment of 80
Initialisierung
aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [2(10), 2(20), 2(30), 2(40)]; // Short notation for [10, 10, 20, 20, 30, 30, 40, 40]
Datenzugriff
iLocal_1 := aiCardGame[1, 3, 5]; // Assignment of 10 iLocal_2 := aiCardGame[2, 3, 5]; // Assignment of 10 iLocal_3 := aiCardGame[1, 4, 5]; // Assignment of 20 iLocal_4 := aiCardGame[2, 4, 5]; // Assignment of 20 iLocal_5 := aiCardGame[1, 3, 6]; // Assignment of 30 iLocal_6 := aiCardGame[2, 3, 6]; // Assignment of 30 iLocal_7 := aiCardGame[1, 4, 6]; // Assignment of 40 iLocal_8 := aiCardGame[2, 4, 6]; // Assignment of 40
TYPE DATA_A STRUCT iA_1 : INT; iA_2 : INT; dwA_3 : DWORD; END_STRUCT END_TYPE PROGRAM PLC_PRG VAR aData_A : ARRAY[1..3, 1..3, 1..10] OF DATA_A; END_VAR
Das Array aData_A
besteht aus insgesamt 3 * 3 * 10 = 90 Arrayelementen des Datentyps DATA_A
.
Teilweise initialisieren
aData_A : ARRAY[1..3, 1..3, 1..10] OF DATA_A := [(iA_1 := 1, iA_2 := 10, dwA_3 := 16#00FF),(iA_1 := 2, iA_2 := 20, dwA_3 := 16#FF00),(iA_1 := 3, iA_2 := 30, dwA_3 := 16#FFFF)];
Im Beispiel werden nur der ersten 3 Elemente explizit initialisiert. Elemente, denen explizit kein Initialisierungswert zugewiesen wird, werden intern mit dem Standardwert des Basisdatentyps initialisiert. Somit werden die Strukturkomponenten ab dem Element aData_A[2, 1, 1]
mit 0 initialisiert.
Datenzugriff
iLocal_1 := aData_A[1,1,1].iA_1; // Assignment of 1 dwLocal_2 := aData_A[3,1,1].dwA_3; // Assignment of 16#FFFF
FUNCTION BLOCK FBObject_A VAR iCounter : INT; END_VAR ... ; PROGRAM PLC_PRG VAR aObject_A : ARRAY[1..4] OF FBObject_A; END_VAR
Das Array aObject_A
besteht aus 4 Elementen. Jedes Element instanziert einen Funktionsbaustein FBObject_A
.
Funktionsaufruf
aObject_A[2]();
Implementierung von FB_Something
mit Methode FB_Init
FUNCTION_BLOCK FB_Something 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;
Der Funktionsbaustein FB_Something
hat eine Methode FB_Init
, die 2 Parameter benötigt.
Instanzierung des Arrays mit Initialisierung
PROGRAM PLC_PRG VAR fb_Something_1 : FB_Something(nId := 11, lrIn := 33.44); a_Something : ARRAY[0..1, 0..1] OF FB_Something[(nId := 12, lrIn := 11.22), (nId := 13, lrIn := 22.33), (nId := 14, lrIn := 33.55),(nId := 15, lrIn := 11.22)]; END_VAR
Tipp
Beachten Sie die Möglichkeit, während der Laufzeit die Einhaltung der Indexgrenzen durch die implizite Überwachungsfunktion CheckBounds()
zu kontrollieren.
Array von Arrays
Die Deklaration eines „Array von Arrays“ ist eine alternative Schreibweise für multidimensionale Arrays. Eine Sammlung von Elementen wird dabei verschachtelt, statt die Elemente zu dimensionieren. Die Schachteltiefe kann beliebig sein.
Syntax bei Deklaration
<variable name> : ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;
Syntax bei Datenzugriff
<variable name> [<index of first array> ] [<index of next array> ]
| Name des Arrays Beispiel: |
| Dreifach verschachteltes Array Beispiel: AnmerkungDie Schachteltiefe kann beliebig sein. |
| Datentyp eines Elements:
|
| Optional Initialwerte für das verschachtelte Array |
PROGRAM PLC_PRG VAR aiPoints : ARRAY[1..2,1..3] OF INT := [1,2,3,4,5,6]; ai2Boxes : ARRAY[1..2] OF ARRAY[1..3] OF INT := [ [1, 2, 3], [ 4, 5, 6]]; ai3Boxes : ARRAY[1..2] OF ARRAY[1..3] OF ARRAY[1..4] OF INT := [ [ [1, 2, 3, 4], [5, 6, 7, 8 ], [9, 10, 11, 12] ], [ [13, 14, 15, 16], [ 17, 18, 19, 20], [21, 22, 23, 24] ] ]; ai4Boxes : ARRAY[1..2] OF ARRAY[1..3] OF ARRAY[1..4] OF ARRAY[1..5] OF INT; END_VAR aiPoints[1, 2] := 1200; ai2Boxes[1][2] := 1200;
Die Variablen aiPoints
und ai2Boxes
sammeln die gleichen Datenelemente, aber die Schreibweisen bei der Deklaration und beim Datenzugriff unterscheiden sich.


Array mit variabler Länge
In Funktionsbausteinen, Funktionen oder Methoden können Sie im Deklarationsabschnitt VAR_IN_OUT
Arrays mit variabler Länge deklarieren.
Um zur Laufzeit die Indexgrenzen des tatsächliche verwendeten Arrays zu ermitteln, stehen Ihnen die Operatoren LOWER_BOUND
und UPPER_BOUND
zur Verfügung.
Tipp
An ein Array mit variabler Länge dürfen nur statisch deklarierte, nicht mit Hilfe des Operators __NEW
erzeugte Arrays übergeben werden.
Syntax der Deklaration eines eindimensionalen Arrays mit variabler Länge
<variable name> : ARRAY[*] OF <data type> := <initialization> ;
| Name des Arrays Beispiel: |
| Datentyp eines Elements:
|
| Optional Initialwerte für den Array von Arrays |
Syntax der Deklaration eines mehrdimensionalen Arrays mit variabler Länge
<variable name> : ARRAY[*, *] OF <data type> := <initialization> ;
| Name des Arrays Beispiel: |
| Deklaration für einen zweidimensionalen Array variabler Länge Formal steht ein Stern für jede Dimension variable Länge. Die Dimensionen sind mit Komma separiert. AnmerkungErlaubt sind beliebig viele Dimensionen variabler Länge. |
Syntax der Operatoren zur Grenzindexberechnung
LOWER_BOUND( <variable name> , <dimension number> ) UPPER_BOUND( <variable name> , <dimension number> )
Die Funktion SUM
addiert die Integerwerte der Arrayelemente und gibt als Ergebnis die ermittelte Summe zurück. Die Summe wird über alle zur Laufzeit vorhandenen Arrayelemente berechnet. Da die tatsächliche Anzahl an Arrayelementen erst zur Laufzeit bekannt sein wird, wird die lokale Variable als eindimensionales Array variabler Länge deklariert.
FUNCTION SUM: INT; VAR_IN_OUT aiData : ARRAY[*] OF INT; END_VAR VAR diCounter : DINT; iResult : INT; END_VAR iResult := 0; FOR diCounter := LOWER_BOUND(aiData, 1) TO UPPER_BOUND(aiData, 1) DO // Calculates the length of the current array iResult := iResult + aiData[diCounter]; END_FOR; SUM := iResult;