I campi a una, due e tre dimensioni (array) sono supportati come tipi di dati elementari. Gli array possono essere definiti sia nella parte dichiarazione di un POU sia nell'elenco di variabili globali. È possibile utilizzare anche i controlli impliciti dei limiti. È possibile dichiarare array con lunghezza definita e lunghezza variabile.
Il tipo di dati ARRAY con lunghezza variabile può essere dichiarato solo per variabili VAR_IN_OUT di blocchi funzione, metodi e funzioni. Utilizzare gli operatori LOWER_BOUND(<array name>,<dim>) e UPPER_BOUND(<array name>,<dim>) per ottenere i limiti superiore e inferiore di tale array.
Sintassi della dichiarazione di un array di lunghezza definita
<Nome array> : ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <tipo elem.>
ll1, ll2, ll3 identificano il limite inferiore dell'intervallo del campo.
ul1, ul2 e ul3 identificano il limite superiore dell'intervallo del campo.
I valori degli intervalli devono essere di tipo intero.
Esempio della dichiarazione di un array di lunghezza definita
Card_game: ARRAY [1..13, 1..4] OF INT;
Sintassi della dichiarazione di un array di lunghezza variabile
<Nome array> : ARRAY [*|, *|, *] OF <tipo dati>;
Esempio della dichiarazione di un array di lunghezza variabile
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;
Esempio di inizializzazione completa di un array
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 *)
Esempio di inizializzazione di un array di una struttura
Definizione di struttura
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
END_TYPE
Inizializzazione dell'array
ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),(p1:=14,p2:=5,p3:=112)];
Esempio di inizializzazione parziale di un array
arr1 : ARRAY [1..10] OF INT := [1,2];
Gli elementi nei quali non è preassegnato alcun valore vengono inizializzati con il valore iniziale predefinito del tipo di base. Nell'esempio precedente, gli elementi arr1[3]...arr1[10] sono pertanto inizializzati con 0.
Esempio di inizializzazione di un array di blocchi funzione con parametri aggiuntivi in FB_Init
Esempio di un blocco funzione FB e metodo FB_Init con due parametri:
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;
Esempio di dichiarazione dell'array con inizializzaizone:
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
Accesso agli elementi dell'array
In un array a due dimensioni, l'accesso agli elementi avviene come segue:
<Nome array>[Index1,Index2]
Esempio:
Card_game [9,2]
Controllo delle funzioni sui limiti dell'array
Per poter accedere correttamente a un elemento durante il runtime, è necessario che per l'applicazione sia disponibile la funzione CheckBounds. Per informazioni sull'inserimento della funzione, consultare la descrizione della funzione POU per controlli impliciti.
Questa funzione di controllo deve gestire le violazioni dei limiti con un metodo appropriato (ad esempio, impostando un flag di errore rilevato o modificando l'indice). La funzione viene chiamata implicitamente non appena viene assegnata una variabile di tipo ARRAY.
Esempio d'uso della funzione CheckBounds
L'implementazione predefinita della funzione di controllo è la seguente:
Parte dichiarazione:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
Parte implementazione:
// Implicitly generated code : Only an Implementation suggestion
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF
Quando viene richiamata, la funzione assume i seguenti parametri di ingresso:
oindex: indice dell'elemento di campo
olower: limite inferiore dell'intervallo di campo
oupper: limite superiore dell'intervallo di campo
Non appena l'indice è compreso nel campo, il valore restituito è l'indice stesso. Altrimenti, in corrispondenza della violazione del campo verrà restituito il limite superiore o il limite inferiore dell'intervallo di campo.
Superamento del limite superiore dell'array a
Nel seguente esempio viene superato il limite superiore dell'array a:
PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b: INT:=10;
END_VAR
a[b]:=TRUE;
In questo esempio, la chiamata implicita alla funzione CheckBounds che precede l'assegnazione ha come effetto la modifica del valore dell'indice da 10 al limite superiore 7. Pertanto, all'elemento a[7] dell'array viene assegnato il valore TRUE. In questo modo si può correggere il tentativo di accesso all'esterno del campo dell'array tramite la funzione CheckBounds.