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.
493 lines
7.6 KiB
493 lines
7.6 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
|
|
|
|
(*Automatically declared*)
|
|
VAR_EXTERNAL
|
|
END_VAR
|
|
(** {* **)
|
|
(** **)
|
|
(** 时 间:20191006 **)
|
|
(** 版 本:1.1 **)
|
|
(** 作 者:姚立 **)
|
|
(** 名 称:平均采样程序 **)
|
|
(** 说 明:平均采样默认20次,间隔100ms **)
|
|
(** 备 注: **)
|
|
(** 依赖块: **)
|
|
(** 时 间:20211110 **)
|
|
(** 版 本:1.2 **)
|
|
(** 作 者:潘平 **)
|
|
(** 名 称:平均采样程序 **)
|
|
(** 说 明:平均采样默认30次,间隔100ms,修正程序未做平均值计算问题,始终位于初始化程序内运行 **)
|
|
(** 备 注: **)
|
|
(** 依赖块: **)
|
|
(** *} **)
|
|
(** **)
|
|
(** if ini=0 then **)
|
|
(* if - Cond *)
|
|
LD ini
|
|
EQ 0
|
|
JMPCN ODK_SKIP_000000000000001_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** ini:=1; **)
|
|
(* assign - Stmt *)
|
|
LD 1
|
|
ST ini
|
|
|
|
JMP ODK_END_IF_000000000000001
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_SKIP_000000000000001_000000000000001:
|
|
ODK_END_IF_000000000000001:
|
|
|
|
(** **)
|
|
(** if Num>30 then **)
|
|
(* if - Cond *)
|
|
LD Num
|
|
GT 30
|
|
JMPCN ODK_SKIP_000000000000002_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** Avg_num:=30; **)
|
|
(* assign - Stmt *)
|
|
LD 30
|
|
ST Avg_num
|
|
|
|
JMP ODK_END_IF_000000000000002
|
|
|
|
(** else **)
|
|
(* else *)
|
|
ODK_SKIP_000000000000002_000000000000001:
|
|
|
|
(* else - Stmts *)
|
|
|
|
(** Avg_num:=Num; **)
|
|
(* assign - Stmt *)
|
|
LD Num
|
|
ST Avg_num
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_END_IF_000000000000002:
|
|
|
|
(** **)
|
|
(** {*初始化30s无延时采样,30s后每avg_delay采样1次*} **)
|
|
(** ton0(in:=ini,PT:= t#30s); **)
|
|
(* call - Stmt *)
|
|
CAL ton0 (
|
|
in := ini,
|
|
PT := t#30s
|
|
)
|
|
|
|
(** if ton0.q=0 then **)
|
|
(* if - Cond *)
|
|
LD ton0.q
|
|
EQ 0
|
|
JMPCN ODK_SKIP_000000000000003_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** k:=k+1;{*程序开始时,取值次数不足20次,为k次*} **)
|
|
(* assign - Stmt *)
|
|
LD k
|
|
ADD 1
|
|
ST k
|
|
|
|
(** if k>Avg_num then **)
|
|
(* if - Cond *)
|
|
LD k
|
|
GT Avg_num
|
|
JMPCN ODK_SKIP_000000000000004_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** k:=Avg_num; **)
|
|
(* assign - Stmt *)
|
|
LD Avg_num
|
|
ST k
|
|
|
|
JMP ODK_END_IF_000000000000004
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_SKIP_000000000000004_000000000000001:
|
|
ODK_END_IF_000000000000004:
|
|
|
|
(** Value_temp[1]:=INT_TO_DINT(Input); **)
|
|
(* assign - Stmt *)
|
|
LD Input
|
|
INT_TO_DINT
|
|
ST Value_temp[1]
|
|
|
|
(** for i:=(Avg_num-1) to 1 by -1 do **)
|
|
(* for - Init *)
|
|
LD Avg_num
|
|
SUB 1
|
|
ST i
|
|
EQ 1
|
|
JMPC ODK_FOR_STMTS_000000000000005
|
|
|
|
(* for - Cond *)
|
|
ODK_FOR_000000000000005:
|
|
|
|
LD Avg_num
|
|
SUB 1
|
|
GT 1
|
|
JMPC ODK_FOR_DOWN_000000000000005
|
|
|
|
LD 0
|
|
GT( -1
|
|
)
|
|
JMPC ODK_END_FOR_000000000000005
|
|
|
|
LD 1
|
|
LT i
|
|
JMPC ODK_END_FOR_000000000000005
|
|
JMP ODK_FOR_STMTS_000000000000005
|
|
|
|
ODK_FOR_DOWN_000000000000005:
|
|
|
|
LD 1
|
|
GT i
|
|
JMPC ODK_END_FOR_000000000000005
|
|
|
|
LD 0
|
|
LT( -1
|
|
)
|
|
JMPC ODK_END_FOR_000000000000005
|
|
|
|
(* for - Stmts *)
|
|
ODK_FOR_STMTS_000000000000005:
|
|
|
|
(** j:=i+1; **)
|
|
(* assign - Stmt *)
|
|
LD i
|
|
ADD 1
|
|
ST j
|
|
|
|
(** Value_temp[j]:=Value_temp[i]; **)
|
|
(* assign - Stmt *)
|
|
LD Value_temp[i]
|
|
ST Value_temp[j]
|
|
|
|
(* for - By *)
|
|
LD -1
|
|
ADD i
|
|
ST i
|
|
(** end_for; **)
|
|
|
|
JMP ODK_FOR_000000000000005
|
|
|
|
(* for - End *)
|
|
ODK_END_FOR_000000000000005:
|
|
|
|
(** Value_sum:=0; **)
|
|
(* assign - Stmt *)
|
|
LD 0
|
|
ST Value_sum
|
|
|
|
(** for i:=1 to Avg_num by 1 do **)
|
|
(* for - Init *)
|
|
LD 1
|
|
ST i
|
|
EQ Avg_num
|
|
JMPC ODK_FOR_STMTS_000000000000006
|
|
|
|
(* for - Cond *)
|
|
ODK_FOR_000000000000006:
|
|
|
|
LD 1
|
|
GT Avg_num
|
|
JMPC ODK_FOR_DOWN_000000000000006
|
|
|
|
LD 0
|
|
GT 1
|
|
JMPC ODK_END_FOR_000000000000006
|
|
|
|
LD Avg_num
|
|
LT i
|
|
JMPC ODK_END_FOR_000000000000006
|
|
JMP ODK_FOR_STMTS_000000000000006
|
|
|
|
ODK_FOR_DOWN_000000000000006:
|
|
|
|
LD Avg_num
|
|
GT i
|
|
JMPC ODK_END_FOR_000000000000006
|
|
|
|
LD 0
|
|
LT 1
|
|
JMPC ODK_END_FOR_000000000000006
|
|
|
|
(* for - Stmts *)
|
|
ODK_FOR_STMTS_000000000000006:
|
|
|
|
(** Value_sum:=Value_sum+Value_temp[i]; **)
|
|
(* assign - Stmt *)
|
|
LD Value_sum
|
|
ADD Value_temp[i]
|
|
ST Value_sum
|
|
|
|
(* for - By *)
|
|
LD 1
|
|
ADD i
|
|
ST i
|
|
(** end_for; **)
|
|
|
|
JMP ODK_FOR_000000000000006
|
|
|
|
(* for - End *)
|
|
ODK_END_FOR_000000000000006:
|
|
|
|
(** output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k)); **)
|
|
(* assign - Stmt *)
|
|
LD Value_sum
|
|
DIV ( k
|
|
INT_TO_DINT
|
|
)
|
|
DINT_TO_INT
|
|
ST output
|
|
|
|
JMP ODK_END_IF_000000000000003
|
|
|
|
(** else **)
|
|
(* else *)
|
|
ODK_SKIP_000000000000003_000000000000001:
|
|
|
|
(* else - Stmts *)
|
|
|
|
(** ton1(PT:= Delay ); **)
|
|
(* call - Stmt *)
|
|
CAL ton1 (
|
|
PT := Delay
|
|
)
|
|
|
|
(** ton1.in:=not ton1.q; **)
|
|
(* assign - Stmt *)
|
|
LD ton1.q
|
|
NOT
|
|
ST ton1.in
|
|
|
|
(** temp:=0; **)
|
|
(* assign - Stmt *)
|
|
LD 0
|
|
ST temp
|
|
|
|
(** if ton1.q=1 and temp=0 then **)
|
|
(* if - Cond *)
|
|
LD ton1.q
|
|
EQ 1
|
|
AND ( temp
|
|
EQ 0
|
|
)
|
|
JMPCN ODK_SKIP_000000000000007_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** k:=k+1;{*程序开始时,取值次数不足30次,为k次*} **)
|
|
(* assign - Stmt *)
|
|
LD k
|
|
ADD 1
|
|
ST k
|
|
|
|
(** if k>Avg_num then **)
|
|
(* if - Cond *)
|
|
LD k
|
|
GT Avg_num
|
|
JMPCN ODK_SKIP_000000000000008_000000000000001
|
|
|
|
(* then - Stmts *)
|
|
|
|
(** k:=Avg_num; **)
|
|
(* assign - Stmt *)
|
|
LD Avg_num
|
|
ST k
|
|
|
|
JMP ODK_END_IF_000000000000008
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_SKIP_000000000000008_000000000000001:
|
|
ODK_END_IF_000000000000008:
|
|
|
|
(** temp:=1; **)
|
|
(* assign - Stmt *)
|
|
LD 1
|
|
ST temp
|
|
|
|
(** Value_temp[1]:=INT_TO_DINT(Input); **)
|
|
(* assign - Stmt *)
|
|
LD Input
|
|
INT_TO_DINT
|
|
ST Value_temp[1]
|
|
|
|
(** for i:=(Avg_num-1) to 1 by -1 do **)
|
|
(* for - Init *)
|
|
LD Avg_num
|
|
SUB 1
|
|
ST i
|
|
EQ 1
|
|
JMPC ODK_FOR_STMTS_000000000000009
|
|
|
|
(* for - Cond *)
|
|
ODK_FOR_000000000000009:
|
|
|
|
LD Avg_num
|
|
SUB 1
|
|
GT 1
|
|
JMPC ODK_FOR_DOWN_000000000000009
|
|
|
|
LD 0
|
|
GT( -1
|
|
)
|
|
JMPC ODK_END_FOR_000000000000009
|
|
|
|
LD 1
|
|
LT i
|
|
JMPC ODK_END_FOR_000000000000009
|
|
JMP ODK_FOR_STMTS_000000000000009
|
|
|
|
ODK_FOR_DOWN_000000000000009:
|
|
|
|
LD 1
|
|
GT i
|
|
JMPC ODK_END_FOR_000000000000009
|
|
|
|
LD 0
|
|
LT( -1
|
|
)
|
|
JMPC ODK_END_FOR_000000000000009
|
|
|
|
(* for - Stmts *)
|
|
ODK_FOR_STMTS_000000000000009:
|
|
|
|
(** j:=i+1; **)
|
|
(* assign - Stmt *)
|
|
LD i
|
|
ADD 1
|
|
ST j
|
|
|
|
(** Value_temp[j]:=Value_temp[i]; **)
|
|
(* assign - Stmt *)
|
|
LD Value_temp[i]
|
|
ST Value_temp[j]
|
|
|
|
(* for - By *)
|
|
LD -1
|
|
ADD i
|
|
ST i
|
|
(** end_for; **)
|
|
|
|
JMP ODK_FOR_000000000000009
|
|
|
|
(* for - End *)
|
|
ODK_END_FOR_000000000000009:
|
|
|
|
(** Value_sum:=0; **)
|
|
(* assign - Stmt *)
|
|
LD 0
|
|
ST Value_sum
|
|
|
|
(** for i:=1 to Avg_num by 1 do **)
|
|
(* for - Init *)
|
|
LD 1
|
|
ST i
|
|
EQ Avg_num
|
|
JMPC ODK_FOR_STMTS_00000000000000A
|
|
|
|
(* for - Cond *)
|
|
ODK_FOR_00000000000000A:
|
|
|
|
LD 1
|
|
GT Avg_num
|
|
JMPC ODK_FOR_DOWN_00000000000000A
|
|
|
|
LD 0
|
|
GT 1
|
|
JMPC ODK_END_FOR_00000000000000A
|
|
|
|
LD Avg_num
|
|
LT i
|
|
JMPC ODK_END_FOR_00000000000000A
|
|
JMP ODK_FOR_STMTS_00000000000000A
|
|
|
|
ODK_FOR_DOWN_00000000000000A:
|
|
|
|
LD Avg_num
|
|
GT i
|
|
JMPC ODK_END_FOR_00000000000000A
|
|
|
|
LD 0
|
|
LT 1
|
|
JMPC ODK_END_FOR_00000000000000A
|
|
|
|
(* for - Stmts *)
|
|
ODK_FOR_STMTS_00000000000000A:
|
|
|
|
(** Value_sum:=Value_sum+Value_temp[i]; **)
|
|
(* assign - Stmt *)
|
|
LD Value_sum
|
|
ADD Value_temp[i]
|
|
ST Value_sum
|
|
|
|
(* for - By *)
|
|
LD 1
|
|
ADD i
|
|
ST i
|
|
(** end_for; **)
|
|
|
|
JMP ODK_FOR_00000000000000A
|
|
|
|
(* for - End *)
|
|
ODK_END_FOR_00000000000000A:
|
|
|
|
JMP ODK_END_IF_000000000000007
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_SKIP_000000000000007_000000000000001:
|
|
ODK_END_IF_000000000000007:
|
|
|
|
(** output:=DINT_TO_INT(Value_sum/INT_TO_DINT(k)); **)
|
|
(* assign - Stmt *)
|
|
LD Value_sum
|
|
DIV ( k
|
|
INT_TO_DINT
|
|
)
|
|
DINT_TO_INT
|
|
ST output
|
|
|
|
(** end_if; **)
|
|
(* if - End *)
|
|
ODK_END_IF_000000000000003:
|
|
|
|
(** **)
|
|
(** **)
|
|
|
|
END_FUNCTION_BLOCK
|