3、通信协议详解:IEC 104规约、MQTT协议、HTTPS API、本地通信(Modbus/RS485)、协议选型对比

各位同行,大家好。这一章我们来聊聊通信协议。

说实话,做VPP聚合商接入,最头疼的往往不是业务逻辑,而是通信协议。我见过太多项目,前期没把协议选型当回事,结果联调时发现数据上不来、指令下不去,最后只能推倒重来。嗯,今天我就把这几种主流协议掰开揉碎了讲清楚。

3.1 IEC 104规约:电力系统的“普通话”

IEC 104,全称是IEC 60870-5-104。说白了,它就是电力系统里的“普通话”。省级VPP平台跟变电站、大型光伏电站通信,基本都用它。

核心特点:

  • 面向连接:基于TCP/IP,端口号2404。先建立连接,再传数据。
  • 遥测、遥信、遥控、遥调:四遥功能全覆盖。遥测是模拟量(电压、电流),遥信是状态量(开关分合),遥控是下发指令,遥调是设定值调整。
  • ASDU格式:应用服务数据单元,结构固定。我刚开始看ASDU时觉得头大,后来发现其实就是个“信封”,里面装着类型标识、传送原因、信息体地址这些字段。

我在项目中遇到过一个问题:某光伏电站用104规约上报数据,但平台总是收不到遥测值。排查了半天,发现是信息体地址没对齐。电站侧用的是0-65535的地址范围,平台侧默认是1-65536。差一个数,全乱套。所以,地址映射表一定要提前对齐

我的习惯:做104接入时,先让厂家导出一份完整的“点表”,包括每个信息体地址对应的物理量、单位、系数。然后逐条核对,别偷懒。

3.2 MQTT协议:轻量级物联网“快递员”

MQTT,Message Queuing Telemetry Transport。名字挺长,但核心就三个字:轻、快、省

为什么VPP里要用MQTT?因为很多中小型聚合商接的是分布式光伏、储能、充电桩,这些设备数量多、分布广,而且网络环境不稳定。用104规约太重了,MQTT正好合适。

MQTT的关键机制是发布/订阅模式。设备端发布消息到某个主题(Topic),平台端订阅这个主题,就能收到消息。反过来也一样。

// 伪代码示例:MQTT客户端发布遥测数据
client.publish("vpp/station_001/telemetry", 
    "{\"voltage\": 220.5, \"current\": 10.2, \"power\": 2249.1}");

这里要注意QoS(服务质量)等级。QoS 0最多发一次,丢了不管;QoS 1至少发一次,可能重复;QoS 2恰好发一次,最可靠但最慢。我建议遥测数据用QoS 1,遥控指令用QoS 2。为什么?遥测丢一帧问题不大,但遥控指令重复执行可能出事故。

避坑指南:我曾经遇到一个项目,MQTT Broker(消息代理)配置了默认的keepalive时间,结果设备网络闪断后,Broker没及时检测到,导致数据积压。后来我把keepalive设成了30秒,并启用了Last Will Testament(遗嘱消息),设备离线时自动通知平台。

3.3 HTTPS API:RESTful风格的“标准接口”

HTTPS API,说白了就是通过HTTP协议调用的接口,数据格式通常是JSON。省级VPP平台现在越来越喜欢用这个,因为它简单、通用、好调试。

典型的场景是:聚合商平台定时调用VPP平台的API,上报聚合数据,或者查询调度指令。

// 示例:POST请求上报聚合功率
POST /api/v1/aggregator/report
Content-Type: application/json
Authorization: Bearer <token>

{
    "aggregator_id": "AGG001",
    "timestamp": "2025-03-21T10:00:00Z",
    "total_power": 12500.5,
    "power_units": [
        {"unit_id": "PV001", "power": 5000.2},
        {"unit_id": "ES001", "power": -2000.0},
        {"unit_id": "CP001", "power": 7500.3}
    ]
}

HTTPS API的好处是生态成熟。用Postman就能调试,用Swagger就能生成文档。但缺点也很明显:实时性差。每次请求都要建立TCP连接、TLS握手,延迟通常在几百毫秒到几秒。所以它适合分钟级的数据上报,不适合毫秒级的控制。

我的建议:API的鉴权一定要用Token,别用简单的API Key。Token有过期时间,可以定期刷新,安全性高很多。另外,接口要设计幂等性,防止重复请求导致数据错误。

3.4 本地通信:Modbus/RS485

Modbus/RS485是“老黄牛”了。在设备端,比如逆变器、电表、BMS(电池管理系统),几乎清一色用Modbus。

RS485是物理层,Modbus是应用层。Modbus有两种模式:RTU(二进制)和TCP(网络)。在VPP场景里,聚合商边缘网关通常通过RS485总线采集设备数据,然后转换成MQTT或104上报给平台。

// Modbus RTU读取寄存器示例(伪代码)
// 读取地址为1的设备,起始寄存器0,读取2个寄存器
send: 01 03 00 00 00 02 C4 0B
recv: 01 03 04 02 1E 00 64 7A 9C
// 解析:电压=0x021E=542(实际值需乘以系数),电流=0x0064=100

Modbus有个坑:寄存器地址和协议地址经常搞混。有些厂家文档写的是“寄存器地址40001”,对应Modbus协议地址是0。你直接填40001去读,肯定读不到。我一般会跟厂家确认:你们用的是PLC地址还是Modbus地址?

避坑指南:我曾经调试一个储能BMS,Modbus通信总是超时。后来发现是RS485总线上接了太多设备,而且终端电阻没加。RS485总线两端必须各加一个120欧姆的终端电阻,否则信号反射会导致通信错误。另外,波特率别设太高,9600或19200最稳。

3.5 协议选型对比

好了,四种协议都讲完了。那到底怎么选?我画了一张对比表,你一看就明白。

特性 IEC 104 MQTT HTTPS API Modbus/RS485
适用层级 站控层到平台 设备/网关到平台 聚合商到平台 设备到网关
实时性 高(秒级) 中(秒级) 低(分钟级) 高(毫秒级)
可靠性 高(有确认机制) 中(依赖QoS) 高(HTTP状态码) 中(无确认)
数据量 大(支持批量) 小(单条消息) 中(JSON结构) 小(寄存器级)
安全性 弱(需额外加密) 中(TLS+认证) 强(HTTPS+Token) 弱(无加密)
开发难度 高(协议复杂) 低(库丰富) 低(RESTful) 低(简单指令)
典型场景 光伏站、变电站 分布式储能、充电桩 聚合商数据上报 逆变器、电表采集

选型时,我一般遵循这个原则:

  • 设备端到网关:用Modbus/RS485,简单可靠。
  • 网关到平台(实时控制):用IEC 104,符合电力标准。
  • 网关到平台(非实时数据):用MQTT,轻量灵活。
  • 聚合商到省级平台(业务接口):用HTTPS API,通用易集成。

你想想看,如果一个充电桩用104规约上报数据,那开发成本得多高?反过来,一个220kV变电站用MQTT上报,平台敢信吗?所以,选对协议,事半功倍

核心逻辑图:下面这张图展示了VPP通信协议的分层架构,从设备端到省级平台,每一层用什么协议,一目了然。

VPP通信协议分层架构 省级VPP平台 IEC 104 MQTT HTTPS API 聚合商边缘网关 Modbus / RS485 逆变器 / 电表 / BMS / 充电桩

好了,这一章的内容就到这里。通信协议这块,说白了就是“因地制宜”。没有最好的协议,只有最合适的协议。你只要把每种协议的特点、适用场景、常见坑点记牢了,做接入时就能少走弯路。

专注资料整理