2、测试环境搭建:Simulink基础配置、Test Harness创建、信号与参数映射

好,咱们进入第二章。测试环境搭建,说白了就是给被测模型搭个台子。台子搭不好,后面所有脚本跑起来都是扯淡。我见过太多人一上来就写脚本,结果连信号都连不上,白白浪费一整天。

这一章,我带你走一遍标准流程。你跟着做,基本不会出大问题。

2.1 Simulink基础配置

先说说Simulink的基础配置。很多人觉得这步无所谓,直接拖模型开干。嗯,这里要注意——配置不对,后面Test Harness创建时会报一堆莫名其妙的错。

第一步:模型参数设置

打开你的Simulink模型,进到 Model Settings。我个人习惯先做三件事:

  • Solver设置:固定步长,选 discrete (no continuous states)。为什么?MIL测试跑的是离散逻辑,连续求解器纯属浪费算力。
  • 数据类型:勾上 Signal resolutionAll。这样你后面映射信号时,不会因为数据类型不匹配而报错。
  • 代码生成:虽然MIL阶段不生成代码,但我建议把 System target file 设为 grt.tlc。这是为了后续HIL/SIL复用,省得再改。
小技巧:我习惯把模型保存为 slx 格式,别用 mdl。slx 是压缩包,Git管理时冲突少很多。

第二步:工作空间与数据字典

测试环境里,参数最好别硬编码在模型里。我建议用 Data Dictionary 或者 Base Workspace。我个人偏向数据字典,因为多人协作时,字典文件可以统一管理。

举个例子,你有个参数 Ts = 0.01,别在模型里写死。在字典里定义好,脚本里直接 load('myDict.sldd') 就行。改参数时,改一处全模型生效。

注意:我曾经遇到过团队里有人直接在模型里改参数,结果合代码时冲突了三天。从那以后,我强制要求所有参数必须走数据字典。

2.2 Test Harness创建

Test Harness,就是测试线束。它把被测模型包起来,提供输入输出接口。说白了,就是给模型穿件衣服,方便你往里面塞测试数据。

创建方式有两种:

  1. 右键创建:在模型上右键,选 Test Harness > Create。这是最快的方式,适合简单模型。
  2. 脚本创建:用 sltest.harness.create 函数。适合自动化场景。

我一般用脚本方式,因为可以批量创建。给你看段代码:

% 创建Test Harness
modelName = 'myModel';
harnessName = 'myHarness';

% 创建harness
sltest.harness.create(modelName, ...
    'Name', harnessName, ...
    'Source', 'Input', ...
    'Sink', 'Output', ...
    'Overwrite', 'on');

% 打开harness
sltest.harness.open(modelName, harnessName);

这段代码干了什么?它创建了一个带输入输出端口的Harness。输入端口用来灌测试数据,输出端口用来抓结果。嗯,这里要注意——SourceSink 参数决定了Harness的接口形式。我习惯都选上,这样既能注入又能观测。

Harness里要放什么?

  • Signal BuilderFrom Workspace:用来提供测试激励。
  • ScopeTo Workspace:用来记录输出。
  • Assertion模块:用来做实时检查。比如信号超限就报错。
核心原则:Harness只负责接口,不负责逻辑。被测模型才是核心。别把测试逻辑写进Harness里,否则后面维护会疯掉。

2.3 信号与参数映射

这一步最容易被忽视,也最容易出问题。信号映射,就是把Harness里的信号和模型里的端口对上。参数映射,就是把测试脚本里的参数和模型里的变量对上。

信号映射怎么做?

在Harness里,每个输入输出端口都要映射到模型的具体端口。你可以手动拖线,也可以用脚本:

% 获取harness中的信号线
harnessPath = [modelName '/' harnessName];
inputLine = [harnessPath '/Input'];

% 映射到模型端口
sltest.harness.mapSignal(harnessPath, ...
    'Signal', inputLine, ...
    'ModelPort', 'myModel/In1');

你想想看,如果模型有50个输入端口,手动拖线得拖到什么时候?脚本一行搞定。

参数映射的坑

参数映射,说白了就是让测试脚本能控制模型里的 GainConstant 这些模块的参数。我遇到过最坑的事——脚本里改了参数,但模型没更新。为什么?因为参数没映射对。

正确的做法是:

  1. 在模型里,把需要测试的参数设成 Simulink.Parameter 类型。
  2. 在数据字典或工作空间里定义这些参数。
  3. 在测试脚本里,用 set_paramassignin 修改参数值。

举个例子:

% 定义参数
myGain = Simulink.Parameter(2.0);
myGain.CoderInfo.StorageClass = 'ExportedGlobal';

% 在脚本中修改
assignin('base', 'myGain', 3.5);
% 或者
set_param('myModel/Gain', 'Gain', 'myGain');
避坑指南:我曾经在项目里用 set_param 直接写数值,结果模型一重启参数就丢了。后来改用 Simulink.Parameter 对象,配合数据字典,再也没出过问题。

映射检查清单

每次搭完环境,我建议你跑一遍这个清单:

检查项 说明
信号连接 Harness的每个输入输出都连到模型端口了吗?
数据类型 信号类型是否匹配?double对double,boolean对boolean。
参数可见性 测试脚本能读到所有需要修改的参数吗?
初始化顺序 参数在模型初始化前赋值了吗?

嗯,这四步走完,你的测试环境基本就稳了。下一章我们开始写第一个自动化脚本,到时候你就知道,环境搭得好,脚本写得快。