Modbus是一种工业现场总线协议,广泛应用于工业自动化领域。它由Modicon公司(现施耐德电气)于1979年开发,是工业领域最流行的通信协议之一。
Modbus能够长期在工业领域占据主导地位,得益于以下特点:
Modbus有三种主要变体:
Modbus RTU vs TCP vs ASCII 对比
flowchart LR
subgraph MB["Modbus 家族"]
RTU["Modbus RTU
RS-232/RS-485
二进制格式"]
TCP["Modbus TCP
以太网
TCP/IP 协议栈"]
ASCII["Modbus ASCII
串口
ASCII文本格式"]
end
subgraph App["应用层"]
P["Protocol Data Unit (PDU)
功能码 + 数据"]
end
subgraph Trans["传输层"]
T1["RS-485/RS-232"]
T2["TCP Port 502"]
T3["RS-232"]
end
RTU --> P
TCP --> P
ASCII --> P
RTU --> T1
TCP --> T2
ASCII --> T3
Modbus采用主从(Master-Slave)架构:
主站(Master) ───┬─── 从站1(Slave 1)
├─── 从站2(Slave 2)
├─── 从站3(Slave 3)
└─── 从站N(Slave N)
Modbus定义了四种基本数据类型:
| 数据类型 | 访问类型 | 说明 |
| --- | --- | --- |
| 线圈(Coils) | 读/写 | 布尔量,开关量 |
| 离散输入(Discrete Inputs) | 只读 | 布尔量,只读开关 |
| 保持寄存器(Holding Registers) | 读/写 | 16位数值 |
| 输入寄存器(Input Registers) | 只读 | 16位数值 |
Modbus定义了多种功能码,常见的有:
| 功能码 | 名称 | 说明 |
| --- | --- | --- |
| 01 | 读线圈 | 读取多个线圈状态 |
| 02 | 读离散输入 | 读取多个离散输入 |
| 03 | 读保持寄存器 | 读取多个保持寄存器 |
| 04 | 读输入寄存器 | 读取多个输入寄存器 |
| 05 | 写单个线圈 | 写入单个线圈 |
| 06 | 写单个寄存器 | 写入单个保持寄存器 |
| 15 | 写多个线圈 | 写入多个线圈 |
| 16 | 写多个寄存器 | 写入多个保持寄存器 |
常用 Modbus 功能码
flowchart TD
F1["0x01 Read Coils
读单个/多个线圈"]
F2["0x02 Read Discrete Inputs
读离散输入"]
F3["0x03 Read Holding Registers
读保持寄存器"]
F4["0x04 Read Input Registers
读输入寄存器"]
F5["0x05 Write Single Coil
写单个线圈"]
F6["0x06 Write Single Register
写单个寄存器"]
F7["0x0F Write Multiple Coils
写多线圈"]
F8["0x10 Write Multiple Registers
写多寄存器"]
style F1 fill:#3498db,color:#fff
style F3 fill:#27ae60,color:#fff
style F6 fill:#f39c12,color:#fff
Modbus RTU使用二进制帧格式:
| 字段 | 长度 | 说明 |
| --- | --- | --- |
| 从站地址 | 1字节 | 1-247 |
| 功能码 | 1字节 | 功能码 |
| 数据 | N字节 | 数据内容 |
| CRC校验 | 2字节 | 循环冗余校验 |
Modbus 查询-响应时序
sequenceDiagram
participant M as 主站(Master)
participant S as 从站(Slave)
M->>S: 从机地址(1字节) + 功能码(1字节) + 数据 + CRC(2字节)
Note over M,S: 查询帧
S->>M: 从机地址 + 功能码 + 数据字节数 + 数据 + CRC
Note over M,S: 正常响应
alt 功能码错误
S->>M: 从机地址 + 功能码+0x80 + 异常码 + CRC
Note over S: 异常响应
end
Modbus TCP在TCP/IP上传输:
| 字段 | 长度 | 说明 |
| --- | --- | --- |
| 事务标识符 | 2字节 | 请求响应匹配 |
| 协议标识符 | 2字节 | 0=Modbus |
| 长度 | 2字节 | 后续字节数 |
| 单元标识符 | 1字节 | 从站地址 |
| 功能码 | 1字节 | 功能码 |
| 数据 | N字节 | 数据内容 |
Modbus广泛应用于各种工业场景:
---
**延伸阅读**:
**相关工具**: