Var_ToAreaOffs

アドレスエリアへの変数値コピー

このファンクションは、入力変数Varの値をメモリエリアAreaとアドレスオフセットOffsで宣言されたアドレスに格納します。入力変数Varのサイズで格納されるデータ数が決まります。

パラメータ

入力

Var(ANY_SIMPLE_NOT_BOOL)

値を格納する変数を指定します。

出力

iArea (INT)

メモリエリアの値1)

iAreaが変数のときは、メモリエリアDTまたはFLに割り付けられている必要があります。FP Tool LibraryのファンクションIs_AreaDTまたはIs_AreaFLを用いてチェックしてください。

Offs (INT)

メモリエリアの16ビット先頭アドレスからのオフセット値を指定します。

解説

iAreadiOffsの値は、ファンクションGetPointer32によって取得することができます。iAreaの値は、DTエリアまたはFLエリアに配置してください。

メモリエリアの値1)

フラグメモリエリア

FP7でのみ使用できます。

SYS_MEMORY_AREA_R

SYS_MEMORY_AREA_L

SYS_MEMORY_AREA_X

SYS_MEMORY_AREA_Y

フラグ

SYS_MEMORY_AREA_WR

タイマ/カウンタ設定値

SYS_MEMORY_AREA_SV

タイマ/カウンタ経過値

SYS_MEMORY_AREA_EV

データレジスタ

SYS_MEMORY_AREA_DT

リンクフラグ

SYS_MEMORY_AREA_WL

リンクレジスタ

SYS_MEMORY_AREA_LD

ファイルレジスタ

SYS_MEMORY_AREA_FL

入力レジスタ

SYS_MEMORY_AREA_WX

出力レジスタ

SYS_MEMORY_AREA_WY

POUヘッダ

POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。

	VAR
		bStart: BOOL:=FALSE;
			(*activation*)
		g_arArrayOut1: ARRAY [0..5] OF REAL:=[6(0.0)];
			(*data field with cumulative sum*)
		g_arArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
			(*data field 1*)
		CalcSum_Real1: CalcSum_Real;
			(*instance of user function block*)
		@'': @'';
	END_VAR

POUボディ

変数bStartTRUEのとき、ファンクションブロックCalcSum_REALが実行されます。データフィールドg_arArrayIn1のすべての要素の合計を求めて、結果をデータフィールドg_arArrayOut1に書き込みます。このように、g_arArrayOut1の1番目の要素が、g_arArrayIn1の1番目の要素を受け取ります。g_arArrayOut1の2番目の要素は、g_arArrayIn1の1番目の要素と2番目の要素の合計を格納します。g_arArrayOut1の3番目の要素は、g_arArrayIn1の1番目と2番目と3番目の要素の合計を格納します。

ファンクションブロックCalcSum_REALは、データが格納されるメモリエリアやデータフィールドの要素数に関わらず、ファンクションを演算することができます。データフィールドにアドレスを割り付けたいときは、グローバル変数リストでそのデータフィールドを宣言する必要があります。両方のデータフィールドの要素数は、必ず同数にしてください。

LDボディ

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 6 ;
        NETWORK_BODY
B(B_VARIN,,g_arArrayIn1,10,3,12,5,);
B(B_VARIN,,g_arArrayOut1,10,4,12,6,);
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_F,GetPointer!,,12,3,19,5,,?D?C);
B(B_F,GetPointer!,,12,4,19,6,,?D?C);
B(B_FB,CalcSum_Real!,CalcSum_Real1,19,1,28,6,,?BEN?BpInputArray?BpOutputArray?AENO);
L(7,3,19,3);
L(1,3,5,3);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

ユーザ定義ファンクションブロックCalcSum_REALのプログラム

POUヘッダ

POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。

	VAR_INPUT
		pToDatafield: POINTER;
			(*pointer on the data field for calculation*)
	END_VAR
	VAR_OUTPUT
		rSum: REAL:=0.0;
			(*calculate sum*)
	END_VAR
	VAR
		Sum_Operand: REAL:=0.0;
			(*inernal calculation of the sum*)
		In_Offs_Intern: INT:=0;
			(*internal offset*)
		Idx: INT:=0;
			(*index*)
		@'': @'';
	END_VAR

LDボディ

  • ネットワーク1~5:

    ここで、合計演算のための初期化を行います。

  • ネットワーク6:

    入力データフィールドから1要素をコピーします。

  • ネットワーク7:

    この値を現在の合計に加算します。

  • ネットワーク8:

    現在の合計を出力データフィールドの1つの要素に加算します。

  • ネットワーク9:

    入出力データフィールドの次の要素のオフセットを計算します。

  • ネットワーク10: データフィールドの全要素の処理が完了するまで、ラベル(ネットワーク6)へジャンプします。

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,Is_AreaDT!,,12,0,18,2,,?D?C);
B(B_VARIN,,pToDatafield.iArea,9,1,11,3,);
B(B_F,Is_AreaFL!,,12,3,18,5,,?D?C);
B(B_F,@AND-2!,,19,1,24,4,NN,?D?D?C);
B(B_F,E_MOVE!,,29,0,35,4,,?DEN?D?AENO?C);
B(B_VARIN,,FALSE,27,2,29,4,);
B(B_VAROUT,,ENO,35,2,37,4,);
B(B_RETURN,,,36,1,38,3,);
L(12,2,12,4);
L(12,1,12,2);
L(11,2,12,2);
L(18,1,18,2);
L(18,2,19,2);
L(18,3,18,4);
L(18,3,19,3);
L(35,2,36,2);
L(24,2,29,2);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,pToDatafield.iOffset,18,0,20,2,);
B(B_VAROUT,,In_Offs_Intern,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,0.0,18,0,20,2,);
B(B_VAROUT,,rSum,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 2 ;
        NETWORK_BODY
B(B_VARIN,,1,18,0,20,2,);
B(B_VAROUT,,Idx,20,0,22,2,);
L(1,0,1,2);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL := Lbl1: ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 4 ;
        NETWORK_BODY
B(B_VARIN,,pToDatafield.iArea,15,1,17,3,);
B(B_VAROUT,,Sum_Operand,27,1,29,3,);
B(B_VARIN,,In_Offs_Intern,15,2,17,4,);
B(B_F,AreaOffs_ToVar!,,17,0,26,4,,?DArea?DOffs?C@'Var');
L(26,2,27,2);
L(1,0,1,4);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_F,@ADD-2!,,17,0,22,3,,?D?D?C);
B(B_VARIN,,rSum,15,0,17,2,);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_VAROUT,,rSum,22,0,24,2,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_F,Size_Of_Var!,,17,1,24,3,,?D?C);
B(B_VARIN,,Sum_Operand,15,1,17,3,);
B(B_F,@ADD-2!,,24,0,29,3,,?D?D?C);
B(B_VARIN,,In_Offs_Intern,22,0,24,2,);
B(B_VAROUT,,In_Offs_Intern,29,0,31,2,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 5 ;
        NETWORK_BODY
B(B_F,@LT-2!,,13,1,18,4,,?D?D?C);
B(B_VARIN,,pToDatafield.iSize,11,2,13,4,);
B(B_F,E_ADD-2!,,22,0,28,5,,?DEN?D?D?AENO?C);
B(B_VARIN,,1,20,3,22,5,);
B(B_VAROUT,,Idx,28,2,30,4,);
B(B_VARIN,,Idx,20,2,22,4,);
B(B_JUMP,,Lbl1,28,1,30,3,);
B(B_VARIN,,Idx,11,1,13,3,);
L(18,2,22,2);
L(1,0,1,5);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY
関連トピック

プロジェクトのサンプルは、FPWIN Pro CDに収納されています。インストール先の"Samples"フォルダから、以下のファイルを開いてください。

最終修正日: 2020-11-19このページに関するフィードバックお問い合わせ窓口