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