第三章 数据通信协议:储能系统的“神经系统”

大家好,我是老张。在储能系统里摸爬滚打了十几年,我越来越觉得,数据通信协议就像是系统的“神经系统”。电池簇、PCS、BMS、EMS……这些设备之间怎么“说话”?数据怎么传上去?云端怎么收下来?全靠这些协议。

今天咱们就聊聊储能系统里最常见的四种通信协议:Modbus、CAN、IEC 61850和MQTT。说实话,这四种协议我都在项目里踩过坑,也积累了一些经验。咱们一个一个来看。

3.1 Modbus RTU/TCP协议详解

Modbus,这玩意儿太经典了。1979年就出来了,到现在还在用。为什么?因为它简单、可靠、成本低。说白了,就是“问-答”模式:主站问,从站答。

Modbus有两种常见形态:

  • Modbus RTU:走串口(RS-232/RS-485),数据是二进制格式。适合短距离、低速场景,比如BMS和PCS之间的通信。
  • Modbus TCP:走以太网,数据封装在TCP/IP包里。适合长距离、高速场景,比如EMS和上位机之间的通信。

我个人习惯,在储能柜内部用RTU,因为抗干扰能力强。但要注意,RS-485总线最长也就1200米,超过这个距离就得加中继器。

核心知识点:Modbus寄存器地址映射

Modbus里数据存在“寄存器”里。常用的有四种:

  • 线圈(Coil):0x开头的地址,可读可写,1位
  • 离散输入(Discrete Input):1x开头的地址,只读,1位
  • 输入寄存器(Input Register):3x开头的地址,只读,16位
  • 保持寄存器(Holding Register):4x开头的地址,可读可写,16位

在储能项目里,电池电压、电流、SOC这些数据,通常放在输入寄存器里。控制指令(比如“启动充电”)放在保持寄存器里。

举个例子,读取电池电压的Modbus报文长这样:

// 主站发送:读取从站地址0x01,寄存器地址0x3100,读取2个寄存器
请求:01 04 31 00 00 02 [CRC校验]

// 从站回复:数据长度为4字节,电压值=0x0BB8 = 3000mV = 3.0V
响应:01 04 04 0B B8 00 00 [CRC校验]

嗯,这里要注意:CRC校验不能算错。我曾经有一次在项目里,CRC算错了,结果从站一直不响应,排查了整整一天才发现是校验码写反了高低字节。从那以后,我写Modbus代码都会先打印原始报文,用工具验证一遍。

3.2 CAN总线在储能系统中的应用

CAN总线,全称是Controller Area Network。这玩意儿在汽车和储能领域用得特别多。为什么?因为它实时性好、可靠性高、抗干扰能力强。

在储能系统里,CAN总线主要用在BMS内部,以及BMS和PCS之间的通信。比如,BMS通过CAN告诉PCS:“当前电池温度过高,请降低充电功率。”PCS收到后立刻响应。

CAN总线的特点:

  • 多主通信:任何节点都可以主动发消息,不需要主站。
  • 优先级仲裁:消息ID越小,优先级越高。紧急消息(比如“电池过温”)用低ID。
  • 差分信号:CAN_H和CAN_L两根线,抗共模干扰能力强。

避坑指南

我曾经在一个储能项目里,CAN总线老是丢包。排查到最后,发现是终端电阻没接。CAN总线两端必须各接一个120Ω的电阻,否则信号反射会导致通信失败。记住:不是接一个,是接两个!

CAN总线的数据帧格式:

// 标准CAN帧(11位ID)
| SOF | 11位ID | RTR | IDE | r0 | DLC | 数据段(0-8字节) | CRC | ACK | EOF |

// 示例:BMS发送电池电压数据
ID: 0x1810F100  // 优先级高,表示电池状态
数据: 0x0B B8 00 00 00 00 00 00  // 电压值=3000mV

你想想看,CAN总线一次最多传8个字节数据。所以设计协议时,要合理分配数据。比如,把电压、电流、温度打包在一个帧里,而不是每个参数单独发一帧。这样可以减少总线负载。

3.3 IEC 61850标准简介

IEC 61850,这名字听起来就很高大上。它是变电站自动化领域的国际标准,现在也逐渐被储能系统采用。尤其是大型储能电站,电网公司要求必须支持IEC 61850。

