编写测试序列与测试评估完整示例

编写测试序列与测试评估完整示例

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)
  1. 打开模型:
scss 复制代码
open_system('TransmissionDownshiftTestSequence')
  1. 右键 shift_controller 子系统,选择 Test Harness > Create for 'shift_controller' 。

  2. 在 Create Test Harness 对话框的 Sources and Sinks 区:

    1. 把源下拉框设为 Test Sequence;
    2. 勾选 Add separate assessment block;
    3. 勾选 Open harness after creation。
  1. 单击 OK ,shift_controller 的测试框架打开。框架结构如下图:Test Sequence 生成 speed、throttle,Test Assessment 接收 speed_A、throttle_A、gear_A。
  1. 双击 Test Sequence 块,打开 Test Sequence Editor。
  2. 把第一个步骤名从 Run 改为 Accelerate,并添加步骤动作------指定初始油门设置与速度上升方式:
ini 复制代码
speed = 10*ramp(et);
throttle = 100;

其中 ramp 函数返回斜率为 1 的斜坡信号在 et(本步骤已流逝时间,elapsed time)处的值;本示例中某时刻的速度是该时刻 ramp 值的 10 倍。

  1. 右键 Accelerate 步骤,选择 Add step after ;把新步骤名从 step_1 改为 Stop,添加在油门与速度都为 0 时停止测试的动作:
ini 复制代码
throttle = 0;
speed = 0;
  1. 在 Symbols 窗格中悬停到 Constant ,单击 add data 按钮;常量名输入 Limit,单击 Add data。
  2. 悬停到 Limit,单击 edit 按钮;在 Constant value 字段输入 2,单击 OK。
  1. 右键第一个步骤的 Transition 列,选择 Add transition ;为 Accelerate 步骤输入转移条件------当系统处于四挡至少 2 秒时转移到 Stop:
ini 复制代码
duration(gear == 4) >= Limit
  1. 在 Next Step 列选择 Stop。
  2. 保存更改并关闭 Test Sequence Editor。最终 Test Sequence 编辑器如下图:Accelerate 步骤动作为 speed = 10*ramp(et); throttle = 100;,转移为 duration(gear == 4) >= Limit,下一步为 Stop;Stop 动作为油门与速度归零。
2.2 建立测试评估(Create a Test Assessment)
  1. 双击 Test Assessment 块打开编辑器;编辑器在 Step 列显示默认的 When 分解序列。
  2. 把第一个步骤名从 Run 改为 Assessments。
  3. 右键 Assessments 步骤,选择 Add sub-step;重复一次,共添加四个子步骤。
  4. 按下表改名并添加动作;第四个子步骤 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)
  1. 保存更改并关闭 Test Sequence Editor。
2.3 运行与查看结果
  1. 在测试框架中添加一个 Scope 块,把 speed、throttle、gear 信号接到 Scope。
  2. 打开 Scope,在 View > Layout 中选三列一行布局。
  3. 在 Simulink 模型的 Simulation 选项卡把 Stop Time 设为 15,单击 Run。在 Scope 中查看信号:速度曲线上升到最大值 105;油门全程保持 100;齿轮在合适速度升到高一挡;当齿轮等于 4 持续 2 秒后,速度与油门归零,齿轮降挡。
  1. 在 Simulation Data Inspector 中查看 verify 结果:

    1. 在 Simulink 模型的 Simulation 选项卡单击 Data Inspector;
    2. 单击 Visualizations and layouts 按钮,在 Grid 下把 Rows 设为 3、Columns 设为 1;
    3. 选中一个绘图区,然后从左侧窗格选一条评估;对其余绘图区与评估重复。

模型运行时,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 补消息,失败时直接在结果窗格读出判据含义,不必回头翻模型。
相关推荐
codigger5 小时前
别再手动催 AI 干活了:一文读懂 Loop Engineering(循环工程)
ai·程序员·编程语言·#人工智能
挖掘狂人5 小时前
别再手动催 AI 干活了:一文读懂 Loop Engineering(循环工程)
人工智能·程序员·ai编程
千里马学框架5 小时前
Service服务绑定对进程adj影响及常见绑定错误
android·智能手机·性能优化·程序员·framework·性能·安卓失业
kyriewen19 小时前
我让 4 个 AI 互相 review 代码,最温柔的那个下手最狠
前端·程序员·ai编程
程序员cxuan21 小时前
掀桌子了!Kimi K3.1 Pro 这效果也太离谱了。
人工智能·后端·程序员
不脱发的程序猿1 天前
红利ETF量化策略
人工智能·python·ai·程序员·量化交易·etf·策略回测
陈随易1 天前
终于 Token 自由了,AI 开支下降 10 倍
前端·后端·程序员
codigger1 天前
别再靠"最终版-改"活下去了:一篇讲透 Git 与 GitHub
git·程序员·github·编程·控制版本
陈随易1 天前
从今天起,你只需要一个浏览器之Ego lite
前端·后端·程序员