Tipo de datos: __VECTOR
Nota
Las operaciones vectoriales se admiten de forma nativa solo en procesadores de 64 bits y ofrecen una ventaja de rendimiento solo en estos procesadores. La hoja de datos del controlador proporciona información sobre el procesador utilizado en el controlador.
Actualmente, las operaciones vectoriales en las plataformas x86/64 bits con SSE2 y ARM64 con NEON se admiten de forma nativa. En todas las demás plataformas, las operaciones vectoriales se traducen en declaraciones individuales. Por ejemplo, la suma de vectores se ejecuta luego con múltiples operaciones de suma única.
Las extensiones del conjunto de comandos de los procesadores son extensiones SIMD. SIMD (Instrucción única, datos múltiples) describe una arquitectura de computadora en la que múltiples conjuntos de datos del mismo tipo se procesan simultáneamente en paralelo y, por lo tanto, más rápido con una llamada de comando. En operaciones vectoriales, por ejemplo, se pueden sumar 4 pares de números al mismo tiempo.
Sintaxis
<variable name> : __VECTOR[ <vector size> ] OF <element type> := <initialization> ; <vector size> : 1 |2 | 3 | 4 | 5| 6 | 7| 8 <element type> : REAL | LREAL
La inicialización de variables es opcional.
Un tipo de dato vectorial es una matriz de números de punto flotante con un máximo de 8 elementos. El __vc<operator name>
Hay operadores disponibles para este tipo de datos. Puede usarlos para implementar operaciones vectoriales sin llamadas a funciones adicionales.
Sintaxis para el acceso al índice
<variable name>[ <index> ] <index> : 0 | 1 | 2| 3 | 4 | 5| 6 | 7
Al indexar una variable vectorial, puede acceder a un solo elemento del vector. El índice comienza en 0 y continúa hasta <tamaño del vector> - 1.
PROGRAM PLC_PRG VAR vcA : __VECTOR[3] OF REAL; END_VAR vcA[0] := 1.1; vcA[1] := 2.2; vcA[2] := 3.3;
Determinación del tamaño óptimo del vector
Sugerencia
Utilice el tamaño de vector óptimo según su sistema de destino como tamaño de vector para programar el código más eficiente posible.
Para los sistemas de destino cuya arquitectura informática es generalmente adecuada para el procesamiento de vectores, no recomendamos utilizar vectores de tamaño arbitrario. Existe un tamaño de vector óptimo dependiendo del tipo de procesamiento de datos del procesador. Los vectores que se declaran con este tamaño de matriz se procesan lo más rápido posible. Los vectores que se declaran como una matriz más grande no tienen ventaja en la velocidad. Los vectores que se declaran como arreglos más pequeños no aprovechan al máximo las capacidades del procesador.
Puede consultar el tamaño óptimo en tiempo de ejecución. Puedes encontrar la información en las constantes. Constants.vcOptimalREAL
(para vectores con REAL
elementos) y Constants.vcOptimalLREAL
(para vectores con LREAL
elementos). Las constantes tienen la LREAL
tipo de datos. Si una constante devuelve el valor 1
como el valor óptimo, esto significa que el procesamiento vectorial acelerado no está disponible para el sistema de destino.
PROGRAM PLC_PRG VAR iOVS_REAL : INT; // Optimal vector size for REAL eleements iOVS_LREAL : INT; // Optimal vector size for LREAL eleements END_VAR iOVS_REAL := Constants.vcOptimalREAL; iOVS_LREAL := Constants.vcOptimalLREAL;
Una aplicación que se carga en el CODESYS El sistema de destino Control Win V3 x64 devuelve los siguientes valores en tiempo de ejecución:

