Main Content

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

使用规范模型进行基于需求的测试

自 R2022b 起

此示例说明如何使用规范模型对飞机自动驾驶仪控制器模型的形式化需求进行模型和测试。规范模型使用两个Requirements Table模块来模型飞机自动驾驶仪控制器模型所需的输入和输出。您分析 Requirements Table模块的建模问题,从规范模型生成测试,然后在飞机自动驾驶仪控制器模型上运行这些测试。您测试的模型是设计模型

有关如何定义和配置 Requirements Table 模块的更多信息,请参阅 使用 Requirements Table 模块创建正式需求 (Requirements Toolbox)配置正式需求的属性 (Requirements Toolbox)

查看高级需求

在需求编辑器中打开需求集 AP_Controller_Reqs

slreq.open("AP_Controller_Reqs");

高级需求指定了模型的输出和自动驾驶仪控制器模式。每个需求描述都使用高级语言,您可以使用它来明确定义形式化需求中所需的逻辑。

This image shows the requirements set, AP_Controller_Reqs, in the Requirements Editor.

查看规范模型的第一次迭代

打开规范模型,spec_model_partial

spec_model = "spec_model_partial";
open_system(spec_model); 

该模型包含两个Requirements Table模块,定义将高级需求转化为可测试的逻辑表达式的形式化需求。模块AP_Mode_Determination指定了自动驾驶仪控制器模式的形式化需求,模块Cmd_Determination指定了控制器的输出。

This image shows the specification model, spec_model_partial. The model has two Requirements Table blocks that are connected together.

要查看形式化需求,请检查每个 Requirements Table模块。

Requirements Table 控制器模式模块

打开 AP_Mode_Determination 。该模块指定了自动驾驶仪控制器模式的形式化需求。为了确定输出数据ModeAP_Mode_Determination使用两个输入数据指定三个需求:

  • AP_Engage_Switch —自动驾驶仪接合开关

  • HDG_Engage_Switch — 航向接合开关

每个需求都使用输入的组合来为 Mode 指定唯一的输出值。

Ths image shows the table for AP_Mode_Determination. The block specifies the formal requirements for the autopilot controller mode.

Requirements Table 控制器命令模块

打开 Cmd_DeterminationCmd_Determination 指定副翼命令和滚转参考命令的需求。 Cmd_Determination 使用四个输入数据:

  • ModeAP_Mode_Determination 输出,Mode

  • Roll_Ref_TK — 滚动参考目标旋钮的设置

  • Roll_Angle_Phi — 实际飞机滚转角度

  • HDG_Ref_TK — 航向参考目标旋钮的设置

该模块使用这些输入数据来确定控制器输出数据:

  • Roll_Ref_Cmd — 滚动参考命令

  • Ail_Cmd — 副翼命令

This image shows the table for Cmd_Determination. Cmd_Determination specifies the requirements for the aileron command and roll reference command.

在此示例中,表达式使用常量数据来定义 Roll_Ref_TKRoll_Angle_Phi 的值范围。您还可以参数化值或使用文字值。参见 在 Requirements Table 模块中定义数据 (Requirements Toolbox) 。要查看这些值,请打开符号窗格。在建模选项卡的设计数据部分中,点击符号窗格

除了需求之外,Cmd_Determination 还定义了设计的假设。参见 将假设添加到需求中 (Requirements Toolbox) 。在这个例子中,假设根据物理限制限制了滚转角度和滚动参考目标旋钮的值。滚转角度不能超过 180 或低于 -180 度,并且横滚参考目标旋钮不能超过 30 或低于 -30 。在表格中,点击假设标签。

This image shows the assumptions used in Cmd_Determination.

您还可以在数据的MinimumMaximum属性中指定数据范围限制,或者使用模块明确指定信号的范围。

分析需求表

接下来分析Requirements Table模块。作为最佳实践,分析该模块以确认形式化需求完整且一致。此最佳实践可帮助您避免在确认形式化需求完整、一致且与高级需求相对应之前从规范模型生成测试。

分析部分中,点击Analyze Table。参见分析 Requirements Table 模块以解决建模问题 (Requirements Toolbox)

分析检测到一个不完整的问题。

Cmd_Determination 中需求集缺少与需求 3 的第三项相对应的正式需求。

This image shows the description for the 3rd high-level requirement. The missing requirement from Cmd_Determination is in the red box.

打开模型spec_model_final中的Cmd_Determination以查看更新的需求集。额外需求的索引为 2.2.4

spec_model = "spec_model_final";
load_system(spec_model);
open_system(spec_model + "/Cmd_Determination");

This image shows the updated formal requirements of Cmd_Determination. The new requirement is in a red box.

