modbus快速入门
我的小站:Ean7的小站
1. Modbus 是什么?
Modbus 是一种工业通信协议,用于 PLC、传感器、变频器、仪表、智能电表等设备之间交换数据。
它的特点:
-
简单
-
开放标准
-
工业应用非常广
-
主从结构(传统 Modbus RTU/TCP)
-
在 Modbus 里面,主站(Master) 可以简单理解为:
主动发起通信、提出读写请求的一方。
而:
从站(Slave) 是被询问、返回数据或执行命令的一方。
现在新的 Modbus 标准里更常叫:
- Master → Client(客户端)
- Slave → Server(服务器)
但工业现场仍然习惯叫主站/从站。
-
典型场景:
上位机/PLC
|
| Modbus
|
+---+----+----+
| | |
温度计 电表 变频器
2. Modbus 有哪些类型?
主要有三个:
| 类型 | 物理层 | 常用场景 |
|---|---|---|
| Modbus RTU | RS485 | 工业现场最多 |
| Modbus ASCII | RS232/485 | 老设备 |
| Modbus TCP | Ethernet | 现在越来越多 |
现在最常用:
- RS485 + Modbus RTU
- 网口 + Modbus TCP
3. Modbus TCP 快速理解
例如:
电脑读取一个温度传感器:
电脑(Modbus Client)
|
| TCP 502端口
|
温度设备(Modbus Server)
设备:
IP:
192.168.1.100
端口:
502
4. Modbus 的核心:寄存器
Modbus 不直接传:
temperature = 25.6℃
而是:
读取地址 40001
返回:
256
然后约定:
实际温度 = 数据 / 10
256 / 10 = 25.6℃
5. 四种寄存器类型(重点)
Modbus 有四类数据:
| 类型 | 名称 | 读写 | 示例 |
|---|---|---|---|
| Coil | 线圈 | 读写 | 开关 |
| Discrete Input | 离散输入 | 只读 | 按钮 |
| Input Register | 输入寄存器 | 只读 | 温度 |
| Holding Register | 保持寄存器 | 读写 | 参数 |
记忆:
0xxxx
线圈
开关
1xxxx
输入
3xxxx
输入寄存器
4xxxx
保持寄存器
实际设备中最常见:
40001
40002
40003
...
6. 一个实际例子
假设:
温度模块:
地址:
40001
数据:
253
说明书:
温度 = 寄存器值 ×0.1
读取:
40001 → 253
计算:
253×0.1
=25.3℃
7. Modbus RTU(RS485)是什么?
典型接线:
PLC 温度模块
A ------------ A
B ------------ B
GND ---------- GND
多个设备:
RS485总线
主站
|
+----设备1 地址1
|
+----设备2 地址2
|
+----设备3 地址3
每个设备有地址:
设备1:
Slave ID=1
设备2:
Slave ID=2
8. Modbus RTU 通信参数
必须一致:
例如:
波特率:
9600
数据位:
8
停止位:
1
校验:
None
简称:
9600 8N1
或者:
9600 8E1
9. 一次读取过程
例如:
主机:
我要读取:
Slave=2
寄存器:
40001
数量:
2个
发送:
02
03
0000
0002
CRC
解释:
| 字段 | 意义 |
|---|---|
| 02 | 设备地址 |
| 03 | 功能码 |
| 0000 | 开始地址 |
| 0002 | 读取2个寄存器 |
| CRC | 校验 |
设备回复:
02
03
04
00FA
0102
CRC
表示:
两个16位数据:
250
258
10. 常用功能码
| 功能码 | 作用 |
|---|---|
| 01 | 读线圈 |
| 02 | 读输入 |
| 03 | 读保持寄存器 |
| 04 | 读输入寄存器 |
| 05 | 写单个线圈 |
| 06 | 写单个寄存器 |
| 15 | 写多个线圈 |
| 16 | 写多个寄存器 |
最常用:
03 读数据
06 写数据
11. Python 快速测试
安装:
pip install pymodbus
读取 Modbus TCP:
from pymodbus.client import ModbusTcpClient
client = ModbusTcpClient(
"192.168.1.100",
port=502
)
client.connect()
result = client.read_holding_registers(
address=0,
count=10
)
print(result.registers)
client.close()
输出:
[253, 100, 0, 55,...]
12. 常用调试软件
Windows
推荐:
Modbus Poll
功能:
- 模拟主站
- 读写寄存器
- 看通信帧
Modbus Slave
模拟设备。
Linux
命令:
sudo apt install mbpoll
读取:
mbpoll \
-m tcp \
-a 1 \
-r 40001 \
192.168.1.100
13. 最重要的三个概念
三个:
① Modbus 是读写寄存器
设备 = 一堆地址
② 地址不是数据
例如:
40001
只是位置。
里面可能:
温度
压力
电压
要看设备手册。
③ 通信双方必须知道规则
包括:
设备地址
寄存器地址
数据类型
缩放比例
字节顺序
浙公网安备 33010602011771号