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