ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

P2混动能量管理Cruise-Simulink联合仿真模型搭建与调试

P2混动能量管理Cruise-Simulink联合仿真模型搭建与调试 先说一个我自己的感受刚接触P2架构混动能量管理时如果只用Simulink搭策略、做理想模型验证多见于论文和教学样例一旦要评估整车级的油耗、电耗、动力性甚至考虑离合器、变速箱挡位、电池SOC这些会互相耦合的物理量纯Simulink根本扛不住。AVL Cruise擅长纵向动力学和整车部件建模Simulink擅长控制策略两者联合仿真才是工程上真正能落地的组合。这篇文章就围绕“P2架构整车能量管理Cruise-Simulink联合仿真模型”展开重点讲清楚P2构型对应的模式边界、Cruise侧整车建模的要点、Simulink侧策略如何设计、联合仿真接口怎么配以及我实际调试中踩过的一堆坑。适合正在做混动策略开发的工程师、在读车辆专业研究生以及准备把控制策略从“理论跑通”推向下一个阶段的同学参考。1. P2构型的能量管理难点为什么这个仿真模型值得搭1.1 P2架构的物理布置与工作模式边界P2架构在混动领域太常见了但很多人对它的理解其实停在“发动机加电机”这种粗暴层面。真正拉开差距的是机械连接细节。典型的P2布置沿传动链看是发动机—扭转减振器—离合器K0—电机—变速箱输入轴—变速箱—主减速器—差速器—半轴。电机布置在发动机离合器K0和变速箱之间这个位置决定了它和发动机之间不是一个“随时可以自由发电”的关系而是存在明确的机械耦合边界。这里必须澄清一个常见误区。很多文章把混动的“串联模式”当成标准P2模式来写我在刚开始建模型时也默认P2应该能行车发电结果状态机里放了一堆串联逻辑仿真里根本跑不通。标准P2构型里K0断开时发动机和动力链完全解耦发动机没法在车辆行进中带动电机发电K0闭合时发动机和电机转速又被绑定在一起只能并联。也就是说严格意义上的P2是“无串联行车模式”的。那些能实现行车串联的要么在电机输出端加了额外离合器、单向离合器形成了P2.5甚至更复杂的变体要么干脆换成功率分流架构。因此做P2能量管理第一个任务就是认清你能控制的自由度到底有哪几个。P2构型实际能使用的运行模式大致如下EV纯电模式K0断开发动机停转电机经变速箱驱动车轮制动时电机做能量回收。发动机直驱模式K0闭合发动机单独提供驱动扭矩电机可以零扭矩空转也可以加一点负扭矩把发动机工作点往高效区移动。并联混合驱动K0闭合发动机和电机扭矩叠加输出用于大需求扭矩或超车等工况。驻车发电车辆静止、变速箱处于空挡K0闭合发动机带动电机发电给电池充电。制动能量回收一般K0断开切断发动机拖曳损失电机做再生制动。从这个模式集合可以看出P2能量管理真正难的点不是连续域的扭矩分配那么简单而是离散决策和连续决策混在一起K0闭不闭、挡位挂几挡、发动机启不启停、发动机和电机各出多少扭矩。四个决策维度相互耦合挡位变了电机和发动机的转速就都变了发动机能不能待在高效区又变了。这类问题在数学上是一个混合整数优化问题仿真平台里不把离散状态和连续量耦合起来策略就谈不上可信。1.2 能量管理要处理的核心约束与目标搞清模式边界之后再来理一理策略要满足的约束。混动能量管理不是“怎么省油怎么来”而是在一堆物理边界内求一个折中。第一层是部件极限约束。电池给电机的功率不能超过电池管理系统允许的放电功率SOP也不能低于充电功率下限电机有峰值扭矩/功率限制长时间运行还要退回持续扭矩发动机有最低稳定转速、最高转速、外特性扭矩包络离合器在滑磨阶段传递的扭矩有摩擦极限变速箱换挡有最短时间约束。任何一条被突破仿真结果对工程的意义就不大实车更不可能接受。第二层是驾驶性相关约束。最典型的是模式切换过程不能出现大的扭矩波动否则整车会顿挫。K0结合瞬间发动机转速和电机转速如果没有同步或者滑磨控制不合理传动系会振荡。实车上有离合器滑磨控制和扭矩协调仿真里如果没有任何过渡逻辑策略就会表现得很“天真”。第三层是电量平衡约束。插电混动按CD-CS思路跑CD阶段尽量把电耗到低电量阈值CS阶段要把SOC维持在一个小窗口内避免电池过放。如果是非插电混动则全程要在SOC平衡附近工作。做横向策略对比时如果起始SOC和结束SOC不一致油耗和电耗是不能直接拿来比较的。算清楚这些约束再去设计Simulink策略才知道每个模块存在的意义。很多人一开始就盯着“最优算法”忽略了约束前置处理模型跑到一半发散或出现离谱的SOC轨迹原因往往不是算法不够先进而是物理边界没有建模进去。2. Cruise侧整车模型搭建不是把所有模块拖出来就行2.1 模型拓扑与关键参数清单在Cruise里搭P2模型基本模块包括Vehicle、Engine、E-Machine、Battery H、Clutch、Gearbox、Final Drive、Differential、Wheel、Brake、Cockpit、Monitor再配上用于联合仿真的Matlab DLL接口模块。机械连接顺序就是上一节说的传动链发动机接到离合器输入端离合器输出接电机输入端电机输出接变速箱输入端之后是主减速器、差速器、车轮。很多初学者在建模型时只关心模块连起来能转结果仿真某些模式总报错。我建议在搭模型之前先把参数表列出来每一项数据都要明确来源是台架试验、整车参数表还是默认值估算。部件关键参数实测/标定数据来源整车整备质量、迎风面积、风阻系数、滚动阻力系数、车轮滚动半径、质心高度整车参数表发动机外特性扭矩曲线、万有特性油耗MAP、转动惯量、怠速转速、最高转速、起动延迟台架标定电机电动峰值/持续外特性、发电峰值/持续外特性、效率MAP、转动惯量台架标定电池容量、标称电压、OCV-SOC曲线、充放电内阻-SOC曲线、充放电SOP、初始SOC电芯测试报告离合器K0最大传递扭矩、滑磨特性离合系统参数变速箱各挡速比、传动效率、换挡时间变速箱标定数据有个细节很容易被忽略发动机和电机的转动惯量。在纯电模式下K0断开发动机不参与但电机自身的转动惯量和变速箱输入端的惯量决定了能量回收和模式切换瞬态的表现。如果转动惯量填的是默认值或拍脑袋值模式切换过程的转速变化轨迹会有明显误差。实际项目中这部分数据通常由台架供应商提供没有条件测的时候用同类部件参数先顶着也要在模型说明里标注清楚。2.2 信号接口设计把控制端口留到后面对接SimulinkCruise内部部件之间的物理连接好处理难点在信号通道设计。能量管理策略需要实时读取车辆状态并下发发动机、电机、离合器指令这些信号必须通过Cruise的Signal信号连接和Data Bus建立起来。我建模型时常用的思路是在Cruise里建立一个Matlab DLL模块把策略涉及的所有输入输出信号集中到这一个模块上而不是在发动机模块上挂一个接口、在电机模块上再挂一个接口。集中式接口的好处很明显联合仿真时信号检查一目了然后期换策略时不需要改动Cruise模型拓扑只要改DLL内部的Simulink模型就行。信号接入点可以这样组织来自驾驶员的信号加速踏板位置、制动踏板位置、当前需求扭矩。驾驶员模型在Cruise的Cockpit里产生踏板信号这些信号要接到DLL模块作为策略输入。来自车辆传动链的信号当前车速、发动机转速、电机转速、实际挡位。车速和转速是模式切换和扭矩分配的基础依据。来自动力源信号发动机当前扭矩、电机当前扭矩、电池SOC、电池允许充放电功率。SOC和动力源扭矩是反馈闭环允许功率则用来让策略自动别碰电池过流。策略输出信号发动机启停指令、发动机扭矩请求、电机扭矩请求、离合器闭合/断开指令、挡位请求。这样做还有一个额外好处接口信号表从一开始就固定下来拿去和实车CAN信号对一下哪个信号在实车上没有、哪个信号名字不一致早期就能发现。等做到HIL和实车标定阶段这套信号定义可以直接迁移。2.3 工况和载荷设置不同测试循环的影响Cruise里设置循环工况很简单无非是载入时间-车速曲线但选什么工况会直接影响能量管理策略的收敛方向。国内开发混动车CLTC工况基本绕不开。这个循环低速段占比大、启停多非常考验纯电模式决策和发动机启停策略。如果只用NEDC那种匀速段较多的工况策略会倾向于“反正车速平稳随便跑跑就省油”一旦切到CLTC或WLTC低速点太多纯电与直驱的切换频率立刻飙升离合器寿命问题、驾驶性问题全出来了。所以我的建议是至少跑三个工况一个用于对标和验收的标准循环比如CLTC或WLTC一个用户实际使用场景采集的工况再加一个高动力需求工况用来验证极限扭矩分配。Cruise的Load Data里记得把道路阻力曲线设好。一般用滑行曲线反推的a、b、c阻力系数不要用默认固定阻力。阻力不准整车的功率需求就不对能量管理策略再好也没意义。尤其是对油耗结果影响极大的高速工况风阻误差会直接吃掉你策略优化出来的那点节省。3. Simulink侧能量管理策略模式状态机与扭矩分配的落地细节3.1 策略总体框架从驾驶员需求到模式决策Simulink侧的策略框架我习惯分四层需求解析层、模式决策层、扭矩分配层、执行保护层。需求解析层负责把加速踏板、制动踏板和车速换算成驾驶员驱动需求扭矩或制动需求扭矩。Cruise里会有驾驶员需求扭矩信号但有些版本直接输出的未必是归一化后的物理量这里需要做个标定和限幅确保进入策略的有效范围是“负的最大回收扭矩”到“正的最大驱动扭矩”。模式决策层是策略核心。我的做法是把模式选择写成有限状态机状态之间设置严格的转移条件。P2的状态机至少要有六个状态EV、并联驱动、发动机直驱、驻车发电、制动能量回收、滑磨过渡。滑磨过渡状态经常被忽略但恰恰是离合器控制中最关键的中间状态。K0从断开切到闭合时如果状态机直接从一个稳态切到另一个稳态Simulink里看起来指令变了实际在Cruise里离合器模块会强行锁止转速差过大就会出现扭矩冲击反映到仿真曲线上就是传动系振荡。加一个滑磨过渡状态让离合器目标从0逐步到1车辆模型才有机会平滑过渡。状态转移条件里SOC、车速、需求扭矩是最基本的三个维度。比如SOC较高时优先EV需求扭矩超过发动机经济区下限且车速高于某阈值时进入直驱或并联SOC低于下限时强制启动发动机进入CS模式并补充电量。3.2 模式切换的滞环和时序设计模式切换逻辑里最容易犯的错误是阈值不做滞环。举个例子SOC低到25%进入CS模式如果不设滞环SOC在25%附近轻微抖动时策略会在EV和CS之间反复横跳离合器和发动机启停指令就在那来回切仿真步长变小结果还容易发散。就算仿真不崩溃这种模式下出来的油耗和电耗也没有参考价值因为每个模式都没稳定运行过。工程做法是给每个关键阈值配一对进入/退出边界。比如进入CS模式SOC 24%退出CS模式SOC 31%进入并联驱动需求扭矩 120 Nm 且 车速 40 km/h退出并联驱动需求扭矩 95 Nm 或 车速 32 km/h滞环宽度过小会让环内抖动穿透过大又会迟滞响应。实测下来模式切换频率敏感度很高建议在离线数据里统计一下不同滞环宽度下的切换次数曲线再定宽度。除了阈值滞环发动机启停还需要“最短运行时间”和“最短停机时间”。混动车在低速走走停停工况下发动机启停如果仅依赖SOC和扭矩可能每几十秒就启停一次。发动机起动过程本身要消耗燃油和电频繁启停对油耗和排放都不利。我习惯加一组计时器发动机启动后至少要运行20秒停机后至少也要稳定30秒才能再次启动。这种时间约束在Stateflow里实现非常方便。3.3 发动机与电机的扭矩分配查表、修正和滤波模式决定之后扭矩分配就是把驾驶员需求扭矩在发动机和电机之间切分。规则策略里最简单的分配方法是查表法以车速和需求扭矩为输入查发动机目标扭矩表。这张表的设计逻辑是让发动机尽量工作在万有特性图的低油耗区。以并联模式为例如果需求扭矩不大发动机又已经在运行发动机可以直接输出该车速下经济区对应的扭矩电机补齐需求和发动机输出之间的差值。如果需求扭矩非常大超过发动机经济扭矩加上电机峰值扭矩那就没法兼顾效率扭矩按满负荷能力分配。这种规则写起来很快但要调出好效果需要反复标定那几张表。SOC修正一定要挂在扭矩分配层之后。策略算出的电机扭矩是效率导向的如果SOC偏低即使并联模式效率最高也不能让电机继续大功率输出。实际模型里我给电机扭矩请求加一个SOC修正系数SOC大于目标时适当放大放电扭矩SOC小于目标时减小放电扭矩甚至让电机转为发电状态给电池充电。修正系数可以用线性查表或PI调节器实现。这里值得专门提一下一阶滤波在扭矩指令上的作用这也是很多人在用Matlab/Simulink建混动模型时忽略的细节。发动机也好、电机也好真实响应不可能像阶跃信号那样瞬时完成。仿真模型如果不加任何滤波、直接给发动机一个阶跃扭矩指令Cruise侧的发动机模型会“搬”出一个响应很快的扭矩输出看起来控制很跟手实际上和台架行为完全不符。更危险的是模式切换时阶跃指令会让传动系扭矩突变触发Cruise的数值发散。因此发动机扭矩请求、电机扭矩请求后面必须加一阶惯性环节或速率限制器。一阶滤波模块的带宽按部件响应能力来设发动机通常慢一些电机可以快一些但都不能为0。这个细节做没做直接决定仿真结果是“看起来合理”还是“物理上可信”。3.4 SOC管理与参数标定入口SOC管理策略本身也是分层的。基础层是对SOC起止范围的控制也就是前面说的CD-CS切换。进阶层是在CS阶段通过微小调整电机扭矩把SOC拉回目标值。相比单纯依靠状态机切换一个带SOC反馈的PI环节能让CS阶段的SOC轨迹更平稳。设计上我建议所有标定参数用参数脚本统一管理不要散落在Stateflow和Simulink模块里。实际工程里我用一个init_params.m脚本定义全部阈值、滤波系数和扭矩限值Simulink模型里直接引用这些变量名。脚本放到MATLAB base workspace里这样Cruise的DLL接口启动时也能读到。% init_params.m 示例P2能量管理策略标定参数 SOC_cs_enter 0.24; % 进入CS模式SOC阈值 SOC_cs_exit 0.31; % 退出CS模式SOC阈值 t_eng_min_on 20.0; % 发动机最短运行时间 [s] t_eng_min_off 30.0; % 发动机最短停机时间 [s] tq_eng_filt_tau 0.25; % 发动机扭矩滤波时间常数 [s] tq_mot_filt_tau 0.05; % 电机扭矩滤波时间常数 [s] k_soc_p 800; % SOC反馈PI比例系数 k_soc_i 50; % SOC反馈PI积分系数 tq_drv_vehicle_max 1800; % 整车最大驱动扭矩[Nm] tq_reg_vehicle_max -1200; % 整车最大回收扭矩[Nm]实际做批量标定时我经常用一层for循环改脚本里的参数值然后重新生成DLL并调用Cruise任务跑工况。相比在Simulink模型界面里逐个点模块改参数这种脚本化管理能节省一个数量级的时间。4. 联合仿真接口配置信号映射和步长是重灾区4.1 两种联合仿真方式的选型Cruise和Simulink联合仿真常见有两条路一条是Cruise作为主程序Simulink模型编译成DLL后通过Matlab DLL模块接入另一条是MATLAB作为主程序Simulink作为上层调用Cruise的API接口。Cruise主DLL这条路我的经验是工程上最稳。Cruise负责整车物理模型积分Simulink策略被封装成DLL按固定步长被调用。优点是运行效率高批量跑工况方便Cruise的Task功能可以直接调度多个工况组合缺点是需要提前把Simulink模型编译成DLL更新策略参数时必须重新编译调试迭代速度略慢。MATLAB主Cruise API这条路适合策略还在频繁调试、需要频繁改Simulink模型的早期阶段。每次仿真MATLAB直接调用Cruise的仿真内核不用编译DLL策略参数可以用工作空间变量随时改。缺点是每跑一次都要启动Cruise内核批量扫参效率低。我个人的做法是策略原型期用MATLAB主调API跑通了、参数差不多定了再切成Cruise主DLL模式做批量仿真。两条路的信号定义完全共用不重复劳动。4.2 DLL接口方案的操作步骤如果你也选择Cruise主DLL方案标准流程大概是这样的。第一步在Simulink里把策略模型编译成DLL。编译前需要确认几个设置求解器选固定步长步长和后面Cruise调用周期一致代码生成目标选DLL编译器选择与Cruise兼容的版本。编译器不一致是DLL加载失败的头号原因。第二步在Cruise的组件库中拖出Matlab DLL模块填上DLL文件的路径和导出函数名。不同版本字段名称略有区别本质都是指定DLL文件、模型名称和接口函数名称。第三步定义该模块的输入输出信号名。这一步要极其小心DLL模块中定义的信号名称必须和Simulink模型中对应的端口名称完全一致大小写、下划线、空格都不能差。Cruise的Data Bus里信号多了以后最好建统一命名的规范比如所有输入信号都以in_开头所有输出信号都以out_开头避免靠肉眼搜索。第四步把这些信号和Cruise内部部件对应的信号连接起来。比如DLL模块的输入信号in_VehSpd要从Vehicle模块输出的车速信号接入in_BattSoc要从电池模块的SOC信号接入。第五步在Cruise的Simulation Setting里把仿真类型设为Matlab DLL联合仿真设置步长和监控参数。步长设置后面单独说。4.3 典型信号映射表与单位核对我把一套典型的P2联合仿真信号映射表列在下面可以帮助你在配置时对照检查。信号方向信号名称单位说明输入in_VehSpdkm/h整车车速输入in_EngSpdr/min发动机转速输入in_MotSpdr/min电机转速输入in_Gear-实际挡位输入in_BattSoc%电池SOC输入in_AccPedal%加速踏板位置输入in_BrkPedal%制动踏板位置输入in_EngTqNm发动机当前扭矩输入in_MotTqNm电机当前扭矩输入in_BattMaxDisPwrkW电池允许最大放电功率输入in_BattMaxChgPwrkW电池允许最大充电功率输出out_EngOnCmd-发动机启停指令输出out_EngTqReqNm发动机扭矩请求输出out_MotTqReqNm电机扭矩请求输出out_K0Cmd-离合器闭合/断开指令输出out_GearReq-挡位请求单位不一致是最隐蔽的问题。Cruise内部车速信号有的地方用km/h有的物理量又按m/s参与计算如果DLL模块里接入的信号单位配错了策略看到的车速就会差3.6倍。扭矩信号基本是Nm但功率信号有的版本按W有的按kW差1000倍。配置完信号映射后一定要先在Simulink里放几个scope/display联合跑一个固定工况看看策略接收到的信号量级是不是在合理区间。这个检查只要10分钟能避免很多后面莫名其妙的问题。4.4 步长设置与仿真调优步长选择直接影响联合仿真的数值稳定性和运行速度。我的经验是Simulink策略模型编译成DLL后被Cruise调用的周期通常在10ms到50ms之间。10ms比较细模式切换和扭矩协调能看得比较清楚但仿真时间会拉长50ms效率高但离合器滑磨阶段的瞬态细节可能被磨掉模式切换前后容易出现细微的振荡。建议先用20ms跑通整体流程再根据关注点调整。比如重点研究换挡和离合器结合过程时步长改到10ms只做长工况油耗评估时可以放大到50ms。Cruise侧本身的步长不一定要和Simulink策略步长一致策略调用周期可以比整车动力学积分周期大一个量级。联合仿真效率优化方面我有三个实测过得益很大的技巧一是关掉不必要的信号记录和scope显示。Simulink里挂几十个scope看起来方便DLL编译时这些显示模块都会消耗计算资源。调通之后把scope全部摘掉只保留必须输出的信号。二是数据记录选点克制。Cruise的Monitor模块如果默认勾选记录所有信号内存占用和磁盘IO会很夸张仿真越来越慢。只勾选后处理需要的车速、SOC、发动机和电机扭矩、油耗这些关键量。三是把长工况分段处理。一个CLTC循环1800秒联合仿真可能跑十几分钟甚至更久。早期策略调参阶段没必要每次都跑完整循环可以先截取一个包含典型模式切换的短段比如600秒快速验证状态机逻辑完全跑通了再全循环仿真。5. 实测踩坑记录从DLL加载失败到数据字典路径丢失5.1 数据字典sldd路径失效报错“找不到数据字典”这个坑我遇到好几次网上也经常看到类似错误MATLAB提示找不到can.sldd或hwa.sldd。这类报错看着像模型文件损坏实际往往是数据字典关联路径失效。Simulink模型本身写完时关联了两个数据字典其中定义了总线对象、信号名、标定量等。工程从一台电脑拷到另一台或者把Cruise工程整体搬了目录数据字典的引用路径还是旧的MATLAB自然找不到。排查步骤比较固定。先打开Simulink的Model Explorer在左侧模型层次结构里选中模型根节点检查右侧关联数据字典列表确认路径指向哪里。如果sldd文件确实还存在只是路径变了用“关联数据字典”重新选择即可如果文件已经丢了就要找到模型的备份或者从版本库里恢复。根治建议是前期就做好数据字典的路径规划。所有sldd文件和Simulink模型放在同一个工程目录下并用相对路径引用避免绝对路径迁移问题。联合仿真工程本来就会同时涉及Cruise工程目录和MATLAB工作目录目录结构一复杂路径问题就会被放大。我现在的做法是在工程根目录下建一个/data文件夹专门放sldd所有模型一律以../data/xx.sldd或相对工程根的路径引用。5.2 DLL编译成功但Cruise加载失败还有一种很常见的现象Simulink里模型能正常编译成DLL但Cruise的Matlab DLL模块加载时提示找不到库文件或函数名错误。这种问题十有八九是编译环境不一致。第一类原因是MATLAB编译器版本和Cruise不兼容。不同版本的Cruise对MATLAB版本有明确的支持范围比如老版本Cruise在MATLAB新版出来后往往需要用旧的编译器或降级到特定版本才能正常生成DLL。实在不行就固定一台机器用大家验证过的版本组合跑联合仿真不要频繁升级MATLAB。第二类原因是DLL位数不匹配。Cruise进程是64位DLL也必须是64位。MATLAB默认生成的DLL可能跟随系统架构但如果MATLAB安装时选了32位生成的就是32位DLL加载必然失败。第三类原因是DLL导出函数名对不上。Cruise的Matlab DLL模块需要调用模型里指定的函数入口如果导出函数名在Simulink模型里被改了或者加了额外前缀Cruise就找不到入口。解决方法是回到模型代码生成设置里查看生成的导出函数符号填到Cruise模块里。5.3 仿真起步异常与模式切换抖动联合仿真最常见的“第一秒异常”仿真刚开始车速还是0SOC是初始值但扭矩指令突然冲到很离谱的数值或者发动机启动指令和离合器结合指令在第一帧就同时触发。这个问题的本质是初始化顺序不一致。Cruise先初始化车辆物理模型Matlab DLL后加载第一个调用周期策略模块收到的是还是不完整的信号集或者滤波寄存器初值为0使得策略算出了一个错误的初始指令。解决思路有两个方向。一个方向是在策略内部加启动抑制逻辑仿真时间小于某个阈值比如0.5秒时所有扭矩请求输出0离合器指令保持断开发动机保持停机。另一个方向是在Cruise侧预先设置好车辆的初始状态初始挡位、初始车速、初始SOC保证传递给DLL模块的第一个信号集就是合理的工作点。模式切换抖动的问题前面提过根源多是扭矩阶跃和离合器滑磨。这里再补充一个排查经验一旦发现仿真在某个模式切换点附近转速振荡不要急着改Simulink逻辑先在Cruise里打开离合器模块的监控曲线看K0的滑磨转速差和传递扭矩曲线。很多情况下是离合器滑磨模型参数设置得不合理摩擦系数、压紧力增长斜率和传递扭矩上限没配对。把这部分调平滑了策略侧的压力会小很多。5.4 油耗和SOC统计口径问题结果对不上先查折算联合仿真跑完经常会遇到一个让人头疼的问题调节了几版策略油耗看起来改善了不少但仔细一看每个Case结束时的SOC都不一样。一个Case结束时SOC还剩35%另一个Case结束时SOC已经掉到22%那油耗差异里包含了大量“吃电量”的贡献根本不是策略真实水平。做混动仿真对比等效油耗折算基本是必修课。简单做法是把电耗按一定的等效因子折算成燃油消耗公式可以写成m_equ m_fuel λ * E_elec / Q_lhv其中λ是等效因子Q_lhv是燃油低热值。等效因子的取值要按车型和测试工况标定不同工况最优等效因子差别很大。当然最稳妥的办法还是让每个Case结束时的SOC回到初始值附近把电量平衡约束变成对比基准的一部分。我的建议是先在策略里加一个“SOC平衡惩罚”也就是把SOC偏差反馈到扭矩分配环节让策略有自我修正能力确保仿真结束时SOC和初始值偏差在1%以内。然后再看油耗和电耗。这个环节如果没做所有的横向对比都是沙子上的塔。5.5 其他几个影响效率的小细节数据记录频率、监控界面实时刷新、Cruise动画显示这些功能在模型调通后统统关掉。还有一点如果MATLAB里同时打开了多个Simulink模型或脚本占用的内存会影响联合仿真速度。跑联合仿真前把不需要的模型全部关闭清空命令窗口和scopes实测能明显缩短单次仿真时间。6. 把联合仿真模型用起来批量标定和策略进阶思路6.1 用Cruise Task批量跑策略标定矩阵模型建好以后真正的价值在批量使用。Cruise的Task功能允许一次配置多个计算任务每个任务可以用不同工况、不同参数集。配合前面说的脚本化参数管理可以在MATLAB里写一个循环修改参数脚本里的值重新编译DLL调用Cruise任务读取结果对比油耗和电耗。典型的标定矩阵可以是这样的SOC进入/退出CS阈值组合例如[0.22/0.30, 0.24/0.31, 0.26/0.33]发动机经济扭矩表偏移量例如基础表乘以0.9、1.0、1.1回收扭矩强度系数例如0.5、0.7、0.9每组参数跑完CLTC和WLTC两个工况记录油耗、电耗、SOC起止、模式切换次数。模式切换次数这个指标非常有用策略看起来油耗低但如果模式切换次数太多离合器磨损和驾驶性问题就埋下了不一定能在整车项目中采纳。6.2 从规则策略升级到ECMS与DP规则策略能把联合仿真的整个链路跑通但继续优化空间有限。这时候可以考虑升级到更系统的优化策略。ECMS的核心是把电池消耗的电能折算成等效燃油消耗每个控制周期最小化“燃油消耗等效电耗”。公式上就是一个瞬时优化问题需要标定的核心参数是等效因子。等效因子对工况敏感联合仿真里可以批量扫参同一个工况不同等效因子对应不同的SOC轨迹和油耗选一个能让SOC平衡且油耗最低的值。ECMS相比纯规则的好处是扭矩分配不再是查表查出来的固定关系而是随SOC和工况自动调整鲁棒性更好。动态规划DP则适合离线分析。DP需要整个工况信息已知能求出理论上的最优SOC轨迹和扭矩分配但它不适合实时控制。我在实际项目里经常把DP解算出来的最优SOC轨迹和最优模式切换序列当成“金标准”用来反推规则策略的阈值设置对不对、有没有把主要的高效区间漏掉。6.3 向HIL和实车标定的延伸联合仿真模型经过充分验证后下一步往往就是HIL测试。把Simulink策略模型自动生成代码部署到实时机Cruise的整车模型可以继续在离线侧运行作为虚拟车辆。信号映射表在这里的价值就体现出来了——如果前期定义接口时已经按实车CAN信号的命名习惯来起名HIL阶段的信号映射几乎不需要大改。从工程流程角度看P2混动能量管理模型的真正产出不只是几个油耗数字而是在开发和标定前期把策略逻辑中的隐患暴露出来。比如离合器状态机有没有遗漏的互斥条件、发动机启停请求有没有和挡位请求打架、SOC反馈有没有振荡趋势。这些逻辑层面、时序层面的问题越早暴露修改成本越低。最后分享一个我个人的操作习惯每次联合仿真的配置、标定参数和结果摘要都记录下来包括当天用的版本组合、编译器信息、步长设置。混动控制项目周期长中间可能插进各种临时任务隔三个月再回到这个模型时如果没有记录你可能连当初那个能稳定运行的DLL是怎么编出来的都想不起来。这些记录看起来琐碎但真的能让你在后续迭代里少走很多冤枉路。
返回列表