Main Content

本页采用了机器翻译。点击此处可查看英文原文。

使用 Simulink 测试管理器编写并运行注入故障的测试

自 R2024a 起

如果您有 Simulink® Fault Analyzer™,您可以将故障添加到测试用例中,并通过创建故障集将其注入到您的模型中。在每个测试用例中,故障集指定了该测试的活动故障。有关如何向模型添加故障的更多信息,请参阅Define and Model Faults (Simulink Fault Analyzer)。您可以在测试套件中创建具有不同活动故障组合的多个测试用例来仿真多种组合。注入故障后,您可以通过时序评估来评估信号,以确定故障是否导致了所需的输出。

Simulink 测试管理器中创建故障集

在测试用例中创建故障集:

  1. 打开 Simulink Test 应用程序。在 App 选项卡中,点击 Simulink Test

  2. 打开 Simulink 测试管理器。在测试选项卡中,点击 Simulink 测试管理器

  3. 创建一个新的测试用例或者加载一个现有的测试用例。

  4. 展开故障设置部分并点击添加 > 添加故障集

新的故障集是空的。要添加故障,请选择故障集并点击添加 > 添加故障。如果在添加故障集之后向模型中添加故障,点击刷新来更新 Simulink 测试管理器从模型中识别出的故障。您可以添加多个故障,只要每个故障位于不同的模型元素上即可。点击确定。故障集显示每个故障名称、其指定的模型元素及其触发器。

An example fault set with faults. The picture shows a fault set named Fault Set 1 with four faults on an example model. Each fault has a timed trigger.

选择一个故障来仿真它。要指定其他故障组合,请创建一个新的故障集并选择不同的故障。您可以为测试中的每个仿真选择一个故障集。

当您运行测试时,测试将覆盖分配给模型的故障的激活状态。如果您未选择故障集,测试将使用模型中指定的故障设置运行仿真。要运行无故障的测试,请选择故障集并清除故障。

如果您想在测试中运行多种故障组合,请创建测试迭代。参见 测试迭代。如果您想在每个测试中调整额外的故障属性,请创建一个回调。参见 回调

仿真完成后,您可以在内嵌的仿真数据检查器中查看故障仿真结果。

通过编程创建故障集

您还可以通过编程创建和修改故障集。你测试的模型肯定已经存在故障。有关以编程方式在模型中创建故障的更多信息,请参阅 Add and Configure Faults Programmatically (Simulink Fault Analyzer)

以编程方式添加故障集:

  1. 检索或创建 sltest.testmanager.TestCase 对象。参见 createTestCasegetTestCasesgetTestCaseByName

  2. 使用 addFaultSet 方法向测试用例添加故障集。此方法创建 sltest.testmanager.FaultSet 类的实例。

  3. 使用被测模型上的 sltest.testmanager.refreshFaults 函数更新可用的故障。

  4. 使用 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 来记录此行为。

该模型包含四个故障。要查看故障,请打开故障表窗格。在应用选项卡中,点击故障分析器。在故障分析器选项卡的查看部分中,点击故障表。展开每个模型元素来查看故障。每个故障都使用定时触发器,在指定的仿真时间注入故障。

The starting Fault Table pane. The model has four faults. Each fault is on a different model element.

查看测试

每次故障注入后都会导致 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;

该测试文件有四个测试用例。

The test manager shows four tests. Each test corresponds to a unique fault combination of active faults for testing. The test name indicates the fault that is injected.

每个测试用例通过指定一个选定故障的故障集来激活一个故障。要查看故障集,请在 Simulink Test 管理器的左侧窗格中点击测试浏览器。展开测试文件和测试套件,并选择一个测试。展开故障设置部分可以查看故障集和故障。该图显示了注入 throttle_fault 故障的测试用例的故障集。

The Fault Settings section for the test case that injects the throttle_fault fault. The fault set is expanded and contains four faults. The fault labeled throttle_fault is selected, and the others are not.

为了验证故障是否产生所需的行为,每个测试用例都包含时序评估。参见 使用时序评估来评估时序逻辑。在测试中,展开逻辑和时序评估部分。评估检查故障信号何时等于注入值。如果信号值等于故障注入的值,那么 normal_operation 信号一定是 false。该图显示了注入 throttle_fault 故障的测试用例的时序评估。

The temporal assessment for the test case that injects the throttle_fault fault. The assessment has two symbols, and a trigger response assessment. The assessment is expanded.

运行测试

运行测试。选择故障注入测试套件并点击运行,或者输入此命令:

run(tf);

选择结果和工件,然后展开结果。每个测试用例都会通过,这意味着控制器会检测到每个故障的注入时间。

The test results. The test suite is expanded. The results show that each test passed.

您可以在 Simulink Test 管理器中嵌入的仿真数据检查器中查看测试的活动故障的故障触发状态。展开某个测试结果,展开 Sim Output,选择故障名称,查看触发状态。此图显示了激活 throttle_fault 的测试中的故障触发器和 normal_operation 状态。

The visualized results of the test that injects throttle_fault. The plot also shows the normal_operation status. throttle_fault is a dark yellow, and normal_operation is purple. Both throttle_fault and normal_operation change their status at 5 seconds.

辅助函数

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

另请参阅

相关主题