Data Type: ARRAY OF
An array is a collection of data elements of the same data type. Single and multi-dimensional arrays of fixed or variable length are supported.
One-dimensional array of fixed length
You can define arrays in the declaration part of a POU or in global variable lists.
Syntax of the declaration of a one-dimensional array:
<variable name> : ARRAY[ <dimension> ] OF <data type> := <initialization> ;
| Name of the array Example: |
| Dimension (lower to higher index limit) Example: One dimension can have any number of indexed elements, determined by the lower and upper index limit. The index limits are integers; maximum of the data type |
| Data type of an element:
TipReferences and pointers to |
| Optional Initial values of the array |
VAR
aiCounter : ARRAY[0..9] OF INT;
END_VARLower index limit: 0
Upper index limit: 9
Initialization for the 10 elements:
aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];
Data access
iLocalVariable := aiCounter[2];
The value 20 is assigned to the local variable.
Multi-dimensional array of fixed length
<variable name> : ARRAY[ <1st dimension> , <next dimensions> ] OF <data type> := <initialization> ;
<variable name> [ <index of 1st dimension> , <index of next dimensions> ]
| First dimension (lower to higher index limit) |
| The next dimensions (comma-separated) |
Syntax for data access
| Index limit of the first dimension |
| Index limit of the next dimensions |
VAR
aiCardGame : ARRAY[1..2, 3..4] OF INT;
END_VAR1st dimension: 1 to 2 (2 array elements)
2nd dimension: 3 to 4 (2 array elements)
Initialization for the 2 * 2 elements:
aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // Short notation for [10, 10, 20, 20]
Data access
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_VAR1st dimension: 1 to 2
2nd dimension: 3 to 4
3rd dimension: 5 to 6
2 * 2 * 2 = 8 array elements
Initialization
aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [10, 20, 30, 40, 50, 60, 70, 80];
Data access
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
Initialization
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]
Data access
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_VARThe array aData_A consists of a total of 3 * 3 * 10 = 90 array elements of data type DATA_A.
Initialize partially
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)];In the example, only the first 3 elements are initialized explicitly. Elements to which no initialization value is assigned explicitly are initialized internally with the default value of the basic data type. This initializes the structure components at 0 starting with the element aData_A[2, 1, 1].
Data access
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_VARThe array aObject_A consists of 4 elements. Each element instantiates a FBObject_A function block.
Function call
aObject_A[2]();
Implementation of FB_Something with method 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;The function block FB_Something has a method FB_Init that requires 2 parameters.
Instantiation of the array with initialization
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_VARTip
Note the capability of using the implicit monitoring function CheckBounds() to monitor the maintenance of the index limits at runtime.
Array of arrays
The declaration of an "array of arrays" is an alternative syntax for multidimensional arrays. A collection of elements is nested instead of dimensioning the elements. The nesting depth is unlimited.
Syntax for declaration
<variable name> : ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;
Syntax for data access
<variable name> [<index of first array> ] [<index of next array> ]
| Name of the array Example: |
| Nested array in three levels Example: NoteThe nesting depth is unlimited. |
| Data type of an element:
|
| Optional Initial values for the nested 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;The variables aiPoints and ai2Boxes collect the same data elements, however the syntax for the declaration differs from that of the data access.


Array of variable length
In function blocks, functions, or methods, you can declare arrays of variable length in the VAR_IN_OUT declaration section.
The LOWER_BOUND and UPPER_BOUND operators are provided for determining the index limits of the actual used array at runtime.
Tip
Only statically declared arrays (not arrays generated by means of the operator __NEW) may be passed to an array with variable length.
Syntax of the declaration of a one-dimensional array of variable length
<variable name> : ARRAY[*] OF <data type> := <initialization> ;
| Name of the array Example: |
| Data type of an element:
|
| Optional Initial values for the array of arrays |
Syntax of the declaration of a multi-dimensional array of variable length
<variable name> : ARRAY[*, *] OF <data type> := <initialization> ;
| Name of the array Example: |
| Declaration for a two-dimensional array of variable length Formally, an asterisk stands for each dimension of variable length. The dimensions are comma-separated. NoteAny number of dimensions of variable length are permitted. |
Syntax of the operators for calculating the limit index
LOWER_BOUND( <variable name> , <dimension number> ) UPPER_BOUND( <variable name> , <dimension number> )
The SUM function adds the integer values of the array elements and returns the calculated sum as a result. The sum is calculated across all array elements available at runtime. As the actual number of array elements will only be known at runtime, the local variable is declared as a one-dimensional array of variable length.
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;