Modbus 通讯协议(超详细,简单易懂)
目录
一、协议中的寄存器定义
二、协议概述
三、使用串口的Modbus 报文帧
编辑 3.1、Modbus ASCII 模式
3.2、Modbus RTU 模式
3.3、功能码概要
3.4、Modbus 报文分析
四、什么是RS-485 RS-232?
一、协议中的寄存器定义
- 想得到按键输入状态时,读取到的是一位数据;
- 想控制 LED 时,需要输出一位数据,想读取 LED 当前状态时,也可以读取到一位数据
- 想读取参数时,读取到的“输入寄存器”,得到多位数据,比如 16 位数据
- 想设置参数时,写的是“保存寄存器”,写入的是多位数据,比如 16 位数据;也可以 读“保存寄存器”
各种寄存器名字花里胡哨的,其实最大区别就是有的可读可写,有的只可读,还有就是可操作的位数量不一样! 有的是位操作,有的是多位操作(在 Modbus 中,多位操作时都是 16 位(2bytes)的)。
- bit 操作涉及的寄存器有 2 类:线圈状态(可读可写)、离散输入状态(只读)
- 16bit 操作的寄存器有 2 类:保存寄存器(可读可写)、输入寄存器(只读)
寄存器种类 | 说明 |
线圈状态 | 输出端口。可设定端口 输出状态,也可以读取该位 的输出状态。 |
离 散 输入状 态 | 输入端口。通过外部设 定改变输入状态,可读但不 可以写 |
保 持 寄 存 器 | 输出参数或保持参数, 控制器运行时被设定的某些 参数,可读可写 |
输 入 寄 存 器 | 输入参数。控制器运行 时从外部设备获得的参数, 但可读不可写 |
序号 | 读写 | 储存类型 | 储存区名称 | 区号 |
1 | 只读 | bit类型 | 离散型 | 1 |
2 | 读写 | bit类型 | 线圈 | 0 |
3 | 只读 | 16bit类型 | 输入寄存器 | 3 |
4 | 读写 | 16bit类型 | 保持寄存器 | 4 |

但是这么多的地址,现实中我们根本用不完,所以就有了短地址模型 :
二、协议概述

它和IIC协议一样都是多从,但是IIC只能和单一丛机联系,但是 Modbus 不一样,他有单播模式和广播模式。
单播模式:
单播模式。主设备仅仅 寻址单个从设备 ,从设备接收并处理请求后,向主设备 返回一个响应报文,即应答 。在这种模式下,一个 Modbus 事务处理包含两个报文:一个是主设备的请求报文,另一个是从设备的响应报文。每个从设备必须有唯一的地址 (地址范围为 1~247) ,这样才能区别于其它从设备,从而可以独立被寻址,同时主设备不占用地址。
广播模式:
广播模式。此种模式下,主设备可以向所有从设备发送请求指令,而从设备在接收到广播指令后仅进行相关指令的事务处理,而不要求返回应答。因此广播模式下,请求指令必须是 Modbus 标准功能中的写指令。根据 Modbus 标准协议的要求,所有从设备必须接收广播模式下的写指令,且地址 0 被保留,用来识别广播通信
Modbus协议说明:
Modbus诞生于1979年 莫迪康公司 后来被施耐德电气公司收购。Modbus提供通用语言用于彼此通信的设备和设备。
Modbus已经成为工业领域通信协议的业界标准,并且现在是工业电子设备之间常用的连接方式。Modbus作为目前工业领域应用最广泛的协议
最简单的说,Modbus就是一个总线通信协议,像IIC SPI这种,但是他不依赖于硬件总线
Modbus之所以使用广泛,是有他的优点的
- Modbus协议标准开放、公开发表且无版权要求
- Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外、无线等
- Modbus协议消息帧格式简单、紧凑、通俗易懂。用户理解和使用简单,厂商容易开发和集成,方便形成工业控制网络
三、使用串口的Modbus 报文帧
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,本质就是一串数据。
Modbus 报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容
Modbus 使用串口中一共有两种模式:Modbus ASCII 模式和Modbus RTU 模式,常用的就是Modbus RTU 模式,Modbus ASCII 模式了解一下即可!
3.1、Modbus ASCII 模式

需要注意的是,在消息中的每个字节都作为两个ASCII字符发送
十六进制的0-F 分别对应ASCII字符的0…9,A…F,也就是0x30~0x3A 0x41~0x46

3.2、Modbus RTU 模式
Modbus 协议 RTU 报文格式如下所示:
帧结构 = 从机地址 + 功能码 + 数据 + 校验
3.3、功能码概要
Modbus 标准在协议中规定了以下 3 类 Modbus 功能码。
公共功能码:
- 被明确定义的功能码;
- 保证唯一性;
- 由 Modbus 协会确认,并提供公开的文档;
- 可进行一致性测试;
- 包括协议定义的功能码和保留将来使用的功能码。
- 有两个用户自定义功能码区域,分别是 65~72 和 100~110;
- 用户自定义,无法保证唯一性。

3.4、Modbus 报文分析
这里我们就主要分析RTU模式就好了,因为这个模式最常用!
读取保存寄存器报文解析:
我们点击Display查看接收的信息的格式: 如果忘记报文帧可以回头看看:帧结构 = 从机地址 + 功能码 + 数据 + 校验
其中数据包括起始地址+寄存器数量的高低位: 我们是从0开始一次性读取10个寄存器,所以起始地址高低位都为00,而A对应的就是10.
那么丛机回应的信息格式:
需要关注的是字节数,因为保存寄存器都是16位的,假如有N个寄存器,所以对应的字节数量就是2N个字节,这里有10个寄存器,所以就会有20个字节,HEX14对应的就是DEC的20。
后面的就是每个寄存器的高低位和CRC校验位了。
温馨提示:如果是线圈,每个寄存器都是一位,所以答应报文中的字节数需要将寄存器数N/8,然后如果有余数家需要+1.
例:有9个线圈寄存器,9/8=1......1,所以需要+1,所以就需要两个字节。
四、什么是RS-485 RS-232?
我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢?
RS232,RS485是一种电平标准
数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。
那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232
RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
- 全双工
- 逻辑1:-15V–5V
- 逻辑0:+3V–+15V
RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1
- 半双工
- 逻辑1:+2V~+6V
- 逻辑0: -2V~ -6V
注意485的电平指的是485-A和485-B两根传输线,两线间的电压差。而不是传输线上的电压