2. 数据源与通信协议:Modbus RTU/TCP协议详解、CAN总线协议基础、IEC 61850在储能中的应用、MQTT与OPC UA协议对比

做储能数据采集这些年,我最大的感触就是:协议选型决定了项目的成败。你想想看,一个储能站里,BMS、PCS、EMS、温控系统、消防系统……每个设备都在用自己的“方言”说话。我们做ETL的,本质上就是个翻译官。

今天咱们就把储能领域最常见的几种协议掰开揉碎聊一聊。我会结合自己踩过的坑,给你一些实在的建议。

2.1 Modbus RTU/TCP协议详解

Modbus可以说是工业界的“普通话”。我入行第一个项目就是跟Modbus打交道,那时候觉得这协议太老了,后来才发现——老,意味着稳定

2.1.1 Modbus RTU vs TCP:到底差在哪?

对比项 Modbus RTU Modbus TCP
物理层 RS-232 / RS-485 以太网
传输方式 串行,半双工 网络,全双工
最大节点数 32(RS-485典型值) 理论上无限制
传输距离 1200米(RS-485) 100米(网线),可扩展
数据校验 CRC16 TCP/IP协议栈保证
典型应用场景 就地采集、短距离、低成本 站内网络、远程监控

我个人习惯:现场总线用RTU,站控层用TCP。为什么?RTU抗干扰能力强,适合电磁环境复杂的储能舱内部。TCP方便组网,适合跟上位机通信。

⚠️ 我曾经踩过的坑: 有个项目,BMS和PCS之间用Modbus RTU通信,距离大概800米。我图省事用了普通双绞线,结果数据经常丢包。后来换成带屏蔽的RS-485专用线缆,问题才解决。记住:物理层别省钱

2.1.2 数据帧结构

Modbus RTU的帧结构其实很简单:

地址码(1字节) + 功能码(1字节) + 数据区(N字节) + CRC校验(2字节)

举个例子,读取BMS的电池电压:

发送:01 03 00 00 00 02 C4 0B
解释:地址01,功能码03(读保持寄存器),起始地址0000,读取2个寄存器,CRC校验

嗯,这里要注意:Modbus的寄存器地址是从0开始的,但很多设备厂商的文档里写的是“地址40001”,那是PLC的映射地址,别搞混了。

2.1.3 功能码速查表

功能码 名称 储能中常用吗?
01 读线圈状态 少用(开关量一般用03)
02 读离散输入 少用
03 读保持寄存器 最常用(电压、电流、温度)
04 读输入寄存器 偶尔用(只读参数)
06 写单个寄存器 常用(下发控制指令)
16 写多个寄存器 常用(批量设置参数)

2.2 CAN总线协议基础

说到CAN总线,我脑子里第一个蹦出来的词就是“硬实时”。储能系统里,BMS和PCS之间的通信,CAN总线是绝对的主力。

为什么?因为CAN总线是事件触发的,优先级高的报文可以抢占总线。你想想看,电池出现过流故障,这个告警报文必须毫秒级送达PCS,否则就可能出事故。Modbus RTU是轮询机制,做不到这一点。

2.2.1 CAN 2.0A vs CAN 2.0B

  • CAN 2.0A:标准帧,11位ID。储能里大部分设备用这个。
  • CAN 2.0B:扩展帧,29位ID。一些新设备开始用,兼容性更好。

我个人建议:能用标准帧就别用扩展帧。扩展帧虽然ID空间大,但传输效率低,而且很多老设备不兼容。

2.2.2 数据帧结构

CAN总线的数据帧长这样:

帧起始(1位) + 仲裁场(11/29位ID) + 控制场(6位) + 数据场(0-8字节) + CRC场(15位) + 应答场(2位) + 帧结束(7位)

关键点:数据场最多8个字节。这意味着什么?你一次最多传4个float或者8个int16。所以设计CAN通信协议时,要合理规划数据打包。

💡 我的经验: 做BMS数据采集时,我习惯把电池单体电压打包成“每帧4个float”,温度打包成“每帧8个int16”。这样既充分利用了8字节,又方便解析。

2.2.3 波特率选择

波特率 最大总线长度 储能应用场景
125 kbps 500米 大型储能站,距离远
250 kbps 250米 中型储能系统,常用
500 kbps 100米 小型储能柜,速度快
1 Mbps 40米 机柜内部,极少用

我一般选250 kbps。为什么?平衡了速度和距离。你想想看,一个储能舱也就十几米长,250 kbps完全够用,而且抗干扰能力比500 kbps强。

2.3 IEC 61850在储能中的应用

IEC 61850,说白了就是电力系统的“国际语言”。以前主要用在变电站,现在储能站也开始用了。我接触这个协议时,第一反应是:太复杂了

但用久了你会发现,它确实强大。尤其是面向对象的数据模型,比Modbus那种“寄存器地址”的方式先进太多了。

