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

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