Modbus协议存在用于串口、以太网、专用网络的版本。各版本的Modbus通信协议在数据模型和功能调用上都是相同的,只有封装方式和一些细节有所不同的。本文对Modbus RTU报文协议进行分析。
Modbus数据帧格式如下:
![583391c57ebe4e1f8cfd7ef306c6f811~noop.image?_iz=58558&from=article.jpg 583391c57ebe4e1f8cfd7ef306c6f811~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538i1adhrh1dahdyon1.jpg)
1)从站地址:地址范围1-247,响应报文中的从站地址保持与请求报文的从站地址一致。
2)功能代码:表示不同的功能。正常响应报文中的功能代码保持与请求报文的功能代码一致,异常响应报文的功能代码=请求报文的功能代码 + 80H。常见功能代码如下:
![3744b2431a024440a2e7fb03a899ae88~noop.image?_iz=58558&from=article.jpg 3744b2431a024440a2e7fb03a899ae88~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538o6aw3exdxq0facce.jpg)
3)数据:请求报文中的数据格式根据功能代码而定,响应报文中的数据为返回的数据或错误码。
4)校验码:2个字节,用于校验数据,RTU采用CRC校验码。
下文采用Modbus Poll、Modbus Slave软件(登录网信智汇wangxinzhihui.com下载)对常见功能的报文进行分析。
1) 功能码01H:读读线圈(01寄存器)。
ModbusPoll读取01从站地址为00的线圈开始10个线圈状态。
![20c66475c1d140d5a393bccb49147087~noop.image?_iz=58558&from=article.jpg 20c66475c1d140d5a393bccb49147087~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538drkpeskssqh0rsrq.jpg)
报文分析如下:
![b1c9eed3a3b940bdb15d70f5661decf2~noop.image?_iz=58558&from=article.jpg b1c9eed3a3b940bdb15d70f5661decf2~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538wyhpv6ccm09q00m7.jpg)
其中响应报文返回的数据字节1、字节2组成的0201H,对应的二进制为1000000001。
ModbusPoll设置01从站地址为01的线圈为ON。
![6c89589fd08c40849394027931d2a8cd~noop.image?_iz=58558&from=article.jpg 6c89589fd08c40849394027931d2a8cd~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538kpahzxhgx7enviiy.jpg)
报文分析如下:
![30bda71cbd3a4229991b4a71c82c2f08~noop.image?_iz=58558&from=article.jpg 30bda71cbd3a4229991b4a71c82c2f08~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538vqqp31zrwrbxemgz.jpg)
其中:
线圈地址:01,高低字节分别为00、01
通断标志:ON对应高低位FF00,OFF对应0000
正常响应报文与请求报文一致。
3)功能码0FH:写多个线圈(01寄存器)
ModbusPoll设置01从站地址为00的线圈开始10个线圈的状态。
![5f59ea30fe6c4215992b1079224369a6~noop.image?_iz=58558&from=article.jpg 5f59ea30fe6c4215992b1079224369a6~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538qr72zpgzgrugsrzp.jpg)
报文分析如下:
![ca60fef93cea41ea8629bfc3148c4ff8~noop.image?_iz=58558&from=article.jpg ca60fef93cea41ea8629bfc3148c4ff8~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538hxixx7cy2w2gh0i0.jpg)
其中线圈通断为多个线圈通断状态按Bit组合而成的数据。如0D 02 组合成020DH,对应二进制为1000001101,每个bit对应线圈的状态。
4)功能码02H:读输入线圈(02寄存器)
ModbusPoll读取01从站地址为00的输入线圈开始10个线圈状态。
![596265b866134eb19f61b435d09aa0d3~noop.image?_iz=58558&from=article.jpg 596265b866134eb19f61b435d09aa0d3~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538xkukwkuemuowsmay.jpg)
报文分析如下:
![d91b4454e9254d738fb490cf1050ae3d~noop.image?_iz=58558&from=article.jpg d91b4454e9254d738fb490cf1050ae3d~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538oqnsbgzzb5qyjhzq.jpg)
其中响应报文返回的数据字节1、字节2组成的0004H,对应的二进制为0000000100。
4)功能码03H:读保持寄存器(03寄存器)
以下为ModbusPoll读取01从站地址为02的保持寄存器,开始2个字,组成1个浮点数。
![7f59c7c688a24ec985e40166a0629c5b~noop.image?_iz=58558&from=article.jpg 7f59c7c688a24ec985e40166a0629c5b~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538frn0zir5f7dvroa7.jpg)
报文分析如下:
![6b81d4ad387b41e894760e17864df1aa~noop.image?_iz=58558&from=article.jpg 6b81d4ad387b41e894760e17864df1aa~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538e4etx2neouyxrn2k.jpg)
5)功能码06H:写单个保持寄存器(03寄存器)
以下为ModbusPoll写01从站地址为02的保持寄存器,写入数据为23。
![4c17e67d46384bf0880cff8d84a4c806~noop.image?_iz=58558&from=article.jpg 4c17e67d46384bf0880cff8d84a4c806~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538penshofsinmoekes.jpg)
报文分析如下:
![0f86b80e1e954cd2b5655a6477ee3c9f~noop.image?_iz=58558&from=article.jpg 0f86b80e1e954cd2b5655a6477ee3c9f~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538fks9fr49fkv7vdck.jpg)
其中
写入数据0017H,为数据23
响应报文同请求报文
以下为ModbusPoll往01从站保持寄存器02地址写入数据120.34,34.768。
![b72b2d614de44f8ba869196967bc994b~noop.image?_iz=58558&from=article.jpg b72b2d614de44f8ba869196967bc994b~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538krpmw41gpjprwbs1.jpg)
报文分析如下:
![8f520d786966404a890b6181c86973c8~noop.image?_iz=58558&from=article.jpg 8f520d786966404a890b6181c86973c8~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538izlwcfdxthaaelev.jpg)
以下为ModbusPoll读取01从站输入寄存器00开始4个字,组成2个浮点数。
![3897b538cc4b4b5688f31bb2bba9091e~noop.image?_iz=58558&from=article.jpg 3897b538cc4b4b5688f31bb2bba9091e~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538clmh3kakrrki3urd.jpg)
报文分析如下:
![b292fa5e89ac4fd1a3b84b2ac88faeaf~noop.image?_iz=58558&from=article.jpg b292fa5e89ac4fd1a3b84b2ac88faeaf~noop.image?_iz=58558&from=article.jpg](https://static.assets-stash.eet-china.com/forum/202306/27/113538y78ia8gra78da7z1.jpg)