Modbus RTU报文简单解析

[复制链接]
查看51783 | 回复0 | 2024-3-22 20:54:20 | 显示全部楼层 |阅读模式

A32

Modbus RTU报文简单解析

工业系统



Modbus RTU通讯协议作为自动化中常用协议的一种,广泛的应用于仪器仪表通信、变频器通信、楼宇控制、消防控制、数据采集等,Modbus协议标准最早由Modicon(莫迪康)公司于1979年制定,并用在其PLC产品上。后来Modicon公司被我们所熟知的Schneider(施耐德)公司收购。

Modbus RTU 常采用RS-485作为物理层,利用串口实现数据报文的收发,报文数据采用二进制数据进行通信(RS485和Modbus RTU是两个层面概念,一个是物理接口,一个属于协议)



Modbus串行链路协议是一个 主——从协议 该协议位于OSI模型的第2层。

主——从类型的系统有一个主节点(主站),它向某个从节点(从站)发出显式命令并处理响应。从站在没有收到主站的请求时并不主动地传输数据,也不与其他从站通信。

在物理层,串行链路上的Modbus系统可以使用不同的物理接口(RS485、RS232)。最常用的物理接口是TIA/EIA-485(RS485)二线制接口。作为附加选项,该物理接口也可以使用RS485四线制接口。当只需要近距离的点对点通信时,也可以使用TIA/EIA-232-E(RS232)串行接口作为Modbus系统的物理接口(EIA/TIA为标准协会简称)



Modbus通信总是由主站发起。当从站没有收到来自主站的请求时,不会发送数据。从站之间不能相互通信。



Modbus寻址规则,Modbus寻址空间由256个不同地址组成,地址 0 为广播地址,所有从站必须识别广播地址,Modbus 主站没有特定地址,只有从站有一个地址,而且从站的地址是唯一的



重点来了,Modbus RTU的报文格式

Modbus RTU协议的“报文”格式如上图所示,由地址(1字节)功能码(1字节)数据(0~255字节)CRC校验码(2字节)组成,功能码为操作命令,比如

读寄存器       (03 16进制)

写某个寄存器(06 16进制)

写多路寄存器(10 16进制)

读线圈状态    (01 16进制)

写线圈           (05 16进制)



Modbus的地址相关





每一种数据区块都最多允许有65536(2的16次方)个元素,每个数据元素的地址范围从0到65535,但是每个数据元素的编号从1开始,范围从1到65536。65536只是协议允许的最大元素范围,并不要求全部实现,因此理论上

线圈地址范围:000001~065536

离散量输入地址范围:100001~165536

输入寄存器地址范围:300001~365536

保持寄存器地址范围:400001~465536

由于65536是比较大的数值,实际应用一般不需要这么大的存储区,设备厂家普遍采用的是10000以内的地址范围

线圈地址范围:00001~09999

离散量输入地址范围:10001~19999

输入寄存器地址范围:30001~39999

保持寄存器地址范围:40001~49999

例如常见到的寄存器地址40001/400001,最前面的4表明它是一个保持寄存器,后面的0001或者00001都是指第一个保持存储器,并且它的地址是0。寄存器30004表明它是输入寄存器,地址是3。注意:保持寄存器和输入寄存器中的数值是2个字节,而线圈和离散量输入中数值大小仅为位(1bit )在报文中,都是以编号地址进行书写,例如地址为0x0000,实际的报文中为00 01(2字节),那报文中怎么分辨它是哪个数据区块呢,这就要靠我们上面说的功能码来识别了,请看下文

例如主站请求1号站,保持寄存器地址0x0000(编号40001)的数据报文:

01  03  00 00  00 01  84 0A

01:从站地址号

03:功能码,读保持寄存器

00 00:请求寄存器起始地址 0x0000(40001)

00 01:寄存器数量 1个

84 0A:CRC校验码

从站回复报文

01  03  02 00  38  B9 96

01:从站地址号

03:功能码,读保持寄存器

02:字节数

00 38:寄存器数据

B9 96:CRC校验码

通过上面的主站请求,从站回复,我们就得到了保持寄存器0x0000(编号40001)的值为38(回复为16进制格式,转换10进制为56)

例如主站分别写入保持寄存器地址0x0000(40001)0x0001(40002)为19,20(16进制,10进制为25,32)的数据报文:

01  10  00 00  00 02  04  00 19  00 20  23 B0

01:从站地址号

10:功能码,写多路寄存器

00 00: 请求寄存器起始地址 0x0000(40001)

00 02:写入寄存器数量 2个

04:写入字节数

00 19:第一个写入数据

00 20:第二个写入数据

23 B0:CRC校验码

从站回复报文

01  10  00 00  00 02  41 C8

01:从站地址号

10:功能码,写多路寄存器

00 00:请求寄存器起始地址 0x0000(40001)

00 02:写入寄存器数量 2个

41 C8:CRC校验码

为了大家直观的理解,我们可以通过软件来模拟这一过程,所需软件:



1、Configure Virtual Serial Port Driver 虚拟串口,它可以在你的电脑上模拟出一对已经关联的虚拟串口,例如COM1←→COM2 这样,仿真出来两个虚拟的串口,给COM1发送数据,COM2就会收到,同理COM2也是

2、Modbus Slave Modbus仿真设备,可以仿真寄存器或线圈的状态

3、UartAssist 串口调试助手

首先打开虚拟串口软件,先虚拟出一对串口出来


我们打开串口助手,找到Modbus相关,这个串口助手软件可以自行计算CRC校验比较方便,同时配置好Modbus Slave软件



我们来实行第一个示例,读取寄存器地址40001的数据

我们再来实现第二个示例,像40001和40002中分别写入0x19(10进制为25), 0x20(10进制为32)




试验软件和简单的资料也给大家准备了,可以自行下载



   

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则