1. 课程导入与验证全景

在基于模型的设计(Model-Based Design,MBD)流程中,Stateflow 承担的是控制逻辑与状态决策的表达职责。Simulink 擅长描述连续时间动态、信号运算与物理对象,而 Stateflow 擅长描述离散事件驱动的状态迁移、条件判断、模式切换与故障处理。二者组合后,一个完整的控制器模型通常呈现为“Simulink 负责被控对象与信号通路,Stateflow 负责模式管理与逻辑仲裁”的分工结构。例如整车控制器中,上电自检、Ready、行驶、充电、故障降级等模式切换,几乎都由 Stateflow 状态机描述;而电机扭矩计算、滤波、限幅等连续运算则留在 Simulink 侧。

正因为 Stateflow 逻辑往往决定“系统在什么条件下做什么”,它的正确性无法仅靠模型外观判断,必须通过分阶段的验证手段逐层确认。MIL、SIL、PIL 就是 MBD 中最常用的三级验证方式,它们验证的是同一套算法逻辑在不同实现形态下的行为一致性。

  • MIL(Model-in-the-Loop,模型在环):被测对象是 Simulink/Stateflow 模型本身,在 PC 上以解释或加速方式运行。目的是验证算法逻辑、状态迁移、接口定义是否正确,此时不涉及任何 C 代码。
  • SIL(Software-in-the-Loop,软件在环):由模型自动生成 C 代码,在 PC 上编译为可执行程序,与测试激励、被控对象模型联合运行。目的是验证生成代码与模型行为是否等价,重点排查代码生成配置、数据类型、定点量化带来的偏差。
  • PIL(Processor-in-the-Loop,处理器在环):将生成的 C 代码交叉编译后下载到目标处理器(如 TC397、S32K、TMS320 等)上运行,PC 侧保留被控对象模型与测试激励,通过通信接口交换数据。目的是验证代码在真实目标硬件上的数值行为、编译器差异、时序与资源约束。

三级验证的核心目标可以概括为三点:逻辑正确(MIL 阶段确认状态机迁移与输出符合需求)、代码等价(SIL 阶段确认生成代码与模型行为一致)、硬件可信(PIL 阶段确认目标处理器上的执行结果与 SIL 一致)。三者构成一条从“设计意图”到“可执行代码”再到“真实硬件”的递进证据链。

联合验证的关键判据是同一组测试用例在 MIL、SIL、PIL 三个阶段的输出应保持一致。工程上通常设定容差:浮点模型与定点代码之间允许量化误差,例如相对误差不超过 1e-3 或绝对误差不超过 0.01(具体阈值由信号量纲和精度需求决定)。若 SIL 与 MIL 偏差超限,优先排查数据类型继承、舍入模式与代码生成优化选项;若 PIL 与 SIL 偏差超限,则优先排查编译器优化、目标浮点单元行为与通信采样周期。

支撑这套流程的工具链以 MathWorks 体系为主:Simulink 提供模型与仿真环境,Stateflow 提供状态机建模,Embedded Coder 负责生成面向嵌入式的 C 代码,Simulink Test 管理测试用例与基线,Simulink Coverage 统计状态、迁移、条件覆盖率,Polyspace 用于静态检查与运行时错误证明,处理器在环则依赖目标编译器、调试探针与串口/CAN/以太网通信链路。一个典型的工程案例是:某电驱控制器项目以 Stateflow 描述扭矩管理模式,MIL 阶段用 Simulink Test 跑 120 条场景用例,SIL 阶段将生成代码封装为 S-Function 回灌同一批用例,PIL 阶段把代码烧录到目标板并通过 CAN 回传状态量,最终以三阶段输出对比报告作为软件释放证据。

Stateflow 联合验证全景:MIL → SIL → PIL 证据链 MBD 模型分工 Simulink 连续动态 / 信号运算 Stateflow 状态迁移 / 逻辑仲裁 模式管理 · 故障降级 · 条件判断 三级验证链 MIL 模型在环 验证逻辑正确 SIL 软件在环 验证代码等价 PIL 处理器在环 验证硬件可信 同一组测试用例贯穿三阶段 输出一致性对比 → 软件释放证据 工具链支撑 • Simulink / Stateflow • Embedded Coder • Simulink Test / Coverage • Polyspace • 目标编译器 / 调试探针 • CAN / 串口 / 以太网 • 目标处理器(TC397 等) 联合验证数据流与判据 测试激励 场景 / 信号 / 时序 被测对象 模型 / 代码 / 目标板 被控对象模型 Plant / 环境 输出对比 基线 / 容差判定 判据:MIL↔SIL 偏差 ≤ 1e-3(相对)或 0.01(绝对);SIL↔PIL 偏差超限 → 查编译器优化 / 浮点单元 / 通信周期 覆盖率:状态覆盖率 100%、迁移覆盖率 ≥ 95%、条件覆盖率 ≥ 90%(示例阈值,按项目裁剪) 释放证据 报告 / 追溯

从工程落地角度看,联合验证并不是把三次仿真简单叠加,而是围绕同一套测试用例、同一套接口定义、同一套判据建立可追溯的证据链。测试用例通常以场景形式组织,例如“钥匙上电 → 自检通过 → 进入 Ready → 收到扭矩请求 → 输出使能”,每条用例记录输入信号序列、期望状态序列与期望输出范围。MIL 阶段用这些用例驱动模型,SIL 阶段把生成代码封装为 S-Function 或独立可执行程序回灌同一批用例,PIL 阶段则把代码下载到目标板,通过 CAN 或串口把状态量回传到 PC 侧与基线比对。

需要特别注意的是,Stateflow 的验证重点与纯 Simulink 不同。状态机的错误往往表现为迁移路径缺失、默认迁移误触发、并行状态竞争、事件排队顺序异常,这些在普通信号波形上不一定明显,必须结合状态覆盖率、迁移覆盖率以及状态活动日志来判断。因此在本课程后续章节中,会围绕 Stateflow 的状态、迁移、事件、并行与历史节点,逐一展开 MIL/SIL/PIL 的测试设计与结果判读方法。

建议在项目初期就固定三件事:接口信号命名与数据类型、测试用例编号规则、三阶段输出对比的容差表。这三项一旦在 MIL 阶段确定,SIL 与 PIL 阶段只需替换被测对象,验证脚本与判据可以最大程度复用,显著降低重复工作量。