local bit = require "bit" local sensors = require "application.sensors" local sensor_monitor = require "application.sensor_monitor" local sys = require "sys" local cjson = require "cjson" local output = {} local do_tmp = nil local function m_to_hm(min) local h, s = math.modf(min / 60) local m = min % 60 return h, m end --[[ 输出设置 PLC接触器开关K1~K8 function output.set(lt, value, finish) local sensor_status = sensor_monitor.get_status() local do_old = sensor_status.ADIO.tags.DO -- DO状态 do_tmp = do_tmp or do_old if lt ~= 0 then local do_new = bit.bor(bit.band(do_tmp or 0, bit.bnot(bit.lshift(1, lt - 1))), bit.lshift(value == 0 and 0 or 1, lt - 1)) if not do_old or do_old ~= do_new then print("set output", do_old, do_new) do_tmp = do_new sensors.set_do_output(do_new) if finish then print("get output") sensors.get_do_status() do_tmp = nil end end elseif value == 0 and (do_old ~= 0 or do_tmp ~= 0) then do_tmp = nil sensors.set_do_output(0) sensors.get_do_status() end sys.wait(1) end]] -- 输出设置 PLC接触器开关K1~K8 function output.contactor_set_do(value) sensors.set_do_output(value) sys.wait(1) end -- 输出策略 接触器 function output.contactor_set_strategy(contactor) local str = cjson.encode(contactor) sensors.set_contactor_sch(contactor) log_print.info(string.format("contactor strategy json layout: ", str)) sys.wait(1) end ----------------------------------------------------------------------------------- -- 输出设置 多路开关控制器开关 function output.multi_set_do(node_sn, value) sensors.set_multi_do_output(node_sn, value) sys.wait(1) end -- 输出策略 多路开关控制器 function output.multi_set_strategy(node_sn, month, day, control, k_cont) local k1_time, K1_DO, k2_time, K2_DO, k3_time, K3_DO, k4_time, K4_DO local tm = string.format("%02d%02d", month, day) local m_d = tonumber(tm, 16) log_print.info("m_d::", string.format("devsn %s mouth[%02d]:day[%02d]", node_sn, month, day)) for j = 1, k_cont, 1 do -- 每天最多设置 4 个开关灯时间 local k = "K" .. string.format("%d", j) if control[k] then -- K1~K4 有策略 local data = control[k] local hh, mm = m_to_hm(data.time) -- 时,分 local tim = string.format("%02d%02d", hh, mm) local tim_h = tonumber(tim, 16) log_print.info("k_time::", string.format("hour[%02d]:min[%02d]", hh, mm)) -- DO开关量值 local do_new = 0x00 for v = 1, 8, 1 do do_new = bit.bor(bit.band(do_new, bit.bnot(bit.lshift(1, v - 1))), bit.lshift(data.value[v] == 0 and 0 or 1, v - 1)) end log_print.info("k_value::", string.format("[%02x]", do_new)) if j == 1 then k1_time = tim_h K1_DO = bit.bor(bit.lshift(0x00, 8), do_new) elseif j == 2 then k2_time = tim_h K2_DO = bit.bor(bit.lshift(0x00, 8), do_new) elseif j == 3 then k3_time = tim_h K3_DO = bit.bor(bit.lshift(0x00, 8), do_new) elseif j == 4 then k4_time = tim_h K4_DO = bit.bor(bit.lshift(0x00, 8), do_new) end end end if k_cont == 1 then sensors.set_multi_strategy_K1(node_sn, m_d, k1_time, K1_DO) elseif k_cont == 2 then sensors.set_multi_strategy_K1_K2(node_sn, m_d, k1_time, K1_DO, k2_time, K2_DO) elseif k_cont == 3 then sensors.set_multi_strategy_K1_K3(node_sn, m_d, k1_time, K1_DO, k2_time, K2_DO, k3_time, K3_DO) elseif k_cont == 4 then sensors.set_multi_strategy_K1_K4(node_sn, m_d, k1_time, K1_DO, k2_time, K2_DO, k3_time, K3_DO, k4_time, K4_DO) end sys.wait(1) end return output