Operador: __VCADD
El operador calcula la suma de dos vectores.
Sintaxis
<vector variable> := <1st vector operand> __VCADD <2nd vector operand>;
FUNCTION_BLOCK FB_ADD VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 3); vcResult : __VECTOR[3] OF REAL; END_VAR vcResult := vcA __VCADD vcB;
Operador: __VCSUB
El operador calcula la diferencia entre dos vectores.
Sintaxis
<vector variable> := <vector minuend> __VCSUB <vector subtrahend>;
FUNCTION_BLOCK FB_SUB VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 3); vcResult0 : __VECTOR[3] OF REAL; vcResult1 : __VECTOR[3] OF REAL; END_VAR vcResult0 := vcA __VCSUB vcB; vcResult1 := vcB __VCSUB vcA;
Operador: __VCMUL
El operador calcula el producto de dos vectores o un escalar (número de coma flotante) y un vector.
Sintaxis
<vector variable> := <1st vector operand> __VCMUL <2nd vector operand> | <scalar operand> __VCMUL <vector operand> | <vector operand> __VCMUL <scalar operand> ;
FUNCTION_BLOCK FB_MUL VAR rScalar : REAL := 1.1; vcA : __VECTOR[3] OF REAL; vcB : __VECTOR[3] OF REAL; vcResult0 : __VECTOR[3] OF REAL; vcResult1 : __VECTOR[3] OF REAL; vcResult2 : __VECTOR[3] OF REAL; END_VAR vcResult0 := vcA __VCMUL vcB; vcResult1 := rScalar __VCMUL vcB; vcResult2 := vcA __VCMUL 3.3;
Operador: __VCDIV
El operador calcula el cociente de dos vectores o un vector y un escalar.
Sintaxis
<vector variable> := <vector dividend> __VCDIV <vector divisor> | < vector dividend> __VCMUL <scalar divisor> ;
FUNCTION_BLOCK FB_DIV VAR iScalar : INT := 3; rScalar : REAL := 1.5; vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 3); vcResult0 : __VECTOR[3] OF REAL; vcResult1 : __VECTOR[3] OF REAL; vcResult2 : __VECTOR[3] OF REAL; END_VAR vcResult0 := vcA __VCDIV vcB; // ERROR CODE vcResult1 := rScalar __VCDIV vcB; // ERROR CODE vcResult1 := iScalar __VCDIV vcB; // ERROR CODE vcResult1 := 3.3 __VCDIV vcB; vcResult2 := vcA __VCDIV 1.5; vcResult2 := vcA __VCDIV iScalar; vcResult2 := vcA __VCDIV rScalar;
Operador: __VCDOT
El operador calcula el producto punto (producto escalar) de dos vectores.
Sintaxis
<skalar variable> := <1st vector operand> __VCDOT <2nd vector operand> ;
FUNCTION_BLOCK FB_DOT VAR rResult : REAL; vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 3); END_VAR rResult := vcA __VCDOT vcB; // = 18
Operador: __VCSQRT
El operador calcula la raíz cuadrada de cada elemento en el vector.
Sintaxis
<vector variable> := __VCSQRT( <vector operand> );
FUNCTION_BLOCK FB_SQRT VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(4, 9, 16); vcResult0 : __VECTOR[3] OF REAL; END_VAR vcResult0 := __VCSQRT(vcA);
Operador: __VCMAX
El operador calcula el vector máximo de dos vectores. El máximo se determina elemento por elemento.
Sintaxis
<vector variable> := __VCMAX( <1st vector operand>, <2nd vector operand>);
FUNCTION_BLOCK FB_MAX VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 6); vcResult0 : __VECTOR[3] OF REAL; END_VAR vcResult0 := __VCMAX(vcA, vcB);
Operador: __VCMIN
El operador calcula el vector mínimo de dos vectores. El mínimo se determina elemento por elemento.
Sintaxis
<vector variable> := __VCMIN( <1st vector operand>, <2nd vector operand>);
FUNCTION_BLOCK FB_MIN VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 6); vcResult0 : __VECTOR[3] OF REAL; END_VAR vcResult0 := __VCMIN(vcA, vcB);
Operador: __VCSET_REAL
El operador establece todos los elementos de un vector en una declaración. Los elementos tienen la REAL
tipo de datos.
Sintaxis
<vector variable> := __VCSET_REAL( <first literal>, ( < next literal> )+ ) ; ( ... )+ // number of elements have to match
FUNCTION_BLOCK FB_SET VAR vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); vcB : __VECTOR[3] OF REAL := __VCSET_REAL(1, 2, 3); END_VAR vcA := __VCSET_REAL(4, 4, 4); vcB := __VCSET_REAL(1.1, 2.2, 3.3);
Operador: __VCSET_LREAL
El operador establece todos los elementos de un vector a la vez en una declaración. Los elementos tienen la LREAL
tipo de datos.
Se pueden usar siempre que las variables sean válidas, como en asignaciones en implementaciones o como parámetros en llamadas a funciones.
Sintaxis
<vector variable> := __VCSET_LREAL( <first literal>, ( < next literal> )+ ) ; ( ... )+ // number of elements have to match
FUNCTION_BLOCK FB_SET VAR vclA : __VECTOR[3] OF LREAL := __VCSET_LREAL(3, 3, 3); vclB : __VECTOR[3] OF LREAL := __VCSET_LREAL(1, 2, 3); END_VAR vclA := __VCSET_LREAL(-1.7976931348623158E+308, 0.0, 1.7976931348623158E+308); vclB := __VCSET_LREAL(-1.7976931348623158E+308, 0.0, 1.7976931348623158E+308);
Operador: __VCLOAD_REAL
El operador interpreta cualquier área de memoria arbitraria como un vector. Esto es útil para conectar variables vectoriales al código existente. El operador requiere 2 parámetros. El primer parámetro indica el número de elementos del vector. El segundo parámetro es un puntero a la REAL
datos.
Importante
__VCLOAD_REAL(<n>,<ptr>)
leer <n>
valores REALES consecutivos en la dirección <ptr>
. Si menos de <n>
Los valores en esta dirección pueden hacer que el controlador se bloquee o lea memoria no deseada.
Sintaxis
<vector variable> := __VCLOAD_REAL( <vector size>, <pointer to data of type REAL> ) ; <vector size> : 2 | 3 | 4 | 5| 6 | 7| 8
FUNCTION_BLOCK FB_LOAD VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR rData : ARRAY[0..2] OF REAL := [1.234, 5.678, 9.123]; vcA : __VECTOR[3] OF REAL := __VCSET_REAL(3, 3, 3); END_VAR vcA := __VCLOAD_REAL(3, ADR(rData[0]));
Operador: __VCLOAD_LREAL
El operador interpreta cualquier área de memoria arbitraria como un vector. Esto es útil para conectar variables vectoriales al código existente. El operador requiere 2 parámetros. El primer parámetro indica el número de elementos del vector. El segundo parámetro es un puntero a la LREAL
datos.
Importante
__VCLOAD_LREAL (<n>,<ptr>)
lee <n>
valores LREAL sucesivos en el <ptr>
habla a. Si hay menos de <n>
valores en esta dirección, esto puede hacer que el controlador se bloquee o lea memoria no deseada.
Sintaxis
<vector variable> := __VCLOAD_LREAL( <vector size>, <pointer to data of type LREAL> ); <number of vector elements> : 1 | 2 | 3 | 4 | 5| 6 | 7| 8
FUNCTION_BLOCK FB_LOAD VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR rData : ARRAY[0..3] OF LREAL := [-1.7976931348623158E+308, 1.6E+308, 1.7E+308, -1.6E+308]; vcA : __VECTOR[3] OF LREAL := __VCSET_LREAL(1, 2, 3); END_VAR vcA := __VCLOAD_LREAL(3, ADR(rData[0]));
Operador: __VCSTORE
El operador guarda/copia el contenido del vector en la dirección de memoria especificada. El número y los tipos de elementos se aplican automáticamente a partir de las variables vectoriales.
Importante
__VCSTORE(<n>,<ptr>)
escribe <n>
valores consecutivos en la dirección <ptr>
. Si menos de <n>
Los valores en esta dirección pueden hacer que el controlador se bloquee o escriba memoria no deseada.
Sintaxis
__VCSTORE( <pointer to data>, <vector variable> );
FUNCTION_BLOCK FB_STORE VAR_INPUT END_VAR VAR_OUTPUT END_VAR VAR rData : ARRAY[0..2] OF REAL := [1, 2, 3]; pData: POINTER TO REAL := ADR(rData[0]); lrData : ARRAY [0..3] OF LREAL := [1, 2, 3, 4]; plData: POINTER TO LREAL := ADR(lrData[0]; vcA : __VECTOR[3] OF REAL := __VCSET_REAL( 1.234, 5.678, 9.123); vclA : __VECTOR[4] OF LREAL := __VCSET_LREAL(-1.7976931348623158E+308, 1.6E+308, 1.7E+308, -1.6E+308); END_VAR __VCSTORE(pData, vcA); __VCSTORE(plData, vclA);