4. Modbus TCP通信协议详解
各位同学好,我是老张。今天咱们聊聊Modbus TCP这个协议。说实话,我在风电行业摸爬滚打这么多年,Modbus TCP是我打交道最多的协议之一。你想想看,风电场里上百台风机,每台风机里又有几十个控制器、传感器,它们之间怎么通信?Modbus TCP就是最常用的方案之一。
嗯,咱们先搞清楚一件事:Modbus TCP和Modbus RTU有什么区别?简单说,Modbus RTU跑在串口上(RS-232/485),而Modbus TCP跑在以太网上。说白了,就是把原来的串口数据包,封装到了TCP/IP的报文里。我在早期做项目时,就遇到过现场工程师把RTU和TCP搞混,结果调试了两天没通……
4.1 Modbus TCP报文结构
Modbus TCP的报文结构,其实不复杂。我习惯把它分成两部分:MBAP头和PDU。
MBAP头(Modbus Application Protocol Header)一共7个字节:
| 字段 | 长度 | 说明 |
|---|---|---|
| 事务处理标识符 | 2字节 | 用于匹配请求和响应,我一般从0开始递增 |
| 协议标识符 | 2字节 | 固定为0x0000,表示Modbus协议 |
| 长度字段 | 2字节 | 后续数据的字节数(单位标识符+PDU) |
| 单位标识符 | 1字节 | 相当于从站地址,比如风机1号设为0x01 |
PDU(Protocol Data Unit)包含功能码和数据。功能码1字节,后面跟着具体数据。
举个例子,读取风机风速的请求报文:
事务标识符: 0x0001
协议标识符: 0x0000
长度: 0x0006
单位标识符: 0x01
功能码: 0x03
起始地址: 0x0064 (100)
寄存器数量: 0x0002 (2个寄存器)
响应报文类似,只是数据区变成了实际的风速值。
关键点:MBAP头里的长度字段,是从单位标识符开始算的,不包括事务标识符和协议标识符。这个坑我踩过,当时报文长度算错了,设备死活不响应。
4.2 功能码详解(03/06/16)
Modbus TCP的功能码很多,但在风电场里,最常用的就三个:03、06、16。我一个个说。
4.2.1 功能码03:读取保持寄存器
这个功能码用来读取数据。比如读取风机当前的功率、风速、桨距角等。请求报文里要告诉设备:从哪个地址开始读,读多少个寄存器。
我曾经在调试时,发现读回来的风速值总是偏大。排查了半天,原来是寄存器地址搞错了。风机厂家给的地址是0x0064,我写成了0x64,结果读到了别的数据。嗯,地址一定要确认清楚。
4.2.2 功能码06:写单个寄存器
这个用来设置单个参数。比如远程启动风机、设定功率限值等。请求报文里包含寄存器地址和要写入的值。
注意:写操作一定要谨慎。我记得有一次,现场工程师用06功能码写错了参数,导致风机直接停机。所以我在项目里,写操作都会加一个确认机制——先读回来看看是不是写对了。
4.2.3 功能码16:写多个寄存器
当你要同时写多个参数时,用16功能码。比如同时设置功率限值和桨距角限值。请求报文里要说明起始地址、寄存器数量和具体数据。
16功能码比06效率高,但报文也复杂一些。我建议:如果只写1个寄存器,用06;写多个,用16。
| 功能码 | 名称 | 应用场景 | 报文长度 |
|---|---|---|---|
| 0x03 | 读取保持寄存器 | 读取风速、功率、温度等 | 请求8字节,响应可变 |
| 0x06 | 写单个寄存器 | 设置单个参数 | 请求12字节,响应12字节 |
| 0x10 | 写多个寄存器 | 批量设置参数 | 请求可变,响应12字节 |
4.3 数据模型
Modbus的数据模型,说白了就是一张地址映射表。风机的每个数据点,都对应一个寄存器地址。比如:
- 0x0064-0x0065:风速(32位浮点数)
- 0x0066-0x0067:有功功率(32位浮点数)
- 0x0068:桨距角(16位整数)
- 0x0069:发电机转速(16位整数)
这里有个重要概念:寄存器地址和数据地址的区别。Modbus协议里,寄存器地址是从0开始的,但有些厂家会加上偏移量(比如40001)。我建议你拿到设备手册后,先确认地址的表示方式。
我的经验:在风电场项目里,最好做一个Excel表格,把每个风机的寄存器地址、数据类型、单位、缩放系数都列清楚。这样调试时一目了然,省得来回翻手册。
4.4 连接建立与关闭
Modbus TCP基于TCP/IP,所以连接管理遵循TCP的规则。客户端(通常是SCADA系统)主动连接服务器(风机控制器)。
连接建立流程:
- 客户端向服务器的502端口发起TCP连接(三次握手)
- 连接建立后,客户端发送Modbus请求报文
- 服务器处理请求,返回响应报文
- 通信完成后,客户端关闭连接(四次挥手)
这里有个实际的问题:长连接还是短连接?
我个人习惯用长连接。因为风电场里数据采集频率高(比如每5秒采集一次),如果每次采集都重新建立连接,开销太大了。但长连接也有问题——如果网络不稳定,连接可能会断开。所以我会加一个心跳机制,每隔30秒发一个空请求,检测连接是否正常。
注意:有些风机控制器对并发连接数有限制。我遇到过一台控制器最多支持4个TCP连接。如果SCADA系统、远程监控、本地调试同时连接,可能就会超限。建议在项目设计时,规划好连接数量。
4.5 核心知识体系
下面这张图,是我自己总结的Modbus TCP知识体系。你可以把它当作一个快速参考。
好了,Modbus TCP的核心内容就这些。说实话,这个协议不难,但细节很多。你在实际项目中,多抓包看看报文,很快就能上手。嗯,下一节咱们聊聊Modbus TCP在风电场里的具体应用案例。
公众号:蓝海资料掘金营,微信deep3321