Modbus_TCP 报文格式解析,Modbus RTU通过DTU转MQTT
- 2022-09-08 17:16:00
- 微图 原创
- 3032
1.Modbus_TCP报文基础
请求:00 00 00 00 00 06 09 03 00 00 00 01
响应:00 00 00 00 00 05 09 03 02 12 34
一次modbus tcp读取保持寄存器的通信分析(省略了ip/tcp头):从左向右分析该数据报文:
请求:
00 00为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文;
00 00表示协议标识符,00 00为modbus协议;
00 06为数据长度,用来指示接下来数据的长度,单位字节;
09为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址。以上七个字节也被称为modbus报文头;
03为功能码,此时代码03为读取保持寄存器数据;
00 00为起始地址;
00 01为寄存器数量,(word数量)。
响应:
00 00为此次通信事务处理标识符,应答报文要求与先前对应的请求保持一致;
00 00为协议标识符,与先前对应的请求保持一致;
00 05为数据长度,用来指示接下来数据的长度,单位字节;
09为设备地址,应答报文要求与先前对应的请求保持一致;
03为功能码,正常情况下应答报文要求与先前对应的请求保持一致,如果出错则返回80h+先前的功能码;
02指示接下来数据的字节长度;
12 34为被读取的保持寄存器中的数据值,即要求被读取的地址为00 00的保持寄存器中的数值为1234h
2.串口转WIFI DTU调试
2.1.DTU设置
串口选择:Modbus(格式正确发送的会自动添加CRC校验,网络收到的会去掉CRC检验)NONE(透传,直接转发网口数据)
(测试发现:串口设置成Modbus后,网络收到的数据和不对,DTU就会不加CRC直接发给串口)
2.2.设置从站
2.3.设置主站
设置Modbus 主站并查看分析报文
Tx:00 DF 00 00 00 06 01 03 00 00 00 0A Rx:00 DF 00 00 00 17 01 03 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A Tx:00 DF 00 00 00 06 01 03 00 00 00 05 Rx:00 DF 00 00 00 0D 01 03 0A 00 01 00 02 00 03 00 04 00 05
2.4.用网络助手调试
3.DTU做Modbus主站
让DTU主动轮询串口设备,网络走MQTT协议,上报数据
3.1.DTU串口设置成透传模式
3.2.DTU网口选MQTT协议
3.3.让DTU主动轮询
导入脚本
3.4.配置调试工具
2款调试工具设置一样的订阅连接信息
3.5.接收数据
发个大于9的数
改成十六进制接收
发现NX用字符类型数据收不到了
4.测试小结
测试了几天DTU的MQTT通讯,小结一下我们汉枫DTU的可行性。特别通用的就不写了
特点 |
易用情况 | ||
导入Flash脚本,DTU主动固定命令轮询 | 小白直接能导入也能用,简单改改就OK。轮询间隔200毫秒+/指令,上传10秒+/轮。(简单轮询,上传时间可以>10秒的话可以选汉枫) |
|
ModbusMasterScript-20200305.txt |
导入非Flash脚本,得先读懂代码 | 没运行完全成功过,串口能收,网络收不到。资料文档少没加群,不好定位问题。解析JSON数据格式的,汉枫代码解析方式就有点门槛了,抽象,脚本工具装起不起来。(要是涉及解析JSON就不推荐汉枫了) |
ModbusMasterScriptC串口能收发不到网口-202209.txt |
|
支持的协议比较多 |
|
ALI_IoTScript跑不起来备也份一下.txt |
发表评论