FUNCTION_BLOCK 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