• 欢迎大家分享资料!前往留言板评论即可!

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

合宙 模组资料网 2年前 (2021-05-15) 371次浏览 0个评论 扫描二维码
文章目录[隐藏]

iRTU开源项目是iRTU开源模组的核心部分,它是iRTU硬件产品的灵魂。我们该做的就是怎么把这个开源项目利用好,让他发挥出应有的价值。 上一篇文章中,我尝试使用手机客户端对Modbus继电器进行控制,今天我们换用开源PC端和Modbus 温湿度传感器 进行一次温湿度采集。

Modbus简介

Modbus对设备的控制是通过对一系列寄存器的读写完成的。 设备地址是一个8bit的字节,规定了总线上要进行通讯的设备地址,最多可以有247个设备,地址为0的时候为广播地址,所有设备都应该进行解析,248-255是供用户扩展之用。 功能代码是具体执行的功能,数据部分是可变长度的整字节数据,报文尾部有一个双8Bit的CRC校验位。 当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就返回任何信息。

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

本次实验以我购得的一个采用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移动双模通讯模块,电路采用极简设计,性能优秀,更更令人愉快的是硬件竟然是开源的。

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

下图是本次实验用到的物料

Air720D DTU大板 X1

SD123-T10 Modbus温湿度传感器 X1

USB转RS485转接头 X1

电话线 1盘

导线 X 6

9V DC直流电源 X1 (含电源接头)

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

下面是连线方式,其中RS485转换头和传输线仅供配置用,配置完成后可以移除。
稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

##实现方法

第一步:按照上图将电路连接完成,完成后如下图所示效果

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

第二步:编写上下行数据流模板

下行数据流模板(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":[]}}

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

第五步,运行UDP Demo。在命令行里输入temp,可以看到温湿度被采集了回来,向传感器 哈一口气,可以明显看到湿度上升。

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

第六步,最终效果

稀饭放姜 iRTU 学习日记 (5):用电脑采集Modbus温湿度传感器数据

温湿度采集用途很广,配合上一期的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


喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址