データ型:__ VECTOR
注記
ベクトル演算は64ビットプロセッサでのみネイティブにサポートされており、これらのプロセッサでのみパフォーマンス上の利点があります。コントローラのデータシートには、コントローラで使用されているプロセッサに関する情報が記載されています。
現在、SSE2を使用するx86 / 64ビットプラットフォームおよびNEONを使用するARM64でのベクトル演算がネイティブにサポートされています。他のすべてのプラットフォームでは、ベクトル演算は個々のステートメントに変換されます。たとえば、ベクトル加算は複数の単一加算演算で実行されます。
プロセッサのコマンドセット拡張はSIMD拡張です。 SIMD(単一命令、複数データ)は、同じタイプの複数のデータセットが同時に並行して処理されるため、1回のコマンド呼び出しでより高速になるコンピューターアーキテクチャーを表します。たとえば、ベクトル演算では、4組の数値を同時に加算できます。
構文
<variable name> : __VECTOR[ <vector size> ] OF <element type> := <initialization> ; <vector size> : 1 |2 | 3 | 4 | 5| 6 | 7| 8 <element type> : REAL | LREAL
変数の初期化はオプションです。
ベクトルデータ型は、最大8つの要素を持つ浮動小数点数の配列です。 The __vc<operator name>
このデータ型には演算子を使用できます。これらを使用して、追加の関数呼び出しなしでベクトル演算を実装できます。
インデックスアクセスの構文
<variable name>[ <index> ] <index> : 0 | 1 | 2| 3 | 4 | 5| 6 | 7
ベクトル変数にインデックスを付けるときは、ベクトルの1つの要素にアクセスできます。インデックスは0から始まり、<ベクトルサイズ> -1まで続きます。
PROGRAM PLC_PRG VAR vcA : __VECTOR[3] OF REAL; END_VAR vcA[0] := 1.1; vcA[1] := 2.2; vcA[2] := 3.3;
最適なベクトルサイズの決定
ヒント
可能な限り最も効率的なコードをプログラムするために、ターゲットシステムに応じて最適なベクトルサイズをベクトルサイズとして使用します。
コンピュータアーキテクチャが一般的にベクトル処理に適しているターゲットシステムの場合、任意のサイズのベクトルを使用することはお勧めしません。プロセッサのデータ処理のタイプに応じて、最適なベクトルサイズがあります。この配列サイズで宣言されたベクトルは、可能な限り迅速に処理されます。より大きな配列として宣言されたベクトルには、速度の利点はありません。より小さな配列として宣言されたベクトルは、プロセッサの機能を十分に活用していません。
実行時に最適なサイズを照会できます。あなたは定数で情報を見つけることができます Constants.vcOptimalREAL
(ベクトルの場合 REAL
要素)と Constants.vcOptimalLREAL
(ベクトルの場合 LREAL
要素)。定数には LREAL
データ・タイプ。定数が値を返す場合 1
最適値として、これは加速ベクトル処理がターゲットシステムで利用できないことを意味します。
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;
にロードされるアプリケーション CODESYS Control Win V3 x64ターゲットシステムは、実行時に次の値を返します。

演算子:__ VCADD
オペレーターは、2つのベクトルの合計を計算します。
構文
<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;
演算子:__ VCSUB
演算子は、2つのベクトル間の差を計算します。
構文
<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;
演算子:__ VCMUL
演算子は、2つのベクトルまたはスカラー(浮動小数点数)とベクトルの積を計算します。
構文
<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;
演算子:__ VCDIV
演算子は、2つのベクトル、またはベクトルとスカラーの商を計算します。
構文
<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;
演算子:__ VCDOT
演算子は、2つのベクトルの内積(スカラー積)を計算します。
構文
<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
演算子:__ VCSQRT
演算子は、ベクトル内の各要素の平方根を計算します。
構文
<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);
演算子:__ VCMAX
オペレーターは、2つのベクトルの最大ベクトルを計算します。最大値は要素ごとに決定されます。
構文
<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);
演算子:__ VCMIN
オペレーターは、2つのベクトルの最小ベクトルを計算します。最小値は要素ごとに決定されます。
構文
<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);
演算子:__ VCSET_REAL
演算子は、ベクトルのすべての要素をステートメントに設定します。要素には REAL
データ・タイプ。
構文
<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);
演算子:__ VCSET_LREAL
演算子は、ベクトルのすべての要素をステートメントに一度に設定します。要素には LREAL
データ・タイプ。
これらは、実装での割り当てや関数呼び出しでのパラメーターなど、変数が有効な場所であればどこでも使用できます。
構文
<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);
演算子:__ VCLOAD_REAL
演算子は、任意のメモリ領域をベクトルとして解釈します。これは、ベクトル変数を既存のコードに接続するのに役立ちます。オペレーターには2つのパラメーターが必要です。最初のパラメーターは、ベクトル要素の数を示します。 2番目のパラメーターは、 REAL
データ。
重要
__VCLOAD_REAL(<n>,<ptr>)
読み取り <n>
での連続するREAL値 <ptr>
住所。未満の場合 <n>
このアドレスに値があると、コントローラーがクラッシュしたり、不要なメモリを読み取ったりする可能性があります。
構文
<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]));
演算子:__ VCLOAD_LREAL
演算子は、任意のメモリ領域をベクトルとして解釈します。これは、ベクトル変数を既存のコードに接続するのに役立ちます。オペレーターには2つのパラメーターが必要です。最初のパラメーターは、ベクトル要素の数を示します。 2番目のパラメーターは、 LREAL
データ。
重要
__VCLOAD_LREAL (<n>,<ptr>)
読み取り <n>
での連続するLREAL値 <ptr>
住所。未満の場合 <n>
このアドレスに値があると、コントローラーがクラッシュしたり、不要なメモリを読み取ったりする可能性があります。
構文
<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]));
演算子:__ VCSTORE
オペレータは、ベクトルの内容を指定されたメモリアドレスに保存/コピーします。要素の数とタイプは、ベクトル変数から自動的に適用されます。
重要
__VCSTORE(<n>,<ptr>)
書き込み <n>
での連続値 <ptr>
住所。未満の場合 <n>
このアドレスに値があると、コントローラーがクラッシュしたり、不要なメモリを書き込んだりする可能性があります。
構文
__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);