1.aprus.lua配置示例
package.cpath="./?.so"
package.path="./?.lua"
cjson = require "cjson"
config = require "config"
require "myModule"
function act_control(m, json)
for k,v in pairs(json) do
if k ~= "Act" then
myModule.write(moduleObj, cjson.encode({["name"] = k, ["val"] = 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
myModule.stop(moduleObj)
elseif code == 1 then
myModule.run(moduleObj)
end
end
function myModule_handle(obj, name, code, data)
mqtt.publish(mqtt3Obj, name, "r", data)
end
function myModule_load_collectnodes(obj, nodes)
for k,v in pairs(nodes)
do
myModule.addcnode(obj,cjson.encode(v))
end
end
function myModule_load_varnodes(obj, nodes)
for k,v in pairs(nodes)
do
myModule.addvnode(obj,cjson.encode(v))
end
end
function init()
mqtt3Obj = mqtt.new()
mqtt.subscribe(mqtt3Obj, "p2p")
--mqtt.config(mqtt3Obj, nil, "123.456.789.123", "1883", "user", "mix123")
user.setluaver(config.AprusX.luaver)
user.setdevinfo(config.AprusX.devinfo)
user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
end
function start()
init()
moduleObj = myModule.new("myModule")
myModule.config(moduleObj, cjson.encode(config.myModule.Device))
myModule_load_collectnodes(moduleObj,config.myModule.ColNode)
myModule_load_varnodes(moduleObj,config.myModule.VarNode)
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 == "myModule" then
myModule_handle(msg.obj, msg.name, msg.code, msg.data)
end
end
end
start()
2.示例脚本解释
(1)代码中”–”后面的部分为注释语句,仅供解释代码意图,不对程序流程有所干预。
(2)在源码的开头部分调用需要的模块
require "myModule"
–其中myModule为用户需要模块名称,比如modbus或s7
(3)所有函数以function 开头, end结尾。代码使用TAB缩进对齐。
例:
function mqttdata_handle(m, topic, data)
local json = cjson.decode(data)
if json.Act == "Control" then
act_control(m, json)
end
end
这是一个名叫luamqttdata_handle()
的函数,它有三个参数,分别是m, topic, data
(4)最后一行表示调用start()
函数,是整个程序的起始。
向上搜索function start()
,可以找到start()
的函数定义。
(5)下面将逐行解读start()
函数的每一行语句
–函数定义:函数名start
, 无参数
function start()
--先调用init()函数进行一些初始化操作。
init()
--调用模块的功能myModule.new()创建一个新的模块实体对象moduleObj。
moduleObj = myModule.new("myModule")
--调用myModule.config()功能,对模块实体对象moduleObj进行配置。
myModule.config(moduleObj, cjson.encode(config.myModule.Device))
--调用myModule_load_collectnodes()函数,配置moduleObj的采集节点
myModule_load_collectnodes(moduleObj,config.myModule.ColNode)
--调用myModule_load_varnodes()函数,配置moduleObj的上报节点
myModule_load_varnodes(moduleObj,config.myModule.VarNode)
--调用mqtt.run()功能,运行mqtt的实体对象mqtt3Obj
mqtt.run(mqtt3Obj)
--循环下面一段代码,反复运行
while true do
--接收消息,并把消息保存在本地变量msg中
local msg = user.waitmsg()
--判断消息msg的来源,如果是mqtt系统消息“mqtt-sys”
if msg.from == "mqtt-sys" then
--调用mqttsys_handle()函数处理消息的内容
mqttsys_handle(msg.session, msg.code)
--判断消息msg的来源,如果是mqtt数据消息“mqtt-msg”
elseif msg.from == "mqtt-msg" then
--调用mqttdata_handle()函数处理消息的内容
mqttdata_handle(msg.session, msg.topic, msg.payload)
--判断消息msg的来源,如果是来自模块myModule的消息“myModule”
elseif msg.from == "myModule" then
--调用myModule_handle()函数处理消息的内容
myModule_handle(msg.obj, msg.name, msg.code, msg.data)
--判断结束
end
--循环结束
end
--start()函数结束
end
(6)初始化函数init()解析
--函数定义:函数名init, 无参数
function init()
--调用mqtt模块的功能mqtt.new()创建一个新的模块实体对象mqtt3Obj 。
mqtt3Obj = mqtt.new()
--调用mqtt模块的功能mqtt.subscribe()配置mqtt3Obj的订阅模式为”p2p”
mqtt.subscribe(mqtt3Obj, "p2p")
--如果需要,使用mqtt.config()配置mqtt3Obj连接到用户自已的服务器。(现在此行以“--”开头,表示注释掉了,不起作用)
--mqtt.config(mqtt3Obj, nil, "123.456.789.123", "1883", "user", "mix123")
--设置lua版本(版本信息来自于配置文件config.lua的AprusX字段的luaver)
user.setluaver(config.AprusX.luaver)
--设置设备信息(设备信息来自于配置文件config.lua的AprusX字段的devinfo)
user.setdevinfo(config.AprusX.devinfo)
--设置Aprus的IP地址(信息来自于配置文件config.lua的AprusX字段)
user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
--init()函数结束
end
(7)user 全局通用/配置类函数
①本机网络配置方法user.ipconfig(config.AprusX.ipmode, config.AprusX.inet_addr, config.AprusX.netmask)
②消息捕获方法msg = user.waitmsg()
通过 msg.from
可判断消息来源
mqtt-sys
:来自mqtt系统消息mqtt-msg
:来自mqtt数据消息modubs
:来自modbus管理器消息
③以下为 msg.from
为 modbus
、opcua
、mitsufx
、mitsumc
、dlt645
、s7
等协议时通用
msg.session
: 消息会话对象msg.code
: 消息号msg.style_L
: 变量名称msg.val_L
: 变量值msg.style_E
: 事件变量名称msg.val_E
: 事件变量值msg.z
: 条件改变标志位
④以下为msg.from
为mqtt
时使用msg.topic
: mqtt话题msg.payload
: mqtt消息数据
⑤以下为msg.from
为mqtt-sys
时使用msg.code
: mqtt事件0
: mqtt断开1
: mqtt 连接
⑥设置Lua版本信息user.setLuaver(Luaver)
⑦设置设备信息user.setdevinfo(devinfo)
(8)mqtt对象操作方法函数
①创建mqtt对象实例mqttobj = mqtt.new()
②配置mqtt连接信息 (选填)mqtt.config(mqttobj, "mqtt_1", "192.168.1.159", "1883")
- param 1: mqtt对象实例
- param 2: 实例id
- param 3: mqtt服务器ip
- param 4: mqtt 服务器端口
注:此配置选填,如果不填,则通过gards 服务器自动指定
③话题订阅mqtt.subscribe(mqttobj, "p2p")
④发布消息mqtt.publish(mqttobj, nil, topic, payload)
- reserve: 预留参数,必须有,可填
nil
⑤mqtt运行mqtt.run(mqttobj)
备注:支持多实例,最大可创建3个mqtt对象
文档更新时间: 2024-11-05 17:40 作者:CGL