
编写测试序列与测试评估完整示例
1. 概念讲解
本讲把第 9~11 讲的概念串成一个端到端示例。示例对象是变速器换挡逻辑控制器:Test Sequence 模块改变控制器的速度输入,Test Assessment 模块验证当前挡位下速度是否合理。模型如下:shift_controller 接收 speed、throttle、brake,输出 gear 给 vehicle 子系统。

这个示例覆盖了建立测试框架、添加两个模块、编写输入序列与评估、运行并查看结果四个阶段。所有命令与对话框选项均按指南原文给出。
学习本示例时建议把它当作一张"最小闭环地图":Test Sequence 负责"施加什么激励",Test Assessment 负责"如何判定",二者通过信号端口解耦------激励侧只管输出 speed、throttle,评估侧只管按 gear 取值分档验证 speed。这种"激励与评估分离"的写法与第 2 讲把 Test Assessment 做成库链接子系统跨框架复用的思路一脉相承,是规模化测试的基础。
2. 操作步骤 / 工作流
2.1 建立测试框架(Create a Test Sequence)
- 打开模型:
scss
open_system('TransmissionDownshiftTestSequence')
-
右键
shift_controller子系统,选择 Test Harness > Create for 'shift_controller' 。 -
在 Create Test Harness 对话框的 Sources and Sinks 区:
- 把源下拉框设为 Test Sequence;
- 勾选 Add separate assessment block;
- 勾选 Open harness after creation。

- 单击 OK ,
shift_controller的测试框架打开。框架结构如下图:Test Sequence 生成speed、throttle,Test Assessment 接收speed_A、throttle_A、gear_A。

- 双击 Test Sequence 块,打开 Test Sequence Editor。
- 把第一个步骤名从
Run改为Accelerate,并添加步骤动作------指定初始油门设置与速度上升方式:
ini
speed = 10*ramp(et);
throttle = 100;
其中 ramp 函数返回斜率为 1 的斜坡信号在 et(本步骤已流逝时间,elapsed time)处的值;本示例中某时刻的速度是该时刻 ramp 值的 10 倍。
- 右键
Accelerate步骤,选择 Add step after ;把新步骤名从step_1改为Stop,添加在油门与速度都为 0 时停止测试的动作:
ini
throttle = 0;
speed = 0;
- 在 Symbols 窗格中悬停到 Constant ,单击 add data 按钮;常量名输入
Limit,单击 Add data。 - 悬停到
Limit,单击 edit 按钮;在 Constant value 字段输入2,单击 OK。

- 右键第一个步骤的 Transition 列,选择 Add transition ;为
Accelerate步骤输入转移条件------当系统处于四挡至少 2 秒时转移到Stop:
ini
duration(gear == 4) >= Limit
- 在 Next Step 列选择
Stop。 - 保存更改并关闭 Test Sequence Editor。最终 Test Sequence 编辑器如下图:
Accelerate步骤动作为speed = 10*ramp(et); throttle = 100;,转移为duration(gear == 4) >= Limit,下一步为Stop;Stop动作为油门与速度归零。

2.2 建立测试评估(Create a Test Assessment)
- 双击 Test Assessment 块打开编辑器;编辑器在 Step 列显示默认的 When 分解序列。
- 把第一个步骤名从
Run改为Assessments。 - 右键
Assessments步骤,选择 Add sub-step;重复一次,共添加四个子步骤。 - 按下表改名并添加动作;第四个子步骤
else处理前面 when 条件之外的仿真工况,不写任何动作:
| 子步骤名 | when 条件与 verify |
|---|---|
| Check1st | when gear == 1,verify(speed < 45) |
| Check2nd | when gear == 2,verify(speed < 75) |
| Check3rd | when gear == 3,verify(speed < 105) |
| else | (无动作,不写 when) |

- 保存更改并关闭 Test Sequence Editor。
2.3 运行与查看结果
- 在测试框架中添加一个 Scope 块,把
speed、throttle、gear信号接到 Scope。 - 打开 Scope,在 View > Layout 中选三列一行布局。
- 在 Simulink 模型的 Simulation 选项卡把 Stop Time 设为
15,单击 Run。在 Scope 中查看信号:速度曲线上升到最大值 105;油门全程保持 100;齿轮在合适速度升到高一挡;当齿轮等于 4 持续 2 秒后,速度与油门归零,齿轮降挡。

-
在 Simulation Data Inspector 中查看
verify结果:- 在 Simulink 模型的 Simulation 选项卡单击 Data Inspector;
- 单击 Visualizations and layouts 按钮,在 Grid 下把 Rows 设为 3、Columns 设为 1;
- 选中一个绘图区,然后从左侧窗格选一条评估;对其余绘图区与评估重复。
模型运行时,Test Assessment 验证每个挡位下速度是否在正确区间:Pass 表示速度在正确范围。每条 verify 针对一个特定挡位,因此控制器处于其他挡位时速度为 untested。Check1st 出现两段 Pass 区,因为测试序列第二步中齿轮又回到了一挡。

3. 示例
scss
% 打开示例模型
open_system('TransmissionDownshiftTestSequence')
Test Sequence 中的关键语句汇总:
ini
% Accelerate 步骤动作
speed = 10*ramp(et);
throttle = 100;
% Accelerate 转移条件
duration(gear == 4) >= Limit
% Stop 步骤动作
throttle = 0;
speed = 0;
Test Assessment 中的 When 分解:
ini
Check1st when gear == 1
verify(speed < 45)
Check2nd when gear == 2
verify(speed < 75)
Check3rd when gear == 3
verify(speed < 105)
else
4. 要点与注意事项
- 创建测试框架时勾选 Add separate assessment block,Test Sequence 与 Test Assessment 才会分成两个独立块;不勾选则评估逻辑混在序列里。
ramp(et)中的et是步骤级已流逝时间,不是全局仿真时间;每个新步骤开始时et归零。- 阈值
2做成 Constant 数据Limit,而不是把数字直接写在转移条件里------便于以后统一调整。 duration(gear == 4) >= Limit表示"该条件已连续持续的时间",不是"从仿真开始累计"。- 三条
verify分别针对一/二/三挡;四挡与降挡区间由else兜住、不评判,因此 SDI 中大量灰色 Untested 是正常现象,不是错误。 - Scope 只用来观察波形;判定结果以 SDI 中
verify的 Pass/Fail/Untested 段为准。Scope 的三列一行布局是临时调试手段,最终判定不依赖它。 - Stop Time 设为 15 秒要与测试序列时长(加速到四挡持续 2 秒再减速)匹配,否则可能截尾。若改大
Limit或换模型,应相应延长 Stop Time。 - 本例中
verify没有带可选消息(如'speed in 1st gear must stay below 45');在真实项目中建议为每条verify补消息,失败时直接在结果窗格读出判据含义,不必回头翻模型。