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> ;
| Nombre de la matriz Ejemplo: |
| Dimensión (límite de índice inferior a superior) Ejemplo: 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 |
| Tipo de datos de un elemento:
SugerenciaReferencias y punteros a |
| Opcional Valores iniciales de la matriz |
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> ]
| Primera dimensión (límite de índice inferior a superior) |
| Las siguientes dimensiones (separadas por comas) |
Sintaxis para el acceso a datos
| Límite de índice de la primera dimensión |
| Límite de índice de las siguientes dimensiones |
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
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
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
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]();
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> ]
| Nombre de la matriz Ejemplo: |
| Matriz anidada en tres niveles Ejemplo: NotaLa profundidad de anidamiento es ilimitada. |
| Tipo de datos de un elemento:
|
| 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.


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> ;
| Nombre de la matriz Ejemplo: |
| Tipo de datos de un elemento:
|
| 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> ;
| Nombre de la matriz Ejemplo: |
| 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. NotaSe 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;