Toggle navigation
首页
(current)
问答
文章
话题
商城
登录
注册
稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据
RS485
iRTU
UPWS服务器
温湿度采集
入门教程
本次实验以我购得的一个采用RS485接口的Modbus温湿度采集模块配合合宙出品的720D DTU大板进行试验,采集环境温湿度。
iRTU开源项目是iRTU开源模组的核心部分,它是iRTU硬件产品的灵魂。我们该做的就是怎么把这个开源项目利用好,让他发挥出应有的价值。 上一篇文章中,我尝试使用手机客户端对Modbus继电器进行控制,今天我们换用开源PC端和Modbus 温湿度传感器 进行一次温湿度采集。 ## Modbus简介 Modbus对设备的控制是通过对一系列寄存器的读写完成的。 设备地址是一个8bit的字节,规定了总线上要进行通讯的设备地址,最多可以有247个设备,地址为0的时候为广播地址,所有设备都应该进行解析,248-255是供用户扩展之用。 功能代码是具体执行的功能,数据部分是可变长度的整字节数据,报文尾部有一个双8Bit的CRC校验位。 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就返回任何信息。 ![](/static/editormd/php/../uploads/5_89650.jpg) 本次实验以我购得的一个采用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移动双模通讯模块,电路采用极简设计,性能优秀,更更令人愉快的是硬件竟然是开源的。 ![](/static/editormd/php/../uploads/5_84480.jpg) 下图是本次实验用到的物料 Air720D DTU大板 X1 SD123-T10 Modbus温湿度传感器 X1 USB转RS485转接头 X1 电话线 1盘 导线 X 6 9V DC直流电源 X1 (含电源接头) ![](/static/editormd/php/../uploads/5_67840.jpg) 下面是连线方式,其中RS485转换头和传输线仅供配置用,配置完成后可以移除。 ![](/static/editormd/php/../uploads/5_59121.jpg) ##实现方法 第一步:按照上图将电路连接完成,完成后如下图所示效果 ![](/static/editormd/php/../uploads/5_57625.jpg) 第二步:编写上下行数据流模板 下行数据流模板(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":[]}} ![](/static/editormd/php/../uploads/5_35767.jpg) 第五步,运行UDP Demo。在命令行里输入temp,可以看到温湿度被采集了回来,向传感器 哈一口气,可以明显看到湿度上升。 ![](/static/editormd/php/../uploads/5_65975.jpg) 第六步,最终效果 ![](/static/editormd/php/../uploads/5_53184.jpg) 温湿度采集用途很广,配合上一期的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
发表于 2020-01-06 16:05
阅读 ( 3045 )
分类:
默认分类
6 推荐
收藏
你可能感兴趣的文章
合宙Air系列模块外部总线接口常见用法-SPI总线,中
2291 浏览
稀饭放姜 iRTU 学习日记 (4):Websokcet手机客户端通过iRTU控制Modbus继电器
2525 浏览
用Air800制作一个带显示和按键键盘的简易电话
2230 浏览
GPS/北斗 导航模块 Air530开发板G1学习日记
4323 浏览
稀饭放姜 iRTU 学习日记 (0)入手iRTU固件的开发板
3364 浏览
相关问题
7 条评论
请先
登录
后评论
miuser
工程师
21 篇文章
作家榜
»
技术销售Delectate
43 文章
陈夏
26 文章
国梁
24 文章
miuser
21 文章
晨旭
20 文章
朱天华
19 文章
金艺
19 文章
杨奉武
18 文章
×
发送私信
发给:
内容:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!