使用 Simulink Test 的代码生成验证工作流程
此示例展示如何使用测试框架、Test Sequence 模块和测试管理器对模型执行代码生成验证 (CGV)。
打开燃料速率控制器模型
mdl = 'sltestFuelRateControlExample';
open_system(mdl);

模型描述
此示例使用汽油发动机的燃油速率控制器模型。控制器使用系统中的四个传感器来确定适当的燃料率。该系统使用的四个传感器是节气门角度、速度、EGO 和歧管绝对压力 [MAP]。
该模型使用三个子系统通过传感器输入来计算燃料率:control logic、airflow calc 和 fuel_calc。核心控制逻辑在名为 control_logic 的 Stateflow® 图中实现。控制逻辑处理单个传感器故障和发动机超速保护。如果单个传感器发生故障,运行仍会继续,但空气/燃料混合物会更浓,以实现更平稳的运行,但代价是更高的排放量。如果多个传感器出现故障,发动机将作为安全措施自动熄火,因为此时无法可靠地控制空燃比。
该模型估计空气流速,并将估计值乘以所需比率的倒数以得出燃料率。
打开测试框架
已为整个模型创建了名为 fuel_rate_control_cgv 的测试框架。请注意,在运行测试之前,使用测试框架打开的范围是空的。
sltest.harness.open(mdl,'fuel_rate_control_cgv');

工厂建模
测试框架已被建模为闭环测试,并使用 Test Sequence 模块来驱动燃油速率控制器。从控制器输出计算出的 fuel_rate 用于驱动汽油发动机模型。燃料速率与 Engine Gas Dynamics 子系统中的实际空气流量相结合,以确定排气处感测到的最终混合比。从氧气传感器到 Test Sequence 模块的反馈提供了速率估计的闭环调节,以保持理想的混合比。
请注意,工厂是在测试框架中而不是主模型中建模的。主模型没有多余的杂乱信息,因此只需对模型进行最少的更改即可轻松地为 ECU 构建代码。
型号传感器故障
名为 Sequence Sensor Failures 的 Test Sequence 模块对各种传感器故障和发动机超速场景建模。它接受来自工厂的反馈并用传感器数据驱动控制器。这种建模模式允许 Test Sequence 模块控制控制器模块接收的反馈信号,并作为创作测试用例的画布。打开 Test Sequence 模块来查看建模的测试场景。
open_system('fuel_rate_control_cgv/Sequence Sensor Failures');
测试场景
在仿真的最初 10 秒内,测试处于稳定化模式,此时来自被控对象的闭环输入直接传递至控制器。节气门和速度输入设置为控制器正常操作范围内的标称值。Stabilize_Engine 步骤对这种状态建模。然后,测试将逐步执行以下模式:
Test_Overspeed:节气门从 30 升至 700Reset_To_Normal_Speed:节气门减速至 400Test_EGO_Fault:仿真故障 3 秒,然后恢复正常状态Test_Throttle_Fault:仿真故障 3 秒,然后恢复正常状态Test_Speed_Fault:仿真故障 3 秒,然后恢复正常状态Test_Map_Fault:仿真故障 3 秒,然后恢复正常状态Test_Multi_Fault:仿真 MAP 和 EGO 故障 3 秒Reset_MAP:标准化 MAP 传感器,并仿真 EGO 故障 3 秒Reset_To_Normal:终止测试
测试评估
Test Sequence 模块 Assess Controller 验证由 Sequence Sensor Failures 模块建模的各种测试用例的控制器输出。建模评估如下:
断言前 4.8 秒加油模式处于
Warmup模式断言当实际速度超过 628 时,加油模式切换到
Overspeed模式当多个传感器出现故障时,断言加油模式不处于
Single_Failure模式。
open_system('fuel_rate_control_cgv/Assess Controller');
运行仿真
仿真测试框架,并在示波器上观测燃油流量和空燃比信号。
sim('fuel_rate_control_cgv')

请注意,在仿真过程中未触发任何断言,这表明在 Assess Controller 中建模的所有评估均通过。
在测试管理器中配置等效性测试
作为控制器系统代码生成验证 (CGV) 的一部分,重要的是断言控制器的功能行为在普通和软件在环 (SIL) 仿真模式下是相同的。使用测试管理器执行此验证。
打开测试管理器和测试文件。
sltest.testmanager.view
sltest.testmanager.TestFile('sltestFuelRateControlComparisonTestSuite.mldatx');
测试用例建模
等效性测试已在测试管理器中配置,以便在普通和 SIL 模式下仿真控制器,并比较这两次运行之间的数值结果。通过点击测试浏览器中的测试层次结构的不同节点来探索测试用例的结构。
运行测试用例
在测试管理器中运行测试。通过/未通过的结果可在测试管理器的结果与工件窗格中查看。
cgvresult = sltest.testmanager.run
cgvresult =
ResultSet with properties:
Outcome: Passed
NumPassed: 1
NumFailed: 0
NumDisabled: 0
NumIncomplete: 0
NumTotal: 1
NumTestCaseResults: 0
NumTestSuiteResults: 0
NumTestFileResults: 1
StartTime: 01-Feb-2025 14:27:54
StopTime: 01-Feb-2025 14:28:43
Duration: 49.169 sec
Description: []
Name: 'Results: 2025-Feb-01 14:27:53'
CoverageResults: []
UserData: []

创建报告
生成一份报告以查看等效性测试的结果。
sltest.testmanager.report(cgvresult,'cgvresult.zip','IncludeTestResults',int32(0));
关闭测试管理器并关闭模型
sltest.testmanager.clear
sltest.testmanager.clearResults
sltest.testmanager.close
close_system(mdl,0);
clear mdl;