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方便组网,适合跟上位机通信。
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通信协议时,要合理规划数据打包。
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 | 开关控制、联锁 |
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。两个协议可以互补,不冲突。
2.5 协议选型决策树
为了让你更直观地理解,我画了一张决策图:
这张图是我多年项目经验的总结。你照着这个思路选型,基本不会出大错。
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