03-TCP与MBAP头


4.3 TCP 与 MBAP 头

本节摘要:Modbus TCP 把 PDU 装进以太网帧,用 MBAP 头取代地址与 CRC。本节讲清 MBAP 七个字节的含义、端口与连接模型,以及串口转 TCP 网关如何桥接两种世界。位置:串口模式讲完,本节进入 IT 侧——Modbus 怎么上网。

MBAP 头:七个字节的替代品

Modbus TCP 帧 = MBAP 头(7B) + PDU。MBAP 用事务号替代地址、用 TCP 替代 CRC:

MBAP = 事务标识(2B) + 协议标识(2B,=0) + 长度(2B) + 单元标识(1B) 例:00 01 00 00 00 06 01 03 00 00 00 01 事务0001 协议0000 长度0006 单元01 PDU(03 0000 0001) ​

字段含义:事务标识——客户端自己生成,用于匹配请求与响应(TCP 上允许多请求并发在途,靠事务号对账);协议标识——固定 0,1 表示 Modbus+(已废弃);长度——从单元标识到 PDU 末尾的字节数(含单元标识与 PDU,不含 MBAP 前 6 字节);单元标识——相当于串口地址,TCP 网关用它寻址背后的串口从站。

端口与连接模型

Modbus TCP 标准端口是 502(Modbus Security/TLS 用 802)。连接模型上,客户端(主站)主动建连,服务器端(从站/网关)监听;一个 TCP 连接上可以流水线式地发多个请求(靠事务号对账),与串口"一问一答"的模型不同——这是它吞吐高于串口的原因之一。

实现注意:TCP 是字节流,没有天然帧界,接收方要按 MBAP 的长度字段切帧(先收 6 字节头,读出长度 L,再收 L-1 字节余下部分);长连接要处理心跳与超时(空闲断开、半开连接检测);多客户端同时连接同一从站时,从站侧要串行化处理(多数实现同一时刻只服务一个事务)。

串口转 TCP 网关:两种世界的桥

现场最常见的拓扑:一堆 RS-485 从站 → 串口转 TCP 网关 → 以太网 → 上位机/云。网关的角色:

上位机(Modbus TCP) → 网关:502 端口 → 网关内部转 RTU → RS-485 从站 上位机发:MBAP(单元01) + PDU 网关收:查单元标识 → 映射到某条串口 → 组 RTU 帧(地址=单元映射) → 转发 ​

网关的工程要点:单元标识与串口地址的映射表(一个网关可能带多条串口,01-08 映射到串口 1 的地址 1-8 等);事务并发转串口串行(TCP 上并发请求到串口必须排队,否则 RTU 帧会互相穿插);超时映射(串口响应慢,网关要缓冲并正确回给 TCP 客户端,别让客户端超时)。

一个组网案例

某厂 6 条 RS-485 总线(每条 20 台仪表),用 3 台 8 串口网关接入交换机,上位机与 MES 系统通过 TCP 轮询。网关把 TCP 流量按单元标识分发到对应串口,每条串口独立轮询互不干扰。这个案例说明 Modbus TCP 的价值不是"快",而是把分散的串口总线汇聚成统一的以太网资源,让 IT 系统用一个协议访问全厂设备。

易错点清单

  • 长度字段算错:长度 = 单元标识 1 + PDU 长度,不含 MBAP 前 6 字节,算错直接切帧错乱;
  • 事务号不递增:事务号要唯一对应,否则并发请求的响应无法对账;
  • 把 TCP 当串口一问一答:TCP 允许多请求在途,但背后的串口从站不支持并发,网关侧的串行化排队必须做。

要点回顾:MBAP 用事务号对账、长度字段切帧、单元标识寻址;502 端口、可并发;网关把 TCP 与串口两种世界桥接起来,是现场主流拓扑。传输模式三种都摸清了,下一章下沉到最常出问题的物理层——RS-485 布线与端接。

多客户端并发的网关行为

Modbus TCP 网关常被多个客户端(上位机、HMI、MES)同时访问,并发行为决定可靠性。规范意义上的网关应支持多 TCP 连接,但底层串口是串行介质,多客户端的请求最终要排队走同一条串口。工程上要确认网关的排队策略:先到先服务(简单但可能被慢请求占住)、按单元分发(每个串口独立队列,互不阻塞)——后者明显更优。测试方法:两个客户端同时高频轮询不同单元,观察是否互相拖慢;若一个客户端掉线(半开连接),网关是否释放其占用的串口队列。

超时与重连的客户端设计

Modbus TCP 客户端的健壮性设计:连接超时(建立连接失败时按退避重连,别每秒重试轰炸网关);读写超时(单次请求超时后,先判断连接是否还活着,再决定重发还是重连);半开连接检测(网关重启或网络闪断后,TCP 连接可能处于半开状态,客户端要在空闲期发心跳或探测,识别后主动重建)。这些逻辑成熟库(libmodbus、pymodbus)大多内置,但默认参数要按现场调整——把超时参数暴露成配置,别写死在库里。

一个 TCP 切帧的排错示例

现象:某客户端间歇性收到"乱帧"。排查:Wireshark 看 TCP 流正常分包,客户端解析却错乱——问题在客户端没有按 MBAP 长度字段切帧,而是按 TCP 包边界切。TCP 是字节流,一次 recv 可能收到半帧也可能收到多帧,必须:先收 6 字节 MBAP 头 → 读长度字段 L → 再收 L-1 字节补全 → 解析一帧。修复后乱帧消失。教训:Modbus TCP 解析的第一步永远是"按长度切帧",其它都是细节。

易错点补充

  • 一个连接串行发请求:虽然 TCP 支持并发在途,但多数从站/网关实现是"一次处理一个事务",客户端并发在途可能收到乱序响应,稳妥做法是单连接串行或每请求独立连接;
  • Unit ID 与串口地址映射写错:网关背后多串口时,单元标识映射表是故障高发区,先在网关面板核对再写客户端;
  • 502 端口被占用:本机调试时另一个程序占着 502,客户端连不上先查端口占用。

现场问答

问:一个 TCP 连接能并发多个请求吗? 协议上可以(事务号对账),但多数从站与网关实现是"一次处理一个",并发在途可能乱序。稳妥做法:单连接串行,或每请求独立短连接。

问:Unit ID 是干什么的? 相当于 TCP 世界的"从站地址"。网关背后挂多条串口总线时,Unit ID 映射到具体串口与从站地址,映射表要在网关里核对。

问:客户端连不上 502 怎么办? 先本地 telnet 网关 502 看通不通,再查防火墙、路由、网关服务状态——网络层不通别急着怀疑协议。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U