测试框架与模型的关系及特定模型元素的构造

0 阅读8分钟

测试框架与模型的关系及特定模型元素的构造

1. 概念讲解

1.1 什么是测试框架

测试框架是一张你可以用来测试、编辑或调试 Simulink 模型的框图(model block diagram)。

在主模型中,你把一个测试框架关联到某个模型组件,或者关联到顶层模型。

测试框架拥有独立的模型工作区(Model Workspace)与配置集(Configuration Set) ,它与主模型关联,并通过模型画布访问。当你创建外部测试框架(External Test Harness) 时,系统还会生成一个元数据 XML 文件,其中保存设计模型的唯一 ID,以此维护模型与测试框架之间的关联;该 XML 文件不必与模型放在同一文件夹,只要二者都在 MATLAB 路径上即可。

围绕被测组件(Component Under Test,CUT)搭建测试框架框图,从而把测试框架链接到主模型。如果你在测试框架中编辑了被测组件,关闭测试框架时主模型会随之更新。可创建测试框架的对象有两类:

  • 模型组件:子系统、库模块、Subsystem Reference 模块、Model 模块、System Composer 组件等。测试框架把该组件隔离到独立的仿真环境中。
  • 顶层模型:此时被测组件是一个引用主模型的 Model 模块;你也可以在子系统模型(Subsystem Model)中搭建测试框架。

1.2 两种关联图景下的参数归属

关联到模型组件时,测试框架的模型工作区中保存与该组件相关联参数的副本。以一个含 Gain 模块的组件为例,创建测试框架后再往框架里加第二个 Gain 模块:

  • 参数 g 属于被测组件本身,因此测试框架模型工作区中含有 g 的副本;
  • 参数 a 属于主模型中被测组件之外的部分,测试框架模型工作区不复制 a;
  • 参数 h 是你在测试框架里新增 Gain 模块的增益,它只存在于测试框架模型工作区。

关联到顶层模型时,被测组件是一个引用主模型的 Model 模块,参数仍留在主模型工作区中:参数 g 存在于主模型工作区,测试框架不复制它;你在框架内新增 Gain 模块的参数 h 则只存在于测试框架模型工作区。

参数解析(Resolving Parameters) :测试框架中的参数按最局部工作区优先的顺序解析——先解析测试框架模型工作区,再解析系统模型工作区,最后解析 MATLAB 基础工作区。

1.3 测试框架注意事项(Considerations)

可以为以下组件创建测试框架:Model 模块、Subsystem Reference 模块、Subsystem 模块、库顶层中具有函数接口的可复用库子系统、Stateflow 块(含 Stateflow 图、Truth Table、State Transition Table、Test Sequence 块)、System Composer 组件、C Caller 块、MATLAB Function 块以及用户自定义函数块。

不支持测试框架的 Stateflow 对象包括:Subsystem Reference 块内部的任何组件、原子子图(Atomic subcharts)、基于 Simulink 的状态、Simulink Function 与 MATLAB Function。其他重要约束:每个 Simulink 模型一次只能打开一个测试框架;不要在测试框架中把被测组件注释掉(comment out),否则可能产生意外行为;Subsystem 模型上的测试框架总是随底层模型同步、创建时不编译、不支持创建后回调、不自动整形输入;带子系统测试框架的子系统不能展开(Expand)进主模型;Subsystem Reference 块只同步块参数、不同步块内容;把 Subsystem 或 Subsystem Reference 转成 Model 块时,测试框架会转移到模型引用上并全部变为内部框架(可能被重命名),但 SIL/PIL 框架与需求不会随之转移;带 Signal Editor 源的框架不支持帧信号与变维信号;以 Test Sequence 块或 Stateflow 图为源时,被测组件所有输入必须使用相同采样时间。需要跨模型聚合覆盖率时,应把同步模式设为"打开与关闭测试框架时同步"。

1.4 针对特定模型元素的构造规则

