目录
[1️⃣ 本质定位(最关键)](#1️⃣ 本质定位(最关键))
[2️⃣ 数据模型(必须会)](#2️⃣ 数据模型(必须会))
[3️⃣ 报文结构(非常关键)](#3️⃣ 报文结构(非常关键))
[4️⃣ 常用功能码(重点记)](#4️⃣ 常用功能码(重点记))
[5️⃣ 地址理解(易踩坑)](#5️⃣ 地址理解(易踩坑))
[6️⃣ TCP 特性(区别于 RTU)](#6️⃣ TCP 特性(区别于 RTU))
[7️⃣ 数据解析重点](#7️⃣ 数据解析重点)
[8️⃣ 工程实践一句话](#8️⃣ 工程实践一句话)
[一、完整 Modbus TCP 报文(请求帧)](#一、完整 Modbus TCP 报文(请求帧))
[二、MBAP Header(7 字节)](#二、MBAP Header(7 字节))
[六、再给你一个【写寄存器】示例(功能码 06)](#六、再给你一个【写寄存器】示例(功能码 06))
[写 40001 = 123](#写 40001 = 123)
1️⃣ 本质定位(最关键)
-
Modbus TCP = Modbus 协议 + TCP/IP
-
跑在 以太网(端口 502)
-
主从模型:Client(主站) ⇄ Server(从站)
2️⃣ 数据模型(必须会)
Modbus 只有 4 种数据区:
| 类型 | 名称 | 访问 | 常见用途 |
|---|---|---|---|
| 0x | Coil | 读/写 | 开关量输出 |
| 1x | Discrete Input | 只读 | 开关量输入 |
| 3x | Input Register | 只读 | 模拟量输入 |
| 4x | Holding Register | 读/写 | 参数、模拟量 |
👉 寄存器本质是 16bit
3️⃣ 报文结构(非常关键)
Modbus TCP 报文 = MBAP 头 + PDU
MBAP(7 字节):
-
Transaction ID(事务号)
-
Protocol ID(固定 0)
-
Length
-
Unit ID(通常可忽略)
PDU:
-
功能码
-
数据
4️⃣ 常用功能码(重点记)
-
01读线圈 -
02读离散输入 -
03读保持寄存器 ⭐ -
04读输入寄存器 -
05写单线圈 -
06写单寄存器 -
0F写多线圈 -
10写多寄存器 ⭐
👉 03 和 10 最常用
5️⃣ 地址理解(易踩坑)
-
协议里地址从 0 开始
-
文档里常写 40001、30001 ------ 这是逻辑编号
-
实际请求地址 = 文档地址 − 基地址
📌 例:
文档写 40001
实际地址 = 0
6️⃣ TCP 特性(区别于 RTU)
-
无校验 CRC(TCP 已保证)
-
可并发请求
-
一问一答(不能乱序)
-
延迟低,速度快
7️⃣ 数据解析重点
-
大端字节序(Big Endian)
-
32bit / float 通常用 2 个寄存器
-
不同厂商:
- 字节顺序可能不同(ABCD / CDAB / BADC)
8️⃣ 工程实践一句话
90% 的问题出在:地址偏移 + 数据类型 + 字节序
好,直接给你真实可用的十六进制报文 ,逐字节拆给你看 👇
(读保持寄存器 40001 起,读 2 个寄存器)
一、完整 Modbus TCP 报文(请求帧)
00 01 00 00 00 06 01 03 00 00 00 02
下面逐字段解释(非常重要)👇
二、MBAP Header(7 字节)
00 01 | 00 00 | 00 06 | 01
| 字节 | 含义 | 说明 |
|---|---|---|
| 00 01 | Transaction ID | 事务号,客户端自己定义,用于区分请求 |
| 00 00 | Protocol ID | 固定为 0(Modbus TCP 标志) |
| 00 06 | Length | 后面 Unit ID + PDU 的长度(=6) |
| 01 | Unit ID | 从站 ID(TCP 下通常随便填) |
三、PDU(协议数据单元)
03 | 00 00 | 00 02
| 字节 | 含义 |
|---|---|
| 03 | 功能码:读保持寄存器 |
| 00 00 | 起始地址(40001 → 实际地址 0) |
| 00 02 | 读取寄存器数量 = 2 |
四、从站响应报文(示例)
假设返回两个寄存器值:
-
第一个:
0x0064(100) -
第二个:
0x00C8(200)
完整响应帧
00 01 00 00 00 07 01 03 04 00 64 00 C8
五、响应拆解
MBAP
00 01 | 00 00 | 00 07 | 01
- Length = 7(UnitID + 功能码 + 字节数 + 数据)
PDU
03 | 04 | 00 64 00 C8
| 字节 | 含义 |
|---|---|
| 03 | 功能码 |
| 04 | 数据字节数(2 寄存器 × 2 字节) |
| 00 64 | 寄存器1 = 100 |
| 00 C8 | 寄存器2 = 200 |
六、再给你一个【写寄存器】示例(功能码 06)
写 40001 = 123
00 02 00 00 00 06 01 06 00 00 00 7B
-
06:写单寄存器 -
00 00:地址 -
00 7B:123
七、一句话记忆法(工程级)
Modbus TCP = 7 字节 MBAP + 功能码 + 数据,全是大端