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
4 months ago
|
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
|