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 (* 时 间:20190905 版 本:1.0 作 者:姚立 名 称:设备扫描功能块 说 明:用于扫描模块在线状态,输出在线模块比例值等参数 备 注: 依赖块:无 *) (*输出初始化*) Dev_Error_Flag := 0; Dev_Status := 0; Dev_Total := 0; Dev_Error := 0; for i:= 0 to 31 by 1 do Dev_Scan_temp := 0; 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 Dev_Total := Dev_Total+1; (*i地址位判断值是否为16#4,是的话进入状态写入*) if Dev_Array[i] = 16#4 then Dev_Status_temp := 1; (*1地址位左移至i位,与输出值OR比较,将状态赋值到对应i地址位*) SHR_L(EN :=1 , IN := Dev_Status_temp, N := i | Dev_Status_temp := OUT); Dev_Status :=Dev_Status_temp or Dev_Status ; else (*任一预设定地址设备不存在,标记错误*) Dev_Error_Flag := 1; Dev_Error:= Dev_Error+1; end_if; end_if; end_for; if Dev_Scan_Hex<>0 then (*有预设定值的情况下,无错误报警,即代表该设备就绪*) Dev_Ready := not Dev_Error_Flag; end_if; if Dev_Total<>0 then (*设备在线比例计算*) Dev_Ratio := 1.0-INT_TO_REAL(Dev_Error)/INT_TO_REAL(Dev_Total); end_if; ton1(pt:=t#2s); ton1.in:=not ton1.q; if ton1.q=1 then HeartVavle :=HeartVavle+1; end_if; if HeartVavle =99 then HeartVavle:=0; end_if; END_FUNCTION_BLOCK