iRTU开源项目是iRTU开源模组的核心部分,它是iRTU硬件产品的灵魂。我们该做的就是怎么把这个开源项目利用好,让他发挥出应有的价值。 上一篇文章中,我尝试使用手机客户端对Modbus继电器进行控制,今天我们换用开源PC端和Modbus 温湿度传感器 进行一次温湿度采集。
Modbus简介
Modbus对设备的控制是通过对一系列寄存器的读写完成的。 设备地址是一个8bit的字节,规定了总线上要进行通讯的设备地址,最多可以有247个设备,地址为0的时候为广播地址,所有设备都应该进行解析,248-255是供用户扩展之用。 功能代码是具体执行的功能,数据部分是可变长度的整字节数据,报文尾部有一个双8Bit的CRC校验位。 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就返回任何信息。
本次实验以我购得的一个采用RS485接口的Modbus温湿度采集模块配合合宙出品的720D DTU大板进行试验。
--下行报文 (iRTU->Modbus温度湿度传感器)
01 03 02 00 00 03 04 73
01->地址码,购买的设备默认起始为01,可以通过随机的PC程序进行配置。
03->功能码,控制采集温湿度
02->寄存器起始位,02 00 代表起始寄存器地址:采集 温度,湿度,露点温度
03->读取的长度
04 73->CRC16校验和
--上行报文 (Modbus->iRTU)
01 03 06 01 0B 01 31 00 50 D5 6A
返回内容格式:
01->地址码,购买的设备默认起始为01,可以通过随机的PC程序进行配置。
03->功能码,控制采集温湿度
06->返回的长度
温度
01 0B-> 0x010B=267 / 10 = 26.7℃;
湿度
01 31->0x0131 =305 / 10 = 30.5%RH。
露点温度
00 50->0x0050 =80 /10 = 8℃
##电路连接方式
本次试验电路测试中采用了我们熟悉的合宙原厂iRTU 硬件 720D 4G DTU大板,此款产品商城有售,内部采用合宙出品的Air720D移动双模通讯模块,电路采用极简设计,性能优秀,更更令人愉快的是硬件竟然是开源的。
下图是本次实验用到的物料
Air720D DTU大板 X1
SD123-T10 Modbus温湿度传感器 X1
USB转RS485转接头 X1
电话线 1盘
导线 X 6
9V DC直流电源 X1 (含电源接头)
下面是连线方式,其中RS485转换头和传输线仅供配置用,配置完成后可以移除。
##实现方法
第一步:按照上图将电路连接完成,完成后如下图所示效果
第二步:编写上下行数据流模板
下行数据流模板(DTU->Modbus传感器),该模板用于将手机发送的继电器控制指令翻译为Modbus继电器的控制报文。
--Download steam
function
local str=...
local dat=str:sub(40,-3)
local ret=""
if (dat:sub(1,4)=="temp") then
ret= string.fromHex("01 03 02 00 00 03 04 73")
else
ret =dat
end
return ret
end
上行数据流模板(Modbus传感器->DTU),该模板用于将Modbus传感器采集到的数据翻译成MTCP报文,发送给PC端。
--Upload stream
function
local a=...
local ret=""
local str=""
if (a:sub(1,2)==string.fromHex("01 03")) then
local num1=(a:sub(4,4):byte()*255+a:sub(5,5):byte())/10
local num2=(a:sub(6,6):byte()*255+a:sub(7,7):byte())/10
local temp=tostring(num1,10)
local humd=tostring(num2,10)
str="Temperature:"..temp.." Humedity:"..humd
else
str=string.toHex(a, " ")
end
local totallen=41+str:len()
local ret=string.format("%04d",totallen).."01".."C".."01".."0000000001".."0000000000000001".."1234"..str.."05"
return ret
end
第三步:配置iRTU
将编写好的上下行数据流模板和Upws服务器参数通过串口工具配置到DTU
服务器设置:
1) 配置iRTU为UDP传输模式,服务器地址为 box.miuser.net,DPU端口为7101
2) 每隔10S发送一次心跳包,心跳包的内容为 005501B01000000000100000000000000011234iRTUUPWs 1.0.000
3) 使用数据通道1通过数据模板进行透传,并绑定到到iRTU串口1
第四步,打开LLCCOM调试工具,将以上配置信息通过串口工具写入iRTU
config,writeconfig,{"fota":0,"uartReadTime":"25","flow":"","param_ver":"1","pwrmod":"normal","password":"","netReadTime":"0","passon":1,"nolog":"0","plate":0,"reg":0,"convert":0,"uconf":[[1,"115200",8,2,0,""],[2,"115200",8,2,0,""]],"conf":[["udp","005501B01000000000100000000000000011234iRTUUPWs 1.0.000",10,"box.miuser.net",7101,1,"","",""],[],[],[],[],[],[]],"preset":{"number":"","delay":"","smsword":""},"apn":["","",""],"cmds":[[],[]],"pins":[],"gps":{"pio":[],"fun":[]},"upprot":["--Upload stream\nfunction \n\n local a=...\n\n local ret=\"\"\n local str=\"\"\n\n if (a:sub(1,2)==string.fromHex(\"01 03\")) then \n local num1=(a:sub(4,4):byte()*255+a:sub(5,5):byte())/10 \n local num2=(a:sub(6,6):byte()*255+a:sub(7,7):byte())/10 \n local temp=tostring(num1,10)\n local humd=tostring(num2,10) \n str=\"Temp:\"..temp..\" Humedity:\"..humd \n else\n str=string.toHex(a, \" \")\n end\n\n local totallen=41+str:len()\n local ret=string.format(\"%04d\",totallen)..\"01\"..\"C\"..\"01\"..\"0000000001\"..\"0000000000000001\"..\"1234\"..str..\"05\"\n\nreturn ret\nend ","","","","","",""],"dwprot":["--Download steam\nfunction\n local str=...\n local dat=str:sub(40,-3)\n local ret=\"\"\n if (dat:sub(1,4)==\"temp\") then\n ret= string.fromHex(\"01 03 02 00 00 03 04 73\")\n else \n ret =dat\n end\n return ret\nend","","","","","",""],"warn":{"adc0":[],"adc1":[],"vbatt":[],"gpio":[]} }
第五步,运行UDP Demo。在命令行里输入temp,可以看到温湿度被采集了回来,向传感器 哈一口气,可以明显看到湿度上升。
第六步,最终效果
温湿度采集用途很广,配合上一期的Modbus继电器就可以构成完整的大棚温湿度采集方案了。而且更加聪明的你一定注意到的是,并不需要配置两个DTU,只需要自行修改传感器的地址,合并Modbus上下行数据流模板就可以用一个DTU同时采集温湿度并控制网络继电器。 这个就需要您自己试试喽,如果有问题也欢迎和我讨论,我的QQ:64034373,加好友注明您的目的,谢谢。
参考资料
本文所提及的文档及工具资料包:
链接:https://pan.baidu.com/s/1bnpWMISqglnLyXnZt5ISEg 提取码:kshz
本文参考资料如下:
1 iRTU项目开源地址
https://github.com/hotdll/iRTU
2 UPWS项目开源地址
https://github.com/miuser00/UdpPlugWebsocket
3 LLC能跑Lua脚本的串口调试工具项目开源地址
https://github.com/chenxuuu/llcom
技术咨询方式
合宙Luat(稀饭放姜iRTU) QQ群:952343033