Matrices

Descripción general

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.

Sintaxis para la declaración de una matriz de longitud definida

<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.

Ejemplo para la declaración de una matriz de longitud definida

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

Sintaxis para la declaración de una matriz de longitud variable

<Array name> :ARRAY[* ( , * )+ ] OF <data type>;

// (...)+: una o más dimensiones

Ejemplo de declaración de una matriz de longitud 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) DO // The length of the respective array is determined.
  sum2:= sum2 + A[i];
END_FOR;
SUM:= sum2;

Inicializando matrices

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 inicialización de una matriz de bloques de funciones con parámetros adicionales en FB_Init

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

Acceso a los elementos de la matriz

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]

Funciones de verificación para límites de matriz

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 POU para comprobaciones implícitas.

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.

Ejemplo de uso de CheckBounds de función

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.

Sobrepasar el límite superior de la matriz a

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.