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.
 
 
 
 
 
 

317 lines
5.8 KiB

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