第1章:信号与数据管理——Test Sequence模块详解、Signal Builder使用技巧、测试数据导入导出
大家好,我是老赵。在汽车电子测试这行摸爬滚打了十几年,今天咱们来聊聊基于模型的测试里最基础也最核心的一块——信号与数据管理。
你想想看,做测试最怕什么?不是模型跑不通,而是测试数据乱七八糟。信号给错了、数据格式不对、测试序列逻辑混乱……这些坑我年轻时都踩过。所以这一章,我把压箱底的经验掏出来,跟你好好说说Test Sequence、Signal Builder和数据导入导出这些事儿。
1.1 Test Sequence模块——测试逻辑的骨架
Test Sequence,说白了就是给测试模型写剧本。你定义好什么时候给什么信号,什么时候检查什么结果,它就像个导演一样,按时间轴一步步执行。
我个人习惯把Test Sequence当成测试用例的“大脑”。它里面可以写if-else、for循环、状态机,甚至还能调用MATLAB函数。嗯,这里要注意:别把Test Sequence当成普通的Stateflow用,它更侧重于测试场景的编排,而不是控制逻辑的实现。
核心要点:
- Step(步骤):每个Step就是一个测试动作,比如“给油门信号”、“等待2秒”、“检查转速”
- Transition(转移):Step之间的跳转条件,可以是时间触发、信号触发、或者逻辑表达式
- Outputs(输出):每个Step可以定义一组输出信号的值
- Assertions(断言):在Step里写assert语句,自动判断测试是否通过
我在项目中遇到过这样一个场景:测试一个ECU的唤醒逻辑,需要先给一个低电平,等500ms再给高电平,然后检查CAN报文。用Test Sequence写起来特别顺手:
// 伪代码示例
Step1: 设置Wakeup_Signal = 0
等待 500ms
跳转到 Step2
Step2: 设置Wakeup_Signal = 1
等待 200ms
断言 CAN_Message.WakeupAck == 1
跳转到 Step3
Step3: 测试结束,记录结果
小技巧:在Test Sequence里,我习惯把每个Step的“Duration”属性设为一个变量,比如T_wait。这样后期调整时间参数时,改一个变量就行,不用每个Step都改。你想想看,如果测试用例有50个Step,每个都硬编码时间,改起来得多痛苦?
1.2 Signal Builder——波形编辑的瑞士军刀
Signal Builder这个模块,说白了就是画波形用的。你可以在里面定义各种信号:正弦波、方波、锯齿波、自定义任意波形……而且它支持多组信号同时编辑,特别适合做传感器信号的模拟。
我记得刚入行那会儿,测试一个ABS系统,需要模拟轮速传感器在不同路况下的信号。用Signal Builder,我画了干燥路面、湿滑路面、冰雪路面三组波形,然后一键切换测试场景,效率提升不是一点半点。
| 信号类型 | 典型应用场景 | 我的建议 |
|---|---|---|
| 阶跃信号 | 模拟开关量、使能信号 | 注意设置上升/下降时间,避免仿真步长问题 |
| 正弦波 | 模拟传感器周期性信号 | 频率不要超过模型采样率的一半 |
| 自定义波形 | 模拟真实路谱、故障注入 | 可以从Excel导入实际采集的数据 |
| 脉冲序列 | 模拟PWM信号、CAN唤醒脉冲 | 注意占空比和周期的精度 |
避坑指南:我曾经在Signal Builder里定义了一个非常复杂的波形,结果仿真时模型跑得巨慢。后来发现是波形的时间分辨率设得太细了——0.001秒一个点,而模型步长是0.01秒。说白了,你给的数据精度远高于模型需要,白白浪费计算资源。建议信号的时间分辨率跟模型步长保持一致,或者略高一点就行。
1.3 测试数据导入导出——Excel和MAT文件实战
做测试最烦什么?重复劳动。每次都要手动输入几十个测试参数?不存在的。Simulink支持从Excel和MAT文件导入测试数据,也支持把测试结果导出。这一块,我建议你花点时间掌握,绝对值得。
1.3.1 从Excel导入测试用例
我个人习惯用Excel管理测试用例。每一行是一个测试用例,每一列是一个输入信号或期望输出。然后在Simulink里写个脚本,一键导入到Signal Builder或者Test Sequence里。
% MATLAB脚本示例:从Excel导入信号到Signal Builder
filename = 'test_cases.xlsx';
sheet = 'Sheet1';
data = readtable(filename);
% 假设Excel有三列:Time, Signal1, Signal2
time = data.Time;
sig1 = data.Signal1;
sig2 = data.Signal2;
% 创建Signal Builder信号组
sigbuilder = 'myModel/Signal Builder';
signalGroup = 1;
signalbuilder(sigbuilder, 'add', signalGroup, time, sig1, 'Signal1');
signalbuilder(sigbuilder, 'add', signalGroup, time, sig2, 'Signal2');
小技巧:Excel表格里,我习惯把第一列固定为时间轴,后面每列是一个信号。这样导入时逻辑清晰,不容易出错。另外,时间轴必须是单调递增的,否则Simulink会报错。
1.3.2 使用MAT文件保存测试场景
MAT文件是MATLAB的原生数据格式,读写速度比Excel快得多。如果你有大量的测试数据(比如几百个测试用例),我建议用MAT文件。
举个例子,我做过一个项目,需要测试ECU的100种故障模式。每个故障模式对应一组输入信号和期望输出。我把所有数据存到一个MAT文件里,结构体数组,每个元素是一个测试用例。然后在Simulink里循环加载,自动跑测试,自动生成报告。嗯,这才是自动化测试该有的样子。
% 保存测试数据到MAT文件
testData(1).time = 0:0.01:10;
testData(1).input = sin(testData(1).time);
testData(1).expectedOutput = cos(testData(1).time);
testData(2).time = 0:0.01:10;
testData(2).input = square(testData(2).time);
testData(2).expectedOutput = -square(testData(2).time);
save('test_scenarios.mat', 'testData');
1.3.3 导出测试结果到Excel
测试跑完了,结果怎么给团队看?我习惯把仿真结果导出到Excel,包括每个测试用例的通过/失败状态、关键信号的值、以及断言失败时的详细信息。
% 导出测试结果到Excel
results = table();
results.TestCaseID = (1:10)';
results.Status = {'Pass'; 'Fail'; 'Pass'; ...};
results.FailureReason = {'', 'Timeout', '', ...};
writetable(results, 'test_report.xlsx', 'Sheet', 'Summary');
数据管理黄金法则:
- 测试数据与模型分离:不要硬编码数据在模型里
- 版本控制:Excel和MAT文件都要纳入Git管理
- 命名规范:测试用例命名要有意义,比如“TC_ABS_DryRoad_001”
- 自动化:能用脚本做的,绝不用手动
好了,这一章的内容就到这里。信号与数据管理是测试的基础,基础打牢了,后面写测试用例、做自动化才能得心应手。记住我一句话:测试数据整理得有多好,你的测试效率就有多高。