第1章:信号与数据管理——Test Sequence模块详解、Signal Builder使用技巧、测试数据导入导出

大家好,我是老赵。在汽车电子测试这行摸爬滚打了十几年,今天咱们来聊聊基于模型的测试里最基础也最核心的一块——信号与数据管理。

你想想看,做测试最怕什么?不是模型跑不通,而是测试数据乱七八糟。信号给错了、数据格式不对、测试序列逻辑混乱……这些坑我年轻时都踩过。所以这一章,我把压箱底的经验掏出来,跟你好好说说Test Sequence、Signal Builder和数据导入导出这些事儿。

信号与数据管理 Test Sequence模块 Signal Builder Excel/MAT文件导入导出 时序控制 · 状态跳转 · 断言 波形编辑 · 信号组 · 参数化 数据持久化 · 批量测试 · 报告生成

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”
  • 自动化:能用脚本做的,绝不用手动

好了,这一章的内容就到这里。信号与数据管理是测试的基础,基础打牢了,后面写测试用例、做自动化才能得心应手。记住我一句话:测试数据整理得有多好,你的测试效率就有多高。

专注资料整理