找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5247|回复: 0
收起左侧

modbus报文解析

[复制链接]
ID:230270 发表于 2017-9-1 15:49 | 显示全部楼层 |阅读模式
Modbus的编写首先需要知道协议的格式是什么样的,这里先通过PC端的modbus Poll的报文来分析具体的格式,内容含义。
1.      功能码为06写单寄存器
000182-Tx:01 06 00 02 00 0C 28 0F
000183-Rx:01 06 00 02 00 0C 28 0F
01 这里的01表示从机的写寄存器的时候,如果我们要把12写到一个地址是0002的寄存器地址里,点一下“send”,就会出现发送指令:01 06 00 02 00 0C 280F。我们来分析一下这帧数据,其中01是设备地址,06是功能码,代表写寄存器这个功能,后边跟0002表示的是要写入的寄存器的地址,00 0C就是要写入的数据,280F就是CRC校验码,这是软件自动算出来了。而根据Modbus协议,当写寄存器的时候,从机成功完成该指令的操作后,会把主机发送的指令直接返回,我们的调试的modbus poll会接收到这样一帧数据:01 06 00 02 00 0C 280F.


2.      功能码为03的读多个寄存器
000464-Tx:01 03 00 00 00 0A C5 CD
000465-Rx:01 03 14 00 09 00 08 00 0C 00 00 00 05 00 04 00 00 00 03 00 02 0001 F0 31
我们来分析一下这帧数据,发送的数据中01是设备地址,03是功能码,代表读多个寄存器这个功能,后边跟00 00表示的是要读的寄存器的起始地址,00 0A就是要写入数据的个数有10个,C5 CD就是CRC校验码。
而主机接收到的数据时,01是设备地址,03是功能码,14是要读取数据的2倍,14的10进制为20.而后面的00 09 00 08 00 0C 00 00 00 05 00 04 00 00 00 03 00 02 0001为读取的10个数据,两个字节表示一位数据。显示的数据与上位机软件的设置一样说明正确。
3.      功能码为05的单线圈的写入
000220-Tx:01 05 00 05 FF 00 9C 3B
000221-Rx:01 05 00 05 FF 00 9C 3B
下面我们来看看0X中功能码为05的报文含义,发送的数据中01是设备地址,05是功能码,代表写单个线圈状态,后边跟00 05表示的是要写的线圈的地址,FF 00就是要写入的线圈的状态,9C 3B就是CRC校验码。
而根据Modbus协议,当写线圈的时候,从机成功完成该指令的操作后,会把主机发送的指令直接返回,与写寄存器类似,返回的数据与原数据一样。
4 .功能码为01的读取线圈的状态
000332-Tx:01 01 00 00 00 0ABC 0D
000333-Rx:01 01 02 A8 03 86 3D

  相比于前面几个线圈的读取所包含的内容相对较多。发送的数据中01是设备地址,01是功能码,代表读多个线圈状态,后边跟00 00表示的是要读的线圈的起始地址,00 0A就是要读取线圈的个数这里是要读取10个线圈状态,BC 0D就是CRC校验码。
我们再看看modbus poll返回的报文,前两个01与前面含义一样,而后面的02的含义是,要读取的10个线圈的状态要使用两个寄存器(每8个线圈状态占用一个寄存器10个就需要两个),A8 03表示的含义是这10个线圈所代表的值的含义。上图中0~9依次是000101011,A8就是7~0的表达值,7~0为10101000刚好为A8,而后面剩余的8~9,也是由00000011表示刚好为03.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表