Modbus协议原理
一、背景
Modbus是一种广泛应用于工业自动化和控制系统中的通信协议,由Modicon于1979年开发。有了它,不同厂商生产的控制设备可以连成工业网络, 进行集中控制。Modbus由于其简单性和可靠性,成为工业领域最常用的协议之一。
二、协议概述
Modbus协议遵循主从架构(Master-Slave Architecture)。在通信网络中,通常有一个主设备(Master)和一个或多个从设备(Slave)。主设备负责发出请求,从设备接收并响应请求。
Modbus协议有多个版本,主要包括:
-
Modbus RTU(Remote Terminal Unit):基于串行通信(如RS-232、RS-485)的协议。数据以二进制格式发送,传输效率高,通常用于串行链路。
-
Modbus ASCII:与Modbus RTU类似,但数据以ASCII码格式发送,传输速率较低,但易于调试。
-
Modbus TCP/IP:基于以太网的版本,采用TCP/IP协议栈来传输Modbus数据包,适用于局域网或广域网环境。它允许更灵活的网络拓扑,并支持更多设备接入。
三、通信帧结构
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上 的 Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域,通用Modbus帧协议如下图所示:
Modbus通信的基本单位是“帧”,一帧包括以下几个部分:
- 地址域:用于标识目标设备的地址。
- 功能码(Function Code):定义要执行的操作,如读取寄存器、写入数据等。
- 数据:根据功能码携带相应的数据(如寄存器地址、寄存器值等)。
- 校验码:用于确保数据传输的完整性(在Modbus RTU和ASCII中使用)。
常用功能码
- 01:读取线圈状态
- 02:读取离散输入
- 03:读取保持寄存器
- 04:读取输入寄存器
- 05:写单个线圈
- 06:写单个寄存器
- 15:写多个线圈
- 16:写多个寄存器
四、报文格式
读数据
写数据
五、实例
Modbus-RTU协议一般用的最多功能码就是03和06,大部分都是用modbus来查询传感器上的信息用03查询功能码,如果需要修改传感器寄存器的值就用06修改功能码。
例如:现在我是主机,我要查询从机地址为01的数据。我需要发送以下数据:
下面展示查询功能码0x03:
主机发送: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E
返回数据
参考:
Modbus初学者教程 | 博客
Modbus通信协议_modbus协议-CSDN博客