2、测试环境搭建:Simulink基础配置、Test Harness创建、信号与参数映射
好,咱们进入第二章。测试环境搭建,说白了就是给被测模型搭个台子。台子搭不好,后面所有脚本跑起来都是扯淡。我见过太多人一上来就写脚本,结果连信号都连不上,白白浪费一整天。
这一章,我带你走一遍标准流程。你跟着做,基本不会出大问题。
2.1 Simulink基础配置
先说说Simulink的基础配置。很多人觉得这步无所谓,直接拖模型开干。嗯,这里要注意——配置不对,后面Test Harness创建时会报一堆莫名其妙的错。
第一步:模型参数设置
打开你的Simulink模型,进到 Model Settings。我个人习惯先做三件事:
- Solver设置:固定步长,选
discrete (no continuous states)。为什么?MIL测试跑的是离散逻辑,连续求解器纯属浪费算力。 - 数据类型:勾上
Signal resolution为All。这样你后面映射信号时,不会因为数据类型不匹配而报错。 - 代码生成:虽然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,就是测试线束。它把被测模型包起来,提供输入输出接口。说白了,就是给模型穿件衣服,方便你往里面塞测试数据。
创建方式有两种:
- 右键创建:在模型上右键,选
Test Harness > Create。这是最快的方式,适合简单模型。 - 脚本创建:用
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。输入端口用来灌测试数据,输出端口用来抓结果。嗯,这里要注意——Source 和 Sink 参数决定了Harness的接口形式。我习惯都选上,这样既能注入又能观测。
Harness里要放什么?
- Signal Builder 或 From Workspace:用来提供测试激励。
- Scope 或 To Workspace:用来记录输出。
- Assertion模块:用来做实时检查。比如信号超限就报错。
2.3 信号与参数映射
这一步最容易被忽视,也最容易出问题。信号映射,就是把Harness里的信号和模型里的端口对上。参数映射,就是把测试脚本里的参数和模型里的变量对上。
信号映射怎么做?
在Harness里,每个输入输出端口都要映射到模型的具体端口。你可以手动拖线,也可以用脚本:
% 获取harness中的信号线
harnessPath = [modelName '/' harnessName];
inputLine = [harnessPath '/Input'];
% 映射到模型端口
sltest.harness.mapSignal(harnessPath, ...
'Signal', inputLine, ...
'ModelPort', 'myModel/In1');
你想想看,如果模型有50个输入端口,手动拖线得拖到什么时候?脚本一行搞定。
参数映射的坑
参数映射,说白了就是让测试脚本能控制模型里的 Gain、Constant 这些模块的参数。我遇到过最坑的事——脚本里改了参数,但模型没更新。为什么?因为参数没映射对。
正确的做法是:
- 在模型里,把需要测试的参数设成
Simulink.Parameter类型。 - 在数据字典或工作空间里定义这些参数。
- 在测试脚本里,用
set_param或assignin修改参数值。
举个例子:
% 定义参数
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。 |
| 参数可见性 | 测试脚本能读到所有需要修改的参数吗? |
| 初始化顺序 | 参数在模型初始化前赋值了吗? |
嗯,这四步走完,你的测试环境基本就稳了。下一章我们开始写第一个自动化脚本,到时候你就知道,环境搭得好,脚本写得快。