FUNCTION_BLOCK BS_DevScan
VAR_EXTERNAL

END_VAR

VAR_INPUT
Dev_Scan_Hex       :DWORD;               (*璁惧鐘舵€佽緭鍏ュ€硷紝杞寲鎴愪簩杩涘埗瀵瑰簲妯″潡鍦ㄧ嚎鐘舵€�*)
Dev_Array          :ARRAY[0..31] of byte;(*璁惧鐘舵€侀€氶亾杈撳叆*)
END_VAR

VAR_OUTPUT
Dev_Status         :DWORD;  (*璁惧鐘舵€佽緭鍑哄€硷紝杞寲鎴愪簩杩涘埗瀵瑰簲妯″潡鍦ㄧ嚎鐘舵€�*)
Dev_Ratio          :REAL;   (*璁惧鍦ㄧ嚎姣斾緥*)
Dev_Ready          :BOOL;   (*璁惧鍑嗗灏辩华锛�0涓哄瓨鍦ㄤ笉杩愯妯″潡锛�1涓哄叏閮ㄦ甯歌繍琛�*)
Dev_Total          :INT;    (*璁惧鎬昏鏁伴噺*)
Dev_Error          :INT;    (*璁惧鏁呴殰鏁伴噺*)
HeartVavle         :int;
END_VAR

VAR
i :UINT;
Dev_Scan_temp      :DWORD;
Dev_Error_Flag     :BOOL; 
Dev_Status_temp    :DWORD;

SHR_D              :SHR_DWORD;
SHR_L              :SHL_DWORD;
ton1 :ton;


END_VAR

(*Automatically declared*)
VAR_EXTERNAL
END_VAR
(** {*  **)
(**   **)
(** 时  间:20190905 **)
(** 版  本:1.0 **)
(** 作  者:姚立 **)
(** 名  称:设备扫描功能块 **)
(** 说  明:用于扫描模块在线状态,输出在线模块比例值等参数 **)
(** 备  注: **)
(** 依赖块:无 **)
(**  **)
(** *} **)
(**  **)
(** {*输出初始化*} **)
(** Dev_Error_Flag := 0; **)
	(* assign - Stmt *)
	LD 0
	ST Dev_Error_Flag

(** Dev_Status     := 0; **)
	(* assign - Stmt *)
	LD 0
	ST Dev_Status

(** Dev_Total      := 0; **)
	(* assign - Stmt *)
	LD 0
	ST Dev_Total

(** Dev_Error      := 0; **)
	(* assign - Stmt *)
	LD 0
	ST Dev_Error

(**  **)
(** for i:= 0 to 31 by 1 do **)
	(* for - Init *)
	LD 0
	ST i
	EQ 31
	JMPC ODK_FOR_STMTS_000000000000001

	(* for - Cond *)
	ODK_FOR_000000000000001:

	LD 0
	GT 31
	JMPC ODK_FOR_DOWN_000000000000001

	LD 0
	GT 1
	JMPC ODK_END_FOR_000000000000001

	LD 31
	LT i
	JMPC ODK_END_FOR_000000000000001
	JMP ODK_FOR_STMTS_000000000000001

	ODK_FOR_DOWN_000000000000001:

	LD 31
	GT i
	JMPC ODK_END_FOR_000000000000001

	LD 0
	LT 1
	JMPC ODK_END_FOR_000000000000001

		(* for - Stmts *)
		ODK_FOR_STMTS_000000000000001:

(** 	Dev_Scan_temp := 0; **)
		(* assign - Stmt *)
		LD 0
		ST Dev_Scan_temp

(** 	SHR_D(EN :=1 , IN := Dev_Scan_Hex , N := i  | Dev_Scan_temp:= OUT); **)
		(* call - Stmt *)
		CAL SHR_D (
			EN := 1,
			IN := Dev_Scan_Hex,
			N := i
			|
			Dev_Scan_temp := OUT
		)

