3. MIL 验证的目标与工作流

模型在环(Model-in-the-Loop,MIL)验证是整个 V 模型左侧验证链的起点:控制器模型与被控对象模型都在 Simulink 中,以纯软件方式闭环运行。它不依赖任何目标硬件、实时系统或代码生成产物,因此是成本最低、迭代最快、可观测性最强的一层验证。但正因为"什么都能改",MIL 也最容易做成"跑一遍看看波形差不多就行"的形式化验证。要让 MIL 真正产生工程价值,必须先明确它要回答什么问题。

MIL 要回答的四类问题

MIL 阶段的核心不是"证明模型没错",而是用可复现的激励去暴露模型在需求层面的偏差。它通常回答四类问题:第一,功能正确性——给定输入序列,控制器的输出是否满足需求中定义的稳态与动态指标,例如目标车速阶跃 0→60 km/h 时超调是否小于 5%、稳态误差是否小于 ±1 km/h;第二,接口与数据类型一致性——模型端口的数据类型、量纲、采样周期是否与接口定义一致,是否存在隐式类型转换导致的精度损失;第三,边界与异常行为——输入饱和、除零、查表越界、状态机非法跳转时模型是否进入可预期的安全状态;第四,需求可追溯性——每条测试用例对应哪条需求,哪些需求尚未被任何用例覆盖。第四点常被忽略,但它决定了 MIL 能否作为后续 SIL、PIL、HIL 的基线。

测试用例设计原则

MIL 用例设计应遵循"需求驱动 + 结构补充 + 边界优先"的组合策略,而不是随机造几条输入曲线。需求驱动指每条功能需求至少对应一条正向用例;结构补充指针对模型内部的分支、状态机迁移、查表区间设计覆盖用例;边界优先指优先覆盖饱和点、切换阈值、量程端点等最容易出问题的地方。

一个可执行的用例应包含明确的字段,下面给出一个可直接填写的用例模板示例(参数为教学示例,非实测结果):

字段示例内容
用例编号MIL-CRU-003
关联需求REQ-CRU-012:车速阶跃响应超调 ≤ 5%
初始条件车速 0 km/h,挡位 D,坡度 0%
激励目标车速 0→60 km/h 阶跃,t=2 s 触发
仿真时长 / 步长20 s / 定步长 1 ms
通过判据超调 ≤ 5%,稳态误差 ≤ ±1 km/h,调节时间 ≤ 5 s
覆盖目标PI 控制器比例支路、积分限幅分支

用例设计还要注意激励的"可复现性":所有输入必须由脚本或 Signal Builder 明确定义,禁止依赖手工拖动。对于随机工况,应固定随机种子,使同一用例每次运行结果一致,否则后续回归比对无从谈起。

仿真配置与求解器选择

MIL 的仿真配置直接决定结果是否可信。关键配置项包括求解器类型、步长、容差、代数环处理和采样周期设置。

求解器选择的基本判断是:模型是否含连续状态。若控制器和被控对象均为离散模块(如离散 PID、离散滤波器),应选择定步长离散求解器(discrete,no continuous states),步长与最快采样周期一致或为其整数分之一。若含连续被控对象(如车辆纵向动力学、电机电气方程),则需选择变步长求解器,常用 ode45(非刚性)或 ode23t/ode15s(刚性)。对于含开关、摩擦、饱和等强非线性环节的模型,ode45 可能步长剧烈收缩,此时改用 ode23t 或 ode15s 更稳定。

% 教学示例:MIL 仿真配置脚本片段
set_param('veh_ctrl_mil','Solver','ode45', ...
    'RelTol','1e-4','AbsTol','1e-6', ...
    'MaxStep','0.01','StopTime','20');
set_param('veh_ctrl_mil','SolverType','Variable-step');
% 若模型为纯离散,则改为:
% set_param('veh_ctrl_mil','Solver','FixedStepDiscrete','FixedStep','0.001');

容差设置需要与信号量级匹配。若车速信号量级为 10²,AbsTol 设为 1e-6 是合理的;若某电流信号量级为 10⁻³,同样的 AbsTol 会过松,应单独为该信号设置绝对容差。MaxStep 不宜过大,否则会跨过控制器采样点,导致离散控制器行为失真;一般取最快采样周期的 1/5~1/2。此外,若模型存在代数环,应优先通过引入单位延迟或重构方程消除,而不是依赖求解器的代数环求解,后者会显著拖慢仿真并可能引入不真实动态。

结果记录与评估指标

MIL 结果记录应做到"信号可追溯、指标可计算、结论可复现"。建议在仿真中通过 To Workspace 或 Dataset 记录关键信号,并统一命名,例如 v_act(实际车速)、v_ref(目标车速)、u_pid(控制器输出)、sat_flag(饱和标志)。记录格式优先使用 Dataset 或带时间戳的结构体,避免使用 Array 导致时间信息丢失。

评估指标应尽量从需求中直接推导,而不是事后挑选。常用指标包括:超调量 σ%、上升时间 t_r、调节时间 t_s(±2% 或 ±5% 带)、稳态误差 e_ss、峰值时间 t_p、积分绝对误差 IAE。这些指标可通过脚本自动计算,例如用 stepinfo 对阶跃响应求取,或对误差信号做数值积分求 IAE。自动计算的意义在于:当模型参数调整后,可一键回归全部用例,快速判断是否引入退化。

建议在 MIL 阶段就建立"用例—需求—指标"三者的映射表,并纳入版本管理。这样当需求变更时,能立刻定位受影响的用例;当指标不通过时,能直接回溯到对应需求条款,而不是凭经验猜测。

最后需要强调,MIL 通过并不等于模型正确。MIL 只能证明"在给定激励和配置下,模型行为满足判据",它无法覆盖代码生成、定点量化、调度时序、硬件接口等后续环节的问题。因此 MIL 的定位是:用最低成本把需求层面的逻辑错误和参数错误尽量挡在代码生成之前,并为 SIL/PIL/HIL 提供可复用的用例集与基线数据。

MIL 验证工作流与关键配置关系 需求条目 功能 / 边界 / 接口 测试用例设计 激励 / 初始条件 / 判据 仿真配置 求解器 / 步长 / 容差 Simulink 控制器+对象 MIL 闭环仿真执行 激励注入 → 模型求解 → 信号记录 结果记录 v_act / v_ref / u_pid sat_flag / 时间戳 评估指标 σ% / t_r / t_s / e_ss IAE / 饱和次数 通过 / 不通过判定 对比判据阈值 回归基线比对 不通过:修正模型参数 / 补充用例 / 调整配置后重跑 求解器选择:纯离散 → FixedStepDiscrete(步长=最快采样周期);含连续状态 → ode45(非刚性)/ ode15s(刚性);强非线性 → ode23t

把上述工作流固化下来,MIL 就不再是一次性的"跑波形",而是一套可回归、可追溯、可交接的验证资产。用例集、配置脚本、指标计算脚本和基线数据共同构成后续 SIL/PIL/HIL 的起点,这也是 MIL 在整个验证体系中不可替代的原因。