拆解ModbusTCP报文:从一个字节开始,搞懂工业通信的底层逻辑
你有没有遇到过这样的场景?
在调试PLC和HMI之间的数据交互时,明明IP地址、端口都对了,但读不到寄存器值;或者收到一串十六进制数据,却不知道哪几位代表温度、哪几位是状态标志。这时候,大多数人会去翻手册、查工具软件——但如果能直接“看懂”通信报文呢?
今天我们就来干一件“硬核”的事: 亲手拆解一个ModbusTCP报文,逐字节分析它的结构与含义 。不讲空话套话,只讲你能用得上的实战知识。无论你是刚入门的自动化工程师,还是想深入协议细节的开发者,这篇文章都会让你真正理解—— ModbusTCP到底在传什么 。
为什么是ModbusTCP?它凭什么还在被广泛使用?
1979年,Modicon公司为PLC设计了一种极简的通信协议,这就是Modbus的起点。几十年过去,新技术层出不穷,OPC UA、MQTT、Profinet等协议不断涌现,但你在工厂车间依然能看到大量设备打着“支持Modbus”的标签。
为什么?因为它够简单、够稳定、够开放。
而当以太网取代RS-485成为主流物理层后, ModbusTCP 自然成了工业通信的事实标准之一。它把原本跑在串口上的Modbus协议,封装进TCP/IP栈里,实现了即插即用的局域网通信。
更重要的是: 没有校验码要算,不用关心波特率,也不需要终端电阻 。只要网络通,端口开,就可以发数据。
但这背后有一个前提:你得知道 报文长什么样 。
一个真实的ModbusTCP请求长什么样?
假设我们要从一台PLC读取两个保持寄存器的值,起始地址是107(即0x006B),设备地址为1。我们通过Python发送这个请求,抓包得到如下原始字节流:
0001 0000 0006 01 03 006B 0002
这短短12个字节,就是整个ModbusTCP报文的全部内容。我们可以把它分为两部分来看:
- 前7字节 → MBAP头
- 后5字节 → Modbus PDU
接下来,我们一步步“剥洋葱”。
MBAP头:ModbusTCP的身份证
MBAP全称是 Modbus Application Protocol Header ,它是ModbusTCP区别于RTU/ASCII的标志性结构。你可以把它理解为一封快递的“面单”,上面写着谁寄的、寄给谁、包裹多大。
Transaction ID(事务ID) —— 匹配请求和响应的关键
Bytes: 0001
这是由客户端(比如你的上位机程序)生成的一个唯一编号,范围从 0x0000 到 0xFFFF 。
它的作用就像HTTP中的请求ID:当你同时发起多个


682


被折叠的 条评论
为什么被折叠?



