Skip to main content

Tipo de datos: ARRAY OF

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.

Array unidimensional de longitud fija

Puede definir matrices en la parte de declaración de un POU o en listas de variables globales.

Sintaxis de la declaración de un arreglo unidimensional:

<variable name> :  ARRAY[ <dimension> ] OF <data type> := <initialization> ;

<variable name>

Nombre de la matriz

Ejemplo: aiCounter

<dimension>

Dimensión (límite de índice inferior a superior)

Ejemplo: 1..100

Una dimensión puede tener cualquier número de elementos indexados, determinados por el límite de índice inferior y superior.

Los límites del índice son números enteros; máximo del tipo de datos DINT.

<data type>

Tipo de datos de un elemento:

  • Tipo de datos elemental

  • Tipo de datos definido por el usuario

  • bloque de funciones

Sugerencia

Referencias y punteros a BIT las variables son inválido declaraciones, así como elementos de matriz con tipo base BIT.

<initialization>

Opcional

Valores iniciales de la matriz

ejemplo 217. Matriz unidimensional de 10 elementos enteros
VAR
    aiCounter : ARRAY[0..9] OF INT;
END_VAR

Límite de índice inferior: 0

Límite de índice superior: 9

Inicialización para los 10 elementos:

aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];

Acceso a los datos

iLocalVariable := aiCounter[2];

El valor 20 se asigna a la variable local.



Array multidimensional de longitud fija

<variable name> :  ARRAY[ <1st dimension> , <next dimensions> ] OF <data type> := <initialization> ;
<variable name> [ <index of 1st dimension> , <index of next dimensions> ]

<1st dimension>

Primera dimensión (límite de índice inferior a superior)

, <next dimensions>

Las siguientes dimensiones (separadas por comas)

Sintaxis para el acceso a datos

<index of 1st dimension>

Límite de índice de la primera dimensión

, <next dimensions>

Límite de índice de las siguientes dimensiones

ejemplo 218. Matriz bidimensional
VAR
    aiCardGame : ARRAY[1..2, 3..4] OF INT;
END_VAR

1ra dimensión: 1 a 2 (2 elementos de matriz)

2ª dimensión: 3 a 4 (2 elementos de matriz)

Inicialización para los elementos 2 * 2:

aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // Short notation for [10, 10, 20, 20]

Acceso a los datos

iLocal_1 := aiCardGame[1, 3]; // Assignment of 10
iLocal_2 := aiCardGame[2, 4]; // Assignment of 20


ejemplo 219. Array tridimensional
VAR
    aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT;
END_VAR

1ª dimensión: 1 a 2

2ª dimensión: 3 a 4

3ra dimensión: 5 a 6

2 * 2 * 2 = 8 elementos de matriz

Inicialización

aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [10, 20, 30, 40, 50, 60, 70, 80];

Acceso a los datos

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

Inicialización

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]

Acceso a los datos

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


ejemplo 220. Array tridimensional de una estructura definida por el usuario
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 matriz aData_A consta de un total de 3 * 3 * 10 = 90 elementos de matriz de tipo de datos DATA_A.

Inicializar parcialmente

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)];

En el ejemplo, solo los primeros 3 elementos se inicializan explícitamente. Los elementos a los que no se asigna explícitamente ningún valor de inicialización se inicializan internamente con el valor predeterminado del tipo de datos básico. Esto inicializa los componentes de la estructura en 0 comenzando con el elemento aData_A[2, 1, 1].

Acceso a los datos

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


ejemplo 221. Array de un bloque de función
FUNCTION BLOCK FBObject_A
VAR
    iCounter : INT;
END_VAR
...
;

PROGRAM PLC_PRG
VAR
    aObject_A : ARRAY[1..4] OF FBObject_A;
END_VAR

la matriz aObject_A consta de 4 elementos. Cada elemento instancia un FBObject_A bloque de funciones

Llamada de función

aObject_A[2]();


ejemplo 222. Array bidimensional de un bloque de funciones

Implementación de 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;

El bloque de funciones FB_Something tiene un método FB_Init que requiere 2 parámetros.

Instanciación de la matriz con inicialización.

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


Sugerencia

Tenga en cuenta la capacidad de usar la función de monitoreo implícita CheckBounds() para monitorear el mantenimiento de los límites del índice en tiempo de ejecución.

Array de arrays

La declaración de una "matriz de matrices" es una sintaxis alternativa para matrices multidimensionales. Una colección de elementos se anida en lugar de dimensionar los elementos. La profundidad de anidamiento es ilimitada.

Sintaxis para declaración

<variable name> :  ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;

Sintaxis para el acceso a datos

<variable name> [<index of first array> ] [<index of next array> ]

<variable name>

Nombre de la matriz

Ejemplo: aaaiCounter

ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF

Matriz anidada en tres niveles

Ejemplo: ARRAY[1..2, 1..3] OF ARRAY[1..3] OF ARRAY[1..4] OF ARRAY[1..5]

Nota

La profundidad de anidamiento es ilimitada.

<data type>

Tipo de datos de un elemento:

  • Tipo de datos elemental

  • Tipo de datos definido por el usuario

  • bloque de funciones

<initialization>

Opcional

Valores iniciales para la matriz anidada

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;

las variables aiPoints y ai2Boxes recopilar los mismos elementos de datos, sin embargo, la sintaxis de la declaración difiere de la del acceso a los datos.

_cds_aipoints.png
_cds_ai2boxes.png

Array de longitud variable

En bloques de funciones, funciones o métodos, puede declarar matrices de longitud variable en el VAR_IN_OUT sección de declaración.

El LOWER_BOUND y UPPER_BOUND se proporcionan operadores para determinar los límites de índice de la matriz utilizada real en tiempo de ejecución.

Sugerencia

Solo arreglos declarados estáticamente (no arreglos generados por medio del operador __NEW) se puede pasar a una matriz con longitud variable.

Sintaxis de la declaración de un arreglo unidimensional de longitud variable

<variable name> :  ARRAY[*] OF <data type> := <initialization> ;

<variable name>

Nombre de la matriz

Ejemplo: aMyVariableArray

<data type>

Tipo de datos de un elemento:

  • Tipo de datos elemental

  • Tipo de datos definido por el usuario

  • bloque de funciones

<initialization>

Opcional

Valores iniciales para la matriz de matrices

Sintaxis de la declaración de un arreglo multidimensional de longitud variable

<variable name> :  ARRAY[*, *] OF <data type> := <initialization> ;

<variable name>

Nombre de la matriz

Ejemplo: aMyVariableArray

ARRAY[*, *]

Declaración para una matriz bidimensional de longitud variable

Formalmente, un asterisco representa cada dimensión de longitud variable. Las dimensiones están separadas por comas.

Nota

Se permite cualquier número de dimensiones de longitud variable.

Sintaxis de los operadores para calcular el índice límite

LOWER_BOUND( <variable name> , <dimension number> )
UPPER_BOUND( <variable name> , <dimension number> )

El SUM La función suma los valores enteros de los elementos de la matriz y devuelve la suma calculada como resultado. La suma se calcula en todos los elementos de la matriz disponibles en tiempo de ejecución. Como el número real de elementos de la matriz solo se conocerá en tiempo de ejecución, la variable local se declara como una matriz unidimensional de longitud variable.

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;