4、通信协议入门:Modbus RTU/TCP、IEC 104、MQTT在EMS中的应用场景
大家好,我是老张。今天咱们聊聊通信协议。
很多刚入行的朋友一听到「协议」两个字就头大。觉得这东西太抽象,看不见摸不着。其实没那么复杂。说白了,协议就是设备之间沟通的「语言」。你想想看,中国人说中文,英国人说英文,设备也一样——有的设备说Modbus,有的说IEC 104,还有的说MQTT。
在EMS系统里,这些协议各司其职。选对了,系统跑得顺;选错了,调试能让你怀疑人生。我这些年踩过的坑,今天一次性给你讲清楚。
4.1 为什么EMS需要多种协议?
先问一个问题:一个光伏电站里有多少种设备?
- 逆变器(可能来自华为、阳光、锦浪)
- 储能变流器(PCS)
- 电池管理系统(BMS)
- 电表(多功能电力仪表)
- 气象站
- 温控设备
- ……
这些设备来自不同厂家,年代不同,接口不同。有的用串口,有的用以太网,有的走无线。你不可能让所有设备都说同一种话。所以,EMS必须是个「多语言者」。
核心原则:协议的选择取决于三个因素——设备能力、传输距离、实时性要求。
我个人习惯把协议分成两类:
- 现场总线类:Modbus RTU、Modbus TCP。适合近距离、确定性高的场景。
- 网络通信类:IEC 104、MQTT。适合远距离、需要上云或调度的场景。
下面我一个一个讲。
4.2 Modbus RTU/TCP:最通用的「普通话」
Modbus 是工业领域最古老的协议之一,1979年就诞生了。但它至今仍然活跃在光伏储能行业。为什么?因为简单、可靠、免费。
4.2.1 Modbus RTU vs Modbus TCP
| 特性 | Modbus RTU | Modbus TCP |
|---|---|---|
| 物理层 | RS-232 / RS-485 | 以太网 |
| 传输方式 | 串行,半双工 | 网络,全双工 |
| 最大距离 | 约1200米(RS-485) | 100米(网线),可扩展 |
| 节点数 | 最多247个 | 理论上无限制 |
| 典型场景 | 电表、小型逆变器 | PCS、大型逆变器 |
嗯,这里要注意:Modbus RTU 虽然慢(波特率通常9600或19200),但抗干扰能力强。我在一个偏远的光伏电站遇到过,RS-485线缆拉了800多米,Modbus TCP死活连不上,最后换成RTU,稳如老狗。
4.2.2 数据模型与寄存器
Modbus 的核心是寄存器。说白了,就是设备把数据放在一个个「抽屉」里,EMS去读或写这些抽屉。
// 常见的寄存器类型
// 0x 开头的:线圈(Coil),可读可写,1位
// 1x 开头的:离散输入(Discrete Input),只读,1位
// 3x 开头的:输入寄存器(Input Register),只读,16位
// 4x 开头的:保持寄存器(Holding Register),可读可写,16位
// 举个例子:读取逆变器的当前功率(地址40001)
// 发送:01 03 00 00 00 01 84 0A
// 含义:设备地址1,功能码03(读保持寄存器),起始地址0,读1个寄存器,CRC校验
我曾经调试一个项目,逆变器厂家给的寄存器地址表写的是「40001」,我直接用地址1去读,死活读不到。后来才发现,他们说的40001是PLC的地址习惯,实际Modbus地址是0。这个坑,我至少见过三次。
避坑指南:拿到设备手册后,先确认地址是「协议地址」还是「PLC地址」。协议地址通常从0开始,PLC地址从1或40001开始。差一个数,数据全乱。
4.3 IEC 104:电力调度的「官方语言」
如果你做的是并网型储能项目,迟早要跟IEC 104打交道。这是电力行业的标准协议,电网调度中心用它来下发指令、采集数据。
说实话,IEC 104比Modbus复杂得多。它定义了完整的通信流程,包括:
- 建立连接(STARTDT/STOPDT)
- 数据上报(遥测、遥信)
- 控制指令(遥控、遥调)
- 时钟同步
- 文件传输
我记得第一次接触IEC 104时,光看协议文档就看了三天。但实际用起来,核心就几个点:
- ASDU(应用服务数据单元):数据的基本单位。比如一个遥测点(电压、电流)就是一个ASDU。
- 公共地址:每个设备有一个唯一的地址,类似Modbus的设备地址。
- 信息对象地址:每个数据点有唯一的地址,类似Modbus的寄存器地址。
// IEC 104 报文示例(读取遥测数据)
// 发送:68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14
// 68:起始字节
// 0E:报文长度(14字节)
// 64:发送序号高位
// 01:发送序号低位
// 06:接收序号高位
// 00:接收序号低位
// 后面是ASDU内容...
嗯,这里要提醒一下:IEC 104的调试工具很重要。我建议用 IEC 104 Slave Simulator 或 CAS Modbus Scanner(它也支持104)。没有工具,纯靠抓包分析,效率极低。
重要提醒:IEC 104的通信超时设置很关键。电网调度通常要求响应时间小于1秒。如果网络延迟大,或者EMS处理慢,调度会判定通信中断,直接下发停机指令。我在一个项目中吃过这个亏,后来把超时从5秒改到3秒,才通过验收。
4.4 MQTT:云端的「快递员」
MQTT 是近几年在光伏储能领域火起来的协议。它基于发布/订阅模式,特别适合设备上云、远程监控的场景。
为什么用MQTT?
- 轻量级:报文头很小,适合带宽有限的场景(比如4G网络)。
- 双向通信:设备可以上报数据,云端也可以下发指令。
- QoS(服务质量):支持三种级别,从「最多发一次」到「确保送达」。
- 保留消息:新设备上线后,能立即获取最新状态。
我参与的一个分布式光伏项目,200多个屋顶电站,每个电站有一个4G网关。如果用Modbus TCP轮询,带宽根本扛不住。换成MQTT后,每个网关只在上报数据时占用带宽,平时几乎不消耗流量。一个月下来,流量费省了60%。
4.4.1 主题设计
MQTT 的核心是主题(Topic)。主题设计得好,系统扩展性就强。我一般这样设计:
// 主题结构
// 电站ID/设备类型/设备ID/数据类型
// 示例
solar_plant_001/inverter/INV_01/power // 逆变器功率
solar_plant_001/bms/BMS_01/soc // 电池SOC
solar_plant_001/meter/MTR_01/energy // 电表电量
// 云端下发指令
cloud/cmd/solar_plant_001/pcs/PCS_01/set_power // 设置PCS功率
这样做的好处是:
- 通过通配符可以批量订阅(比如
solar_plant_001/+/+/power订阅所有功率数据) - 新增设备不影响已有主题
- 权限控制方便(不同设备只能发布自己的主题)
个人经验:MQTT的QoS级别不要盲目用2(确保送达)。在弱网环境下,QoS 2会导致大量重传,反而降低效率。我一般用QoS 1,配合心跳和重连机制,效果很好。
4.5 协议对比与选型建议
说了这么多,到底怎么选?我画了一张图,帮你快速决策。
选型时,我一般按这个思路:
- 先看设备支持什么:很多电表只支持Modbus RTU,逆变器可能同时支持Modbus TCP和MQTT。
- 再看传输距离:同一机柜内用Modbus RTU没问题,跨厂房建议用Modbus TCP或MQTT。
- 最后看实时性:电网调度要求毫秒级响应,必须用IEC 104。远程监控允许秒级延迟,MQTT足够。
4.6 实际项目中的协议转换
现实情况是,你不可能让所有设备都直接跟EMS通信。很多时候需要协议转换器(网关)。
举个例子:
- 电表(Modbus RTU)→ 网关 → EMS(Modbus TCP)
- 逆变器(Modbus TCP)→ 网关 → 云端(MQTT)
- BMS(私有协议)→ 网关 → EMS(IEC 104)
我建议选网关时注意三点:
- 协议库丰富程度:最好支持常见的Modbus、IEC 104、MQTT,以及一些私有协议(如华为、阳光的逆变器协议)。
- 数据缓存能力:网络中断时,网关能缓存数据,恢复后自动补传。
- 边缘计算能力:有些网关可以在本地做简单的逻辑判断,减少EMS的负担。
曾经踩过的坑:有一次我选了一款便宜的网关,只支持Modbus RTU转TCP,不支持数据缓存。结果网络抖动时,数据大量丢失,导致EMS的功率曲线出现断点。后来换了支持缓存的网关,问题才解决。所以,网关的钱不能省。
4.7 小结
好了,这一章的内容就这些。总结一下:
- Modbus RTU/TCP:现场设备的首选,简单可靠,但功能有限。
- IEC 104:电网调度的标准协议,复杂但功能强大。
- MQTT:云端通信的利器,轻量灵活,适合大规模部署。
协议没有好坏之分,只有合不合适。选对了,系统稳定运行;选错了,调试能让你崩溃。希望今天的分享能帮你少走弯路。
下一章,我们聊聊EMS的硬件架构——从采集终端到服务器,每一层该怎么设计。到时候见。