You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

96 lines
1.7 KiB

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