将高级需求与形式化需求联系起来

加载规范模型会在需求编辑器中加载形式化需求。关闭规范模型也会关闭相关的需求集。当开发形式化需求时,将形式化需求链接到相应的高级需求,以跟踪规范模型中的需求。在此示例中,链接需求不会影响测试生成或测试结果。

将第一个正式需求链接到相应的高级需求:

  1. spec_model_final 中,展开名为 Table1的需求集。

  2. 右键单击索引1 的正式需求,并选择选择与需求链接

  3. 扩展AP_Controller_Reqs需求集。

  4. 右键单击 ID1 的需求,然后点击 从“1 创建链接:自动驾驶模式已关闭”改为“1:高水平:自动驾驶仪控制......”

链接类型默认为 Related to 。有关链接类型的更多信息,请参阅 链接类型 (Requirements Toolbox)

从更新后的模型生成测试

Simulink® Design Verifier™ 根据 Requirements Table 模块中定义的需求自动创建测试目标。要生成测试,请使用配置参数窗口或以编程方式指定测试。参见 测试生成的模型覆盖率目标 。选择不同的覆盖率目标来确定您是想最小化生成的测试数量,还是想提高测试粒度和可追溯性。

在此示例中,生成具有决策覆盖率的测试并将输出保存到 MAT 文件。

opts = sldvoptions; 
opts.Mode = "TestGeneration"; 
opts.ModelCoverageObjectives = "Decision"; 
[~,files] = sldvrun(spec_model,opts,true);

Simulink Design Verifier 根据需求生成测试目标和测试。在此版本的规范模型中,测试目标已经得到满足。

This image shows the results of generating the tests on the updated specification model. The test objectives are satisfied.

在设计模型上运行测试

创建满足测试目标的测试后,您可以在设计模型上运行测试。在这个例子中,设计模型是飞机自动驾驶仪控制器的模型,sldvexRollApController

在对设计模型运行测试之前,必须将规范模型与设计模型连接起来。通常,规范模型不会产生或使用与设计模型相同的信号。这些差异可以是简单的,也可以是抽象的。例如,设计模型可能使用与规范模型不同的输入和输出信号类型,或者您可能希望将设计模型的标量输出与规范模型中的范围进行比较。因此,您需要在设计模型和规范模型之间构建一个接口。

将设计模型与规范模型连接起来

在这个例子中,规范模型spec_model_final 和设计模型sldvexRollApController 输入可以直接接口,但其中一个输出不同。 spec_model_final 将副翼命令表示为一个值范围,但 ldvexRollApController 产生的副翼命令值是一个标量双精度数。该接口使用MATLAB功能模块来比较副翼命令值。然后,接口使用 Assertion 模块验证两个输出。打开模型spec_model_test_interface,查看界面。

test_interface = "spec_model_test_interface";
open_system(test_interface);

This image shows the model, spec_model_test_interface.

MATLAB 功能模块使用以下代码比较这两个信号:

function y = fcn(design_val, spec_val)
switch spec_val 
    case Ail_Cmd.All
        y = true;
    case Ail_Cmd.Zero
        y = (design_val == 0);
    otherwise
        y = false;
end    

在设计模型上运行更新的测试

为了测试和验证设计模型,请创建一个包含以下内容的框架模型:

  1. 规格模型

  2. 设计模型

  3. 测试接口与验证模型

框架模型中,将模型连接在一起。然后在设计模型上运行测试并验证输出是否与框架模型中的需求相符。

要查看框架模型,请打开模型sldvexDesignHarnessFinal

harness_model = "sldvexDesignHarnessFinal";
open_system(harness_model);

与接口模型一样,并非所有设计模型输入都可能直接对应于规范模型输入。在此示例中,框架模型使用规范模型指定的五个输入来准备测试设计模型。

This image shows the harness model, sldvexDesignHarnessFinal.

从框架模型内部对设计模型运行更新后的测试。使用sldvruntest函数运行测试并保存结果。如果您有 Simulink Coverage ™,您可以从覆盖率报告中的 sldvruntest 输出中查看测试结果。使用 cvhtml (Simulink Coverage) 函数查看覆盖率报告。

cvopts = sldvruntestopts;
cvopts.coverageEnabled = true;
[finalData, finalCov] = sldvruntest(...
    harness_model,files.DataFile,cvopts);
cvhtml("finalCov",finalCov);

在覆盖率报告中,点击sldvexRollApController 链接。摘要表明,设计模型sldvexRollApController 实现了全面覆盖率。

This image shows the coverage report after running the tests from within the harness model. The report shows that full coverage is achieved on the design model.

bdclose("all");
slreq.clear;

另请参阅

(Requirements Toolbox)

相关主题