AreaOffs_ToVar

16ビットオフセット付き変数へのアドレス内容コピー

このファンクションは、メモリエリアAreaとオフセットOffsで決まるアドレスから、変数Varのサイズで定義されるワード数を変数Varにコピーします。

パラメータ

入力

iArea (INT)

メモリエリアの値1)

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

Offs (INT)

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

出力

Var(ANY_SIMPLE_NOT_BOOL)

アドレスの内容を格納する変数です。

解説

入力値AreaOffsは、ファンクションGetPointerによって取得することができます。Areaの値は、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からアクセスできる変数を宣言します。

ここでは、変数g_arArrayIn1を宣言します。変数は、プログラムProgram_CalcSumsのPOUヘッダにも宣言することができます。

POUヘッダ

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

R_EXTERNAL
		WrongAreaArray: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
	END_VAR
	VAR 
		start: BOOL:=FALSE;
		RealArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
		RealArrayIn2: ARRAY [0..3,1..4] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,110.0,120.0,130.0,140.0,150.0,160.0];
		RealArrayIn3: ARRAY [0..2,1..3,2..5] OF REAL:=[10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0];
		RealSum1: REAL:=0.0;
			(*Result: 210*)
		RealSum2: REAL:=0.0;
			(*Result: 1360*)
		RealSum3: REAL:=0.0;
			(*Result: 180*)
		IsWrongArea: BOOL:=FALSE;
		WrongAreaSum: REAL:=0.0;
		CalcSum_Real1: CalcSum_REAL;
	END_VAR

POUボディ

変数bStartTRUEになると、ファンクションブロックCalcSum_REALが実行されます。データフィールドg_arArrayIn1のすべての要素の合計を計算して、演算結果を変数rRealSum1に書き込みます。

LDボディ

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_COMMENT,,This program calculates the sum of all array elements of the input array In,3,1,38,2,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 10 ;
        NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum1,36,4,38,6,);
B(B_VARIN,,RealArrayIn1,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,AreaOffs_OfVar,,10,1,22,5,,?D@'Var'?CArea?COffs);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+50+60,26,8,35,9,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,210.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,3,24,3);
L(22,4,23,4);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,10);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 13 ;
        NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum2,36,4,38,6,);
B(B_VARIN,,RealArrayIn2,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+ø^50+60+70+80+ø^90+100+110+120+ø^130+140+150+160,26,8,35,12,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,1360.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,13);
L(10,3,24,3);
L(10,4,23,4);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

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

POUヘッダ

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

R_EXTERNAL
		WrongAreaArray: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
	END_VAR
	VAR 
		start: BOOL:=FALSE;
		RealArrayIn1: ARRAY [0..5] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0];
		RealArrayIn2: ARRAY [0..3,1..4] OF REAL:=[10.0,20.0,30.0,40.0,50.0,60.0,70.0,80.0,90.0,100.0,110.0,120.0,130.0,140.0,150.0,160.0];
		RealArrayIn3: ARRAY [0..2,1..3,2..5] OF REAL:=[10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0,10.0,0.0];
		RealSum1: REAL:=0.0;
			(*Result: 210*)
		RealSum2: REAL:=0.0;
			(*Result: 1360*)
		RealSum3: REAL:=0.0;
			(*Result: 180*)
		IsWrongArea: BOOL:=FALSE;
		WrongAreaSum: REAL:=0.0;
		CalcSum_Real1: CalcSum_REAL;
	END_VAR

LDボディ

  • ネットワーク1:

    転送されたデータフィールドがDTまたはFLエリアにない場合、ファンクションブロックのENOがFALSEになり、処理を終了します。

  • ネットワーク2~4:

    合計を求めるための初期化を行います。クラスVAR_INPUTの変数は直接変更できないので、入力変数In_Offsetを内部変数In_Offs_internにコピーする必要があります。

    参照: Var_ToAreaOffs

  • ネットワーク5~8:

    合計計算用ループ

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 3 ;
        NETWORK_BODY
B(B_COMMENT,,This program calculates the sum of all array elements of the input array In,3,1,38,2,);
L(1,0,1,3);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 10 ;
        NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum1,36,4,38,6,);
B(B_VARIN,,RealArrayIn1,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,AreaOffs_OfVar,,10,1,22,5,,?D@'Var'?CArea?COffs);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+50+60,26,8,35,9,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,210.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,3,24,3);
L(22,4,23,4);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,10);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 13 ;
        NETWORK_BODY
B(B_VARIN,,start,6,0,8,2,);
B(B_VAROUT,,RealSum2,36,4,38,6,);
B(B_VARIN,,RealArrayIn2,8,2,10,4,);
B(B_FB,CalcSum_REAL,CalcSum_Real1,25,2,36,8,,?BEN?BIn_Area?BIn_Offset?BNrOfIdx?AENO?ASum);
B(B_F,Elem_OfArray1D,,10,5,22,8,,?DArray1D?CNrOfElem1);
B(B_COMMENT,,10+20+30+40+ø^50+60+70+80+ø^90+100+110+120+ø^130+140+150+160,26,8,35,12,);
B(B_COMMENT,,=,36,8,38,9,);
B(B_COMMENT,,1360.0,39,8,43,9,);
B(B_COMMENT,,if (Enable==TRUE):,15,8,25,9,);
L(25,1,25,4);
L(8,1,25,1);
L(24,3,24,5);
L(23,4,23,6);
L(24,5,25,5);
L(10,3,10,7);
L(22,7,25,7);
L(23,6,25,6);
L(1,0,1,13);
L(10,3,24,3);
L(10,4,23,4);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY
関連トピック

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

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

Calculates the product of two-dimensional arrays

Calculate the sum of all array elements

Calculates the trace of a three-dimensional array

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