1. 概念讲解
测试框架是与设计模型隔离的独立工作区,你可以为整个模型创建,也可以为模型中的一个或多个组件创建,还可以从一个独立测试模型导入现成的框图作为测试框架。
两种创建入口:
为顶层模型(含子系统模型与模型引用模型)创建时,直接在 Simulink 模型画布空白处右键,选择 Test Harness > Create for Model,打开 Create Test Harness 对话框。
为一个或多个模型组件创建时,走测试管理器向导:在 Apps 选项卡的 Model Verification, Validation, and Test 组中单击 Simulink Test,在 Tests 选项卡单击 Simulink Test Manager,新建测试文件后单击 New > Test for Model Component,按向导指定模型并选择组件(选多个组件时向导为每个组件各建一个测试框架)。
需要注意:该向导只暴露一部分测试框架选项;若你的框架不使用非默认选项,用向导快速创建即可,之后再用测试框架属性对话框调整其他选项。
导入测试框架:右键模型或某组件,分别选择 Test Harness > Import for Model 或 Test Harness > Import for Component,打开 Import Test Harness 对话框。
预览与打开:组件带有测试框架时,模块右下角会出现徽标;单击徽标即可看到该组件的测试框架缩略图,单击某张瓦片(tile)即打开对应框架。对模型框图级框架,则单击模型画布上的拉出图标(pullout icon)查看瓦片。
修改属性:打开中的测试框架,单击其框图上的徽标,选择 Test harness properties;在主模型一侧,则从测试框架预览上单击 Harness operations 图标。
2. 操作步骤 / 工作流
选择属性前先想清楚五件事:测试输入用什么数据源;测试输出如何观察或保存;是否要把主模型的参数与工作区复制到框架;是否打算在框架中编辑被测组件;希望框架与模型之间如何同步。除源块与汇块外,其他属性事后都能在框架属性对话框中修改;源/汇一旦创建不能在对话框里改,只能手动删块换新。
Create Test Harness 对话框主要属性:
| 属性 | 含义 |
|---|---|
| Harness Name | 必须是合法 MATLAB 文件名 |
| Save test harnesses externally | 勾选则框架存为外部独立 SLX 文件并生成 harness 信息 XML;不勾选则存在模型 SLX/MDL 内部。模型已有框架时该复选框消失,改为提示当前是内部还是外部存储(一个模型的所有框架存储方式必须一致) |
| Select Function Interface | 仅当被测组件是带函数接口的可复用库子系统时出现,用于选择关联的函数接口 |
| Sources and Sinks | 从菜单选常用源/汇;也可选 Custom source/sink 并填块路径(如 simulink/Sources/Sine Wave、simulink/Sinks/Terminator),自定义源/汇按端口一接一块 |
| Create scalar inputs | 为多维信号创建标量输入再 reshape 回原维度;适用于 Inport、Constant、Signal Editor、From Workspace、From File 源,不适用于 Subsystem 模型 |
| Add scheduler for function-calls and rates / Generate function-call signals using | 模型级框架用于调度函数与设置 I/O 采样时间,子系统级框架用于调子系统内函数;可选用 Test Sequence 块、MATLAB Function 块或 Stateflow 图作调度器 |
| Enable Initialize, Reset, and Terminate ports | 暴露被测组件的 initialize/terminate/reset 函数调用端口并接好调度器;仅顶层模型框架且选了调度器时出现。运行时若报端口执行函数调用错误,可用 set_param(<子系统>,'ShowModelInitializePort','off') 等三条命令隐藏断开 |
| Add separate assessment block | 在框架中加入独立的 Test Assessment 块 |
| Log Output Signals | 记录被测组件全部输出信号(仅新建时可选;未命名信号按 <被测组件名>:<输出端口号> 命名;右键信号选 Stop Logging Selected Signals 可取消记录) |
| Open Harness After Creation | 取消勾选则创建后不打开,便于连续创建多个框架 |
| Create without compiling the model | 不编译主模型即可建框架:参数与主模型配置不复制、框架不含转换子系统,待模型可编译后再重建(Rebuild)。Subsystem 模型框架总是不编译创建 |
| Verification Modes | Normal(普通框图);SIL、PIL(引用生成代码,需 Embedded Coder)。Subsystem 模型框架不支持 SIL/PIL。选 SIL/PIL 时务必同时选 Rebuild harness on open,否则代码不反映主模型最新设计 |
| Use generated code to create SIL/PIL block / Build folder | 已有生成代码时复用之,并指定代码所在文件夹;仅子系统框架可用 |
| Post-create callback method / Post-rebuild callback method | 创建后/重建后运行的回调函数,多个用逗号分隔、按序执行(第 6 讲展开);Subsystem 模型框架不支持 |
| Rebuild harness on open | 每次打开框架都重建 |
| Update Configuration Parameters and Model Workspace data on rebuild | 重建时同步配置参数与模型工作区数据 |
| Synchronization Mode | 控制被测组件改动何时同步回主模型、框架属主改动何时同步进框架,并影响锁定方式,详见第 7 讲 |
Import Test Harness 对话框主要属性:Name(导入后框架名)、Save Test Harnesses Externally(存储方式规则同上)、Simulink model to import(要导入的独立测试模型名或完整路径)、Component under Test in imported model(独立模型中被测组件路径)、Rebuild harness on open、Update Configuration Parameters and Model Workspace data on rebuild。
定制创建默认属性值:新建框架的默认属性可用 sl_customization.m 或 sltest.harness.setHarnessCreateDefaults 设置,之后所有新建框架都套用新默认值;用 sltest.harness.getHarnessCreateDefaults 查看当前默认值。在对话框或 sltest.harness.create 中为某个框架改值不影响全局默认。
3. 示例
% 用 sl_customization.m 设置新建框架默认值的写法
function sl_customization(cm)
myStruct.Name = "myTestHarness";
myStruct.PostCreateCallback = "addHarnessAnnotation";
myStruct.SaveExternally = false;
myStruct.LogOutputs = true;
cObj = cm.SimulinkTestCustomizer;
cObj.setHarnessCreateDefaults(myStruct);
end
% 保存后把文件放入 MATLAB 路径,并运行 sl_refresh_customizations 注册
% 命令行方式设置/查看默认值
sltest.harness.setHarnessCreateDefaults('LogOutputs',true);
sltest.harness.getHarnessCreateDefaults
4. 要点与注意事项
- 一个模型的所有测试框架要么全部内部存储、要么全部外部存储,不能混用;已建框架后再建框架,复选框消失,提示当前存储方式。
- 外部框架依赖
<模型名>_harnessInfo.xml元数据文件,删除或手动修改该文件会切断模型与框架的关联且无法恢复(第 5 讲展开)。 - 源块与汇块在框架创建后不能在属性对话框中改,只能手动删块替换——创建前务必选好。
- 选 SIL/PIL 验证模式时务必同时选 Rebuild harness on open,并在需要时用 Rebuild Harness > Update Harness Configuration Settings and Model Workspace 重新生成代码。
- 向导(Create Test for Model Component)只暴露部分选项,复杂需求先快速建框架再改属性。
- 注册 sl_customization 后,其值成为全局默认,之前注册的值会被清空。