ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Cruise与Simulink联合仿真实战:混联混动整车建模与调试指南

Cruise与Simulink联合仿真实战:混联混动整车建模与调试指南 做混动整车仿真这几年我最大的一个感受是真正难的不是某一款软件用得多熟而是怎么让两套工具“对话”起来。AVL Cruise擅长把整车、发动机、电机、电池、传动系统这些机械电气部件放在一个模型里跑工况Simulink则几乎是做控制策略的事实标准。当你要做一台混联混动车型的动力性和经济性联合仿真Cruise加Simulink这套组合几乎绕不开。我最早接触联合仿真时也被一堆概念绕晕过DLL接口、S-Function、编译器匹配、外部模式、信号映射……折腾了一两周才把第一个闭环跑通。这篇就把我实际走过的路子完整写下来包括构型分析、模型搭建、接口配置、参数调试和那些文档里查不到的坑希望能帮你少走点弯路。不管你是做策略的刚上手联合仿真还是做整车性能的想摸清Simulink侧门道这篇应该都对得上胃口。1. 为什么混联混动必须走“CruiseSimulink”联合仿真这条路1.1 混联构型比串联、并联都“难缠”在哪串联混动的发动机和车轮没有机械连接发动机只发电电机只管驱动控制策略相对简单。并联混动则是在传统车上加电机发动机和电机通过机械耦合点叠加扭矩策略难点集中在扭矩分配。而混联混动厉害就厉害在它既能串联也能并联发动机既可以直接驱动车轮也可以脱离车轮去发电两条能量路径可以按工况灵活切换。这个“两条腿走路”的特点直接导致两个问题。第一整车模型必须同时描述机械连接和电气连接发动机这边可能连着一个发电机驱动电机那边又连着主减速器中间还穿插着离合器或行星排拓扑关系比串并联复杂得多。第二控制策略的复杂度上了一个台阶你不仅要决定发动机启不启机、电机出多少扭矩还得决定当前工况走串联路径还是并联路径切换条件处理不好就会出现模式频繁抖动整车顿挫感明显仿真里SOC曲线也跟着乱跳。1.2 Cruise和Simulink到底各自负责什么我个人的理解是Cruise管“身体”Simulink管“大脑”。Cruise里能建立完整的整车纵向动力学模型包括发动机万有特性、电机效率MAP、电池开路电压和内阻、传动比、滚阻风阻、制动系统还能直接加载NEDC、WLTC、CLTC这些标准工况。它算动力性指标非常方便原地起步加速时间、最高车速、最大爬坡度都是现成的计算任务。经济性方面只要给定工况和策略它就能积分出油耗电耗。但它的短板也很明显——内置的Function模块写复杂逻辑很痛苦耦合关系一多状态机、滞回、滤波、查表全堆进去基本没法维护。Simulink恰好补上这块短板。模式仲裁、扭矩分配、SOC管理、发动机起停控制这些都是Simulink的强项。联合仿真最主流的做法就是Cruise保留完整整车模型Simulink专门做能量管理策略通过编译成DLL的方式让Cruise在每个仿真步长调用。Cruise算完当前节点的车辆状态把车速、SOC、踏板开度、挡位这些信号送给策略策略算出发动机开关指令、两个电机的扭矩指令、离合器状态再传回Cruise两个工具就这么一步步推着整车跑完整个工况。提示这里说的联合仿真方式是Cruise作为主控、Simulink策略编译成DLL被调用的方案。这也是目前工程中最常用、最稳定的集成方式后续全文都按这个方案展开。这种分工最大的好处是整车模型的修改不依赖策略策略的迭代也不用重搭整车模型两边能并行开发。项目后期策略换版只要重新生成DLL替换掉就行Cruise模型完全不用动。2. 动手建模前先想清楚构型和接口2.1 混联构型怎么选直接决定模型复杂度混联构型在实车上主要有两大类。一类是以行星排为核心的功率分流型发动机输出一部分功率走机械路径另一部分走发电机-电动机电气路径丰田THS就是典型代表。另一类是串并联切换型通过离合器和齿轮连接关系让系统在串联模式、并联模式、纯电模式之间硬切换本田iMMD就是这种思路。如果要在Cruise里建模我个人更推荐先从串并联切换型入手。原因很简单功率分流型虽然有行星排这个机械节点但机械点和电气点之间是连续功率耦合扭矩和转速关系耦合度极高。这类模型更适合整体放在Simulink里搭建然后用Simulink作为主端调用Cruise提供部件级数据而不是反过来。串并联切换型用几个离合器就能描述模式变化在Cruise里通过控制离合器状态和电机扭矩指令就能复现建模直观排查问题也容易。具体到Cruise里的物理拓扑我习惯这样搭发动机通过一个离合器连到发电机轴同时经过另一个离合器连到主驱动路径主驱电机单独通过固定速比连到主减速器电池在电气侧同时连着发电机的逆变器和主驱电机的逆变器。车辆需要纯电时发动机和两个离合器都断开需要串联时发动机带动发电机发电电能供给主驱电机需要并联时发动机离合器结合发动机和主驱电机一起出力。这个拓扑的建模思路是把机械路径和电气路径分开看待。机械路径里发动机、离合器、主驱电机、主减速器、车轮都在同一根传动链上信号层面用Cruise的机械连接串联起来电气路径则是发电机、电池、主驱电机之间通过高压总线建立连接关系在Cruise里通过Bus和电连接定义。2.2 控制策略的输入输出接口越早定越省事联合仿真最痛苦的一件事就是信号对不上。所以建模前第一件事就是把策略的输入输出接口清单定下来双方按同一份清单开发。我通常会把接口分成三组。状态输入组包括车速、加速踏板开度、制动踏板开度、发动机实际转速和扭矩、发电机实际转速和扭矩、主驱电机实际转速和扭矩、电池SOC、当前挡位。需求输出组包括发动机启停指令、发动机目标扭矩、发电机目标扭矩、主驱电机目标扭矩、离合器1和离合器2状态、能量回收扭矩。模式与标志位组包括当前运行模式、故障标志、允许回收标志、发动机运行时间等这些用于后处理分析和策略调试。信号方向信号名称单位说明输入Vehicle Speedkm/h仿真工况车速输入Accelerator Pedal%加速踏板开度输入Brake Pedal%制动踏板开度输入Engine Speedrpm发动机实际转速输入Generator Speedrpm发电机实际转速输入Motor Speedrpm主驱电机实际转速输入Battery SOC%动力电池荷电状态输出Engine On/Off-发动机启停指令输出Engine Torque RequestNm发动机目标扭矩输出Generator Torque RequestNm发电机目标扭矩输出Motor Torque RequestNm主驱电机目标扭矩输出Clutch 1 State-发动机与发电机间离合器输出Clutch 2 State-发动机与主驱路径间离合器输出Regen TorqueNm能量回收附加扭矩这个表要在模型搭建前发给所有相关的人确认。信号名称、单位、取值范围、更新频率统统写清楚。我在实际项目里踩过最深的坑就是Cruise里信号名用的是Motor_TorqueSimulink里写的是Motor_Tq两个字符合不上DLL能加载但仿真结果全乱了排查了半天才发现是信号名不匹配。2.3 策略模型里的几个关键模块提前准备好Simulink侧策略模型不用一上来就写复杂逻辑但有几个基础模块是肯定要预置的。一阶滤波模块几乎是所有混动策略的标配。扭矩请求从目标值到执行值之间如果直接阶跃发动机和电机响应会有冲击仿真结果也跟着抖动。用一阶滤波平滑扭矩请求变化率相当于给执行器一个爬坡时间Simulink里就是First-Order Transfer Function时间常数按实际部件的响应能力设。比如发动机扭矩响应慢滤波常数可以设到0.1到0.3秒电机扭矩响应快设0.02到0.05秒。这个参数直接影响结果平顺性后面调参环节还会专门讲。SOC管理也是策略核心。为了防止电池过放或过充得给SOC设定工作区间一般是30%到80%。SOC高于上限时优先用电低于下限时强制发动机充电。但这个上下限不能设成一条直线否则发动机在边界附近来回启停所以要做滞回。Simulink里可以用带有滞回特性的判断模块也可以用Stateflow状态机或者干脆用查表加记忆模块。模式仲裁表是第三个必须预置的模块。把纯电、串联、并联、行车充电、能量回收这几个模式画成一张真值表横轴是驾驶需求纵轴是SOC状态交叉点填模式编号。后续所有策略逻辑其实都是在填这张表的细节。True Table模块在这个场景下非常好用比散落在一堆逻辑里的判断条件清晰得多后期查问题也快。3. 一步步跑通Cruise与Simulink联合仿真3.1 环境准备版本、编译器、接口方式一个都不能少Cruise与Simulink联合仿真最常见的翻车现场就是编译器不对。Simulink侧要编译成DLLMatlab必须能找到可用的C编译器。早几年版本对编译器要求很苛刻用微软Visual Studio或MinGW都行但必须和Matlab版本匹配。现在的新版Matlab自带MinGW编译器省了不少事但还是建议你在Matlab命令行跑一下mex -setup确认编译器已经正确配置。版本匹配上Cruise和Matlab之间不是每个版本都互相兼容。AVL官方会随软件发布接口说明文档直接查你要用的Cruise版本对应支持哪些Matlab版本。我建议装机前就查好免得模型做到一半发现接口不认那才是大麻烦。还有一点Cruise与Simulink联合仿真在32位和64位环境下有区别。早期项目用32位居多DLL也必须是32位。现在主流都切到64位了但如果你把老项目从32位迁到64位记得重新编译DLL直接在原目录拿老的DLL用会报错。3.2 Cruise整车模型搭建从部件选型到机械连接在Cruise里搭混动模型一般从车辆模块开始。整车质量、迎风面积、风阻系数、滚动阻力系数这些基础参数先填进去然后是轮胎和制动器接着是主减速器和变速器。电驱动系统方面主驱电机和发电机分别用Electric Machine模块电池用High Voltage Battery模块。发动机用Engine模块机械连接通过离合器模块和齿轮副相连。参数填写上有几个地方特别容易出错。发动机模块的万有特性数据必须完整覆盖工作区域不能只在某个转速区间有数据否则仿真到高转速或低转速工况时发动机扭矩查不到值结果直接中断。电机的效率MAP要注意区分电动机工况和发电工况。同一台电机驱动时效率MAP和发电时效率MAP大概率不一样Cruise里一般用二维或三维查表分别定义。电池模块最基础的是开路电压和内阻随SOC变化的曲线如果做低温场景还要考虑温度修正但前期常温工况模拟可以先不填温度维度。机械连接方面Cruise里用Mechanical Connection把所有旋转部件在轴向上串起来。发动机到离合器1再到发电机这是一条轴系发动机到离合器2再到主减速器这是另一条轴系主驱电机直接连主减速器又一条轴系。这些轴系最终都汇到车轮。电气连接用Electrical Connection把发电机、电池、主驱电机连到高压总线上。信号连接上Cruise里有一个专门的Function模块用来和外部控制器交换信号。把控制策略需要读取的信号逐一映射到这个模块的输入端口把策略输出的控制指令映射到输出端口。这一步做完后Cruise模型本身基本就完整了后面只差Simulink这个“大脑”还没接上。3.3 Simulink策略模型与DLL生成Simulink侧的策略模型我习惯用一个顶层模型包含几个子模块输入信号预处理、模式仲裁、扭矩分配、SOC管理、输出指令限值。这些子模块各自独立运行输入输出都走总线信号方便调试。这里重点说DLL生成。Cruise调用Simulink策略的经典方式是使用S-Function。策略模型写好之后外层套一个S-Function封装输入输出按接口清单配置好端口个数和顺序然后用mex命令或者Simulink的代码生成工具编译成动态链接库。我在实际项目里最常用的命令是mex加S-Function源文件把策略模型生成一个共享库文件。核心步骤大致是先确保mex -setup指向的编译器正确然后写一个S-Function的C源码文件在里面注册输入输出端口的数量、信号名称和数据类型。接着运行编译命令生成DLL文件。最后把DLL文件放在Cruise项目可以访问到的目录下供后续调用。如果策略模型比较复杂也可以直接在Simulink里配置好C代码生成选项用Simulink Coder生成可集成的目标文件再把生成结果注册成Cruise能加载的接口库。两种方式各有适用场景S-Function更灵活适合控制策略频繁变化时快速迭代C代码生成方式更规范适合代码质量要求高、要交付嵌入式代码的项目。前期做性能仿真验证用S-Function方式效率最高。提示编译生成的DLL文件名不要用中文路径也尽量全英文。Cruise加载DLL时对路径处理比较死板中文路径或者带空格的目录都容易加载失败这个坑我踩过不止一次。3.4 在Cruise里挂接DLL跑通闭环仿真DLL编译好之后回到Cruise模型。在Function模块里指定DLL文件路径按接口清单逐个勾选输入输出信号。这里要注意Cruise里的信号名称必须和Simulink侧S-Function里注册的端口名称一一对应哪怕差一个下划线都不行。信号挂接完成后在Cruise的Task文件夹里新建一个仿真任务选好工况循环和仿真步长。混动系统仿真步长一般取0.01秒到0.05秒。步长太大模式切换瞬间的扭矩冲击捕捉不到步长太小整个工况跑下来耗时成倍增加。我个人的经验是先用0.05秒跑通流程确认逻辑没有问题再根据具体研究需求加密步长。仿真跑起来之后Cruise主界面能看到车辆状态在实时变化Simulink侧的话如果开了外部模式还能在线观察策略内部的信号变化。这一步的价值非常大因为单纯看Cruise的曲线只能看到现象比如油耗高、SOC不规律波动打开Simulink模型在线观察才能看到策略内部哪个环节出了问题比如模式仲裁是不是老在临界点跳来跳去、扭矩分配是不是一个电机在出工另一个在摸鱼。仿真结束后用Cruise的后处理工具提取结果GSP曲线反映动力性能燃油消耗量和电量变化量用来算经济性。SOC曲线全程都在合理区间内波动发动机起停次数不要过于频繁这样的仿真结果才有参考价值。动力性指标方面用Cruise的计算任务可以直接输出0到100km/h加速时间、最高车速、最大爬坡度这些数据是后续写性能分析报告的核心输出。4. 联合仿真实战中的高频问题与处理方法4.1 DLL编译和加载层的坑联合仿真最开始的报错基本都集中在DLL上。症状要么是Cruise加载DLL时提示找不到文件要么是加载成功但仿真到某个时刻直接崩掉。找不到文件先查路径。我之前有个项目Simulink编译输出到了Matlab默认的当前目录结果Cruise项目目录和它不在一起DLL文件就没带过去。解决办法是把DLL统一放到Cruise项目根目录下的一个固定文件夹里每次重新编译后复制过去模型引用相对路径。加载成功但仿真崩掉优先怀疑数据接口问题。最常见的是信号数量和类型对不上。Simulink侧注册的是8个输入4个输出Cruise侧Function模块只映射了7个输入运行时系统拿到不完整数据自然出错。这种问题排查时最有效的方法是把S-Function里接口定义打印出来对照Cruise的信号映射逐行核对耐心一点很快能找到问题。版本不匹配也经常导致DLL加载异常。比如Cruise是32位版本DLL却是64位编译的系统直接拒绝加载。判断方法很简单如果DLL文件能加载但一运行就报内存错误先怀疑位数不匹配。4.2 仿真运行期的典型问题跑通加载这一步后运行期的问题才真正考验调参水平。第一个高频问题是模式频繁切换。表征是SOC曲线在某个区间内上下抖动发动机启停信号在短时间内反复跳变车速曲线也能看到扭矩波动。根因通常是模式仲裁的边界条件太“脆”。比如纯电和串联模式的切换点在车速30km/h策略在30km/h附近稍微波动就会反复切换。解决办法很直接加滞回。把切换逻辑改成30km/h以上切串联、25km/h以下切回纯电中间这5km/h就是滞回区。配合一阶滤波平滑模式切换瞬间的扭矩请求值体验会好很多。第二个高频问题是SOC越界。要么是SOC冲到80%以上还在持续充电要么是掉到20%以下还硬要纯电行驶。前者说明充电逻辑的退出阈值设得太高后者说明SOC下限保护没做到位。经验做法是在策略里设定强制充电和强制用电两条硬边界比如SOC低于25%强制启动发动机充电高于75%强制进入纯电消磨电量。两条硬边界之间再留出滞回区间让策略自由调度。第三个问题是动力性与经济性打架。比如想提升0到100km/h加速时间策略倾向于让电机满功率输出电池放电电流变大SOC下降过快后续工况发动机被迫频繁启动补电油耗反而升高。这种矛盾本质上是扭矩分配策略的权重设置问题。前期做性能仿真验证时建议先跑一个“无脑并联”策略的极限工况摸清系统动力上限再逐步优化经济性策略找出满足动力性约束下的最佳经济性标定。4.3 几个提升效率的小技巧Simulink模型越写越大之后界面上找一个模块很费眼睛。一个小技巧是直接在模块上双击进入内部子系统右键选择隐藏模块名称这样图上只显示图标整体清爽很多。实际多人协作时隐藏名称也有助于避免误操作删错。主模型参数导入这个问题我也是被坑过才重视起来的。Simulink策略模型里如果有一堆常数需要标定比如滤波时间常数、SOC阈值、扭矩限值不要在模型里一条条手工改。正确做法是写一个统一的初始化脚本用参数结构体统一管理所有标定量模型里所有常数都引用结构体字段。联合仿真正式开跑前在Simulink侧先运行一遍初始化脚本所有参数一次性加载批量跑多组工况时非常有用。外部模式在线调试这个功能我要专门推荐一下。联合仿真跑起来后把Simulink模型切到外部模式可以实时观察策略内部信号甚至在线修改某些参数看即时效果。这个功能用来排查模式切换问题和调滤波器时间常数效率比跑完一遍再看结果高出一个量级。当然外部模式对接口实时性要求高不是所有环境下都稳定前期调试用为主。最后再给一张速查表把最常用的几类问题归纳一下。常见现象可能原因处理建议DLL加载失败路径含中文、位数不匹配、编译器版本不符使用英文路径、确认32/64位一致、检查编译环境仿真中途崩溃信号数量不匹配、数据越界逐项核对接口清单、检查查表范围是否覆盖模式频繁切换切换边界过近、缺少滞回滤波增加滞回区、调大一阶滤波时间常数SOC异常偏高充电退出阈值过高降低充电退出SOC、增加强制纯电边界SOC异常偏低充电启动阈值过低提高充电启动SOC、增强SOC闭环调节写在最后联合仿真这条路上我试过用Cruise内置Function硬写策略也试过把整个混动模型搬到Simulink里完全抛开Cruise最后都觉得不如两条腿走路舒服。Cruise给出可信的整车物理表现Simulink提供灵活的策略开发环境DLL作为桥梁把它们粘在一起这套组合用顺手之后做构型方案对比、策略参数扫描、性能指标分解都会快很多。根据我实际跑过的项目经验刚上手时不要急着追求复杂策略先把纯电、串联、并联三个基础模式在联合仿真里跑通SOC曲线稳定加速时间合理再慢慢往里填优化算法。基础链路通了后面的问题基本都能通过查接口、调滞回、改滤波这三板斧解决。希望这篇对正在折腾混联混动联合仿真的你有帮助。
返回列表