2. 电驱系统基础

1. 到底什么是MIL?

MIL,全称Model-in-the-Loop,模型在环仿真。说白了,就是用纯数学模型来验证你的控制逻辑对不对。

我经常跟团队里的新人讲:MIL是V流程里最便宜、最灵活的验证环节。为什么?因为你连一行C代码都不用写,甚至不需要知道最终跑在什么芯片上。你只需要在Simulink里搭好模型,给个输入,看输出是不是你想要的。

MIL的核心目的其实就三个:

  • 验证算法逻辑:你的状态机跳转对不对?PID参数合不合理?
  • 发现早期缺陷:等代码生成完再改逻辑,成本至少翻10倍。
  • 建立测试基准:MIL通过的结果,就是后续SIL、HIL的“标准答案”。

关键认知:MIL不关心实时性,不关心代码效率,只关心“功能对不对”。这是它和HIL最大的区别。

2. Simulink/Stateflow模型基础——你得会看,更得会建

做MIL,Simulink是吃饭的家伙。但说实话,很多人只是“会用”,不是“会建”。

2.1 Simulink连续与离散系统

车载控制模型,大部分是离散的。为什么?因为ECU是周期采样的。我个人习惯在MIL阶段就把模型搭成离散的,这样后面做代码生成时几乎不用改。

类型 典型模块 MIL中的用途
连续 Integrator, Transfer Fcn 被控对象(如电机、车身动力学)
离散 Unit Delay, Discrete PID 控制器逻辑(ECU算法)
混合 Rate Transition 多速率系统桥接

我的经验:被控对象用连续模型,控制器用离散模型。两者之间加Rate Transition模块,可以避免代数环。我曾经在一个项目中没加这个,仿真直接卡死,排查了整整半天。

2.2 Stateflow状态机——别画得太复杂

Stateflow是处理模式切换的神器。比如车窗防夹、自动雨刮、驾驶模式切换,这些用状态机描述最清晰。

但我要提醒一句:Stateflow容易画上瘾。我见过有人把几十个状态画在一张图里,连线像蜘蛛网。结果MIL仿真跑起来没问题,代码生成后RAM爆了。

建Stateflow模型,记住三条:

  • 状态数不超过10个,超过就考虑分层
  • 每个状态内的转移条件写清楚,不要用默认转移
  • 一定要加entry、during、exit动作,别偷懒
// 一个简单的Stateflow状态转移示例(伪代码)
State: IDLE
  entry: output = 0;
  during: if (sensor > threshold) next = ACTIVE;

State: ACTIVE
  entry: output = 1;
  during: if (timer > 5) next = IDLE;
  exit: timer = 0;

3. 模型仿真配置与运行——别让配置坑了你

模型搭好了,配置不对,结果全白费。我见过太多人仿真结果不对,最后发现是求解器类型选错了。

3.1 求解器选择

MIL仿真里,求解器选fixed-step还是variable-step?

  • 固定步长(fixed-step):推荐。因为最终代码生成后也是固定步长运行。步长一般取1ms、5ms或10ms,看控制周期。
  • 变步长(variable-step):只适合纯被控对象仿真,精度高但不可代码生成。

避坑指南:我曾经用变步长跑MIL,结果模型收敛得特别好。等代码生成后放到HIL上,直接发散。原因就是变步长掩盖了离散系统的数值稳定性问题。所以,MIL阶段就用固定步长,别给自己挖坑。

3.2 仿真时间与数据记录

仿真时间设多长?没有标准答案。但我有个习惯:

  • 功能测试:跑3-5个完整周期(比如一个车窗升降循环)
  • 边界测试:跑10倍于最长时间常数的时长
  • 压力测试:连续跑30分钟以上,看内存是否泄漏

数据记录方面,我建议用To Workspace模块,把关键信号存成结构体。别用Scope看波形,那东西没法后处理。

3.3 仿真运行与调试

点一下Run谁都会,但调试才是真功夫。MIL仿真跑崩了怎么办?

  1. 看错误信息:Simulink的错误提示其实很明确,别跳过。
  2. 降低步长:如果数值发散,先试试把步长从1ms降到0.1ms。
  3. 检查代数环:模型里出现红色虚线环,就是代数环。加个Unit Delay或Memory模块就能破。
  4. 用Simulink Debugger:单步执行,看每个时间步的信号值。这招我屡试不爽。

4. MIL知识体系总览

下面这张图,是我自己总结的MIL知识框架。你把它记在脑子里,做MIL就不会跑偏。

MIL仿真知识体系 MIL模型在环仿真 概念与目的 验证算法逻辑 发现早期缺陷 建立测试基准 Simulink/Stateflow 连续/离散系统建模 Stateflow状态机 代数环处理 仿真配置与运行 求解器选择(固定步长) 仿真时间与数据记录 调试与错误排查 核心原则:功能验证优先,不关心实时性

5. 一个完整的MIL仿真流程

最后,我梳理一下做MIL的标准步骤。你照着这个流程走,基本不会漏东西。

  1. 搭建被控对象模型:用连续模块搭,精度够用就行,别过度建模。
  2. 搭建控制器模型:用离散模块搭,步长与目标ECU一致。
  3. 连接闭环:注意信号类型和维度匹配,别出现mux/demux混乱。
  4. 配置仿真参数:固定步长,步长1ms,仿真时间根据测试用例定。
  5. 运行仿真:先跑一个简单用例,确认模型能跑通。
  6. 分析结果:用To Workspace导出数据,在MATLAB里画图对比。
  7. 迭代修改:逻辑不对就改模型,改完再跑,直到通过。

一个小技巧:我习惯在MIL阶段就把测试用例写成脚本,用sim()函数批量跑。这样每次改完模型,一键跑完所有用例,省时省力。

嗯,MIL的基础就这些。你想想看,其实MIL就是“在电脑上把算法先跑通”。后面到了SIL和HIL,你会发现很多问题其实在MIL阶段就能发现。所以,别急着往下走,先把MIL做扎实了。