(** 	{*数据右移i位至1地址位与16#1进行AND比较,如果为1,代表i地址位设备有预设定,需要判断在线情况*} **)
(** 	if (Dev_Scan_temp and 16#1) = 1 then **)
		(* if - Cond *)
		LD Dev_Scan_temp
		AND 16#1
		EQ 1
		JMPCN ODK_SKIP_000000000000002_000000000000001

			(* then - Stmts *)

(** 	   Dev_Total := Dev_Total+1; **)
			(* assign - Stmt *)
			LD Dev_Total
			ADD 1
			ST Dev_Total

(** 	{*i地址位判断值是否为16#4,是的话进入状态写入*} **)
(** 	   if Dev_Array[i] = 16#4 then **)
			(* if - Cond *)
			LD Dev_Array[i]
			EQ 16#4
			JMPCN ODK_SKIP_000000000000003_000000000000001

				(* then - Stmts *)

(** 	      Dev_Status_temp := 1; **)
				(* assign - Stmt *)
				LD 1
				ST Dev_Status_temp

(** 		  {*1地址位左移至i位,与输出值OR比较,将状态赋值到对应i地址位*} **)
(** 		  SHR_L(EN :=1 , IN := Dev_Status_temp, N := i | Dev_Status_temp := OUT); **)
				(* call - Stmt *)
				CAL SHR_L (
					EN := 1,
					IN := Dev_Status_temp,
					N := i
					|
					Dev_Status_temp := OUT
				)

(** 		  Dev_Status :=Dev_Status_temp or Dev_Status ; **)
				(* assign - Stmt *)
				LD Dev_Status_temp
				OR Dev_Status
				ST Dev_Status

				JMP ODK_END_IF_000000000000003

(** 		else **)
			(* else *) 
			ODK_SKIP_000000000000003_000000000000001:

				(* else - Stmts *)

(** 		  {*任一预设定地址设备不存在,标记错误*} **)
(** 		  Dev_Error_Flag := 1; **)
				(* assign - Stmt *)
				LD 1
				ST Dev_Error_Flag

(** 		  Dev_Error:= Dev_Error+1; **)
				(* assign - Stmt *)
				LD Dev_Error
				ADD 1
				ST Dev_Error

(** 		end_if; **)
			(* if - End *) 
			ODK_END_IF_000000000000003:

			JMP ODK_END_IF_000000000000002

(** 	end_if; **)
		(* if - End *) 
		ODK_SKIP_000000000000002_000000000000001:
		ODK_END_IF_000000000000002:

	(* for - By *)
	LD 1
	ADD i
	ST i
(** end_for;  **)

	JMP ODK_FOR_000000000000001

	(* for - End *) 
	ODK_END_FOR_000000000000001:

(**  **)
(** if Dev_Scan_Hex<>0 then **)
	(* if - Cond *)
	LD Dev_Scan_Hex
	NE 0
	JMPCN ODK_SKIP_000000000000004_000000000000001

		(* then - Stmts *)

(**    {*有预设定值的情况下,无错误报警,即代表该设备就绪*} **)
(**    Dev_Ready := not Dev_Error_Flag; **)
		(* assign - Stmt *)
		LD Dev_Error_Flag
		NOT
		ST Dev_Ready

		JMP ODK_END_IF_000000000000004

(** end_if; **)
	(* if - End *) 
	ODK_SKIP_000000000000004_000000000000001:
	ODK_END_IF_000000000000004:

(** if Dev_Total<>0 then **)
	(* if - Cond *)
	LD Dev_Total
	NE 0
	JMPCN ODK_SKIP_000000000000005_000000000000001

		(* then - Stmts *)

(** 	{*设备在线比例计算*} **)
(**    Dev_Ratio := 1.0-INT_TO_REAL(Dev_Error)/INT_TO_REAL(Dev_Total); **)
		(* assign - Stmt *)
		LD 1.0
		SUB ( Dev_Error
			INT_TO_REAL 
			DIV ( Dev_Total
				INT_TO_REAL 
			)
		)
		ST Dev_Ratio

		JMP ODK_END_IF_000000000000005

(** end_if; **)
	(* if - End *) 
	ODK_SKIP_000000000000005_000000000000001:
	ODK_END_IF_000000000000005:

(**  **)
(** ton1(pt:=t#2s); **)
	(* call - Stmt *)
	CAL ton1 (
		pt := t#2s
	)

(** ton1.in:=not ton1.q; **)
	(* assign - Stmt *)
	LD ton1.q
	NOT
	ST ton1.IN

(** if ton1.q=1 then **)
	(* if - Cond *)
	LD ton1.q
	EQ 1
	JMPCN ODK_SKIP_000000000000006_000000000000001

		(* then - Stmts *)

(** 	HeartVavle :=HeartVavle+1; **)
		(* assign - Stmt *)
		LD HeartVavle
		ADD 1
		ST HeartVavle

		JMP ODK_END_IF_000000000000006

(** end_if; **)
	(* if - End *) 
	ODK_SKIP_000000000000006_000000000000001:
	ODK_END_IF_000000000000006:

(** if HeartVavle =99 then **)
	(* if - Cond *)
	LD HeartVavle
	EQ 99
	JMPCN ODK_SKIP_000000000000007_000000000000001

		(* then - Stmts *)

(** 	HeartVavle:=0; **)
		(* assign - Stmt *)
		LD 0
		ST HeartVavle

		JMP ODK_END_IF_000000000000007

(** end_if; **)
	(* if - End *) 
	ODK_SKIP_000000000000007_000000000000001:
	ODK_END_IF_000000000000007:

(**  **)
(**  **)

END_FUNCTION_BLOCK