移動平均値と合計値用のバッファエリアの定義
このFP命令は、平均値と含まれるすべての値の合計を計算するための専用のバッファを指定します。開始アドレスはd_Startで、サイズはn_Wordsで設定されます。バッファはプログラミング例に示す特有の構造になっていて、最後の要素iArrDataの配列要素の数がn_wordsで定義されたサイズに対応しています。バッファへの書き込みには、命令FP_AVERAGE_BUFFER_WRITEを使用します。
入力
バッファのメモリサイズを指定します
値: 1~30000
出力
バッファの先頭データエリア
プログラミング例に示すように、ユーザー定義のDUTを使用することをお勧めします。
パラメータに指定された値が許容範囲外の場合。
パラメータに指定された値が許容範囲外の場合。
DUTの要素(変数名)
バッファのサイズ
格納されるデータ数
格納されるデータの合計
移動平均
書き込みポインタの位置
バッファの値を含みます。整数値の数(この例では10)は、iNumberOfIntegerValuesで定義されたバッファのサイズと等しくなければなりません。
POUヘッダには、このプログラムで使用するすべての入力変数と出力変数を宣言します。 POUヘッダは全プログラム言語で使用できます。
VAR
bDefine: BOOL:=FALSE;
bWrite: BOOL:=FALSE;
iCounter: INT:=0;
END_VAR
VAR CONSTANT
iNumberOfIntegerValues: INT:=10;
(*number of integers values must be equal to average buffer size*)
END_VAR
VAR
dutAverageBufferInt10: DUT_FP_AVERAGE_BUFFER_INT_10;
(*Average Buffer for integer numbers of size 10*)
END_VAR
変数bDefineがTRUEにセットされると、命令を実行します。
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_F,FP_AVERAGE_BUFFER_DEFINE!,,13,2,28,6,,?DEN?Dn_Words?AENO?Cd_Start);
B(B_VARIN,,iNumberOfIntegerValues,11,4,13,6,);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,bDefine,4,1,6,3,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
L(1,2,4,2);
L(6,2,6,4);
L(6,4,13,4);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_CONTACT,,bWrite,2,1,4,3,);
B(B_CONTACT,,bDefine,6,1,8,3,N);
B(B_F,FP_AVERAGE_BUFFER_WRITE!,,14,2,28,6,,?DEN?D@'s'?AENO?Cd_Start);
B(B_VARIN,,sys_iRingCounter_2ms5,12,4,14,6,);
B(B_F,Adr_Of_Var_O!,,28,4,36,6,,?D?C);
B(B_VAROUT,,dutAverageBufferInt10,36,4,38,6,);
B(B_CONTACT,,sys_bPulse1s,11,1,13,3,R);
L(1,2,2,2);
L(4,2,6,2);
L(8,2,11,2);
L(13,2,13,4);
L(13,4,14,4);
L(1,0,1,8);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (bDefine) then
FP_AVERAGE_BUFFER_DEFINE(n_Words := iNumberOfIntegerValues,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
END_IF;
If (bWrite) AND NOT (bDefine) AND DF(sys_bPulse1s) then
FP_AVERAGE_BUFFER_WRITE(s := sys_iRingCounter_2ms5,
d_Start => Adr_Of_Var(dutAverageBufferInt10));
End_if;