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
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
|