
做整车仿真的人应该都有过这种经历同事问你“有没有一个能跑通增程能量流的模型”你翻遍电脑发现要么太复杂要么带一大堆试验标定数据根本不适合拿来验证策略想法。我的做法是先搭一个 CRUISE 的 base 模型配合一套最简单可靠的恒功率控制让增程汽车仿真模型的骨架先立起来。所谓 base 模型不是偷工减料而是把电池、驱动电机、发动机、发电机这条增程动力链的关键角色理清楚让仿真一开始就朝着正确的能量流方向走。这篇内容就是围绕这个 base 模型怎么写、恒功率控制在 AVL CRUISE 里怎么落地展开适合正在用 CRUISE 搭增程模型、或者想把纯电模型扩展成增程构型的人作参考。1. 为什么增程仿真必须从 base 模型起步而不是直接堆细节1.1 增程构型与 CRUISE 仿真的“最小闭环”增程式电动汽车和其他混动构型的本质差异在于发动机不直接驱动车轮只通过发电机给电系统供能。整车需求功率由驱动电机响应电池和增程器APU共同维持高压母线上的功率平衡。在 CRUISE 仿真里这个构型的最小闭环其实非常简单就只有四条链路能量源链路发动机 → 发电机 → 高压母线储能链路电池 ↔ 高压母线驱动链路高压母线 → 驱动电机 → 减速器 → 车轮控制链路SOC → 增程器启停与功率指令 → 能量输出 → SOC 更新只要这四条链路能在仿真中稳定收敛配合一个驾驶循环输入base 模型就算成立。很多新手上来就想把热管理、能量回收、电池寿命衰减、NVH 全部加进去结果模型还没跑起来就先被各种参数填表埋住了。我更建议先让动力链闭环走通确认每个组件的功率、扭矩、转速方向都正确再逐步往上面加复杂度。1.2 base 模型该有什么、不该有什么“base 模型”这四个字经常被误解。有人觉得 base 模型就是粗糙、不准、能跑就行也有人觉得 base 模型应该有完整的内外特性参数、整车附件模型、换挡策略、驾驶员模型恨不得一步到位。我的理解是base 模型服务于阶段目标它的核心任务是让控制策略和能量管理在仿真环境里先有个可信的试验台。我把 base 模型和后续完善模型做个对比大家看这张表就清楚了维度base 模型常用配置后续完善方向控制策略单点恒功率 SOC 滞环多点恒功率、负荷跟随、等效燃油最小策略ECMS、预测控制发动机模型MAP 模型关注 BSFC 与外特性增加瞬态油耗修正、冷启动油耗、热管理耦合发电机模型固定效率 MAP 或简单损耗模型效率随温度和转速细分考虑电磁损耗电池模型内阻 OCV 查表电化学等效电路、热模型、寿命模型整车负载阻力 附件固定功率空调、低压电器、制动能量回收细节验证目标能量流方向、SOC 趋势、油耗量级精确油耗、排放、热平衡、耐久工况从这个表能看出base 模型的特点就是“控制简单、参数可查、结果可解释”。它不应该轻易出问题出了问题也容易定位。等这一步做扎实了后续加一百个细节都不是事反过来如果 base 模型都是乱的后面填再多精密数据也只会掩盖问题不会解决问题。2. CRUISE 里搭增程动力链组件选型与物理连接顺序2.1 组件怎么选AVL CRUISE 的组件库比较全但同一个物理部件可能有几种建模方式选错了会绕很多弯路。以我常用的习惯来说base 模型优先选 MAP 类模型少用详细物理模型。原因很简单MAP 模型的输入输出关系直接调试控制策略时能一眼看穿问题出在部件还是控制。我搭增程 base 模型时通常选这几类Vehicle整车模块填整备质量、风阻面积、空气阻力系数、滚动阻力系数。基础参数可以直接参考同级别车型公告。Engine发动机模块选 MAP 模型。输入外特性扭矩曲线和万有特性油耗 MAP控制端用负荷信号Load Signal而不是油门踏板物理模型。Generator发电机模块填额定功率、转速范围、效率 MAP。它的角色是给发动机施加反扭矩并把机械功率转成电功率。Battery高压电池模块用 OCV 表 内阻表描述极化特性填容量、SOC 初值、电压范围。Electric Motor驱动电机模块填峰值外特性扭矩和效率 MAP。Final Drive Wheel主减速器和轮胎模块设置减速比和滚动半径。如果你在 CRUISE 里看到自带的增程 demo也可以从 demo 改起但我不太建议直接拿 demo 当 base 模型因为 demo 往往带着大量传感器、控制逻辑、显示表格删起来费时而且删不干净容易留下隐性约束。自己从零搭一遍边搭边想每条功率流的方向这比改 demo 更能建立模型感。2.2 机械、电气、信号三种连接的正确用法CRUISE 的连线分三类很多人刚开始会搞混。机械连接处理转速和扭矩电气连接处理功率流信号连接处理控制量。对应到增程模型就是发动机输出轴和发电机输入轴之间是机械连接必须保证这两个端口在同一转速水平。发电机的高压电输出口、电池的高压口、电机逆变器的输入口接在同一条高压电气线路上。这里的电气连接需要选对端口的类型我之前见过有人把电池接到普通低压电网上导致功率怎么都送不出去。SOC、车速、驱动功率请求这些控制相关量走信号线从组件端口引到 Function 模块或 Simulink 接口。物理连接的第一步建议先做“机械端”把发动机、发电机、电机、减速器、轮胎这条驱动路径连好然后加高压电气线路最后再接信号线。顺序不要反否则一上来信号满天飞物理层有没有通却没人知道。2.3 从发动机到车轮的能量流检查方法连好线后不要急着跑完整循环先做一次最小验证给发电机输入一个固定的阻力矩需求发动机按 MAP 输出相应功率观察整条链路的功率流向。我当时做这一步时习惯打开 CRUISE 的 Monitor 窗口同时看发动机扭矩、发电机转速、电池功率、电机功率四个量。如果发电机的机械输入功率是正、电输出功率也是正说明机械能正在向电能转换如果电机输出正扭矩并且车速在增加说明电功率正在向机械能转换如果电池功率在增程器运行期间为正说明确实在充电。四条功率流方向全对这个 base 模型的物理层就算通了。这一步很枯燥但极其重要。方向错一条后面跑出来的曲线也许也能看但是物理含义完全不对分析等于白做。3. 恒功率控制的真实含义发电机力矩管理、转速调节与滞环启停3.1 恒功率不是“一脚油门到某个固定值”很多人把恒功率控制理解成“增程器输出固定 30kW”这句话其实只说对了一半。增程器是一个发动机加一个发电机的组合发动机输出的是轴功率发电机输出的是电功率。要让 APU 稳定在 30kW 这个功率点上需要同时控制发动机转速和发电机扭矩两者配合才能实现。基本关系式是[ T 9550 \times \frac{P}{n} ]其中 T 是扭矩NmP 是功率kWn 是转速rpm。举个例子如果发动机目标转速是 2200rpmAPU 目标功率 30kW那么发电机的目标扭矩就是[ T 9550 \times \frac{30}{2200} \approx 130\ \text{Nm} ]注意这个 130Nm 是发电机施加在发动机输出轴上的反扭矩方向和发动机旋转方向相反。发动机承受这个阻力矩之后通过自身的调速特性把转速稳定在目标点附近。所以在 CRUISE 里实现恒功率本质上是给发电机一个扭矩指令同时给发动机一个转速或负荷指令让它们共同收敛到目标工作点。如果你只是把发动机油门固定、把发电机扭矩固定没有检查转速是否落在目标区间那很可能 APU 实际工作在 3000rpm发出的功率也不是 30kW而是 25kW 或者 35kW控制逻辑完全失效。3.2 ON/OFF 与 SOC 滞环设计恒功率控制还有个关键点不是任何时候都让 APU 开着。增程器停下来的时候电池单独供电启动的时候APU 以恒定功率运行。什么时候启动、什么时候停止由 SOC 滞环决定。所谓滞环就是给增程器一个启动阈值和一个停止阈值两个阈值之间形成一个区间。我的 base 模型上常用的一组参数是SOC 低于 0.25 时强制启动增程器SOC 高于 0.35 时关闭增程器SOC 在 0.25 到 0.35 之间保持上一状态不变为什么不用单阈值呢比如 SOC 低于 0.30 就启动、高于 0.30 就停止那 SOC 在 0.30 附近会反复上下波动增程器频繁启停油耗和排放都很难看。加上滞环之后SOC 会像锯齿波一样在 0.25 和 0.35 之间来回摆动增程器每个启停周期能持续一段时间逻辑稳定且容易观察。这段时间窗口的选择也值得说两句。窗口太窄电池可用容量小增程器启停周期短窗口太宽SOC 波动大整车动力性受电池状态影响明显。base 模型阶段选 10 个百分点的窗口是合理的等后面做能量管理优化时再仔细标定。3.3 发动机工作点选哪个万有特性与 BSFC恒功率点的选择直接决定增程器油耗。发动机不同转速、不同扭矩下的燃油消耗率差别很大通常用万有特性图上的比油耗BSFC单位 g/kWh来找最优区域。举一个常见的小排量涡轮增压发动机例子。它的峰值功率 110kW峰值扭矩 230Nm万有特性图上最低油耗区域大约在 2000-2500rpm、扭矩 100-150Nm 之间对应功率大约 20-38kW。如果你把恒功率点选在 2200rpm、130Nm 附近比油耗可能只有 230-240g/kWh如果你选在 4000rpm、最大扭矩附近比油耗可能变成 280g/kWh 甚至更高。所以单体恒功率点的选法是有套路的打开发动机万有特性图找 BSFC 最低的等高线区域在这个区域内选一个中等功率值让日常市区行驶时 APU 有足够的净充电余量把转速和扭矩换算成功率和发电机目标扭矩填入控制逻辑base 模型阶段不需要做多目标优化但至少要知道恒功率点偏了后面所有油耗结论都不可信。我自己就在这个点上吃过亏最初随便选了个 45kW 的点结果市区跑下来油耗比纯油车还高一度以为是控制策略写错了后来才发现是整个工作点落在高油耗区。3.4 算一笔账恒功率 30kW 的 APU 在市区循环里怎么影响 SOC光说理论没意思我拿一组常见参数帮大家算算账理解恒功率控制下 SOC 为什么会在窗口内波动以及波动周期大概是多长。假设条件是这些APU 恒功率输出 30kW发动机轴端功率发电机效率 0.9所以注入高压母线的电功率约 27kW市区低速循环整车平均需求功率约 8kW净充电功率约 19kW电池可用容量按 35kWh 算SOC 窗口 10 个百分点对应 3.5kWh 能量那么从 SOC0.25 充到 SOC0.35需要的时间大约是[ t_{chg} \frac{3.5}{19} \approx 0.184\ \text{小时} \approx 11\ \text{分钟} ]之后增程器关闭电池单独供电8kW 的平均需求功率消耗 3.5kWh 可用能量大约能撑[ t_{dis} \frac{3.5}{8} \approx 0.438\ \text{小时} \approx 26\ \text{分钟} ]这意味着在平均车速不高的市区工况增程器大约每隔 37 分钟启停一次运行时间约占 30%。按 35km/h 平均车速、发动机 240g/kWh 比油耗折算百公里油耗大约在 8L 上下。这个量级对一款 1.7 吨左右的增程 SUV 是合理的。通过这种估算你在跑 CRUISE 之前就能对结果有个预期等仿真曲线出来如果偏离这个量级很多说明模型里一定哪里有问题。4. 在 CRUISE 中落地恒功率控制Function/C 代码与 Simulink 联合仿真两种路线4.1 纯 CRUISE 路线Function 模块与 C 函数的信号交互恒功率控制在 CRUISE 里最朴素的实现方式是用软件自带的 Function 模块通过 C 语言函数读取输入信号、计算控制量、写回输出信号。这种方式的好处是不依赖外部工具链模型拷给别人也能直接跑非常适合 base 模型阶段。控制逻辑的核心部分非常短思路就像下面这段伪代码/* 读取输入信号 */ double soc get_signal(Battery_SOC); int apu_state get_signal(APU_State); /* SOC 滞环判断 */ if (soc SOC_LOW apu_state 0) { apu_state 1; } if (soc SOC_HIGH apu_state 1) { apu_state 0; } /* 恒功率换算发电机目标扭矩 */ double gen_torque 0.0; double engine_speed get_signal(Engine_Speed); if (apu_state 1) { gen_torque -9550.0 * P_APU / engine_speed; } /* 写输出信号 */ set_signal(Gen_TorqueDemand, gen_torque); set_signal(APU_State, apu_state);注意上面只是一个示意不同 CRUISE 版本的 API 函数名有差异但逻辑是通用的。负号代表发电机要吸收发动机的机械功率对发动机轴施加的是阻力矩方向不能弄反。纯 CRUISE 路线的优点还不只是部署方便。Function 模块里的输出信号可以直接连接到发电机扭矩需求端口不需要经过额外接口信号周期由模型求解器控制调试起来简单。缺点是控制器内部的中间变量不太方便在界面上实时看只能通过输出信号引出来观察。我的经验是把 APU_State、目标功率、实际功率、SOC 四个信号都引出来挂到 Graph 窗口里看排查问题会快很多。4.2 联合仿真路线CRUISE 调用 Simulink 控制模型如果后续要做更复杂的能量管理策略比如基于工况预测的 SOC 规划纯 C 函数写起来会比较痛苦。这时候一般走 CRUISE 和 MATLAB/Simulink 联合仿真路线CRUISE 提供整车物理模型Simulink 里放控制策略。联合仿真的配置流程大概是在 CRUISE 模型里创建一个接口组件指定需要输入到 Simulink 的信号列表比如 SOC、车速、驱动功率请求、APU 启停状态。创建一个输出信号列表对应 Simulink 返回的控制指令通常包括发电机扭矩需求、发动机负荷信号或 APU 启停命令。在 Simulink 模型里建立相同数量的 Inport 和 Outport保证端口顺序和 CRUISE 中的信号列表一一对应。运行仿真前设置好接口参数确保 MATLAB 工作区或者 DLL 路径能被 CRUISE 正确调起。这个路线的优势是策略层可以用 Simulink 的各种模块调试方便、可视化好。劣势是模型的可移植性变差别人拿到你的模型还得装 MATLAB 环境和相应的工具箱。base 模型阶段我通常先用纯 CRUISE Function跑通后再升级到联合仿真避免两个复杂系统同时出问题。4.3 信号映射顺序一个字母差都会让模型飞掉不管是纯 CRUISE 还是联合仿真信号映射顺序都是最容易出隐性 bug 的地方。Simulink 接口的 Inport 端口顺序和 CRUISE 信号列表顺序一旦不一致就会出现“SOC 输到了油门踏板变量上”这种哭笑不得的结果。仿真能跑也不报错但行为完全失控。我吃过一次亏当时基模型里第一路输入是 Battery_SOC第二路是 Vehicle_Speed但 Simulink 端我习惯性地把车速放到了第一个 Inport结果增程器该启动时不启动SOC 越低反而越关掉。排查了两天最后发现是顺序问题。现在我的操作习惯是在 CRUISE 端给每个信号加上编号和注释比如 Signal_01_Battery_SOCSignal_02_Vehicle_Speed在 Simulink 端把 Inport 名字改成同样的编号并额外用一个小的 Signal View 组件把前几个周期的值打印出来做比对。虽然麻烦一点但能省下后面几个小时的排查时间。5. base 模型跑通后的参数迭代SOC 曲线、油耗结果与工作点检查5.1 三个必看的结果base 模型跑完一个驾驶循环后我不会急着调控制参数而是先看三类结果确认模型本身在正常工作。第一SOC 曲线。恒功率控制下如果模型起点 SOC 已经在滞环窗口内SOC 曲线应该呈现锯齿状波动增程器启动后缓慢上升关闭后缓慢下降整体不持续发散。如果 SOC 单调下降且跌破下限说明 APU 平均输出功率小于整车平均需求功率反之如果 SOC 一直顶到上限不下来说明 APU 功率选得过大。两条路都是不合理的。第二发动机工作点分布。把仿真结果里的发动机转速、扭矩散点画出来叠加到 BSFC 等高线图上。正常情况散点应密集分布在所选恒功率点附近偏差不要太大。如果散点在整个 MAP 上到处飞说明转速控制不稳定或扭矩指令反复振荡这通常不是算法问题而是信号反馈周期或者控制增益不合适。第三油耗和电耗的量级。base 模型阶段不需要对标最终公告值但要对标物理常识。整车质量、循环平均功率、发动机比油耗摆在那里算出来的百公里油耗不可能脱离合理区间。哪怕稍微偏一点都没关系偏离太多就要往回查参数填表和数据单位。5.2 典型异常现象与调控方向base 模型最常见的异常现象就那么几类我列个表方便大家对照异常现象可能原因调整方向SOC 持续下降增程器启动时间少恒功率点偏低、启动阈值过低提高 APU 目标功率、抬高 SOC 启动阈值SOC 快速上升顶到上限恒功率点偏高、车辆平均需求功率小降低 APU 目标功率、调低停止阈值增程器频繁启停滞环窗口太小、信号波动大扩大滞环、增加启停最小持续时间发动机工作点飘移转速闭环不稳、扭矩指令振荡减小控制增益、增加信号滤波油耗明显偏大恒功率点落在高油耗区重新查万有特性移动工作点这个表里每一行都对应真实案例。比如“增程器频繁启停”很多人第一反应是滞环阈值太小但有时候是因为 SOC 信号本身有高频波动加一个 1Hz 的滤波就解决了。所以调参之前先确认信号质量千万别一上来就动策略。5.3 从单点到多点base 模型如何演进base 模型用单点恒功率跑通后下一步很自然的演进是“多点恒功率”。什么意思呢同一个 APU 在两个或三个功率点之间切换比如市区低速用 20kW 低功率点高速巡航或强动力请求时切到 40kW 高功率点。每个功率点都落在发动机万有特性的低油耗区整体油耗可以比单点恒功率再低一些。实现方式也很简单把 Control 模块里的 P_APU 从常数改成一个查表量输入是整车平均需求功率或车速经过滞环或滤波处理后选择功率档位。除此之外base 模型的整体结构完全不用动。这也说明 base 阶段把架构搭干净有多重要后面加策略就像换零件而不是动手术。再往后可以上负荷跟随、等效燃油最小策略、基于 SOC 参考轨迹的预测控制但那些都属于策略层迭代物理层 base 模型始终是那套动力链。CRUISE 里模型的分层优势在这里体现得特别充分。6. 我搭增程 base 模型时踩过的几个坑6.1 发电机扭矩方向设反整个功率流报废这个坑说起来很基础但真的很容易犯尤其在你从别人手里接过一个模型时。现象是增程器一启动发动机转速直接往上冲SOC 不升反降发电机模块的功率输出变成负值。这说明发电机在“反向驱动发动机”也就是它在消耗电功率而不是在发电。排查链路我当时是这样走的先单独看发电机模块的输出功率确认符号。再看发电机机械端口的扭矩方向和转速方向是否相反。最后把控制逻辑里的目标扭矩符号取反重新跑同一个小工况对比。解决方式就是给发电机目标扭矩加负号或者调整 CRUISE 组件参数里的方向设置。关键是记住一句话发电机作为负载它的反扭矩一定和发动机旋转方向相反如果两者同向能量流一定反了。6.2 电池限功率没给够SOC 曲线震荡第二个常见坑是电池模型的充放电功率限制和 APU 恒功率点不匹配。现象比较隐蔽SOC 曲线不是平滑锯齿而是带高频抖动增程器运行期间电池功率忽大忽小甚至出现一会儿充电一会儿放电的交替工况。排查链路是调出电池模块的允许充电功率参数表对比 SOC 在 0.25-0.35 区间内允许的最大充电功率。对比 APU 净充电功率是否接近或超过该限制。如果超过要么降低 APU 功率点要么调整 SOC 窗口让电池始终工作在允许大功率充电的区间。我当时遇到的问题就是电池模型在低 SOC 区间允许的充电电流很小而 APU 配的 30kW 功率偏大导致电池无法吸收多余电能能量只能从别的渠道漏掉SOC 曲线自然就乱了。把 APU 功率点降到 25kW 之后问题立刻消失。6.3 控制周期和信号初值不匹配联合仿真时CRUISE 物理模型的求解步长和控制模型的采样周期如果不匹配也会出现奇怪的振荡。现象是恒功率运行时发动机扭矩波动幅度很大工作点散点图变成一团乱麻。解决思路有两个方向。一个是让 Simulink 控制模型的采样周期和 CRUISE 输出信号更新周期对齐另一个是在控制输出端加一阶低通滤波比如时间常数 0.1s 左右让扭矩指令不要跟着信号噪声一起抖。CRUISE 里很多信号本身是从组件直接输出的高频噪声明显滤波器几乎是增程控制的标配。信号初值也要注意。Simulink Inport 的初值如果设置成 0而实际 CRUISE 启动时发动机转速可能是 800rpm控制函数一算出来就是 0 扭矩或极大扭矩起步瞬间就会给模型一个冲击。所以初值尽量设为和整车静态状态一致至少把目标转速、目标功率的初值填合理。6.4 温度与冷启动的影响最后说一个容易被忽略的问题base 模型如果带了发动机温度模型冷启动阶段的油耗会比热机高出一大截。有人跑完同一个循环发现油耗波动 10%就以为控制策略有问题其实是每次设置里发动机初始温度不一样。base 模型阶段我不建议把太多精力放在温度细节上。统一把发动机初始水温设为 90°C电池初始温度设为 25°C先让策略层的结果可复现、可对比之后再做冷启动工况专题。温度模型本身是个大坑涉及冷却液流量、散热器面积、水泵转速和恒功率控制完全是两条技术路线一上来就混在一起很容易两头都做不好。最后分享一点我自己的体会。用 CRUISE 搭增程 base 模型这件事最大的价值其实是把问题前置。恒功率控制看上去简单但正因为简单任何一个物理层错误都会直接暴露在结果里逼着你去理解功率流、理解发电机扭矩方向、理解 SOC 和油耗之间的平衡。把这个基础打牢了后面做多功率点、做预测控制、做热管理耦合都不会再被“模型本身是不是对”这个问题绊住。所以别嫌 base 模型土能把土的事情做扎实才是后面所有花活能成立的前提。