modbus快速入门
分类: MODBUS
1. 核心概念:主从模式 (Master/Slave)
Modbus 最基本的逻辑是一问一答。
- 主站 (Master / Client): 整个网络的控制者(通常是 PLC、触摸屏、或电脑)。只有主站能主动发起对话。
- 从站 (Slave / Server): 被动响应者(通常是传感器、变频器、仪表)。它从不主动说话,只有被主站点名时才回答。
注意: 在一个 Modbus RTU (串行) 网络中,同一时刻只能有一个主站,但可以有多个从站(最多 247 个)。
2. 数据模型:四个“仓库”
这是新手最容易晕的地方。Modbus 把从站设备里的数据分成了四个区域(仓库),主站去读写这些数据。
| 区域名称 |
对象类型 |
读写权限 |
数据类型 |
用途示例 |
| 线圈 (Coils) |
0xxxx |
读 / 写 |
布尔 (0/1) |
控制继电器、启停开关 |
| 离散输入 (Discrete Inputs) |
1xxxx |
只读 |
布尔 (0/1) |
读取接近开关、按钮状态 |
| 输入寄存器 (Input Registers) |
3xxxx |
只读 |
16位字 (Word) |
读取温度传感器数值、电压值 |
| 保持寄存器 (Holding Registers) |
4xxxx |
读 / 写 |
16位字 (Word) |
设定PID参数、频率设定 |
- 0/1 (位操作): 开关量,就像电灯开关。
- Word (字操作): 模拟量,一个寄存器 16 bit(2字节),数值范围 0-65535。如果需要传浮点数(如 23.56),通常需要合并读取两个连续的寄存器。
3. 两种主流传输方式
虽然协议逻辑一样,但物理上的“语言格式”有两种主要变体:
A. Modbus RTU (最常用)
- 物理层: 通常跑在 RS-485 串口上。
- 特点: 使用十六进制 (Hex) 传输,紧凑、效率高。
- 校验: 使用 CRC (循环冗余校验) 防止数据出错。
B. Modbus TCP
- 物理层: 跑在网线 (Ethernet) 上。
- 特点: 基于 TCP/IP 协议,不需要校验码(TCP 自带校验),速度极快。
- 端口: 默认端口 502。
4. 报文解剖:它到底发了什么?
让我们看一个真实的 Modbus RTU 例子。
场景: 主站想要读取 1号从站 的 保持寄存器,从地址 0 开始,读 2 个数据。
主站发送 (Request): 01 03 00 00 00 02 C4 0B
| 字节 (Hex) |
含义 |
解析 |
| 01 |
从站地址 |
"喂,1号设备听着..." |
| 03 |
功能码 |
"我要读取保持寄存器 (Read Holding Registers)..." |
| 00 00 |
起始地址 |
"从第 0 个地址开始..." |
| 00 02 |
寄存器数量 |
"往后读 2 个寄存器..." |
| C4 0B |
CRC 校验 |
(用于确保数据没传错的校验码) |
从站回复 (Response): 01 03 04 00 0A 01 02 3F 45
| 字节 (Hex) |
含义 |
解析 |
| 01 |
从站地址 |
"我是1号..." |
| 03 |
功能码 |
"这是你要的读取结果..." |
| 04 |
数据字节数 |
"后面跟着 4 个字节的数据 (2个寄存器 x 2字节)..." |
| 00 0A |
数据1 |
第一个寄存器的值是 10 |
| 01 02 |
数据2 |
第二个寄存器的值是 258 (0x0102) |
| 3F 45 |
CRC 校验 |
(校验码) |
5. 常用功能码 (Function Codes)
你需要记住的主要是这几个:
- 01: 读线圈 (Read Coils)
- 02: 读离散输入 (Read Discrete Inputs)
- 03: 读保持寄存器 (最常用,读参数)
- 04: 读输入寄存器 (读传感器值)
- 05: 写单个线圈 (开关控制)
- 06: 写单个寄存器 (改参数)
- 15: 写多个线圈
- 16: 写多个寄存器 (批量改参数)
6. 新手常见的“坑”
- 地址偏移 (0 vs 1):
- 协议底层地址是从 0 开始的。
- 但是 PLC 或文档里通常写成从 1 开始(例如 40001)。
- 坑: 如果文档说地址是 40001,你在代码里发送指令时,地址通常要写
0 (即 40001 - 40001)。如果读不到数据,尝试把地址 +1 或 -1 试试。
- 大小端 (Endianness):
- 一个 16 位整数由两个字节组成(高字节和低字节)。
- 不同厂家设备的发送顺序可能不同(先发高位还是先发低位)。如果读出来的数字很奇怪(比如把 1 读成了 256),通常是字节序反了,需要在软件里勾选 "Byte Swap"。
- RS-485 接线:
- A 接 A,B 接 B(有时标为 D+ 接 D+,D- 接 D-)。千万不要接反,接反了无法通信,但通常不会烧坏设备。
7. 必备工具
要开始实战,你需要:
- 硬件: USB 转 RS485 转换器(淘宝十几块钱一个)。
- 软件(PC端):
- Modbus Poll: 模拟主站(用来测试传感器好不好用)。
- Modbus Slave: 模拟从站(用来测试你的上位机软件写得对不对)。