ModbusRTU串口读写报文解析

0. MODBUS速览

Modbus是一种通信协议,ModubsRTU是它的一种传输模式,通过这个协议能实现串口数据通讯。可以用C#控件读写串口,也可以直接使用开源的串口助手。

为了简化问题,本文只解析报文的格式,且只讨论异常状态读多个保持寄存器写多个保持寄存器

报文分为上行报文和下行报文。下行报文指主机发送给从机的数据。上行报文指从机发送给主机的数据。当主机为计算机,从机为单片机时,主机和从机用USB转485连接时,下行报文就是计算机通过485串口发送给单片机的数据,上行报文就是计算机收到的来自单片机的数据。

1. MODBUS常用下行报文格式

<1>读多个保持寄存器下行报文

Modbus下行[0]报文格式-读取多个寄存器
名称 从机号[1] 功能码 起始地址 寄存器数量 CRC校验码[3]
占用字节 1字节 1字节 2字节 2字节 2字节
例:01 03(读)[2] 例:0x03E8 例:0001

注[0]:

注[1]:Modbus协议规定存在一台主机和不少于一台的从机。从机数目大于1台时,不同的从机通讯口并联,不同的从机号区分开不同的从机。

注[2]:功能码代表对从机发出的请求类型。03表示读多个连续的寄存器,0x16表示写多个连续寄存器。

注[3]:CRC校验码是根据报文计算出的数据,用于核对数据,防止误码。

<2>写多个保持寄存器的下行报文

Modbus下行报文格式-写多个寄存器
名称 从机号 功能码 起始地址 寄存器数目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 

3. MODBUS常见上行报文格式

<1>写多个寄存器上行报文

Modbus上行报文格式-写多个寄存器
名称 从机号

功能码

起始地址 寄存器数量 CRC校验位
字节数 1 1 2 2 2
例:01 0x10 例:0x07D0 例:0001

<2>读多个寄存器上行报文

Modbus上行报文格式-读多个寄存器
名称 从机号 功能码 字节数2N 读到的数据 CRC校验位
字节数 1 1 1 2N 2
例:01 03 例:0x0A

物联沃分享整理
物联沃-IOTWORD物联网 » ModbusRTU串口读写报文解析

发表评论