Tipo di dati: __VECTOR
Nota
Le operazioni vettoriali sono supportate in modo nativo solo su processori a 64 bit e offrono un vantaggio in termini di prestazioni solo su questi processori. La scheda tecnica del titolare fornisce informazioni sul responsabile del trattamento utilizzato dal titolare.
Attualmente, le operazioni vettoriali sulle piattaforme x86/64-bit con SSE2 e ARM64 con NEON sono supportate in modo nativo. Su tutte le altre piattaforme, le operazioni vettoriali vengono tradotte in singole istruzioni. Ad esempio, l'addizione vettoriale viene quindi eseguita con più operazioni di addizione singola.
Le estensioni del set di comandi dei processori sono estensioni SIMD. SIMD (Single Instruction, Multiple Data) descrive un'architettura di computer in cui più set di dati dello stesso tipo vengono elaborati simultaneamente in parallelo e quindi più velocemente con una chiamata di comando. Nelle operazioni vettoriali, ad esempio, è possibile aggiungere contemporaneamente 4 coppie di numeri.
Sintassi
<variable name> : __VECTOR[ <vector size> ] OF <element type> := <initialization> ; <vector size> : 1 |2 | 3 | 4 | 5| 6 | 7| 8 <element type> : REAL | LREAL
L'inizializzazione delle variabili è facoltativa.
Un tipo di dati vettoriale è una matrice di numeri a virgola mobile con un massimo di 8 elementi. Il __vc<operator name>
sono disponibili operatori per questo tipo di dati. Puoi usarli per implementare operazioni vettoriali senza chiamate di funzioni aggiuntive.
Sintassi per l'accesso all'indice
<variable name>[ <index> ] <index> : 0 | 1 | 2| 3 | 4 | 5| 6 | 7
Quando si indicizza una variabile vettoriale, è possibile accedere a un singolo elemento del vettore. L'indice inizia da 0 e va fino a <dimensione vettore> - 1.
PROGRAM PLC_PRG VAR vcA : __VECTOR[3] OF REAL; END_VAR vcA[0] := 1.1; vcA[1] := 2.2; vcA[2] := 3.3;
Determinazione della dimensione ottimale del vettore
Suggerimento
Utilizzare la dimensione del vettore ottimale a seconda del sistema di destinazione come dimensione del vettore per programmare il codice più efficiente possibile.
Per i sistemi di destinazione la cui architettura del computer è generalmente adatta per l'elaborazione vettoriale, non è consigliabile utilizzare vettori di dimensioni arbitrarie. Esiste una dimensione del vettore ottimale a seconda del tipo di elaborazione dei dati del processore. I vettori dichiarati con questa dimensione dell'array vengono elaborati il più rapidamente possibile. I vettori dichiarati come un array più grande non hanno un vantaggio in termini di velocità. I vettori dichiarati come array più piccoli non sfruttano appieno le capacità del processore.
È possibile interrogare la dimensione ottimale in fase di esecuzione. Puoi trovare le informazioni nelle costanti Constants.vcOptimalREAL
(per vettori con REAL
elementi) e Constants.vcOptimalLREAL
(per vettori con LREAL
elementi). Le costanti hanno il LREAL
tipo di dati. Se una costante restituisce il valore 1
come valore ottimale, significa che l'elaborazione vettoriale accelerata non è disponibile per il sistema di destinazione.
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;
Un'applicazione caricata su CODESYS Il sistema di destinazione Control Win V3 x64 restituisce i seguenti valori in fase di esecuzione:

Operatore: __VCADD
L'operatore calcola la somma di due vettori.
Sintassi
<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;
Operatore: __VCSUB
L'operatore calcola la differenza tra due vettori.
Sintassi
<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;
Operatore: __VCMUL
L'operatore calcola il prodotto di due vettori o uno scalare (numero in virgola mobile) e un vettore.
Sintassi
<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;
Operatore: __VCDIV
L'operatore calcola il quoziente di due vettori o un vettore e uno scalare.
Sintassi
<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;
Operatore: __VCDOT
L'operatore calcola il prodotto scalare (prodotto scalare) di due vettori.
Sintassi
<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
Operatore: __VCSQRT
L'operatore calcola la radice quadrata di ogni elemento nel vettore.
Sintassi
<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);
Operatore: __VCMAX
L'operatore calcola il vettore massimo di due vettori. Il massimo è determinato elemento per elemento.
Sintassi
<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);
Operatore: __VCMIN
L'operatore calcola il vettore minimo di due vettori. Il minimo è determinato elemento per elemento.
Sintassi
<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);
Operatore: __VCSET_REAL
L'operatore imposta tutti gli elementi di un vettore in un'istruzione. Gli elementi hanno il REAL
tipo di dati.
Sintassi
<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);
Operatore: __VCSET_LREAL
L'operatore imposta tutti gli elementi di un vettore contemporaneamente in un'istruzione. Gli elementi hanno il LREAL
tipo di dati.
Possono essere utilizzati ovunque siano valide variabili, ad esempio nelle assegnazioni nelle implementazioni o come parametri nelle chiamate di funzione.
Sintassi
<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);
Operatore: __VCLOAD_REAL
L'operatore interpreta qualsiasi area di memoria arbitraria come un vettore. Questo è utile per connettere variabili vettoriali al codice esistente. L'operatore richiede 2 parametri. Il primo parametro indica il numero di elementi vettoriali. Il secondo parametro è un puntatore a REAL
dati.
Importante
__VCLOAD_REAL(<n>,<ptr>)
leggere <n>
valori REAL consecutivi all'indirizzo <ptr>
. Se inferiore a <n>
I valori a questo indirizzo possono causare l'arresto anomalo del controller o la lettura di memoria indesiderata.
Sintassi
<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]));
Operatore: __VCLOAD_LREAL
L'operatore interpreta qualsiasi area di memoria arbitraria come un vettore. Questo è utile per connettere variabili vettoriali al codice esistente. L'operatore richiede 2 parametri. Il primo parametro indica il numero di elementi vettoriali. Il secondo parametro è un puntatore a LREAL
dati.
Importante
__VCLOAD_LREAL (<n>,<ptr>)
legge <n>
valori LREAL successivi al <ptr>
indirizzo. Se ci sono meno di <n>
valori a questo indirizzo, ciò può causare l'arresto anomalo del controller o la lettura di memoria indesiderata.
Sintassi
<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]));
Operatore: __VCSTORE
L'operatore salva/copia il contenuto del vettore nell'indirizzo di memoria specificato. Il numero ed i tipi di elementi vengono applicati automaticamente dalle variabili vettoriali.
Importante
__VCSTORE(<n>,<ptr>)
scrive <n>
valori consecutivi all'indirizzo <ptr>
. Se inferiore a <n>
I valori a questo indirizzo possono causare l'arresto anomalo del controller o la scrittura di memoria indesiderata.
Sintassi
__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);