0. MODBUS速览
Modbus是一种通信协议,ModubsRTU是它的一种传输模式,通过这个协议能实现串口数据通讯。可以用C#控件读写串口,也可以直接使用开源的串口助手。
为了简化问题,本文只解析报文的格式,且只讨论异常状态、读多个保持寄存器与写多个保持寄存器。
报文分为上行报文和下行报文。下行报文指主机发送给从机的数据。上行报文指从机发送给主机的数据。当主机为计算机,从机为单片机时,主机和从机用USB转485连接时,下行报文就是计算机通过485串口发送给单片机的数据,上行报文就是计算机收到的来自单片机的数据。
1. MODBUS常用下行报文格式
<1>读多个保持寄存器下行报文
名称 | 从机号[1] | 功能码 | 起始地址 | 寄存器数量 | CRC校验码[3] |
占用字节 | 1字节 | 1字节 | 2字节 | 2字节 | 2字节 |
例:01 | 03(读)[2] | 例:0x03E8 | 例:0001 |
注[0]:
注[1]:Modbus协议规定存在一台主机和不少于一台的从机。从机数目大于1台时,不同的从机通讯口并联,不同的从机号区分开不同的从机。
注[2]:功能码代表对从机发出的请求类型。03表示读多个连续的寄存器,0x16表示写多个连续寄存器。
注[3]:CRC校验码是根据报文计算出的数据,用于核对数据,防止误码。
<2>写多个保持寄存器的下行报文
名称 | 从机号 | 功能码 | 起始地址 | 寄存器数目N | 字节数目2N | 待写入数据 | CRC校验码 |
占用字节 | 1字节 | 1字节 | 2字节 | 2字节 | 1字节 | 2N字节 | 2字节 |
例:01 | 0x10(写) |
例:0x07D0 | 例:02 | 例:04 |
2. MODBUS常见异常状态
<1>没有收到上行报文
有时候,通过串口助手发送下行报文后,主机却没有收到报文,常见原因如下。
A. 硬件问题
A1. 接触不良,或者AB线连接错误
A2. 单片机没有上电
应对方案:检查电路
B. 报文问题
B1. 校验码错误
B2. 报文格式错误
应对方案:检查报文
C.软件问题
C1: 单片机程序问题
应对方案:重新烧录程序
<2>收到的数据为异常码
若主机正常地接收到了上行报文,返回的功能码应该与下行报文一致。若出现异常,返回的功能码为原功能码加上0x80。
返回的从机号与下行报文一致。若从机不存在,不返回报文。
例:
下行报文
01 03 00 01 00 02
上行报文(异常)
01 83 02 C0 F1 文章来源:https://www.toymoban.com/news/detail-447051.html
3. MODBUS常见上行报文格式
<1>写多个寄存器上行报文
名称 | 从机号 | 功能码文章来源地址https://www.toymoban.com/news/detail-447051.html |
起始地址 | 寄存器数量 | CRC校验位 |
字节数 | 1 | 1 | 2 | 2 | 2 |
例:01 | 0x10 | 例:0x07D0 | 例:0001 |
<2>读多个寄存器上行报文
名称 | 从机号 | 功能码 | 字节数2N | 读到的数据 | CRC校验位 |
字节数 | 1 | 1 | 1 | 2N | 2 |
例:01 | 03 | 例:0x0A |
到了这里,关于ModbusRTU串口读写报文解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!