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翻车的。选对协议,做好细节,这才是王道。