Modbus协议解析
Modbus协议解析
- Modbus协议分类
- Modbus通讯模型
- Client-Server模型
- Master-Slave模型
- 模型本质
- 寄存器
- 功能码
- 典表
- Modbus-TCP通讯帧结构
- 功能码0x01\0x02
- 功能码0x03\0x04
- 功能码0x05\0x06
- 功能码0x0F/0x10
- 异常回复
- Modbus-RTU通讯帧结构
- 读取Slave寄存器
- 写单个Coil、Hold Reg
- 写多个Coils、Hold Regs
- 异常回复
Modbus协议分类
Modbus是工业现场常用的一种通讯协议,其本质是,利用通讯,读写其他设备的内存数据。
本文仅记录个人常用的Modbus-TCP,Modbus-RTU。顾名思义,这两者的区别之一是传输的物理介质不同。Modbus-TCP主要基于以太网传输,Modbus-RTU主要基于RS485传输。
Modbus通讯模型
Modbus通讯模型主要有两种,Client-Server模型和Master-Slave模型。
Client-Server模型
此模型适用于Modbus-TCP。在TCP通讯中,存在着Client与Server。Client首先发起请求,Server监听Client的请求,并在收到Client的请求后予以回应。TCP是基于连接的通讯,Modbus是基于TCP通讯之上,构建的应用层协议。Client发起Modbus请求,Server予以回应。在通讯层面,仅看做简单的TCP数据收发。而应用层的Modbus具体协议,请看后文。
关于TCP,Client,Server、IP地址,端口号等TCP通讯模型,本文不再赘述,如有疑问,请自行查阅其他资料。
Client-Server模型示意图:
Master-Slave模型
此模型适用于Modbus-RTU。如上文所述,RS485是两根差分线进行半双工通讯,CPU侧是UART外设,即串口。RS485是半双工总线,只有两根差分物理信号线,简洁高效。
RS485的总线拓扑:
此图截选自ADI公司的某款RS485/422驱动芯片的一份数据手册,RS422比RS485多了一对差分线,收发分立,所以可以全双工工作。但RS485由于其布线简单,所以应用场景更为广泛。
RS485的半双工特性,决定了它的通讯拓扑中,只能有一个Master,作为通讯的发起者,而其余设备作为Slave,每个Slave赋予唯一的ID号,借此判断Master是否是与自己对话。简单说,Master只能有一个,一次只能对一个Slave进行对话,同时刻,总线上只能有一个人在说话,不是对自己说的,则不予回复。
Master-Slave模型示意图如下:
模型本质
不管是何种模型,其本质都是数据的交换。发起者获取应答者的数据,或者发起者传递数据到应答者。Modbus协议的核心,就是定义数据交换的格式。由此引入了寄存器、功能码、典表这三个最重要的概念。
寄存器
Slave或者Server所在的设备的内存中的某些变量或区域需要共享给Master或者Client设备,则该变量被称为寄存器。
寄存器分为4类,分别是 Coil Reg,Input Discrete Reg,Hold Reg,Input Reg,它的常规翻译难以简单明了表示其属性,所以下表的描述,可能与常规翻译有出入。
寄存器 | 描述 |
---|---|
Coil Reg | 布尔量寄存器,Master/Client可读可写 |
Input Discrete Reg | 输入型布尔量寄存器,Master/Client只读 |
Hold Reg | 保持寄存器,最小单位16bit,Master/Client可读可写 |
Input Reg | 输入寄存器,最小单位16bit,Master/Client只读 |
功能码
Master/Client发起的每一帧Modbus请求,都包含有功能码。功能码标志此请求的类型,是请求帧中的核心数据。
功能码 | Dec | 中文描述 |
---|---|---|
0x01 | Read Coil Regs | 读取一个或多个 Coil Regs |
0x02 | Read Discrete Input Regs | 读取一个或多个Discrete Input Regs |
0x03 | Read Hold Regs | 读取一个或多个Hold Regs |
0x04 | Read Input Regs | 读取一个或多个 Input Regs |
0x05 | Write Single Coil Reg | 写单个Coil Reg |
0x06 | Write single Hold Reg | 写单个Hold Reg |
0x07 | Read Exception Status | |
0x0F | Write Multiple Coil Regs | 写多个Coil Reg |
0x10 | Write Multiple Hold Regs | 写多个Hold Reg |
0x11 | Export Slave ID | |
0x16 | Mask Write Register | |
0x17 | Write And Read Hold Registers |
功能码0x07\0x11\0x16\0x17本人不曾使用过,限于精力,本文不予描述。
典表
给Slave/Server中的寄存器,协定一个地址,形成地址–>寄存器的映射关系表,就是典表。Master/Client中看到的是地址,此地址对应到Slave/Server中一个具体的寄存器。典表由所有设备共同维护。
关系图如下:
如上图,Master发起写单个HoldReg请求,功能码06,地址是 500,附带了A数组中所有的数据。Slave接到此请求包后,将具体数据,写入到地址码500对应的变量B中。
Modbus-TCP通讯帧结构
Modbus-TCP由于TCP自带CRC校验,所以无需添加任何其他校验
功能码0x01\0x02
读取BOOL型数据。Sequence指的是通讯轮次,每完成一轮 Request-Respond,递增1。NB1指的是读取的BOOL的个数。
Respond的Sequence与Request一致。NB2 = (NB1)/8 + ((NB1 % 8) ? 1 : 0)。一个BOOL在内存中占1字节。在通讯中只需要占用1bit即可。所以Modbus中,将8个BOOL数据压缩成一个字节,余下不足8bit的,依然占用1字节。
N = 8+NB2,Respond[8]后面跟的数据,才是Master/Client读取的数据。
功能码0x03\0x04
Hold Reg 和 Input Reg,最小单位为Word,即16bit。NB1指的是读取Address后,NB1个Word的数据。
Respond中,NB2 = NB1 * 2,即NB2的单位为字节。N = 8 + NB2。
功能码0x05\0x06
写单个Coil和单个Hold Reg帧结构一致
对于写Coil:Data = 0xFF00 或者 0,取决于BOOL量的值
对于写Hold Reg:Data = 要写入的数据,需要注意大小端一致。
正常的Respond与Request的数据一摸一样。
功能码0x0F/0x10
写多个Coils和写多个Hold Regs帧结构一致
对于写Coils,NB2 = (NB1 / 8) + ((NB1 % 8) ? 1 : 0);
对于写Hold Regs,NB2 = NB1 * 2
异常回复
异常的回复帧将功能码最高位置1,并跟随一个异常代码:
异常代码表:
异常码 | Dec |
---|---|
0x01 | MODBUS_EXCEPTION_ILLEGAL_FUNCTION |
0x02 | MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS |
0x03 | MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE |
0x04 | MODBUS_EXCEPTION_SLAVE_OR_SERVER_FAILURE |
0x05 | MODBUS_EXCEPTION_ACKNOWLEDGE |
0x06 | MODBUS_EXCEPTION_SLAVE_OR_SERVER_BUSY |
0x07 | MODBUS_EXCEPTION_NEGATIVE_ACKNOWLEDGE |
0x08 | MODBUS_EXCEPTION_MEMORY_PARITY |
0x09 | MODBUS_EXCEPTION_NOT_DEFINED |
0x0a | MODBUS_EXCEPTION_GATEWAY_PATH |
0x0b | MODBUS_EXCEPTION_GATEWAY_TARGET |
Modbus-RTU通讯帧结构
Modbus-RTU帧结构与Modbus-TCP相比,典表处理方式一致,帧首排列不一致,帧尾多了CRC校验。
读取Slave寄存器
功能码0x01\0x02\0x03\0x04,帧结构都如下:
功能码 | NB2计算 |
---|---|
0x01、0x02 | (NB1 / 8) + ((NB1 % 8) ? 1 : 0); |
0x03、0x04 | NB1 * 2 |
写单个Coil、Hold Reg
帧结构:
功能码 | data |
---|---|
0x05 | (Coil) ? 0xFF00 , 0 |
0x06 | 需要写入的数据 |
写多个Coils、Hold Regs
帧结构:
功能码 | NB2计算 |
---|---|
0x0F | (NB1 / 8) + ((NB1 % 8) ? 1 : 0); |
0x10 | NB1 * 2 |
异常回复
Modbus协议解析相关推荐
- Modbus协议解析--小白一看就懂的协议
文章目录 提问三连 1.什么是Modbus? 2.Modbus用来干什么? 3.Modbus的内容是什么? 3.1 Modbus-RTU+Modbus-ASCII 3.1.1 Modbus-RTU协议 ...
- 工业modbus协议解析和转换
1 什么是Modbus协议? Modbus 协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络(例如以太网)和其它设备之间可以通信.它已经成为一通用工业标准.有了它,不 ...
- 二、ModBus协议解析
0x01 初识ModBus Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的.现在的Modbus协议已经成为工业领域通信 ...
- Modbus介绍与协议解析
一.Modbus介绍 Modbus是一种通讯协议,主要应用于电子控制器上的一种通用语言.Modbus支持多种电气接口,如RS232.RS485.TCP/IP等.多数Modbus设备通信是通过串口或TC ...
- 【Modbus 】Modbus 协议
Modbus 协议简介 Modbus协议是一项应用层报文传输协议,包括ASCII.RTU.TCP三种报文类型. 标准的Modbus协议物理层接口有RS232.RS422.RS485和以太网接口,采用m ...
- STM32物联网项目-RS485通信(Modbus协议)
RS485通信(Modbus协议) 协议介绍 RS485介绍:http://t.csdn.cn/bOuFX Modbus协议:http://t.csdn.cn/mgioX CubeMX配置 RS-48 ...
- modbus 协议基础知识
Modbus的内容是什么 协议种类 Modbus-RTU+Modbus-ASCII Modbus-TCP Modbus-Plus 通讯过程: Modbus是主从方式通信,也就是说,不能同步进行通信,总 ...
- 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信
接下来的内容,我会以从头开发一个简单的基于modbus tcp通信的案例,来实现一个基础的通信功能. 有关环境: 开发环境:VS 2022企业版 运行环境:Win 10 专业版 .NET 环境版本:. ...
- Modbus通信协议+Modbus串口调试工具+Java版协议解析源码
网络与串口二合一调试助手TCPCOM: https://download.csdn.net/download/liuyuan_java/87454762 Modbus调试工具,模拟串口调试工具 htt ...
- Modbus TCP协议解析
在之前的文章中,我们介绍了Modbus RTU协议的内容和实现方法.最近在进行网络通讯的时候又用到了Modbus TCP协议,因此这里把自己对Modbus TCP的了解总结一下. 文章目录 一.Mod ...
最新文章
- php要求掌握链表结构吗,PHP 链表结构之单链表(一)
- 01-HTML基础与进阶-day6-录像281
- ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
- Windows从命令行创建文本文件的两种方式
- 简单易用的库存管理软件、进销存软件
- SQL SERVER 2012 OBJECT_ID
- 远程桌面服务怎么测试_快速的远程服务测试
- OpenXLSX 中文字段读取问题
- 【PDF】PDF无法注释的一种解决方案
- Codecraft-18 and Codeforces Round #458: C. Travelling Salesman and Sp(组合数)
- 关于 Java 性能监控您不知道的 5 件事,第 1 部分
- jupternote不同类之间相互调用(调用ipynb文件)
- matlab green函数,地基土的传Green函数编辑中……
- mac录制视频——OBS
- 如何解决安装DreamWeaver8 时候提示“无法将数值写入键/SOFTWARE/classes/.shtml”
- oracle清除过期备份,rman delete obsolete删除过期备份集问题
- Unity 抛物线,直线,Sine曲线等
- 联泰科技与赢创联合研发实验室正式成立;丰田携手Fleetsu提供互联车队管理解决方案 | 全球TMT...
- 技术团队里什么样的人会被清除?抢老板的工作干合适吗?
- RPC接口测试技术-Tcp 协议的接口测试