La versione 1.1 di EcoStruxure Machine Expert non supporta i controllori M258, LMC058 e LMC078.

Array

Panoramica

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;

Inizializzazione degli array

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.