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协议解析相关推荐

  1. Modbus协议解析--小白一看就懂的协议

    文章目录 提问三连 1.什么是Modbus? 2.Modbus用来干什么? 3.Modbus的内容是什么? 3.1 Modbus-RTU+Modbus-ASCII 3.1.1 Modbus-RTU协议 ...

  2. 工业modbus协议解析和转换

    1 什么是Modbus协议? Modbus 协议是应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络(例如以太网)和其它设备之间可以通信.它已经成为一通用工业标准.有了它,不 ...

  3. 二、ModBus协议解析

    0x01 初识ModBus Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气)于1979年为使用可编程逻辑控制器(PLC)通信而发表的.现在的Modbus协议已经成为工业领域通信 ...

  4. Modbus介绍与协议解析

    一.Modbus介绍 Modbus是一种通讯协议,主要应用于电子控制器上的一种通用语言.Modbus支持多种电气接口,如RS232.RS485.TCP/IP等.多数Modbus设备通信是通过串口或TC ...

  5. 【Modbus 】Modbus 协议

    Modbus 协议简介 Modbus协议是一项应用层报文传输协议,包括ASCII.RTU.TCP三种报文类型. 标准的Modbus协议物理层接口有RS232.RS422.RS485和以太网接口,采用m ...

  6. STM32物联网项目-RS485通信(Modbus协议)

    RS485通信(Modbus协议) 协议介绍 RS485介绍:http://t.csdn.cn/bOuFX Modbus协议:http://t.csdn.cn/mgioX CubeMX配置 RS-48 ...

  7. modbus 协议基础知识

    Modbus的内容是什么 协议种类 Modbus-RTU+Modbus-ASCII Modbus-TCP Modbus-Plus 通讯过程: Modbus是主从方式通信,也就是说,不能同步进行通信,总 ...

  8. 【.NET6+Modbus】Modbus TCP协议解析、仿真环境以及基于.NET实现基础通信

    接下来的内容,我会以从头开发一个简单的基于modbus tcp通信的案例,来实现一个基础的通信功能. 有关环境: 开发环境:VS 2022企业版 运行环境:Win 10 专业版 .NET 环境版本:. ...

  9. Modbus通信协议+Modbus串口调试工具+Java版协议解析源码

    网络与串口二合一调试助手TCPCOM: https://download.csdn.net/download/liuyuan_java/87454762 Modbus调试工具,模拟串口调试工具 htt ...

  10. Modbus TCP协议解析

    在之前的文章中,我们介绍了Modbus RTU协议的内容和实现方法.最近在进行网络通讯的时候又用到了Modbus TCP协议,因此这里把自己对Modbus TCP的了解总结一下. 文章目录 一.Mod ...

最新文章

  1. php要求掌握链表结构吗,PHP 链表结构之单链表(一)
  2. 01-HTML基础与进阶-day6-录像281
  3. ajax+lucene pdf,基于Ajax/Lucene的站内搜索技术研究
  4. Windows从命令行创建文本文件的两种方式
  5. 简单易用的库存管理软件、进销存软件
  6. SQL SERVER 2012 OBJECT_ID
  7. 远程桌面服务怎么测试_快速的远程服务测试
  8. OpenXLSX 中文字段读取问题
  9. 【PDF】PDF无法注释的一种解决方案
  10. Codecraft-18 and Codeforces Round #458: C. Travelling Salesman and Sp(组合数)
  11. 关于 Java 性能监控您不知道的 5 件事,第 1 部分
  12. jupternote不同类之间相互调用(调用ipynb文件)
  13. matlab green函数,地基土的传Green函数编辑中……
  14. mac录制视频——OBS
  15. 如何解决安装DreamWeaver8 时候提示“无法将数值写入键/SOFTWARE/classes/.shtml”
  16. oracle清除过期备份,rman delete obsolete删除过期备份集问题
  17. Unity 抛物线,直线,Sine曲线等
  18. 联泰科技与赢创联合研发实验室正式成立;丰田携手Fleetsu提供互联车队管理解决方案 | 全球TMT...
  19. 技术团队里什么样的人会被清除?抢老板的工作干合适吗?
  20. RPC接口测试技术-Tcp 协议的接口测试

热门文章

  1. CAN 接收邮箱 掩码设置
  2. 成功架构设计的关键要素
  3. vmware虚拟机设置静态ip地址
  4. LibreOffice创建数据透视表
  5. Hive字符串函数-空格处理
  6. java中的match函数_javascript中match函数的用法小结
  7. 信息差,永远可以赚钱
  8. 02 | 给你一张知识地图,计算机组成原理应该这么学
  9. 解决mac上复制粘贴失效问题
  10. (八)office2016-excel绘制斜线表头 双斜线和三斜线