2.3.1 核心概念

  • 逻辑节点(LN):比如“MMXU”代表测量单元,“XCBR”代表断路器。
  • 数据对象(DO):比如“MMXU.PhV”代表相电压。
  • 数据属性(DA):比如“MMXU.PhV.cVal.mag.f”代表电压幅值的浮点数。

举个例子,读取PCS的A相电压:

路径:PCS1/MMXU1.PhV.phsA.cVal.mag.f
解释:PCS1设备 -> 测量单元1 -> A相电压 -> 复数 -> 幅值 -> 浮点数

嗯,这里要注意:IEC 61850的路径是树形结构,不像Modbus那样扁平。所以解析起来要递归遍历,代码量会大一些。

2.3.2 在储能中的典型应用

应用场景 使用的逻辑节点 说明
PCS遥测 MMXU, MMXN 电压、电流、功率、频率
BMS状态 ZBAT, ZBTC 电池状态、充电控制
保护告警 PTRC, RREC 保护动作、重合闸
并网控制 CSWI, CILO 开关控制、联锁
⚠️ 我曾经踩过的坑: 有个项目要求用IEC 61850采集BMS数据。我按照标准文档写了个通用解析器,结果发现不同厂家的BMS对逻辑节点的命名规则不一样。有的用“ZBAT1”,有的用“BAT1”。最后只能给每个厂家写一个映射表。所以,别指望完全标准化,做好适配层。

2.4 MQTT与OPC UA协议对比

这两个协议,我经常被问到“选哪个好”。其实没有绝对的好坏,关键看场景。

2.4.1 核心差异

对比项 MQTT OPC UA
通信模式 发布/订阅 客户端/服务器 + 发布/订阅
传输协议 TCP/IP TCP/IP, HTTP, 二进制
数据模型 扁平主题(Topic) 面向对象,类型系统
安全性 TLS + 用户名密码 内置加密、签名、认证
实时性 中等(依赖Broker) 高(支持订阅+轮询)
典型场景 云端接入、物联网 工业控制、站内通信

2.4.2 什么时候用MQTT?

说白了,MQTT适合“数据上云”。我做过一个项目,把储能站的数据传到云端监控平台。用MQTT就特别合适:

  • Topic结构清晰:station/001/bms/voltage
  • QoS保证:重要告警用QoS 2,普通遥测用QoS 1
  • 断线重连:自动重连,数据不丢
# MQTT主题设计示例
station/001/bms/voltage       # BMS总电压
station/001/bms/soc           # 电池SOC
station/001/pcs/active_power  # PCS有功功率
station/001/alarm/level       # 告警等级

2.4.3 什么时候用OPC UA?

OPC UA适合站内控制。为什么?因为它有完整的数据模型和安全机制。你想想看,如果PCS要读取BMS的某个参数,用OPC UA可以直接通过地址空间访问,不需要像MQTT那样订阅一堆Topic。

我个人习惯:站内用OPC UA,上云用MQTT。两个协议可以互补,不冲突。

💡 我的经验: 有个项目,我用了OPC UA作为站内总线,然后写了一个OPC UA到MQTT的网关,把数据转发到云端。这样既保证了站内的实时性和安全性,又实现了云端接入。说白了,不要非此即彼

2.5 协议选型决策树

为了让你更直观地理解,我画了一张决策图:

储能数据采集协议选型决策树 数据源是什么? 就地设备(BMS/PCS) 站控系统/云端 实时控制? (毫秒级) 非实时采集 (秒级) CAN总线 BMS ↔ PCS Modbus RTU RS-485采集 站内通信? (局域网) 远程通信? (互联网) OPC UA / IEC 61850 站控层通信 MQTT 云端接入 注:实际项目中往往多种协议混合使用,请根据具体需求灵活选择

这张图是我多年项目经验的总结。你照着这个思路选型,基本不会出大错。

2.6 小结

聊了这么多,其实就一句话:没有最好的协议,只有最合适的协议

  • Modbus RTU:便宜、稳定,适合就地采集
  • Modbus TCP:方便组网,适合站内通信
  • CAN总线:实时、可靠,BMS和PCS之间的首选
  • IEC 61850:标准化、面向对象,大型储能站的趋势
  • MQTT:轻量、灵活,云端接入的利器
  • OPC UA:安全、完整,站内控制的标杆

做ETL设计时,我的建议是:先搞清楚数据从哪里来、到哪里去、实时性要求多高。然后对着上面的决策树选型,再根据实际情况微调。嗯,这样基本就能搞定。

📌 核心要点:

  • Modbus RTU和TCP的帧结构不同,RTU有CRC校验,TCP依赖IP层
  • CAN总线数据场最多8字节,设计协议时要合理打包
  • IEC 61850的路径是树形结构,解析需要递归遍历
  • MQTT适合上云,OPC UA适合站内,两者可以互补

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