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这边是网口。翻译官要做的事很简单:

  1. 从TCP报文里取出单元标识符,作为RTU的设备地址。
  2. 把功能码和数据原封不动地塞进RTU报文。
  3. 计算CRC,发到串口上。
  4. 收到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接到上位机。虽然多花了几千块网关钱,但调试时间省了一半。值不值?你自己算算。

嗯,这一节就到这里。下一节咱们聊聊数据采集的实战技巧,包括轮询策略、超时处理、断线重连这些真正要命的东西。到时候见。