2. 通信协议基础:IEC 60870-5-101/104协议、DNP3协议、MQTT在配电中的应用

说到配电终端的远程升级,通信协议是绕不开的坎。我做了这么多年配电自动化,见过太多因为协议选型不当导致项目翻车的情况。今天咱们就聊聊配电领域最常用的三种协议:IEC 101/104、DNP3,还有这两年火起来的MQTT。

2.1 IEC 60870-5-101/104:电力系统的老大哥

IEC 101和104,说白了就是一对孪生兄弟。101走串口,104走网络。它们俩在配电自动化里的地位,就像普通话在中国一样——基本是标配。

2.1.1 IEC 101:串口通信的老将

我记得2015年做某个县城配网改造时,现场还有大量老式FTU只支持串口通信。那时候我就在想,101协议虽然老,但真不能丢。

101协议的特点很鲜明:

  • 物理层:RS-232/RS-485,波特率一般9600或19200
  • 帧格式:FT 1.2异步帧,带奇偶校验
  • 传输方式:问答式,主站问啥终端答啥

核心要点:101协议最麻烦的是链路层处理。每个报文都要等确认,超时重传。我建议你在做远程升级时,把超时时间设成3-5秒,太短容易误判,太长影响效率。

来看一段101协议报文解析的例子:

// IEC 101 链路层报文结构
// 启动字符 68H + 长度 + 长度 + 启动字符 68H
// 控制域 + 地址域 + 链路用户数据 + 帧校验和 + 结束字符 16H

// 举个例子:复位远方链路命令
68 04 04 68 53 01 00 16
// 68 - 启动字符
// 04 04 - 报文长度(4字节)
// 53 - 控制域(复位命令)
// 01 - 链路地址
// 00 - 帧校验和
// 16 - 结束字符

避坑指南:我曾经在某个项目中,101协议升级总是失败。查了两天才发现,是终端设备的接收缓冲区只有256字节,而升级包分片稍微大一点就溢出了。后来我把每个分片控制在200字节以内,问题就解决了。

2.1.2 IEC 104:网络时代的升级版

104协议其实就是把101搬到了TCP/IP上。说白了,就是把串口那套东西封装成网络报文。但别小看这个变化,它让远程升级变得简单多了。

104协议的关键改进:

  • 传输层:TCP连接,端口号2404
  • APDU结构:启动字符68H + APDU长度 + 控制域 + ASDU
  • 传输模式:支持非平衡和平衡两种模式

我个人习惯用104做远程升级,原因很简单:它支持同时传输多个报文,不像101那样一问一答效率低。你想想看,升级一个几百KB的固件,如果用101得传半天,用104就快多了。

// IEC 104 APDU 结构示例
// 启动字符 68H + 长度 + 控制域(4字节) + ASDU

// 总召唤命令(激活)
68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14
// 68 - 启动字符
// 0E - APDU长度(14字节)
// 00 00 00 00 - 控制域(发送序号0)
// 64 01 - 类型标识(总召唤)
// 06 00 - 可变结构限定词
// 01 00 - 传送原因
// 00 00 - 公共地址
// 00 00 00 14 - 信息体(召唤限定词)

注意:104协议有个坑——TCP连接保活。我遇到过终端设备因为NAT超时导致连接断开,升级到一半就断了。建议你在主站和终端都实现心跳机制,一般30秒发一次测试帧就够了。

2.2 DNP3:北美来的实力派

DNP3协议在北美配电市场占有率很高,国内这几年也开始用了。说实话,我第一次接触DNP3时觉得它比IEC 104复杂,但用久了发现它确实有独到之处。

DNP3的核心特点:

  • 分层架构:物理层、数据链路层、传输层、应用层
  • 事件驱动:支持主动上报,不用等主站问
  • 时间同步:精度高,支持毫秒级同步

为什么DNP3适合远程升级?因为它支持文件传输功能。你想想看,IEC 104传固件还得自己分包,DNP3直接就有文件对象,省事多了。

// DNP3 文件传输命令示例
// 请求:打开文件
// 功能码:0x17(文件操作)
// 文件操作码:0x01(打开文件)

// 报文结构
// 起始字节(0x0564) + 长度 + 控制域 + 目的地址 + 源地址 + CRC + 传输头 + 应用层数据 + CRC

// 简化示例(仅应用层部分)
// 应用层控制:0xC3(FIR/FIN/CON)
// 功能码:0x17
// 文件操作码:0x01
// 文件句柄:0x0001
// 文件名:"firmware.bin"

经验之谈:DNP3的CRC校验很严格,每个数据块都有CRC。我曾经遇到一个终端,升级时总是CRC校验失败,后来发现是终端设备的时钟不准,导致时间戳对不上。嗯,这个问题折腾了我一整天。

2.3 MQTT:物联网新秀在配电中的应用

MQTT这几年在配电领域越来越火。说白了,它就是为物联网场景设计的轻量级消息协议。我最近做的几个项目,都开始用MQTT替代传统协议做远程升级了。

MQTT的优势很明显:

  • 发布/订阅模式:一对多通信,主站发一条消息,所有终端都能收到
  • QoS等级:支持0/1/2三种服务质量,按需选择
  • 遗嘱消息:终端掉线时自动通知主站

你可能会问,MQTT用在配电上安全吗?说实话,早期版本确实有安全问题。但现在MQTT 5.0支持TLS加密和用户名密码认证,安全性已经够用了。

// MQTT 远程升级主题设计示例
// 主题:配电终端升级命令
// 格式:/upgrade/{device_id}/command

// 发布升级命令
// 主题:/upgrade/FTU001/command
// 消息体(JSON格式):
{
    "cmd": "start_upgrade",
    "version": "2.1.0",
    "file_size": 1048576,
    "checksum": "a1b2c3d4e5f6",
    "url": "http://192.168.1.100/firmware/FTU_v2.1.0.bin"
}

// 终端上报进度
// 主题:/upgrade/FTU001/progress
// 消息体:
{
    "status": "downloading",
    "progress": 45,
    "speed": 102400
}

实用建议:用MQTT做远程升级时,我建议把固件分成1MB一个的块,每块单独发布。这样即使某一块传丢了,只需要重传那一块,不用全部重来。我曾经用这个方案,把升级成功率从85%提升到了99%以上。

2.4 三种协议对比与选型建议

说了这么多,到底该选哪个?我根据自己的经验,整理了一个对比表:

特性 IEC 101 IEC 104 DNP3 MQTT
传输层 串口 TCP/IP TCP/IP TCP/IP
通信模式 问答式 问答+主动 事件驱动 发布/订阅
远程升级支持 差(需自定义) 一般(需分包) 好(文件传输) 优秀(天然支持)
安全性 弱(需额外加密) 一般(支持认证) 强(TLS+认证)
适用场景 老旧设备改造 新建配网项目 北美标准项目 物联网化配电

我的建议

  • 如果现场全是老设备,用101协议,别折腾
  • 新建项目,首选104协议,成熟稳定
  • 有北美背景的项目,用DNP3
  • 想做智能化升级,试试MQTT,未来趋势

最后说一句,协议只是工具,关键还是看你怎么用。我见过用101协议也能把远程升级做得很好,也见过用MQTT翻车的。选对协议,做好细节,这才是王道。