Skip to main content

データ型:__ 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ターゲットシステムは、実行時に次の値を返します。

_cds_img_read_optimal_vector_size.png

演算子:__ VCADD

オペレーターは、2つのベクトルの合計を計算します。

構文

<vector variable> := <1st vector operand> __VCADD <2nd vector operand>;
241. 添加
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>;
242. 減算
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> ;
243. 乗算
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> ;
244. 分割
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> ;
245. ドット積
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> );
246. 平方根
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>);
247. 最大ベクトル
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>);
248. 最小ベクトルの例
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
249. ベクトル化
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
250. ベクトル化
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> );
251. 保存する
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);