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

-- MQTT数据处理函数
function mqttdata_handle(m, topic, data)
    local json = cjson.decode(data)
    if json.Act == "Control" then
        act_control(m, json)
    end
end

-- MQTT系统事件处理函数
function mqttsys_handle(m, code)
    if code == 0 then
        modbus.stop(modbusObj)
    elseif code == 1 then
        modbus.run(modbusObj)
    end
end

-- Modbus事件处理函数
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
end

-- 加载Modbus采集节点
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

-- 加载Modbus变量节点
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 init()
    mqtt3Obj = mqtt.new()
    user.setluaver(config.AprusX.luaver)
    user.setdevinfo(config.AprusX.devinfo)
    user.ipconfig(config.ApronX.ipmode, config.ApronX.inet_addr, config.ApronX.netmask)
end

-- 启动函数
function start()
    init()

    -- Modbus RTU配置
    MBCfg = config.Modbus

    -- 初始化Modbus对象
    modbusObj = nil
    mbbuf = { modbusObj }
    mbstr = { modbusObj }

    -- 配置Modbus对象
    modbusObj = modbus.new(MBCfg.device.type)
    mbbuf[modbusObj] = {}
    mbstr[modbusObj] = "modbusObj"
    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客户端
    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()
文档更新时间: 2024-10-25 17:33   作者:技术支持