规则基 EMS 仿真实战:SOC 区间划分与 Simulink 闭环建模全解

一、 规则基 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 模型,严格按照以下 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:完整的模块连线

现在画布上有这些模块了,请严格按照箭头的方向连接:

  1. 输入连线 :将 Sine Wave 的输出,连接到 MATLAB Function 的第一个输入端 P_req
  2. 电池回环连线
  • MATLAB Function 的第二个输出端 P_bat ,连接到 Gain 的输入端。
  • Gain 的输出 →\rightarrow→ Integrator 的输入。
  • Integrator 的输出 →\rightarrow→ Saturation 的输入。(此时 Saturation 的输出端就是当前的真实 SOC)。
  1. 闭环反馈连线
  • Saturation 的输出 →\rightarrow→ Unit Delay 的输入。
  • Unit Delay 的输出 →\rightarrow→ 接回到 MATLAB Function 的第二个输入端 SOC
  1. 示波器观测连线(将信号分别接在 Scope 的 4 个输入口上):
  • 引出一根线,把 Sine Wave (也就是 P_req) 接到 Scope 端口 1。
  • 引出一根线,把 MATLAB Function 的第一个输出 P_main 接到 Scope 端口 2。
  • 引出一根线,把 P_bat 接到 Scope 端口 3。
  • 引出一根线,把 Saturation 出来的 真实 SOC 接到 Scope 端口 4。

步骤 5:运行仿真
  1. 在 Simulink 顶部的工具栏,找到 Stop Time (停止时间) ,默认是 10.0,请改为 200(因为我们要观察一个比较长的充放电过程)。
  2. 点击顶部工具栏的 Run (运行/绿色播放键)
  3. 双击打开 Scope 模块。
  4. 点击示波器上方的 View -> Layout ,选择 4×14 \times 14×1 的网格(上下排列四个图表)。
  5. 点击 Scale X/Y Limits (自动缩放) 按钮。

至此,你将清晰地看到四个波形:

  • 图 1 (P_req): 正弦波动的需求功率。
  • 图 2 (P_main): 主电源的输出,你会看到它在低负载时稳定在 20kW(最优效率点),在高负载或电池缺电时顶上去。
  • 图 3 (P_bat): 电池的充放电功率(正为放,负为充)。
  • 图 4 (SOC): 随着时间推移,SOC 会从 0.5 开始上下波动,并被严格限制在你设定的逻辑框架内。
相关推荐
多加点辣也没关系1 小时前
数据结构与算法|第二十三章:高级数据结构
数据结构·算法
hoiii1874 小时前
孤立森林 (Isolation Forest) 快速异常检测系统
算法
c++之路5 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌5 小时前
Java——接口的细节
java·开发语言·算法
myheartgo-on5 小时前
Java—方 法
java·开发语言·算法·青少年编程
宝贝儿好6 小时前
【LLM】第三章:项目实操案例:智能输入法项目
人工智能·python·深度学习·算法·机器人
机器学习之心7 小时前
集成BWM法、熵权法、改进博弈论组合赋权与三角直觉模糊云模型的多属性评价模型,MATLAB代码
开发语言·matlab·熵权法·三角直觉模糊云模型·bwm法·改进博弈论组合赋权·多属性评价模型
雪碧聊技术7 小时前
上午题_算法
算法·软考·软件设计师