测试框架由一个或多个驱动被测组件的源块、被测组件本身以及一个或多个汇块组成,如下图所示。构造过程负责配置信号属性、函数调用、数据存储与执行语义,并尽量在源、汇与组件接口之间匹配信号属性。

  • 信号转换(Signal Conversion) :信号转换子系统把源/汇块的信号接口适配到组件的图形接口(输入、输出以及 action/trigger/enable 输入)。测试框架编译主模型以确定数据类型、维度、复数性。若源块能直接产生编译所得属性,则配置源块自行产生;否则在信号转换子系统中加入 Reshape、Rate Transition、Data Type Conversion 等信号属性块进行适配。信号转换子系统默认锁定、不可编辑。
  • 函数调用(Function Calls) :若被测组件有函数调用输入,即使你在创建时选了别的源,Test Sequence 块、MATLAB Function 块或 Stateflow 图仍会自动生成函数调用输入。要改用自选源,需用 sltest.harness.create 并把 'DriveFcnCallWithTestSequence' 设为 false。被测组件的函数调用输出连接到 Terminator 块。
  • 物理信号连接(Physical Signal Connections) :接受或输出物理信号的组件在构造时被支持,但不会自动生成物理源/汇,构造完成后你需要自行添加物理建模块。
  • 总线信号(Bus Signals) :能接受总线的源/汇直接连接;源不能输出总线时,信号转换子系统会用各总线元素自动拼出总线;汇不能接受总线时,总线元素会在转换子系统中被展开。
  • 字符串信号(String Signals) :被测组件使用字符串输入而所选源不支持字符串时,字符串输入接到 Ground 块(Inport 源除外,仍用 Inport;Constant 源用 String Constant,含字符串的总线用 Ground);字符串输出不被所选汇支持时接到 Terminator 块。
  • 非图形连接(Non-Graphical Connections) :跨组件边界的 Goto–From 对被视为组件输入/输出——组件内没有对应 Goto 的 From 视为输入,框架会带对应 Goto 的源块;组件内没有对应 From 的 Goto 视为输出,框架会带对应 From 的汇块。Data Store Read/Write 缺少 Data Store Memory 时框架自动补齐;只有 Read 时补"源→Data Store Write",只有 Write 时补"Data Store Read→汇"。组件调用了未在其内部定义的 Simulink Function 时,框架会添加一个签名匹配的桩(stub)Simulink Function 块。
  • 导出函数模型(Export Function Models) :测试框架内置函数调用调度器(Test Sequence 块、MATLAB Function 块或 Stateflow 图),其中包含对模型函数的原型调用;调度器 Test Sequence 步目中列出组件内全局作用域的 Simulink Function 目录与组件接口处可访问的函数调用触发,并对周期性触发做适当抽取(decimation)。含 Initialize/Terminate/Reset 事件子系统的模型,框架自动包含相应步骤;其他导出函数模型可用 sltest.harness.create 的 'ScheduleInitTermReset' 属性加入这些步骤。
  • 执行语义(Execution Semantics) :框架构造时把主模型的配置参数、所需模型工作区参数定义复制进来,并在条件满足时复制数据字典设置;对采样时间只支持其中一个有限子集(用显式源块规格与 Rate Transition 块实现)。组件的图形与编译接口优先于其他执行语义。
  • 采样时间规范(Sample Time Specification) :支持周期性离散、连续与固定在小步(fixed-in-minor-step)采样时间:支持该速率的源块被配置为对应速率,并在信号转换子系统中放置带速率规格的 Signal Specification 块;不能支持该速率的源块不被配置;周期离散与固定小步速率会在转换子系统中加入 Rate Transition 块;连续速率由求解器决定,不加 Rate Transition。其他采样时间规范在构造时被忽略,由求解器决定执行行为。

2. 操作步骤 / 工作流

本讲以理解构造规则为主,手动操作很少;典型触发路径为:

  1. 在模型中右键目标组件或画布,选择 Test Harness > Create,在对话框中选择源/汇(Sources and Sinks)。
  2. 保持默认设置时,框架按 1.4 节规则自动完成信号适配、函数调用调度、总线拆分与非图形连接补全。
  3. 若需让函数调用输入接到自选源,改用命令行创建(见下节示例)。
  4. 构造完成后检查信号转换子系统(默认锁定),必要时解锁后手动调整物理信号连接或新增块。

3. 示例

% 为含函数调用输入的子系统创建测试框架,
% 并把函数调用输入接到自选源(From File),而不是默认的 Test Sequence
sltest.harness.create('Model/FcnCallSubsystem','Source','From File',...
    'DriveFcnCallWithTestSequence',false)

4. 要点与注意事项

  • 测试框架拥有独立模型工作区与配置集;组件级框架复制组件参数副本,顶层框架不复制参数——判断参数归谁所有,先看框架挂在组件上还是挂在顶层。
  • 参数解析顺序:测试框架模型工作区 → 系统模型工作区 → MATLAB 基础工作区。
  • 一次只能打开一个测试框架;切勿注释掉被测组件;子系统带测试框架时不能执行展开。
  • 信号转换子系统默认锁定;编译主模型后才能得到正确的数据类型、维度与复数性。
  • 用 Test Sequence 或 Stateflow 图作源时,被测组件全部输入必须同采样时间。
  • 需要跨模型聚合覆盖率时,同步模式必须选"打开与关闭时同步"(