Una matriz es una colección de elementos de datos del mismo tipo de datos. Se admiten matrices unidimensionales y multidimensionales de longitud fija o variable. Puede definir matrices tanto en la parte de declaraciones de un POU como en las listas de variables globales. También puede utilizar comprobaciones de límites implícitas.
El tipo de datos ARRAY de longitud variable solo puede declararse para variables VAR_IN_OUT de bloques de funciones, métodos y funciones. Utilice los operadores LOWER_BOUND(<array name>,<dim>)
y UPPER_BOUND(<array name>,<dim>)
para obtener los límites inferior y superior de la matriz en cuestión.
<Nombre de la matriz> : ARRAY [<ll1>..<ul1>,<ll2>..<ul2>,..,<lln>..<uln>] OF <tipo de elemento>
ll1, ll2, lln
identifican el límite inferior del rango de campo.
ul1, ul2
y uln
identifican el límite superior del rango de campo.
Los valores del rango deben ser de tipo entero.
Card_game: ARRAY [1..13, 1..4] OF INT;
<Array name> :ARRAY[* ( , * )+ ] OF <data type>;
// (...)+
: una o más dimensiones
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;
Ejemplo para la inicialización completa de una matriz.
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 *)
Ejemplo de la inicialización de la matriz de una estructura.
Definición de la estructura
TYPE STRUCT1
STRUCT
p1:int;
p2:int;
p3:dword;
END_STRUCT
END_TYPE
Inicialización de la matriz
ARRAY[1..3] OF STRUCT1:= [(p1:=1,p2:=10,p3:=4723),(p1:=2,p2:=0,p3:=299),(p1:=14,p2:=5,p3:=112)];
Ejemplo de la inicialización parcial de una matriz.
arr1 : ARRAY [1..10] OF INT := [1,2];
Los elementos en los que no hay ningún valor preasignado se inicializan con el valor inicial predeterminado del tipo básico. En consecuencia, los elementos arr1[3]...arr1[10]
del ejemplo anterior se inicializan con 0.
Ejemplo de bloque de funciones FB y método FB_Init con dos parámetros:
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;
Ejemplo de declaración de matriz con inicialización:
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
En una matriz de dos dimensiones, acceda a los elementos de la siguiente manera:
<Nombre de la matriz>[Index1,Index2]
Ejemplo:
Card_game [9,2]
Para acceder a un elemento de la matriz de una manera apropiada durante el tiempo de ejecución, la función CheckBounds
debe estar disponible para la aplicación. Para obtener información sobre cómo insertar la función, consulte la descripción de la función .
Esta función de verificación debe tratar las infracciones de límite con un método apropiado (por ejemplo, estableciendo un indicador de error detectado o ajustando el índice). Se llama implícitamente la función en cuanto se asigna una variable de tipo ARRAY.
La implementación predeterminada de la función de verificación es la siguiente:
Parte de la declaración:
// Implicitly generated code : DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
Parte de implementación:
// Implicitly generated code : Only an Implementation suggestion
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF
Una vez llamada, la función obtiene los siguientes parámetros de entrada:
index: índice de elementos de campo.
lower: límite inferior del rango de campo.
upper: límite superior del rango de campo.
Mientras el índice permanezca dentro del rango, el valor de retorno será el propio índice. De lo contrario, en correspondencia con la infracción de rango, el límite superior o inferior del rango de campo será devuelto.
El límite superior de la matriz a se sobrepasa en el ejemplo a continuación:
PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b: INT:=10;
END_VAR
a[b]:=TRUE;
En este ejemplo, la llamada implícita a la función CheckBounds
que precede a la asignación modifica el valor del índice, que pasa de 10
a un límite superior de 7
. Así pues, el valor TRUE se asigna al elemento a[7] de la matriz. De esta manera podrá corregir intentos de acceso fuera del rango de la matriz mediante la función CheckBounds
.