设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
控制专题
›
『数控/电机控制/运动控制/工业总线』
›
Modbus RTU报文简单解析
返回列表
发新帖
Modbus RTU报文简单解析
[复制链接]
51790
|
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
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
tony40830389
回复楼主
返回列表
『数控/电机控制/运动控制/工业总线』
『机器视觉/AI/IoT/机器人论坛』
『高级语言/组态软件/触摸屏』
『操作系统xp/xin7/win10/linux』