使用规范模型进行基于需求的测试
此示例说明如何使用规范模型对飞机自动驾驶仪控制器模型的形式化需求进行模型和测试。规范模型使用两个Requirements Table模块来模型飞机自动驾驶仪控制器模型所需的输入和输出。您分析 Requirements Table模块的建模问题,从规范模型生成测试,然后在飞机自动驾驶仪控制器模型上运行这些测试。您测试的模型是设计模型。
有关如何定义和配置 Requirements Table 模块的更多信息,请参阅 使用 Requirements Table 模块创建正式需求 (Requirements Toolbox) 和 配置正式需求的属性 (Requirements Toolbox) 。
查看高级需求
在需求编辑器中打开需求集 AP_Controller_Reqs
。
slreq.open("AP_Controller_Reqs");
高级需求指定了模型的输出和自动驾驶仪控制器模式。每个需求描述都使用高级语言,您可以使用它来明确定义形式化需求中所需的逻辑。
查看规范模型的第一次迭代
打开规范模型,spec_model_partial
。
spec_model = "spec_model_partial";
open_system(spec_model);
该模型包含两个Requirements Table模块,定义将高级需求转化为可测试的逻辑表达式的形式化需求。模块AP_Mode_Determination
指定了自动驾驶仪控制器模式的形式化需求,模块Cmd_Determination
指定了控制器的输出。
要查看形式化需求,请检查每个 Requirements Table模块。
Requirements Table 控制器模式模块
打开 AP_Mode_Determination
。该模块指定了自动驾驶仪控制器模式的形式化需求。为了确定输出数据Mode
,AP_Mode_Determination
使用两个输入数据指定三个需求:
AP_Engage_Switch
—自动驾驶仪接合开关HDG_Engage_Switch
— 航向接合开关
每个需求都使用输入的组合来为 Mode
指定唯一的输出值。
Requirements Table 控制器命令模块
打开 Cmd_Determination
。 Cmd_Determination
指定副翼命令和滚转参考命令的需求。 Cmd_Determination
使用四个输入数据:
Mode
—AP_Mode_Determination
输出,Mode
Roll_Ref_TK
— 滚动参考目标旋钮的设置Roll_Angle_Phi
— 实际飞机滚转角度HDG_Ref_TK
— 航向参考目标旋钮的设置
该模块使用这些输入数据来确定控制器输出数据:
Roll_Ref_Cmd
— 滚动参考命令Ail_Cmd
— 副翼命令
在此示例中,表达式使用常量数据来定义 Roll_Ref_TK
和 Roll_Angle_Phi
的值范围。您还可以参数化值或使用文字值。参见 在 Requirements Table 模块中定义数据 (Requirements Toolbox) 。要查看这些值,请打开符号窗格。在建模选项卡的设计数据部分中,点击符号窗格。
除了需求之外,Cmd_Determination
还定义了设计的假设。参见 将假设添加到需求中 (Requirements Toolbox) 。在这个例子中,假设根据物理限制限制了滚转角度和滚动参考目标旋钮的值。滚转角度不能超过 180
或低于 -180
度,并且横滚参考目标旋钮不能超过 30
或低于 -30
。在表格中,点击假设标签。
您还可以在数据的Minimum和Maximum属性中指定数据范围限制,或者使用模块明确指定信号的范围。
分析需求表
接下来分析Requirements Table模块。作为最佳实践,分析该模块以确认形式化需求完整且一致。此最佳实践可帮助您避免在确认形式化需求完整、一致且与高级需求相对应之前从规范模型生成测试。
在分析部分中,点击Analyze Table。参见分析 Requirements Table 模块以解决建模问题 (Requirements Toolbox)。
分析检测到一个不完整的问题。
Cmd_Determination
中需求集缺少与需求 3 的第三项相对应的正式需求。
打开模型spec_model_final
中的Cmd_Determination
以查看更新的需求集。额外需求的索引为 2.2.4
。
spec_model = "spec_model_final"; load_system(spec_model); open_system(spec_model + "/Cmd_Determination");
将高级需求与形式化需求联系起来
加载规范模型会在需求编辑器中加载形式化需求。关闭规范模型也会关闭相关的需求集。当开发形式化需求时,将形式化需求链接到相应的高级需求,以跟踪规范模型中的需求。在此示例中,链接需求不会影响测试生成或测试结果。
将第一个正式需求链接到相应的高级需求:
在
spec_model_final
中,展开名为 Table1
的需求集。右键单击索引为
1
的正式需求,并选择选择与需求链接。扩展
AP_Controller_Reqs
需求集。右键单击 ID 为
1
的需求,然后点击 从“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 根据需求生成测试目标和测试。在此版本的规范模型中,测试目标已经得到满足。
在设计模型上运行测试
创建满足测试目标的测试后,您可以在设计模型上运行测试。在这个例子中,设计模型是飞机自动驾驶仪控制器的模型,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);
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
在设计模型上运行更新的测试
为了测试和验证设计模型,请创建一个包含以下内容的框架模型:
规格模型
设计模型
测试接口与验证模型
框架模型中,将模型连接在一起。然后在设计模型上运行测试并验证输出是否与框架模型中的需求相符。
要查看框架模型,请打开模型sldvexDesignHarnessFinal
。
harness_model = "sldvexDesignHarnessFinal";
open_system(harness_model);
与接口模型一样,并非所有设计模型输入都可能直接对应于规范模型输入。在此示例中,框架模型使用规范模型指定的五个输入来准备测试设计模型。
从框架模型内部对设计模型运行更新后的测试。使用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
实现了全面覆盖率。
bdclose("all");
slreq.clear;
另请参阅
Requirements Table (Requirements Toolbox)
相关主题
- 什么是规范模型?
- 将假设添加到需求中 (Requirements Toolbox)
- 使用 Simulink Design Verifier 从包含 Requirements Table 模块的模型中导出测试