4、通讯协议基础(下):Modbus TCP协议、协议转换(RTU转TCP)、DL/T645协议简介与对比
好,咱们接着聊。上一节我们把Modbus RTU的底裤扒了个干净,这一节重点聊聊它的两个“亲戚”——Modbus TCP和DL/T645。说实话,这三个协议在智能楼宇里碰面的机会特别多。我见过不少新手,一上来就把它们搞混,结果调试的时候抓耳挠腮。
别急,今天咱们一个一个捋清楚。
4.1 Modbus TCP:把串口搬到以太网上
Modbus TCP,说白了就是把Modbus RTU的报文,原封不动地塞进TCP/IP的包里。你想想看,RTU走的是RS485串口,一根线上挂一堆设备,主站轮询。TCP呢?走的是网线,每个设备都有自己的IP地址,主站可以直接“点对点”通信。
报文结构有什么变化?
RTU的报文是:地址 + 功能码 + 数据 + CRC校验。
TCP的报文是:事务标识符 + 协议标识符 + 长度 + 单元标识符 + 功能码 + 数据。
嗯,这里要注意:TCP报文里去掉了CRC校验。为什么?因为TCP/IP协议栈自己会做校验,你再算一遍就是脱裤子放屁了。我在项目中遇到过有人硬要在TCP报文里加CRC,结果对方设备直接不认,折腾了半天才发现问题。
一个典型的Modbus TCP请求报文(读保持寄存器):
事务标识符:0x00 0x01
协议标识符:0x00 0x00
长度:0x00 0x06
单元标识符:0x01
功能码:0x03
起始地址:0x00 0x00
寄存器数量:0x00 0x0A
你看,长度字段是6,表示后面还有6个字节。单元标识符其实就是RTU里的设备地址,只不过在TCP里它变成了一个“逻辑地址”。
核心区别一句话总结:
Modbus RTU是“串口轮询”,Modbus TCP是“网络直连”。RTU靠地址区分设备,TCP靠IP+单元标识符区分设备。
4.2 协议转换:RTU转TCP,到底怎么转?
现实情况是,楼宇里很多老设备只支持RTU,但新系统又只愿意走TCP。怎么办?加一个协议转换器(也叫网关)。
我建议你把它理解成一个“翻译官”。RTU那边是串口,TCP这边是网口。翻译官要做的事很简单:
- 从TCP报文里取出单元标识符,作为RTU的设备地址。
- 把功能码和数据原封不动地塞进RTU报文。
- 计算CRC,发到串口上。
- 收到RTU回复后,去掉CRC,加上TCP头,发回给主站。
避坑指南:我曾经在项目里遇到过一个坑——网关的“超时时间”设置太短。RTU设备响应慢,网关等不及就直接报超时了。结果主站那边一直显示通讯失败,查了三天才发现是网关的超时参数没调。所以,转换器的超时时间一定要大于RTU设备的最大响应时间,一般建议设到500ms以上。
小技巧:如果你用Modbus TCP网关,记得把网关的IP地址设成固定IP,别用DHCP。楼宇监控系统一旦重启,IP变了,整个系统都得重新配置,那画面太美我不敢看。
4.3 DL/T645协议:电表界的“普通话”
DL/T645是中国电力行业的标准协议,专门用于电能表的通讯。你想想看,楼宇里那么多电表,总不能每家厂商各说各话吧?645就是那个统一的标准。
它的报文结构和Modbus完全不同。645的报文是:
起始符:0x68
地址域:6个字节(电表地址)
起始符:0x68
控制码:1个字节
数据长度:1个字节
数据域:N个字节
校验和:1个字节
结束符:0x16
你看,它用0x68开头,0x16结尾,中间是地址、控制码和数据。和Modbus最大的区别是:645的地址是6个字节,而Modbus只有1个字节。这意味着645可以挂更多的设备,而且地址可以做得更复杂。
控制码里有什么?
- D7位:方向(0=主站请求,1=从站应答)
- D6位:是否有后续数据帧
- D5-D0位:具体功能(读数据、写数据、读事件等)
我个人习惯把控制码拆成二进制来看,这样一眼就能看出方向和数据状态。比如0x11,二进制是00010001,D7=0表示请求,D5-D0=010001表示读数据。
4.4 三大协议对比:什么时候用哪个?
| 对比项 | Modbus RTU | Modbus TCP | DL/T645 |
|---|---|---|---|
| 物理层 | RS485/RS232 | 以太网 | RS485 |
| 地址长度 | 1字节 | 1字节(单元标识符) | 6字节 |
| 校验方式 | CRC16 | TCP/IP校验 | 校验和 |
| 典型设备 | PLC、变频器、温控器 | 网络IO、智能网关 | 电能表、多功能电力仪表 |
| 通讯方式 | 主从轮询 | 点对点 | 主从轮询 |
| 数据格式 | 二进制 | 二进制 | BCD码为主 |
你看这个表就清楚了。Modbus RTU适合控制类设备,比如PLC、变频器。Modbus TCP适合网络化部署,比如跨楼层、跨机房的通讯。DL/T645则专门用于电表计量,它的数据格式是BCD码,直接读出来就是电表度数,不用再转换。
注意:千万不要用Modbus去读电表的数据!645协议里有很多特殊的数据格式(比如浮点数、时间戳、冻结数据),Modbus根本解析不了。我见过有人硬要用Modbus RTU去读智能电表,结果读出来的数据全是乱码,最后还得老老实实加一个645转Modbus的网关。
4.5 实战建议:怎么选?
好了,理论说完了,咱们聊聊实际怎么选。
- 如果你要控制设备(开关、调节、启停),选Modbus RTU或TCP。RTU便宜,TCP方便。
- 如果你要计量电表,选DL/T645。别犹豫,这是国标,所有正规电表都支持。
- 如果你要新旧系统对接,加一个协议转换网关。记住,网关不是万能的,但没网关是万万不能的。
我记得有一次做楼宇节能改造,现场既有老式的Modbus RTU电表,又有新装的645智能电表。最后我用了两个网关:一个RTU转TCP,一个645转TCP,全部统一成Modbus TCP接到上位机。虽然多花了几千块网关钱,但调试时间省了一半。值不值?你自己算算。
嗯,这一节就到这里。下一节咱们聊聊数据采集的实战技巧,包括轮询策略、超时处理、断线重连这些真正要命的东西。到时候见。