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 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
20100ms
20211110
1.2
30100ms
*)
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;(*20k*)
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;(*30k*)
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