使用 Simulink 测试管理器编写并运行注入故障的测试
如果您有 Simulink® Fault Analyzer™,您可以将故障添加到测试用例中,并通过创建故障集将其注入到您的模型中。在每个测试用例中,故障集指定了该测试的活动故障。有关如何向模型添加故障的更多信息,请参阅Define and Model Faults (Simulink Fault Analyzer)。您可以在测试套件中创建具有不同活动故障组合的多个测试用例来仿真多种组合。注入故障后,您可以通过时序评估来评估信号,以确定故障是否导致了所需的输出。
在 Simulink 测试管理器中创建故障集
在测试用例中创建故障集:
打开 Simulink Test 应用程序。在 App 选项卡中,点击 Simulink Test。
打开 Simulink 测试管理器。在测试选项卡中,点击 Simulink 测试管理器。
创建一个新的测试用例或者加载一个现有的测试用例。
展开故障设置部分并点击添加 > 添加故障集。
新的故障集是空的。要添加故障,请选择故障集并点击添加 > 添加故障。如果在添加故障集之后向模型中添加故障,点击刷新来更新 Simulink 测试管理器从模型中识别出的故障。您可以添加多个故障,只要每个故障位于不同的模型元素上即可。点击确定。故障集显示每个故障名称、其指定的模型元素及其触发器。
选择一个故障来仿真它。要指定其他故障组合,请创建一个新的故障集并选择不同的故障。您可以为测试中的每个仿真选择一个故障集。
当您运行测试时,测试将覆盖分配给模型的故障的激活状态。如果您未选择故障集,测试将使用模型中指定的故障设置运行仿真。要运行无故障的测试,请选择故障集并清除故障。
如果您想在测试中运行多种故障组合,请创建测试迭代。参见 测试迭代。如果您想在每个测试中调整额外的故障属性,请创建一个回调。参见 回调。
仿真完成后,您可以在内嵌的仿真数据检查器中查看故障仿真结果。
通过编程创建故障集
您还可以通过编程创建和修改故障集。你测试的模型肯定已经存在故障。有关以编程方式在模型中创建故障的更多信息,请参阅 Add and Configure Faults Programmatically (Simulink Fault Analyzer)。
以编程方式添加故障集:
检索或创建
sltest.testmanager.TestCase
对象。参见createTestCase
、getTestCases
和getTestCaseByName
。使用
addFaultSet
方法向测试用例添加故障集。此方法创建sltest.testmanager.FaultSet
类的实例。使用被测模型上的
sltest.testmanager.refreshFaults
函数更新可用的故障。使用
addSpecifiedFault
方法将故障添加到故障集中。此方法创建sltest.testmanager.SpecifiedFault
类的实例。
如果测试用例中已经有故障集,则可以通过在 sltest.testmanager.TestCase
类实例上使用 getFaultSets
方法来检索 sltest.testmanager.FaultSet
类实例。类似地,使用 sltest.testmanager.FaultSet
类实例上的 getSpecifiedFaults
方法从故障集中检索 sltest.testmanager.SpecifiedFault
。
要删除故障集和故障,请对故障集或故障使用 remove
方法。
对示例模型运行故障注入测试
此示例显示如何运行使用故障集激活和注入故障的测试。注入故障后,您可以评估信号并使用时序评估来确定故障是否导致了所需的输出。
打开模型
打开 sldemo_fuelsys_fault_analyzer
模型并使用 fuelSysFaultTestSetup
辅助函数设置故障。
mdlName = "sldemo_fuelsys_fault_analyzer";
open_system(mdlName)
fuelSysFaultTestSetup
要查看设置故障的代码,请打开 fuelSysFaultTestSetup
MATLAB® 文件或转到辅助函数部分。
该模型代表汽油发动机的燃料控制系统,是 容错燃油控制系统建模 中模型的修改版本。该模型在检测到控制器故障后会产生燃料模式信号。当控制器检测到单个故障时,控制器会将 fuel_mode
信号从代表低排放的 LOW
更改为代表浓混合气的 RICH
。当控制器检测到第二个故障时,它将 fuel_mode
设置为 DISABLED
。当控制器检测到故障时,模型通过将 normal_operation
信号设置为 false
来记录此行为。
该模型包含四个故障。要查看故障,请打开故障表窗格。在应用选项卡中,点击故障分析器。在故障分析器选项卡的查看部分中,点击故障表。展开每个模型元素来查看故障。每个故障都使用定时触发器,在指定的仿真时间注入故障。
查看测试
每次故障注入后都会导致 normal_operation
信号输出 false
。在此示例中,您运行测试来验证此行为。打开 Simulink Test 管理器并加载 fault_tests_example.mldatx
测试文件。在应用选项卡中,点击 Simulink Test。在测试选项卡中,点击 Simulink Test 管理器。在 Simulink Test 管理器中,打开 fault_tests_example.mldatx
测试文件。或者,输入此命令:
tf = sltest.testmanager.load("fault_tests_example.mldatx");
sltest.testmanager.view;
该测试文件有四个测试用例。
每个测试用例通过指定一个选定故障的故障集来激活一个故障。要查看故障集,请在 Simulink Test 管理器的左侧窗格中点击测试浏览器。展开测试文件和测试套件,并选择一个测试。展开故障设置部分可以查看故障集和故障。该图显示了注入 throttle_fault
故障的测试用例的故障集。
为了验证故障是否产生所需的行为,每个测试用例都包含时序评估。参见 使用时序评估来评估时序逻辑。在测试中,展开逻辑和时序评估部分。评估检查故障信号何时等于注入值。如果信号值等于故障注入的值,那么 normal_operation
信号一定是 false
。该图显示了注入 throttle_fault
故障的测试用例的时序评估。
运行测试
运行测试。选择故障注入测试套件并点击运行,或者输入此命令:
run(tf);
选择结果和工件,然后展开结果。每个测试用例都会通过,这意味着控制器会检测到每个故障的注入时间。
您可以在 Simulink Test 管理器中嵌入的仿真数据检查器中查看测试的活动故障的故障触发状态。展开某个测试结果,展开 Sim Output,选择故障名称,查看触发状态。此图显示了激活 throttle_fault
的测试中的故障触发器和 normal_operation
状态。
辅助函数
fuelSysFaultTestSetup
函数将故障添加到模型中,并将故障集和故障添加到测试用例中。要查看创建故障集、添加故障和启用故障的示例代码,请参阅 Create Fault Sets and Add Faults in Test Cases
部分。
function fuelSysFaultTestSetup %% Add Faults to Model and Specifying Behaviors % Define the model and load it. mdl = "sldemo_fuelsys_fault_analyzer"; bmdl = mdl + "_FaultModel"; load_system(mdl); fault = Simulink.fault.Fault.empty(0,4); ports = 4; % Add a fault to each input port of the To Controller subsystem. for n = 1:ports fault(n) = Simulink.fault.addFault(mdl ... + "/To Controller/Inport/" + num2str(n)); end % Add behavior to each fault. Three of the faults use stuck-at-ground % behavior and one of them uses stuck-at-constant behavior. addBehavior(fault(1),bmdl,... FaultBehavior="mwfaultlib/Stuck-at-Ground"); addBehavior(fault(2),bmdl,... FaultBehavior="mwfaultlib/Stuck-at-Ground"); addBehavior(fault(3),bmdl,... FaultBehavior="mwfaultlib/Stuck-at-Constant"); addBehavior(fault(4),bmdl,... FaultBehavior="mwfaultlib/Stuck-at-Ground"); load_system(bmdl) set_param(bmdl+"/ego_fault/Constant",Value="12") %% Specify Fault Properties % Define the trigger types. Each fault uses a timed trigger % at a different time. fault(1).TriggerType = "Timed"; fault(1).StartTime = 5; fault(2).TriggerType = "Timed"; fault(2).StartTime = 10; fault(3).TriggerType = "Timed"; fault(3).StartTime = 15; fault(4).TriggerType = "Timed"; fault(4).StartTime = 20; % Disable the faults. Simulink.fault.enable(mdl + "/To Controller/Inport/1",0) Simulink.fault.enable(mdl + "/To Controller/Inport/2",0) Simulink.fault.enable(mdl + "/To Controller/Inport/3",0) Simulink.fault.enable(mdl + "/To Controller/Inport/4",0) save_system(mdl); save_system(bmdl); %% Create Fault Sets and Add Faults in Test Cases % Load the test file, and get the test suite and test cases. tf = sltest.testmanager.load("fault_tests_example.mldatx"); ts = getTestSuites(tf); tc = getTestCases(ts); % Update the available faults to include the faults in the model % that you can select for the fault set. sltest.testmanager.refreshFaults(mdl) % Create the fault sets and adding the faults to each fault set. % Activate only one fault for each fault set, and disable the others. faultSets = sltest.testmanager.FaultSet.empty(0,4); testedFaults = sltest.testmanager.SpecifiedFault.empty(0,4); for i = 1:4 faultSets(i) = addFaultSet(tc(i),Name="Fault Set"); for m = 1:4 testedFaults(m) = addSpecifiedFault(faultSets(i),... "sldemo_fuelsys_fault_analyzer/To Controller/Inport/" ... + num2str(m),fault(m).Name); if m == i testedFaults(m).IsActive = true; else testedFaults(m).IsActive = false; end end end end
另请参阅
相关主题
- Define and Model Faults (Simulink Fault Analyzer)
- Add and Configure Faults Programmatically (Simulink Fault Analyzer)
- 使用时序评估来评估时序逻辑
- Evaluate Fault Combinations on a Fault-Tolerant Fuel System (Simulink Fault Analyzer)
- Simulate Models with Faults by Using the Multiple Simulations Panel (Simulink Fault Analyzer)