AX作为控制器使用

示例场景

如,蔬菜大棚常用温湿度传感器监测大棚温度、湿度。 现添加三色报警灯对大棚温度给出预警设定提示:

  • 15 ℃ < 大棚温度 <= 26 ℃ 绿灯亮
  • 26 ℃ < 大棚温度 <= 30 ℃ 黄灯亮
  • 30 ℃ < 大棚温度 红灯亮、报警
  • 大棚温度 <= 15℃ 红灯亮、报警

所需物料

  1. 智物联MixIOT物联网平台
  2. 智物联AX适配器
  3. 三色灯, 购买地址

对接说明

lua示例

aprus.lua

package.cpath="./?.so"
package.path="./?.lua"
cjson = require "cjson"
config = require "config"
require "modbus"

function act_control(m, json)
    for k,v in pairs(json) do
        if k ~= "Act" then
            modbus.write(modbusObj, k, v) --执行写入操作
        end
    end
end

function mqttdata_handle(m, topic, data)
    local json = cjson.decode(data)

    if json.Act == "Control" then
        act_control(m, json)
    end
end

function mqttsys_handle(m, code)
    if code == 0 then
        modbus.stop(modbusObj)
    elseif code == 1 then
        modbus.run(modbusObj)
    end
end

function modbus_load_collectnodes(session, nodes)
    for k,v in pairs(nodes)
    do
        modbus.add_collectnode(session, v.ID, v.reg, v.addr, v.cnt, v.delay)
    end
end

function modbus_load_varnodes(session, nodes)
    for k,v in pairs(nodes)
    do
        modbus.add_varnode(session, v.ID, v.reg, v.addr, v.dtype, v.dBit, v.format, v.len, v.pMode, v.dStyle, v.dOffset, v.dExt)
    end
end

function modbusevent_handle(session, code, style_L, val_L, style_E, val_E, z)
    if code == 15 then
        local json = cjson.encode(mbbuf[session])
        mqtt.publish(mqtt3Obj, mbstr[session], "r", json)
        mbbuf[session] = {}
    elseif code > 10 then
        mbbuf[session][style_L] = val_L
        mbbuf[session][style_E] = val_E
    else
        local json = cjson.encode({[style_L] = val_L, [style_E] = val_E, ["Z"] = z})
        mqtt.publish(mqtt3Obj, mbstr[session], "r", json)
    end

    if style_L == "Temp" then    --key(style_L) 等于 Temp
        W0_Temp = val_L             --则把采集的数据赋值给全局变量 Temp
        Check_Temperature()         --执行温度判断函数
    end
end

--[[
  ** 温度判断函数
]]--
function Check_Temperature()
    if W0_Temp > 15 and W0_Temp <= 26 then           -- 15 ℃ < 大棚温度 <= 26 ℃    `绿灯亮`
        modbus.write(modbusObj, "S_Led", 4)  -- S_Led 写入 4 绿灯亮
    elseif W0_Temp > 26 and W0_Temp <= 30 then       -- 26 ℃ < 大棚温度 <= 30 ℃    `黄灯亮`
        modbus.write(modbusObj, "S_Led", 2)  -- S_Led 写入 2 黄灯亮
    elseif W0_Temp > 30 then                         -- 30 ℃ < 大棚温度            `红灯亮、报警`
        modbus.write(modbusObj, "S_Led", 9)  -- S_Led 写入 9 红灯亮、报警
    elseif W0_Temp <=15 then                          -- 大棚温度 <= 15℃           `红灯亮、报警`
        modbus.write(modbusObj, "S_Led", 9)  -- S_Led 写入 9 红灯亮、报警
    end
end
--***

function init()
    mqtt3Obj = mqtt.new()  --创建一个mqtt实例
    mqtt.config(mqtt3Obj,"","xxx.mixiot.top","1883","username","pwd") --上报至指定的物联网平台
    user.setluaver(config.AprusX.luaver)
    user.setdevinfo(config.AprusX.devinfo)
    user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)

    --    user.reset_eth0()    --if you want to set eth0  use this interface
    --    user.ipconfig_eth0("manual", "10.100.1.123", "255.255.255.0", "10.100.1.1", "114.114.114.114")
end

function start()
    W0_Temp = 0  ------定义一个温度的全局变量-----

    init()
    ----------ModbusRtu Config----------
    MBCfg = config.Modbus   --config里的配置赋值给MBCfg

    --Init Object
    modbusObj = nil  --初始化 modbusObj
    mbbuf = { modbusObj }
    mbstr = { modbusObj }

    --Config Object
    modbusObj = modbus.new(MBCfg.device.type)
    mbbuf[modbusObj] = {}
    mbstr[modbusObj] = "modbusObj"
    --modbus.select_rs485(modbusObj, "2")    --you can select "1" or "2", default is "1"
    modbus.config(modbusObj, MBCfg.device.rate, MBCfg.device.databit, MBCfg.device.stopbit, MBCfg.device.parity)
    modbus_load_collectnodes(modbusObj, MBCfg.node.collect)
    modbus_load_varnodes(modbusObj, MBCfg.node.variable)
    ----------------------------------

    mqtt.run(mqtt3Obj)
    while true do
        local msg = user.waitmsg()
        if msg.from == "mqtt-sys" then
            mqttsys_handle(msg.session, msg.code)
        elseif msg.from == "mqtt-msg" then
            mqttdata_handle(msg.session, msg.topic, msg.payload)
        elseif msg.from == "modbus" then
            modbusevent_handle(msg.session, msg.code, msg.style_L, msg.val_L, msg.style_E, msg.val_E, msg.z)
        end
    end
end

start()

config.lua

return
{
    AprusX={
        ipmode="none",                  --auto/manual/none
        inet_addr="192.168.1.234",
        netmask="255.255.255.0",
        luaver="Temp.L.V100.R",
        devinfo="ModbusRtuDev",
    },
    Modbus={
        device={
            type="rtu",     --"rtu"/"ascii"
            rate=9600,      --波特率
            databit=8,      --数据位
            stopbit=1,      --停止位
            parity="None",  --奇偶校验  None/Odd/Even
        },
        node={
            collect={
                {ID=2, reg="3", addr=0,  cnt=2},    --温度传感器
                {ID=1, reg="3", addr=16, cnt=1},    --报警灯
            },
            variable={
                {ID=2,reg="3",addr=0,dtype="short",pMode={1,1},dOffset={{"/",10}},dStyle={"Temp"}},         --温度
                {ID=2,reg="3",addr=1,dtype="short",pMode={1,1},dOffset={{"/",10}},dStyle={"Humidity"}},     --湿度

                {ID=1,reg="3",addr=16,dtype="short",pMode={1,1},dStyle={"Led"}},        --灯
                {ID=1,reg="6",addr=16,dtype="short",pMode={1,1},dStyle={"S_Led"}},      --灯,用于写入操作
            },
        },
    },
}

附录

三色灯通信协议资料

文档更新时间: 2024-08-29 10:29   作者:技术支持