实现原理
倾角传感器能够监测环境中的倾斜角度(X轴/Y轴/Z轴),将传感器安装在需要监测的对象(塔杆、危房、古建筑、桥梁等),结合4G通信模组即可长期远程监测对象的倾斜程度。 市面上有很多倾角传感器,我们选一款支持RS485 Modbus的传感器,再结合内置 4G 通信模组的 FlexLua DTU01 采集器,即可实现整个功能。
4G通信实现
4G 通过 MQTT 接入云服务器,然后 DTU01 将采集到的传感器数据以 Json 明文的方式发送(Publish)给云服务器,因为 DTU01 内置的 main.lua 代码文件可以配置 MQTT 的三要素(clientid,username,password),所以理论上可以通过 MQTT 接入任何云服务器。 DTU01 的实现源代码可以在 FlexLua 官网的 M000C 文档中找到,然后将代码通过 USB-C 口烧录至 DTU01 既可以实现整个功能。
传感器参数及Modbus点表
核心代码讲解
(1)Modbus采集代码
ModbusToJson()函数实现了对传感器的Modbus 485 数据采集,并将采集到的结果数据转换成 Json 形式,留着接下来的 4G MQTT 发送。
--读取RS485仁科 DIP-N01 倾角变送器
--获取到的Json数据形如:{"X":56.12, "Y":12.22, "Z":170.02} --表示X轴倾斜角度=56.12度,表示Y轴倾斜角度=12.22度,表示Z轴倾斜角度=170.02度,
function ModbusToJson()
--配置RS485 Modbus转Json功能,并设置Json字符串最大长度为150字节
LIB_ModbusToJsonConfig(150)--必须小于255
--X轴倾斜角度值寄存器地址0x0000,16bit带符号整数AB类型,2位小数,Json名称"X"
LIB_ModbusToJsonAdd(0x0000,"S_AB",2,"X")
--Y轴倾斜角度值寄存器地址0x0001,16bit带符号整数AB类型,2位小数,Json名称"Y"
LIB_ModbusToJsonAdd(0x0001,"S_AB",2,"Y")
--Z轴倾斜角度值寄存器地址0x0002,16bit带符号整数AB类型,2位小数,Json名称"Z"
LIB_ModbusToJsonAdd(0x0002,"S_AB",2,"Z")
--参数设置(4800,无校验,1位停止位,功能码"03",从机地址默认0x01,应答最长等待1000ms,包与包最短间隔100ms)
LIB_ModbusToJsonSend("BAUDRATE_4800","NoneParity","StopBit_1","03",0x01,1000,100)
end
(2)4G 通信代码
WaitAnd4GSend() 函数实现 Json 传感器数据完整拼装,并将最终的 Json 字符串通过 MQTT Publish的方式发送给云服务器。
--等待RS485通信结束,并将合成好的Json数据通过4G模块发送给服务器
function WaitAnd4GSend(dev)
--等待RS485通信结束
while true do
--读取传感器结果和错误信息(如果没有错误Err=null)
Finish,Data,Err = LIB_ModbusToJsonFinishCheck()
if Finish == 1 then
--MbToJsonStr形如:{"Dev":"TH","Data":{"Humi":79.7,"Temp":26.8},"Err":null}
MbToJsonStr = string.format("{\"Dev\":\"%s\",\"Data\":%s,\"Err\":%s}", dev, Data, Err)
--等待4G网络连上(最多等90秒)
NetWaitTimeMsCnt = 0
while NetConnect == 0 and NetWaitTimeMsCnt < 90*1000
do
end
--将MbToJsonStr通过4G发给服务器
LIB_Cat1MqttEC800SendPub("QOS0", MqttPubTopic, MbToJsonStr)
break --跳出while循环
end
end
end