Tipo di dati: ARRAY OF
Un array è una raccolta di elementi di dati dello stesso tipo di dati. Sono supportati array singoli e multidimensionali di lunghezza fissa o variabile.
Matrice unidimensionale di lunghezza fissa
È possibile definire gli array nella parte di dichiarazione di una POU o negli elenchi di variabili globali.
Sintassi della dichiarazione di un array unidimensionale:
<variable name> : ARRAY[ <dimension> ] OF <data type> := <initialization> ;
| Nome dell'array Esempio: |
| Dimensione (limite di indice da inferiore a superiore) Esempio: Una dimensione può avere un numero qualsiasi di elementi indicizzati, determinato dal limite di indice inferiore e superiore. I limiti dell'indice sono numeri interi; massimo del tipo di dati |
| Tipo di dati di un elemento:
SuggerimentoRiferimenti e puntatori a |
| Opzionale Valori iniziali dell'array |
VAR aiCounter : ARRAY[0..9] OF INT; END_VAR
Limite indice inferiore: 0
Limite superiore dell'indice: 9
Inizializzazione per i 10 elementi:
aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];
Accesso ai dati
iLocalVariable := aiCounter[2];
Il valore 20 è assegnato alla variabile locale.
Matrice multidimensionale di lunghezza fissa
<variable name> : ARRAY[ <1st dimension> , <next dimensions> ] OF <data type> := <initialization> ;
<variable name> [ <index of 1st dimension> , <index of next dimensions> ]
| Prima dimensione (limite di indice da inferiore a superiore) |
| Le dimensioni successive (separate da virgole) |
Sintassi per l'accesso ai dati
| Limite indice della prima dimensione |
| Limite indice delle dimensioni successive |
VAR aiCardGame : ARRAY[1..2, 3..4] OF INT; END_VAR
1a dimensione: da 1 a 2 (2 elementi dell'array)
2a dimensione: da 3 a 4 (2 elementi dell'array)
Inizializzazione per gli elementi 2 * 2:
aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // Short notation for [10, 10, 20, 20]
Accesso ai dati
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
1a dimensione: da 1 a 2
2a dimensione: da 3 a 4
3a dimensione: da 5 a 6
2 * 2 * 2 = 8 elementi dell'array
Inizializzazione
aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [10, 20, 30, 40, 50, 60, 70, 80];
Accesso ai dati
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
Inizializzazione
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]
Accesso ai dati
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
La matrice aData_A
è costituito da un totale di 3 * 3 * 10 = 90 elementi di matrice di tipo di dati DATA_A
.
Inizializzare parzialmente
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)];
Nell'esempio, solo i primi 3 elementi vengono inizializzati in modo esplicito. Gli elementi a cui non è assegnato alcun valore di inizializzazione in modo esplicito vengono inizializzati internamente con il valore predefinito del tipo di dati di base. Questo inizializza i componenti della struttura a 0 a partire dall'elemento aData_A[2, 1, 1]
.
Accesso ai dati
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
La matrice aObject_A
composto da 4 elementi. Ogni elemento istanzia a FBObject_A
blocco funzione.
Chiamata di funzione
aObject_A[2]();
Implementazione di FB_Something
con metodo 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;
Il blocco funzione FB_Something
ha un metodo FB_Init
che richiede 2 parametri.
Istanziazione dell'array con inizializzazione
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
Suggerimento
Notare la possibilità di utilizzare la funzione di monitoraggio implicito CheckBounds()
per monitorare il mantenimento dei limiti dell'indice in fase di esecuzione.
Array di array
La dichiarazione di un "array di array" è una sintassi alternativa per gli array multidimensionali. Una raccolta di elementi viene nidificata invece di quotare gli elementi. La profondità di nidificazione è illimitata.
Sintassi per la dichiarazione
<variable name> : ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;
Sintassi per l'accesso ai dati
<variable name> [<index of first array> ] [<index of next array> ]
| Nome dell'array Esempio: |
| Array annidato su tre livelli Esempio: NotaLa profondità di nidificazione è illimitata. |
| Tipo di dati di un elemento:
|
| Opzionale Valori iniziali per l'array nidificato |
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;
Le variabili aiPoints
e ai2Boxes
raccogliere gli stessi dati, tuttavia la sintassi per la dichiarazione differisce da quella dei dati di accesso.


Matrice di lunghezza variabile
Nei blocchi funzione, nelle funzioni o nei metodi, è possibile dichiarare array di lunghezza variabile nel file VAR_IN_OUT
sezione dichiarazione.
Il LOWER_BOUND
e UPPER_BOUND
gli operatori vengono forniti per determinare i limiti dell'indice dell'array effettivamente utilizzato in fase di esecuzione.
Suggerimento
Solo array dichiarati staticamente (non array generati tramite l'operatore __NEW
) può essere passato a un array con lunghezza variabile.
Sintassi della dichiarazione di un array unidimensionale di lunghezza variabile
<variable name> : ARRAY[*] OF <data type> := <initialization> ;
| Nome dell'array Esempio: |
| Tipo di dati di un elemento:
|
| Opzionale Valori iniziali per l'array di array |
Sintassi della dichiarazione di un array multidimensionale di lunghezza variabile
<variable name> : ARRAY[*, *] OF <data type> := <initialization> ;
| Nome dell'array Esempio: |
| Dichiarazione per un array bidimensionale di lunghezza variabile Formalmente, un asterisco sta per ogni dimensione di lunghezza variabile. Le dimensioni sono separate da virgole. NotaÈ consentito un numero qualsiasi di dimensioni di lunghezza variabile. |
Sintassi degli operatori per il calcolo dell'indice limite
LOWER_BOUND( <variable name> , <dimension number> ) UPPER_BOUND( <variable name> , <dimension number> )
Il SUM
La funzione aggiunge i valori interi degli elementi dell'array e restituisce la somma calcolata come risultato. La somma viene calcolata su tutti gli elementi dell'array disponibili in fase di esecuzione. Poiché il numero effettivo di elementi dell'array sarà noto solo in fase di esecuzione, la variabile locale viene dichiarata come un array unidimensionale di lunghezza variabile.
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;