GetPointer32

ポインタ情報取得

GetPointer32ファンクションは、データ型POINTER32のあらかじめ定義された構造体(DUT)の変数"32ビットポインタ情報"を取得します。この情報は、ファンクションやファンクションブロックで使用することができます。これらのポインタ情報や対応するポインタ機能により、ファンクションやファンクションブロックを外部データのアドレス領域から直接読み出したり、その領域に書き込んだりすることができます。

パラメータ

入力

未定義入力 (ANY)

DTFL、またはYメモリエリアに割り付ける必要のあるデータ型の入力変数

出力

未定義出力(POINTER32)

入力変数のポインタ情報

解説

ユーザ定義のファンクションまたはファンクションブロックは、ポインタ情報を以下のように利用することができます。

  • ポインタ要素iSizeは、数値を指定できます(要素数 =Pointer.iSize / Size_Of_Var (DataElement))。

  • 対応するポインタファンクションAreaOffs32_ToVarVar_ToAreaOffs32、およびポインタ要素iAreadiOffsetにより、外部データのアドレスエリアに対して直接読み出したり書き込んだりできます。

  • メモリエリア命令Is_AreaDTまたはIs_AreaFL、およびアドレス命令AdrDT_Of_Offs32またはAdrFL_Of_Offs32により、外部データのアドレスエリアでFP命令を使用することもできます。

入力変数は、以下の理由により、必ずメモリエリアDTまたはFLに割り付けてください。

  • メモリエリア命令Is_AreaDTまたはIs_AreaFLおよびアドレス命令AdrDT_Of_Offs32またはAdrFL_Of_Offs32は、これらのメモリエリアでのみ機能するため。

  • ポインタ命令AreaOffs32_ToVarおよびVar_ToAreaOffs32は、これらのメモリエリア内でのみ正しく機能するため。

この命令は、AreaOffs_OfVar命令の代わりとなります。

POUヘッダ

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

	VAR
		arData: ARRAY [0..2] OF REAL:=[10.0,20.0,30.0];
		diNumberOfElements: DINT:=0;
		rSum: REAL:=0.0;
		rMean: REAL:=0.0;
		rDeviation: REAL:=0.0;
	END_VAR

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_COMMENT,,These functions show the write access to an input array by using the GetPointer32 function.ø^The input array arDara is initialized with [10.0~ 20.0~ 30.0],3,0,42,2,);
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,FunCalcStatisticsInitArray1!,,15,3,28,6,,?DprArray);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
L(1,0,1,6);
        END_NETWORK_BODY
    END_NET_WORK
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 9 ;
        NETWORK_BODY
B(B_VARIN,,arData,6,4,8,6,);
B(B_F,GetPointer32!,,8,4,15,6,,?D?C);
B(B_VAROUT,,diNumberOfElements,29,4,31,6,);
B(B_F,FunCalcStatistics1!,,15,3,29,9,,?DprArray?AdiNumberOfElements?ArSum?ArMean?ArDeviation);
B(B_VAROUT,,rSum,29,5,31,7,);
B(B_VAROUT,,rMean,29,6,31,8,);
B(B_VAROUT,,rDeviation,29,7,31,9,);
B(B_COMMENT,,These functions show the read access from an input array using the GetPointer function.ø^Some statistical features are calculated from the input array arData [10.0; 20.0; 30.0],3,0,42,2,);
L(1,0,1,9);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

例: FunCalcStatisticsInitArray1

POUヘッダ

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

STボディ

(* Calculate the number of elements from the pointer member diSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Calculate the current element di*10.0 *)
    rCurrentElement:=DINT_TO_REAL(di)*10.0;
(* Write the current element to the data to which the pointer refers *)
    Var_ToAreaOffs32(Var := rCurrentElement, 
                     iArea => prArray.iArea, 
                     diOffs => diOffset);
(* Increase the offset to the next element *)
    diOffset:=diOffset + INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;

FunCalcStatistics1

ユーザ定義ファンクション"FunCalcStatistics1"は、prArrayによって指定された値から統計値を求めます。命令AreaOffs_ToVarは内部で使用され、外部データのアドレスエリアからデータを読み出します。

STボディ

(* Calculate the number of elements from the pointer member iSize *)
diNumberOfElements:=prArray.diSize/INT_TO_DINT(Size_Of_Var(rCurrentElement) );
(* Copy the offset to an internal offset which can be increased later *)
diOffset:=prArray.diOffset;
(* Loop over all elements *)
for di := 1 to diNumberOfElements do
(* Read the current element from the data to which the pointer refers *)
    rCurrentElement:=AreaOffs32_ToVar(iArea := prArray.iArea, diOffs := diOffset);
(* Calculate the sum and the square sum *)
    rSum:=rSum+rCurrentElement;
    rSquareSum:=rSquareSum+rCurrentElement*rCurrentElement; 
(* Increase the offset to the next element *)
    diOffset:=diOffset+INT_TO_DINT(Size_Of_Var(rCurrentElement));
end_for;
(* Final calculation of the additional statistical parameters *)
rNumberOfElements:=DINT_TO_REAL(diNumberOfElements);
rMean:=rSum/rNumberOfElements;
rDeviation:=SQRT(1.0/(rNumberOfElements-1.0)*rSquareSum);

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