一、 规则基 EMS 完整设计:SOC 区间 + 功率分配
在这个设计中,我们假设系统由主电源 (如发动机/燃料电池)和储能系统 (动力电池)组成。系统的核心目标是:在满足总功率需求(PreqP_{req}Preq)的前提下,将电池的 SOC 维持在高效、安全的区间内。
1. 变量与参数定义
- 输入变量 :PreqP_{req}Preq(需求功率),SOCSOCSOC(当前电池荷电状态)
- 输出变量 :PmainP_{main}Pmain(主电源输出功率),PbatP_{bat}Pbat(电池输出功率,正为放电,负为充电)
- 关键阈值:
- SOC 区间阈值 :SOClowSOC_{low}SOClow(通常设为 20%-30%),SOChighSOC_{high}SOChigh(通常设为 80%-90%)。
- 功率阈值 :Pmain_optP_{main\opt}Pmain_opt(主电源最优经济功率),Pmain_maxP{main\max}Pmain_max(主电源最大功率),PchargeP{charge}Pcharge(设定的目标充电功率)。
2. SOC 区间划分与逻辑规则
我们将 SOC 划分为三个核心区间,并针对每个区间制定功率分配规则:满足约束条件
Preq=Pmain+PbatP_{req} = P_{main} + P_{bat}Preq=Pmain+Pbat
- 状态 A:低电量区间 (SOC≤SOClowSOC \le SOC_{low}SOC≤SOClow)
- 策略:强制充电模式(Charge Sustaining / Forced Charge)。此时电池电量过低,主电源必须在满足负载的同时,尽可能多地为电池充电。
- 功率分配:
Pmain=min(Preq+Pcharge,Pmain_max)P_{main} = \min(P_{req} + P_{charge}, P_{main\_max})Pmain=min(Preq+Pcharge,Pmain_max)
Pbat=Preq−PmainP_{bat} = P_{req} - P_{main}Pbat=Preq−Pmain
- 状态 B:高电量区间 (SOC≥SOChighSOC \ge SOC_{high}SOC≥SOChigh)
- 策略:电量消耗模式(Charge Depleting)。电池电量充足,优先使用电池放电,主电源怠速、关机或保持最低功率运行。
- 功率分配:
Pmain=Pmain_minP_{main} = P_{main\_min}Pmain=Pmain_min
(或直接设为 0)
Pbat=Preq−PmainP_{bat} = P_{req} - P_{main}Pbat=Preq−Pmain
- 状态 C:正常运行区间 (SOClow<SOC<SOChighSOC_{low} < SOC < SOC_{high}SOClow<SOC<SOChigh)
- 策略 :功率跟随与混合驱动。此时需要根据当前的需求功率大小 来决定主电源的工作状态,使其尽量工作在最优效率点(Pmain_optP_{main\_opt}Pmain_opt)。
- 子规则 1(高负载) :如果 Preq≥Pmain_optP_{req} \ge P_{main\_opt}Preq≥Pmain_opt
- 主电源输出最优功率,不足部分由电池补足。
Pmain=Pmain_optP_{main} = P_{main\_opt}Pmain=Pmain_opt
Pbat=Preq−PmainP_{bat} = P_{req} - P_{main}Pbat=Preq−Pmain
- 子规则 2(低负载) :如果 Preq<Pmain_optP_{req} < P_{main\_opt}Preq<Pmain_opt
- 主电源输出最优功率,多余的功率用于给电池充电。
Pmain=Pmain_optP_{main} = P_{main\_opt}Pmain=Pmain_opt
Pbat=Preq−PmainP_{bat} = P_{req} - P_{main}Pbat=Preq−Pmain
(此时 Pbat<0P_{bat} < 0Pbat<0,表示充电)
二、 Simulink 建模详解(针对规则基 EMS)
请打开一个空白的 Simulink 模型,严格按照以下 5 个步骤拖拽模块和填入参数:
步骤 1:准备所有需要的模块
打开 Simulink 库浏览器(Library Browser),将以下模块拖入空白画布中:
输入信号源(模拟行驶工况):
- Sine Wave (Sources 库) - 用于生成波动变化的需求功率。
控制器核心:
- MATLAB Function (User-Defined Functions 库) - 写入能量管理规则。
被控对象(模拟电池SOC消耗):
- Gain (Math Operations 库) - 用于将电池功率转换为 SOC 消耗率。
- Integrator (Continuous 库) - 用于积分计算当前的 SOC。
- Saturation (Discontinuities 库) - 用于限制 SOC 永远在 0 到 1 之间。
- Unit Delay (Discrete 库) - 必须有,用于打断代数环报错。
观测结果:
- Scope (Sinks 库) - 用于看波形。
- Mux (Signal Routing 库) - 用于将多根信号线合并到同一个示波器中。
步骤 2:逐一设置模块内部参数(双击模块打开)
不需要在 MATLAB 工作区写任何代码,所有参数我们都直接写在模块里。
1. Sine Wave (模拟需求功率 P_req)
- Amplitude (振幅) :
25000(波动范围 25kW) - Bias (偏置) :
15000(基准功率 15kW) - Frequency (频率) :
0.05(让波形变化得缓慢一些) - 物理意义:这将生成一个在 -10kW(模拟刹车能量回收)到 40kW(模拟急加速)之间缓慢波动的需求功率曲线。
2. Gain (电池容量转换系数)
- 假设电池容量为 50Ah50\text{Ah}50Ah,系统电压 300V300\text{V}300V,总能量为 50×300×3600=54,000,000J50 \times 300 \times 3600 = 54,000,000\text{J}50×300×3600=54,000,000J。
- Gain :
-1/54000000 - 物理意义:电池放电功率(正值)会导致 SOC 下降,所以加负号除以总焦耳数。
3. Integrator (计算 SOC)
- Initial condition :
0.5 - 物理意义:假设车辆启动时,电池电量为 50%。
4. Saturation (限制 SOC 上下限)
- Upper limit :
1 - Lower limit :
0
5. Scope (示波器配置)
- 双击打开示波器,点击齿轮图标(Settings),将 Number of input ports 改为
4。
步骤 3:编写 EMS 核心控制代码
双击 MATLAB Function 模块,删除里面原本的代码,将下面的代码完整复制粘贴进去。所有的控制阈值我都直接写在了代码内部,不需要外部输入。
matlab
function [P_main, P_bat] = RuleBased_EMS(P_req, SOC)
% 1. 定义内置参数
SOC_low = 0.3; % SOC 强制充电下限
SOC_high = 0.8; % SOC 纯电消耗上限
P_opt = 20000; % 主电源最优经济功率 (20kW)
P_max = 50000; % 主电源最大输出功率 (50kW)
P_chg = 10000; % 设定的充电功率 (10kW)
% 2. 状态机逻辑判断
if SOC <= SOC_low
% 模式A:低电量强制充电
% 主电源需同时满足负载并充电,但不能超过物理极限
P_main_temp = P_req + P_chg;
P_main = min(P_main_temp, P_max);
elseif SOC >= SOC_high
% 模式B:高电量纯电/放电模式
% 主电源关闭,全靠电池
P_main = 0;
else
% 模式C:正常区间(功率跟随与最优曲线)
if P_req >= P_opt
% 需求大于最优功率:主电源全速输出最优功率,不足的由电池补(混合驱动)
P_main = P_opt;
else
% 需求小于最优功率:主电源输出最优功率,多余的功率给电池充电
% 加入 min 防止由于需求过低导致给电池充电的功率超过 P_chg 设定值
P_main = min(P_opt, P_req + P_chg);
end
end
% 3. 电池功率计算:需求 = 主电源 + 电池
P_bat = P_req - P_main;
end
步骤 4:完整的模块连线
现在画布上有这些模块了,请严格按照箭头的方向连接:
- 输入连线 :将
Sine Wave的输出,连接到MATLAB Function的第一个输入端 P_req。 - 电池回环连线:
- 将
MATLAB Function的第二个输出端 P_bat ,连接到Gain的输入端。 Gain的输出 →\rightarrow→Integrator的输入。Integrator的输出 →\rightarrow→Saturation的输入。(此时Saturation的输出端就是当前的真实 SOC)。
- 闭环反馈连线:
- 将
Saturation的输出 →\rightarrow→Unit Delay的输入。 - 将
Unit Delay的输出 →\rightarrow→ 接回到MATLAB Function的第二个输入端 SOC。
- 示波器观测连线(将信号分别接在 Scope 的 4 个输入口上):
- 引出一根线,把
Sine Wave(也就是 P_req) 接到 Scope 端口 1。 - 引出一根线,把
MATLAB Function的第一个输出 P_main 接到 Scope 端口 2。 - 引出一根线,把 P_bat 接到 Scope 端口 3。
- 引出一根线,把
Saturation出来的 真实 SOC 接到 Scope 端口 4。
步骤 5:运行仿真
- 在 Simulink 顶部的工具栏,找到 Stop Time (停止时间) ,默认是 10.0,请改为
200(因为我们要观察一个比较长的充放电过程)。 - 点击顶部工具栏的 Run (运行/绿色播放键)。
- 双击打开 Scope 模块。
- 点击示波器上方的 View -> Layout ,选择 4×14 \times 14×1 的网格(上下排列四个图表)。
- 点击 Scale X/Y Limits (自动缩放) 按钮。
至此,你将清晰地看到四个波形:
- 图 1 (P_req): 正弦波动的需求功率。
- 图 2 (P_main): 主电源的输出,你会看到它在低负载时稳定在 20kW(最优效率点),在高负载或电池缺电时顶上去。
- 图 3 (P_bat): 电池的充放电功率(正为放,负为充)。
- 图 4 (SOC): 随着时间推移,SOC 会从 0.5 开始上下波动,并被严格限制在你设定的逻辑框架内。
