Un array è una raccolta di elementi di dati dello stesso tipo di dati. Sono supportati array unidimensionali e multidimensionali di lunghezza fissa o variabile. 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.
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 inferiore e superiore di questo array.
__NEW
non sono consentiti.
<Nome_Array> : ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,..,<lln>..<uln>] OF <tipo elem.>
ll1, ll2, lln
identificare il limite inferiore dell'intervallo di campo.
ul1, ul2
e uln
identificare il limite superiore dell'intervallo di campo.
I valori degli intervalli devono essere di tipo intero.
Card_game: ARRAY [1..13, 1..4] OF INT;
<Array name> :ARRAY[* ( , * )+ ] OF <data type>;
// (...)+
: una o più ulteriori dimensioni
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) DO // 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]
vengono pertanto inizializzati con 0.
Esempio di 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
In un array a due dimensioni, l'accesso agli elementi avviene come segue:
<Array name>[Index1,Index2]
Esempio:
Card_game [9,2]
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 .
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.
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:
index: indice elemento campo
lower: limite inferiore dell'intervallo di campo
upper: 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.
Il limite superiore dell'array a viene superato nell'esempio seguente:
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
. Perciò, all'elemento a[7] dell'array viene assegnato il valore TRUE. In questo modo è possibile correggere il tentativo di accesso all'esterno dell'intervallo dell'array tramite la funzione CheckBounds
.