说白了,IEC 61850就是一套“面向对象”的通信协议。它把设备抽象成“逻辑节点”,比如“电池系统”是一个逻辑节点,“断路器”是另一个逻辑节点。每个逻辑节点有若干“数据对象”,比如“电压”、“电流”、“状态”。

IEC 61850的核心概念:

  • SCL(变电站配置描述语言):用XML文件描述设备的能力和通信参数。
  • MMS(制造报文规范):用于读取和写入数据,类似Modbus的读写操作。
  • GOOSE(通用面向对象变电站事件):用于快速传输事件信号,比如“保护跳闸”。延迟要求小于4ms。
  • SV(采样值):用于传输模拟量采样数据,比如电压波形。

实际项目经验

我记得有一次做储能电站的并网测试,电网公司要求用IEC 61850上传电池的实时数据。我们当时用的是MMS协议,但发现数据刷新速度跟不上。后来发现是MMS的轮询间隔设置得太长了。调整到100ms后,问题解决了。

另外,IEC 61850的配置非常繁琐。每个设备都要生成一个ICD文件(设备能力描述),然后导入到系统里。如果ICD文件写错了,整个通信都连不上。所以,我建议在项目初期就找厂家要ICD文件,提前验证。

3.4 MQTT协议在云端数据传输中的应用

MQTT,全称是Message Queuing Telemetry Transport。这玩意儿是物联网领域的“网红”协议。为什么?因为它轻量、省带宽、支持发布/订阅模式。

在储能系统里,MQTT主要用于把本地数据上传到云端。比如,BMS采集到的电池数据,通过MQTT发送到云平台,运维人员在手机上就能看到。

MQTT的核心概念:

  • Broker(代理):消息的中转站。所有设备都连接到Broker。
  • Topic(主题):消息的分类标签。比如“/bms/battery/voltage”。
  • Publish(发布):设备发送消息到某个Topic。
  • Subscribe(订阅):设备接收某个Topic的消息。

举个例子,BMS发布电池电压数据:

// 发布消息到Topic: /bms/battery/voltage
Topic: /bms/battery/voltage
Payload: {"voltage": 3000, "unit": "mV", "timestamp": 1700000000}
QoS: 1  // 至少一次送达

MQTT有三个QoS等级:

QoS等级 含义 适用场景
0 最多一次(可能丢包) 非关键数据,比如环境温度
1 至少一次(可能重复) 一般数据,比如电池电压
2 恰好一次(最可靠) 关键数据,比如保护动作信号

注意:MQTT的Topic设计

Topic设计不好,后期维护会很痛苦。我建议采用“设备类型/设备ID/数据类型”的层级结构。比如:

  • /bms/001/voltage
  • /pcs/002/status
  • /ems/003/command

另外,不要用中文Topic,有些Broker不支持。还有,Topic层级不要太深,一般3-4层就够了。

知识体系总览

下面这张图,是我自己画的。它把四种协议的关系和应用场景梳理清楚了。你一看就明白:

储能系统数据通信协议知识体系 储能系统通信协议 Modbus RTU/TCP CAN总线 IEC 61850 MQTT 应用场景 BMS ↔ PCS EMS ↔ 上位机 应用场景 BMS内部通信 BMS ↔ PCS 应用场景 大型储能电站 电网调度 应用场景 云端数据上传 远程运维 特点 简单、可靠 成本低 特点 实时性好 抗干扰强 特点 面向对象 标准化 特点 轻量、省带宽 发布/订阅 总结 Modbus适合本地设备通信,CAN适合实时控制 IEC 61850适合并网调度,MQTT适合云端传输

好了,这一章的内容就到这里。四种协议各有各的用武之地。在实际项目中,往往是多种协议混用。比如,BMS内部用CAN,BMS和PCS之间用Modbus,EMS和云端用MQTT,大型电站再加IEC 61850。你想想看,是不是这个道理?

记住一句话:没有最好的协议,只有最合适的协议。选型时,要考虑成本、实时性、可靠性、维护难度。嗯,这些经验,都是我用真金白银换来的。


公众号:蓝海资料掘金营,微信deep3321