一、储能控制器软件架构总览:分层架构设计
做储能系统这么多年,我见过不少团队一上来就写代码,结果后期维护成本高得吓人。说白了,软件架构就是给整个系统搭骨架。骨架搭好了,后面添砖加瓦才顺手。
我个人习惯把储能控制器的软件分成三层:应用层、中间层、驱动层。为什么这么分?你想想看,如果所有代码都揉在一起,改一个BMS通信协议,结果把PCS控制逻辑搞崩了,这种坑我踩过不止一次。
1.1 三层架构的核心思想
每一层各司其职,层与层之间通过标准接口通信。这样做的好处很明显:
- 驱动层:直接跟硬件打交道。管它用的是STM32还是GD32,驱动层把硬件差异全封装掉。
- 中间层:承上启下。把驱动层的原始数据加工成应用层能用的信息。
- 应用层:只关心业务逻辑。SOC怎么算?调度策略怎么定?跟硬件无关。
重要原则:上层可以调用下层,下层绝不能反向依赖上层。这个规矩破了,架构就乱了。
我在项目中遇到过一件事:有个同事为了图方便,在驱动层直接调用了应用层的SOC计算函数。结果换了个BMS型号,驱动层重写,应用层也得跟着改。嗯,后来我们花了整整一周重构代码。
1.2 各层职责详解
| 层级 | 主要职责 | 典型模块 |
|---|---|---|
| 应用层 | 业务逻辑、策略决策 | 调度策略、SOC/SOH算法、故障处理 |
| 中间层 | 数据抽象、协议解析 | BMS协议解析、PCS控制封装、数据缓存 |
| 驱动层 | 硬件访问、外设控制 | CAN驱动、SPI驱动、GPIO控制、ADC读取 |
我的经验:中间层最容易被人忽视。很多人觉得它"多余",但恰恰是中间层让系统具备了可移植性。我曾经把一个项目从FreeRTOS移植到RT-Thread,只改了驱动层和中间层的一小部分,应用层几乎没动。
二、模块划分:BMS通信、PCS控制、调度策略
分层是纵向切分,模块划分就是横向切分。我习惯把储能控制器拆成三个核心模块:BMS通信模块、PCS控制模块、调度策略模块。
2.1 BMS通信模块
BMS(电池管理系统)是储能系统的"感觉神经"。它告诉你电池的电压、电流、温度、SOC等关键数据。
这个模块要处理的事情:
- 协议解析:Modbus RTU、CAN 2.0、甚至私有协议
- 数据校验:CRC校验、超时重传
- 异常处理:通信中断怎么办?数据异常怎么报?
我曾经遇到过一个坑:某个BMS厂家在CAN报文中把SOC放在第3和第4字节,但文档写的是第2和第3字节。嗯,那次调试了整整两天才发现问题。所以我现在做BMS通信,一定会先抓报文验证。
2.2 PCS控制模块
PCS(储能变流器)是执行机构。你让它充它就充,让它放它就放。
核心功能包括:
- 功率指令下发:有功功率、无功功率
- 运行模式切换:并网/离网/待机
- 保护逻辑:过流、过压、过温保护
注意:PCS控制模块一定要有"看门狗"机制。我见过一次事故:调度层死机了,PCS还在按最后一条指令运行,结果电池过充了。从那以后,我要求PCS控制模块必须实现心跳检测,超时自动切到安全状态。
2.3 调度策略模块
这是整个控制器的"大脑"。它根据BMS上报的电池状态和电网需求,决定怎么调度PCS。
常见的调度策略:
- 削峰填谷:电价高时放电,电价低时充电
- 需量管理:控制最大功率,避免超需量罚款
- 光伏消纳:优先用光伏发电给电池充电
说白了,调度策略就是一套规则引擎。我个人习惯用状态机来实现,每个状态对应一种运行模式,状态切换条件清晰明了。
三、数据流与任务调度
架构搭好了,模块分完了,接下来就是数据怎么流、任务怎么跑。
3.1 数据流设计
数据流的核心是"生产者-消费者"模型。BMS通信模块是生产者,它把电池数据塞进队列;调度策略模块是消费者,它从队列取数据做决策。
典型的数据流路径:
- 驱动层:CAN中断接收BMS报文 → 原始数据入队列
- 中间层:解析线程从队列取数据 → 校验、解析、格式化
- 应用层:调度任务读取格式化数据 → 计算SOC、执行策略
- 中间层:封装PCS指令 → 下发到驱动层
- 驱动层:CAN发送PCS控制报文
关键点:数据流中一定要加"防抖"和"限幅"处理。电池电压跳变是常有的事,不加滤波的话,调度策略会频繁误动作。
3.2 任务调度设计
我建议用实时操作系统(RTOS)来管理任务。裸机跑复杂逻辑,迟早会出问题。
典型的任务划分:
| 任务名称 | 优先级 | 周期 | 说明 |
|---|---|---|---|
| BMS通信任务 | 高 | 10ms | 处理BMS报文收发 |
| PCS控制任务 | 高 | 10ms | 下发功率指令、监控状态 |
| 调度策略任务 | 中 | 100ms | 执行调度算法 |
| 日志记录任务 | 低 | 1000ms | 保存运行数据 |
你可能会问:为什么BMS和PCS任务要设成10ms?因为储能系统的响应速度要求很高。电网波动时,PCS必须在几十毫秒内做出反应,否则可能触发保护跳闸。
避坑指南:我曾经把调度策略任务的优先级设得比BMS通信任务还高。结果BMS数据更新不及时,调度策略用的全是旧数据。嗯,后来我学乖了:数据生产者的优先级一定要高于数据消费者。
四、架构总览图
下面这张图是我用SVG画的,把整个架构串起来看会更清楚。
从这张图可以看得很清楚:数据从驱动层往上走,经过中间层加工,最终到应用层做决策。控制指令则反过来,从应用层往下走。这种双向数据流的设计,说白了就是"上传下达"。
好了,这一章的内容就到这里。记住一句话:架构设计不是写代码,而是搭骨架。骨架稳了,后面怎么加功能都不怕。