La version V1.1 d' EcoStruxure Machine Expert ne prend pas en charge les contrôleurs M258, LMC058 et LMC078.

Tableaux

Présentation

Les champs à une, deux et trois dimensions (tableaux) sont pris en charge comme types de données élémentaires. Les tableaux peuvent être définis dans la partie déclaration d'un POU et dans les listes de variables globales. Vous pouvez aussi prévoir des vérifications implicites des limites. Vous pouvez déclarer des tableaux de longueur définie ou variable.

La déclaration d'un tableau ARRAY de longueur variable est possible seulement pour les variables VAR_IN_OUT de blocs fonction, méthodes et fonctions. Les opérateurs LOWER_BOUND(<array name>,<dim>) et UPPER_BOUND(<array name>,<dim>) permettent d'obtenir les limites inférieure et supérieure du tableau.

Syntaxe de déclaration d'un tableau de longueur définie

<nom du tableau> : ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,<ll3>..<ul3>] OF <typed'élément>

ll1, ll2, ll3 indiquent la limite inférieure de la plage du champ.

ul1, ul2 et ul3 indiquent la limite supérieure de la plage du champ.

La plage est constituée de valeurs de type entier.

Exemple de déclaration d'un tableau de longueur définie

Card_game: ARRAY [1..13, 1..4] OF INT;

Syntaxe de déclaration d'un tableau de longueur variable

<nom du tableau> : ARRAY [*|, *|, *] OF <type de données>;

Exemple de déclaration d'un tableau de longueur variable

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;

Initialisation de tableaux

Exemple d'initialisation complète d'un tableau

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 *)

Exemple d'initialisation d'un tableau de structure

Définition de la structure

TYPE STRUCT1
STRUCT
 p1:int;
 p2:int;
 p3:dword;
END_STRUCT
END_TYPE

Initialisation du tableau

ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),(p1:=14,p2:=5,p3:=112)];

Exemple d'initialisation partielle d'un tableau

arr1 : ARRAY [1..10] OF INT := [1,2];

Les éléments sans valeur pré-attribuée sont initialisés sur la valeur initiale par défaut de type de base. Dans l'exemple précédent, les éléments arr1[3]...arr1[10] sont donc initialisés sur 0.

Exemple d'initialisation d'un tableau de blocs fonction avec paramètres supplémentaires dans FB_Init

Exemple de bloc fonction FB et de méthode FB_Init avec deux paramètres :

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;

Exemple de déclaration de tableau avec initialisation :

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

Accès aux éléments du tableau

Pour accéder aux éléments d'un tableau à deux dimensions, procédez comme suit :

<nom du tableau>[Index1,Index2]

Exemple :

Card_game [9,2]

Fonctions de vérification des limites d'un tableau

Pour pouvoir accéder correctement à un élément de tableau en cours d'exécution, la fonction CheckBounds doit être disponible dans l'application. Pour plus d'informations sur l'insertion de la fonction, consultez la description de la fonction POU pour vérifications implicites.

Pour traiter les dépassements de limites, cette fonction de vérification a besoin d'une méthode spécifique, comme la définition d'un indicateur d'erreur ou le réglage de l'index, par exemple. La fonction est appelée implicitement après l'attribution d'une variable de type ARRAY.

Exemple d'utilisation de la fonction CheckBounds

La fonction de vérification est implémentée par défaut comme suit :

Partie déclaration :

// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR

Partie implémentation :

// Implicitly generated code : Only an Implementation suggestion
IF  index < lower THEN
CheckBounds := lower;
ELSIF  index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF

Sur appel, la fonction reçoit les paramètres d'entrée suivants :

oindex : index d'élément du champ

olower : limite inférieure de la plage du champ

oupper : limite supérieure de la plage du champ

Tant que l'index se situe dans la plage, il est renvoyé. Dans le cas contraire, c'est la limite supérieure ou inférieure de la plage du champ qui est renvoyée, selon le dépassement détecté.

Dépassement de la limite supérieure du tableau a

L'exemple suivant illustre un dépassement de la limite supérieure du tableau a :

PROGRAM PLC_PRG
VAR
 a: ARRAY[0..7] OF BOOL;
    b: INT:=10;
END_VAR
a[b]:=TRUE;

Dans cet exemple, l'appel implicite de la fonction CheckBounds précédant l'attribution fait passer l'index 10 à la valeur de limite supérieure 7. La valeur TRUE est alors attribuée à l'élément a[7] du tableau. La fonction CheckBounds vous permet ainsi de résoudre les tentatives d'accès en dehors de la plage du tableau.