一、储能控制器软件架构总览:分层架构设计

做储能系统这么多年,我见过不少团队一上来就写代码,结果后期维护成本高得吓人。说白了,软件架构就是给整个系统搭骨架。骨架搭好了,后面添砖加瓦才顺手。

我个人习惯把储能控制器的软件分成三层:应用层、中间层、驱动层。为什么这么分?你想想看,如果所有代码都揉在一起,改一个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通信模块是生产者,它把电池数据塞进队列;调度策略模块是消费者,它从队列取数据做决策。

典型的数据流路径:

  1. 驱动层:CAN中断接收BMS报文 → 原始数据入队列
  2. 中间层:解析线程从队列取数据 → 校验、解析、格式化
  3. 应用层:调度任务读取格式化数据 → 计算SOC、执行策略
  4. 中间层:封装PCS指令 → 下发到驱动层
  5. 驱动层:CAN发送PCS控制报文

关键点:数据流中一定要加"防抖"和"限幅"处理。电池电压跳变是常有的事,不加滤波的话,调度策略会频繁误动作。

3.2 任务调度设计

我建议用实时操作系统(RTOS)来管理任务。裸机跑复杂逻辑,迟早会出问题。

典型的任务划分:

任务名称 优先级 周期 说明
BMS通信任务 10ms 处理BMS报文收发
PCS控制任务 10ms 下发功率指令、监控状态
调度策略任务 100ms 执行调度算法
日志记录任务 1000ms 保存运行数据

你可能会问:为什么BMS和PCS任务要设成10ms?因为储能系统的响应速度要求很高。电网波动时,PCS必须在几十毫秒内做出反应,否则可能触发保护跳闸。

避坑指南:我曾经把调度策略任务的优先级设得比BMS通信任务还高。结果BMS数据更新不及时,调度策略用的全是旧数据。嗯,后来我学乖了:数据生产者的优先级一定要高于数据消费者。

四、架构总览图

下面这张图是我用SVG画的,把整个架构串起来看会更清楚。

储能控制器软件架构总览 应用层 调度策略模块 削峰填谷 / 需量管理 SOC/SOH算法 电池状态估算 故障处理 保护逻辑 / 告警 中间层 BMS协议解析 Modbus / CAN解析 PCS控制封装 指令格式化 / 心跳 数据缓存 队列 / 环形缓冲区 驱动层 CAN驱动 BMS / PCS通信 SPI / I2C驱动 外设传感器 GPIO / ADC 继电器 / 采样 策略结果 解析后数据 数据流方向:驱动层 → 中间层 → 应用层(上行数据) 控制流方向:应用层 → 中间层 → 驱动层(下行指令)

从这张图可以看得很清楚:数据从驱动层往上走,经过中间层加工,最终到应用层做决策。控制指令则反过来,从应用层往下走。这种双向数据流的设计,说白了就是"上传下达"。

好了,这一章的内容就到这里。记住一句话:架构设计不是写代码,而是搭骨架。骨架稳了,后面怎么加功能都不怕。