FUNCTION_BLOCK BS_AVERAGE
VAR_EXTERNAL

END_VAR

VAR_INPUT
Input		 :INT;
Num			 :INT:=30;
Delay	 	 :Time:=t#100ms;
END_VAR

VAR_OUTPUT
Output 		 :INT;
END_VAR

VAR
Avg_num		 :INT;
Value_temp 	 :ARRAY[0..30]OF DINT;
ton1		 :ton;
Value_sum	 :DINT;
temp		 :BOOL;
i,j,k	  	 :INT:=1;
ton0		 :ton;
ini 		 :BOOL;
END_VAR
(*

时  间:20191006
版  本:1.1
作  者:姚立
名  称:平均采样程序
说  明:平均采样默认20次,间隔100ms
备  注:
依赖块:
时  间:20211110
版  本:1.2
作  者:潘平
名  称:平均采样程序
说  明:平均采样默认30次,间隔100ms,修正程序未做平均值计算问题,始终位于初始化程序内运行
备  注:
依赖块:
*)

if ini=0 then
	ini:=1;
end_if;

if Num>30 then
	Avg_num:=30;
else
	Avg_num:=Num;
end_if;

(*初始化30s无延时采样,30s后每avg_delay采样1次*)
ton0(in:=ini,PT:= t#30s);
if ton0.q=0 then
	k:=k+1;(*程序开始时,取值次数不足20次,为k次*)
	if k>Avg_num then
		k:=Avg_num;
	end_if;
	Value_temp[1]:=INT_TO_DINT(Input);
	for i:=(Avg_num-1) to 1 by -1 do
		j:=i+1;
		Value_temp[j]:=Value_temp[i];
	end_for;
	Value_sum:=0;
	for i:=1 to Avg_num by 1 do 
	Value_sum:=Value_sum+Value_temp[i];
	end_for;
	output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k));
else
	ton1(PT:= Delay );
	ton1.in:=not ton1.q;
	temp:=0;
	if ton1.q=1 and temp=0 then 
		k:=k+1;(*程序开始时,取值次数不足30次,为k次*)
		if k>Avg_num then
			k:=Avg_num;
		end_if;
		temp:=1;
	Value_temp[1]:=INT_TO_DINT(Input);
	for i:=(Avg_num-1) to 1 by -1 do
		j:=i+1;
		Value_temp[j]:=Value_temp[i];
	end_for;
	Value_sum:=0;
	for i:=1 to Avg_num by 1 do 
	Value_sum:=Value_sum+Value_temp[i];
	end_for;
	end_if;
	output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k));	
end_if;



END_FUNCTION_BLOCK