ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

串联式混合动力Simulink能量控制策略详解

串联式混合动力Simulink能量控制策略详解 简介压缩包内提供了一套串联式混合动力电动汽车能量控制策略的Simulink仿真模型面向车辆工程、控制科学与工程方向的研究者与学习者用于分析混合动力系统在典型工况下的能量分配和燃油经济性优化问题。模型以m文件形式组织共1个文件整体仅4KB便于快速导入MATLAB/Simulink环境查看与修改。建模内容涵盖能源存储模块、能量转换模块、驱动模块、控制策略模块及车辆动力学模块其中电池荷电状态动态、内燃机与发电机协调工作点、电机扭矩需求均做了具体刻画能够支持预测控制、最优控制、模糊逻辑等策略的仿真对比。压缩包内附带的模型结构清晰、参数集中既可作为理解串联式混动能量管理机制的教学示例也可用于课程设计、毕业设计或科研预研的模型基线。已有618人学习下载适合希望快速上手Simulink仿真、验证不同能量控制策略并观察功率流变化的读者。1. 串联式混合动力电动汽车的能量控制策略为什么要先谈发动机工作点很多人第一次接触串联式混合动力电动汽车时会觉得这种构型相对简单发动机不直接驱动车轮只带动发电机给电池和电机供电那能量控制策略不就是看着SOC决定发不发电吗真正用Simulink模型把策略跑起来后会发现问题远不止“SOC到80%就停机到30%就启动”这么粗粒度。发动机启停一次除了机械损耗还有尾气后处理温度掉下来的代价发电功率选得太大电池电流冲击和燃油消耗同时上升选得太小又会出现系统功率不足、发动机长时间疲劳运行。所谓能量控制策略在串联构型里实际上是对“发动机何时启动、在哪个功率点工作、电池承担多少削峰填谷责任”的实时决策。对做整车控制、动力系统开发或刚接触VCU控制策略Simulink建模的工程师来说把一个可靠的Simulink模型调好就等于有了一座可反复试验的标定台架。2. 串联式混合动力Simulink模型里可以落地的三种能量控制策略串联式混合动力系统的控制自由度比并联构型少但不代表控制算法只能做成简单的开关判据。从工程交付角度我一般把策略按复杂度分成三层恒温器型、功率跟随型、基于规则的模糊控制型。它们都可以直接在Simulink里用Stateflow、MATLAB Function和Fuzzy Logic Controller实现而且能共用同一套电池、电机和整车动力学模型。2.1 恒温器型策略用Stateflow把发动机当成一个带迟滞的温控开关恒温器策略的核心是让发动机尽量工作在最优燃油消耗点附近。SOC高于上限时就切到纯电动模式发动机停机SOC低于下限时启动发动机并以固定功率发电直到SOC恢复到上限。由于发动机始终在标定的固定工作点运行效率容易控制但电池会频繁处于“大电流放电、中电流充电”的循环中SOC曲线呈锯齿状。在Simulink里实现时我通常用Stateflow而不是纯逻辑模块因为需要保存“上一时刻发动机是否在运行”这个状态否则SOC在上下限之间时发动机会反复启停。下面的MATLAB Function写法供参考它用persistent变量记录历史状态function Pgen thermostat(SOC, SOC_lo, SOC_hi, P_optimal) % 恒温器型能量控制策略 % 输入SOC为电池荷电状态SOC_lo为启动下限SOC_hi为停机上限 % 输出Pgen为发动机-发电机组的发电功率单位kW persistent engine_on; if isempty(engine_on) engine_on 0; % 初始状态发动机关闭 end if SOC SOC_lo engine_on 1; % 电量过低启动发动机 elseif SOC SOC_hi engine_on 0; % 电量充足关闭发动机 end if engine_on Pgen P_optimal; else Pgen 0; end end这段代码里的SOC_lo和SOC_hi需要带迟滞边界例如0.35和0.8。注意发电功率的突变问题如果P_optimal设为40kW而当前驱动需求只有5kW那么多余的功率会灌进电池对电池老化不友好。所以恒温器策略比较适合发动机功率覆盖大部分平均需求、电池只做短时平衡的车型通常用于增程式控制器初版验证。2.2 功率跟随型策略发动机功率随需求功率和SOC做有约束的调整功率跟随策略的目标是让发电功率跟随整车需求功率变化电池只负责快速动态部分的补偿。它的好处是电池充放电电流更平缓SOC维持更稳定坏处是发动机经常工作在怠速或低负荷区如果不加约束燃油经济性反而比恒温器更差。实际模型中需要同时处理两个工程问题一是SOC过低时强制提高发电功率SOC高时降低发电功率二是限制发动机功率爬升速率避免真实发动机油门变化过快。下面代码展示一个带查表修正和爬坡限制的实现function Pgen powerFollowing(Pdem, SOC, Ts) % 功率跟随型能量控制策略 % Pdem为整车需求功率SOC为当前荷电状态Ts为采样周期 % 基础发电系数由SOC查表确定SOC越低系数越大 soc_break [0.3 0.4 0.5 0.6 0.7 0.8]; % SOC断点 coeff [1.0 1.0 0.8 0.5 0.2 0.0]; % 发电功率系数 base [8 6 4 2 1 0]; % 基础发电功率kW k interp1(soc_break, coeff, SOC, linear, extrap); Pb interp1(soc_break, base, SOC, linear, extrap); Pgen_target min(max(Pdem * k Pb, 0), 40); % 限制最大发电功率40kW % 功率爬坡限制每秒最大变化20kW persistent Pgen_prev; if isempty(Pgen_prev) Pgen_prev 0; end Pgen Pgen_prev max(min(Pgen_target - Pgen_prev, 20*Ts), -20*Ts); Pgen_prev Pgen; end这里用interp1做SOC修正而不是直接写if-else好处是切换点平滑不会产生功率阶跃。参数表中的coeff和base需要结合实际增程器效率图调整比如低温时可以让SOC中段的发电系数下调避免电池过充。2.3 基于规则的模糊控制策略把工程经验写成模糊规则表模糊控制在串联式混合动力里的意义是同时输入SOC和需求功率输出一个发动机发电功率修正系数。规则可以用“SOC偏低且需求功率高时全力发电”这类经验表达比数值查表更贴近标定工程师的思维习惯。Simulink里用Fuzzy Logic Toolbox的Fuzzy Logic Controller模块导入.fis文件即可模型内部不需要自己写推理代码。规则编号SOC状态需求功率状态输出发电功率状态R1低低中R2低中高R3低高高R4中低低R5中中中R6中高高R7高低零R8高中低R9高高中每条规则的隶属度用三角形或高斯函数定义即可。需要强调的是模糊策略在Simulink中跑起来很容易但真正部署到VCU之前必须把模糊控制器转换为二维查表否则在嵌入式C代码生成时会增加较多计算开销。实际项目里我通常先用模糊策略离线寻找合适的功率分配曲面再用查表模块复现。三种策略放在同一套模型里对比时重点看三个指标SOC维持能力、发动机单位油耗、电池充放电循环次数。恒温器策略SOC波动大功率跟随策略发动机低效区多模糊控制策略调参自由度高但规则迭代成本高。给客户做概念验证时我会先跑恒温器和功率跟随两条基线再决定要不要上模糊规则。3. 把混合动力汽车Simulink模型.rar恢复到工作区依赖检查与顶层结构拿到一个命名为“串联式混合动力电动汽车的能量控制策略_混合动力汽车Simulink模型.rar”的资源包第一件事不是急着双击打开模型而是先检查解压后的文件是否完整。Simulink模型通常依赖回调代码、数据字典和多个子模块文件缺一个都会导致加载失败或参数解析错误。3.1 解压并一键将.rar中的模型文件夹加入MATLAB路径假设你用的是Windows环境先把.rar解压到不含中文和空格的路径下。解压后项目内可能包含.slx、.sldd、.m、.mat等文件。为了保证模型能找到数据字典和初始化脚本需要递归添加路径。下面的命令在MATLAB命令窗口执行% 将当前目录切换为解压后的根目录 cd(D:\work\series_hev_model); % 用genpath递归加入所有子目录 addpath(genpath(pwd)); % 保存默认路径避免下次启动后丢失 savepath;genpath(pwd)会把根目录下所有层级文件夹加入搜索路径这是最省事的做法。缺点是如果目录里有大量缓存或版本管理文件夹路径会很乱所以建议解压后手动删除.git、.svn、slprj这些目录。savepath只有在MATLAB安装目录有写入权限时才生效如果报错可以在启动脚本startup.m里重新执行addpath。3.2 用诊断工具排查缺失模块和数据字典模型能打开不代表能正常跑。在命令行执行load_system(模型名)如果缺少Stateflow授权或附加工具箱会直接报错。更隐蔽的问题是数据字典里的信号命名不匹配例如模型里引用了SOC_lo但.sldd里没有定义。排查这类问题可以用两种方法。第一种是调用Simulink.slddOpen打开数据字典再检查模型是否引用外部字典% 加载模型 load_system(series_hev); % 检查模型引用的数据字典 dicts Simulink.data.dictionary.open(series_hev.sldd); % 列出字典中定义的参数名 paramNames Simulink.data.dictionary.getDefinitionNames(dicts);第二种是直接运行仿真Simulink会把第一个未定义参数或缺失模块以错误提示的方式列出来。注意这里的提示可能出现在“诊断查看器”里而不仅仅是命令行。如果模型包含专属定制模块比如Carsim接口模块或自建S-Functionfind_system可以用来查看顶层是否有未知模块% 获取顶层系统里的所有模块名称 blks find_system(series_hev, SearchDepth, 1, LookUnderMasks, on); % 找到带有S-Function的模块 sfcnBlks find_system(series_hev, BlockType, S-Function); disp(sfcnBlks);3.3 认识串联式混合动力Simulink模型的顶层子系统划分打开模型后不要急着看细节先看顶层有几个大子系统。规范的串联式混合动力模型一般由信号总线连接几个域驾驶员模型负责解析工况和目标车速整车控制器内部再分能量控制策略和扭矩分配两层。常见的顶层划分可以对应下表。子系统关键输入关键输出作用Driver车速工况、当前车速加速踏板、制动踏板信号模拟驾驶员跟车行为Vehicle Control Unit踏板、SOC、挡位发动机启停指令、发电功率指令、电机扭矩指令运行能量控制策略Range Extender发电功率指令直流母线功率、燃油消耗率发动机-发电机-整流器特性Battery电池功率需求、SOC初值端电压、SOC、电流电池动态响应Electric Motor电机扭矩指令、母线电压机械扭矩、转速驱动和制动能量回收Vehicle Dynamics车轮扭矩、车速实际车速、加速度整车纵向动力学这个划分和VCU控制策略Simulink建模的常见思路一致。排查问题时一般先从Vehicle Control Unit的输出信号往回看确认发动机启停指令和发电功率指令是否符合能量控制策略的设计预期。4. 在Simulink中仿真串联式混合动力能量控制策略工况、扫参和油耗计算模型能跑通之后真正花时间的地方在工况和参数整定。串联式混合动力能量控制策略的性能不会在所有驾驶循环里同时最优所以必须用标准工况反复仿真再根据结果回改控制参数。4.1 生成驱动工况数据并接进驾驶循环输入没有Carsim或整车动态数据时可以直接用MATLAB的timeseries对象作为驱动工况。下面代码生成一个简化的速度片段并准备好被Simulink的From Workspace模块读取% 构造一个简化的城市工况片段 t [0; 10; 20; 30; 40; 50; 60; 70]; % 时间s v [0; 22; 22; 18; 0; 0; 18; 22]; % 车速km/h speed_ts timeseries(v, t);如果模型里的Driver模块直接读speed_ts变量名必须保持完全一致。在Simulation Configuration Parameters里将Stop Time设为t(end)同时把输送到Workspace的变量只保留需要的信号。使用Standard Cycle时不要手动输入庞大的曲线用ncd或driveCyclesData这类数据包即可但要注意不同工况对能量控制策略的考验点完全不同比如NEDC更偏低速低负荷WLTC含有较多急加速段。4.2 能量控制策略关键参数表与批量扫参方法以下是一组串联式混合动力Simulink模型中最常调节的控制器参数以及它们在初始阶段的参考值参数名称初始参考值影响结果SOC_lo0.35SOC低于该值启动发动机SOC_hi0.85SOC高于该值停机或降功率P_optimal25 kW恒温器策略下发动机固定发电功率发电功率爬坡速率20 kW/s影响发动机动态响应和排放电池最大放电功率60 kW影响纯电驱动能力和故障诊断阈值电机回收扭矩上限-30 Nm影响制动能量回收比例扫参最直接的方法是写脚本调用set_param和sim每条参数组合独立仿真。下面的脚本只扫SOC_lo并保存结果供后处理model series_hev; soc_lo_list [0.3 0.35 0.4 0.45]; simOut cell(length(soc_lo_list), 1); for i 1:length(soc_lo_list) % 设置控制器模块中的SOC_lo参数 set_param([model /Controller/SOC_lo], Value, num2str(soc_lo_list(i))); simOut{i} sim(model, StopTime, 200); end注意set_param的路径必须与模型中Constant或MATLAB Function的参数块一致如果参数定义在基础工作区需要使用evalin(base, ...)赋值。批量扫参时建议把fast restart打开减少模型编译时间。4.3 用日志数据评估燃油消耗和发动机启停次数能量控制策略的好坏最终要落到数字上。仿真设置里勾选“Signal Logging”后将发动机开关信号、SOC、燃油消耗率和车速记录为logsout。后处理时计算累计油耗和启停次数% 提取仿真日志 logsOut simOut{2}.logsout; soc logsOut.get(SOC).Values.Data; eng_on logsOut.get(EngineOn).Values.Data; fuel logsOut.get(FuelRate).Values.Data; time logsOut.get(EngineOn).Values.Time; % 累计油耗单位从g/s折算为kg fuel_total trapz(time, fuel) / 3600; % 发动机启停次数从0到1的上升沿次数 engine_starts sum(diff(eng_on) 0.5); % SOC终值是否在合理区间 soc_end soc(end);这里的trapz是离散积分比直接求和更准确。如果engine_starts超过预期比如在200秒的城市工况里启停超过8次说明SOC阈值迟滞不够或发电功率过强导致SOC很快冲到上限。油耗计算中还要考虑发动机冷启动阶段的额外喷油简单模型中可以用一个启动附加油耗系数近似。把不同参数组合的fuel_total和engine_starts整理成表格就能直观看到能量控制策略的取舍。5. 串联式混合动力能量控制策略的进阶联调代码生成、CAN诊断与外部模式5.1 将能量控制策略生成嵌入式C代码时的模型准备如果控制器要脱离Simulink环境运行通常用Simulink Coder生成C代码再集成到VCU工程。生成前要把能量控制策略从整车模型里单独抽出来接口只保留传感器信号和CAN信号。代码生成配置里选择ERT目标禁用不必要的数据记录可以显著降低生成代码的复杂度。生成后需要检查函数输入输出是否与手写代码的接口变量一致尤其注意SOC上下限阈值是编译期常量还是运行时变量。5.2 CAN报文故障诊断与能量控制策略的联合调试实车状态下能量控制策略读到的SOC往往来自BMS发出的CAN报文而不是Simulink内部理想电压计算值。因此Simulink模型里通常会加入CAN Pack/CAN Unpack模块将SOC、电流、温度等信号打包成报文。调试时常见的问题是CAN报文字节序和信号缩放因子不匹配导致控制策略收到错误的SOC。一个有效的验证方法是把记录的真实CAN报文导入模型通过CAN Log回放模块驱动能量控制策略观察模型响应是否与实车一致。诊断逻辑可以和能量控制策略放在同一个Stateflow中例如当电池温度过高、SOC跳变异常时强制发动机进入保护模式。5.3 使用外部模式实时调功率跟随系数外部模式是Simulink提供的实时调参通道适合在HIL台架或快速原型控制器上验证参数。启用外部模式后通过Host到Target的数据连接可以在仿真运行中直接修改功率跟随查表里的coeff数组无需重新编译模型。实际使用时先把模型目标设为“External Mode Simulation”再下载到目标机然后在模型窗口打开信号标尺观察SOC曲线变化。调参时建议一次只改一个系数比如先修改SOC中间段的发电系数观察SOC曲线是否平滑跨越0.5附近而不是同时动多个参数导致无法定位问题原因。若模型里含有Stateflow状态机外部模式下也能修改变量的初值但频繁在线改写持久变量会引入不确定状态调完参数后最好做一次完整停机重启确认状态初始化正确。本文还有配套的精品资源点击获取
返回列表