主要内容

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

使用模型切片器以编程方式解决模型中的意外行为

在这个示例中,您将评估一个 Simulink® 模型,检测意外行为,并使用模型切片器以编程方式隔离和解决意外行为。当您计划重用 API 命令并将其用途扩展到其他模型时,程序化方法非常有用。

前提条件

熟悉模型切片器的行为和用途以及模型切片器 API 的功能。突出功能依赖关系 概述了如何使用模型切片器用户界面来浏览模型。slslicerslsliceroptionsslslicertrace 函数参考页面包含模型切片器 API 命令帮助。

找出模型中导致意外行为的区域

sldvSliceCruiseControlHarness 测试框架模型包含一个巡航控制器子系统 sldvSliceCruiseControl 和一个模块 TestCases,其中包含该子系统的测试用例。首先仿真模型以执行测试用例。然后,您需要评估模型的行为,以找出并隔离模型中导致意外行为的区域:

1.打开巡航控制模型的 sldvSliceCruiseControlHarness 测试框架。

open_system('sldvSliceCruiseControlHarness')

注意:当实际操作模式与预期操作模式不一致时,Assertion 模块设置为断言失败时停止仿真

TestCases 模块包含 sldvSliceCruiseControl 的几个测试输入。

2.在测试用例信号编辑器中,点击全部运行按钮以运行所有包含的测试用例。在 ResumeWO 测试用例中收到错误。Assertion 模块在 27 秒时停止了仿真,因为实际运行模式与预期运行模式不同。点击 OK 关闭此错误消息。

3.在 sldvSliceCruiseControlHarness 模型中,双击 Assertion 模块,清除启用断言,然后点击 OK

set_param('sldvSliceCruiseControlHarness/Assertion','Enabled','off')

4.将 TestCases Signal Editor 模块的 活动 Group 设置为包含错误的测试用例,然后再次运行仿真。

set_param('sldvSliceCruiseControlHarness/TestCases',"ActiveScenario", "ResumeWO")
sim('sldvSliceCruiseControlHarness')

模型中的 Scope 模块包含三个信号:

  • operation_mode - 显示子系统的实际运行模式。

  • expected_mode - 显示测试用例提供的子系统的预期操作模式。

  • verify - 显示一个布尔值,比较操作模式和预期模式。

示波器显示,从时间 27 开始,预期运行模式与实际运行模式之间存在差异。现在您已经知道了显示异常行为的输出端口和包含异常行为的时间窗口,请使用模型切片器来隔离和分析异常行为。

找出模型中导致意外行为的区域

1.使用 slslicer 为模型创建模型切片器配置对象。命令行窗口显示此模型切片器配置的切片属性。

obj = slslicer('sldvSliceCruiseControlHarness')
obj = 

  SLSlicer with properties:

        Configuration: [1×1 SLSlicerAPI.SLSlicerConfig]
         ActiveConfig: 1
      DisplayedConfig: []
       StorageOptions: [1×1 struct]
      AnalysisOptions: [1×1 struct]
         SliceOptions: [1×1 struct]
        InlineOptions: [1×1 struct]

   Contents of active configuration:
                 Name: 'untitled'
          Description: ''
                Color: [0 1 1]
    SignalPropagation: 'upstream'
        StartingPoint: [1×0 struct]
       ExclusionPoint: [1×0 struct]
           Constraint: [1×0 struct]
       SliceComponent: [1×0 struct]
        UseTimeWindow: 0
         CoverageFile: ''
         UseDeadLogic: 0
        DeadLogicFile: ''

2.激活模型切片器的切片高亮显示模式,编译模型并准备进行依赖性分析。

activate(obj);
Consider turning on <a href="matlab:helpview(fullfile(docroot, 'simulink/ug/fast-restart-workflow.html#bugm2tp-3'))">Fast Restart</a> before launching Model Slicer for simulation based workflows. <a href="matlab:SlicerConfiguration.DisableFastRestartNotif">Do not show again.</a>

3.添加 operation_mode 输出端口模块作为起点并突出显示它。

addStartingPoint(obj,'sldvSliceCruiseControlHarness/operation_mode')
highlight(obj)

模型中起始点上游且在仿真中处于活动的区域已突出显示。

4.在限定的仿真时间窗口(最多 30 秒)内仿真模型,以仅突出显示模型中起始点上游且在感兴趣的时间窗口内活动的区域。

simulate(obj,0,30)

仅突出显示模型中起始点上游且在仿真时间窗口内活动的部分。

5.您可以通过将开始时间更改为 20 秒来进一步缩小仿真时间窗口。

setTimeWindow(obj,20,30)

6.创建一个切片模型 sldvSliceCruiseControlHarness_sliced,其中只包含感兴趣的区域。

slicedModel = slice(obj,'sldvSliceCruiseControlHarness_sliced')
open_system('sldvSliceCruiseControlHarness_sliced')
slicedModel =

    'sldvSliceCruiseControlHarness_sliced'

切片模型 sldvSliceCruiseControlHarness_sliced 现在包含源模型 sldvSliceCruiseControlHarness 的简化版本。简化的独立模型仅包含模型中位于指定起始点上游且在感兴趣的时间窗口内活动的部分。

研究切片模型并调试源模型

现在您可以在简化的独立模型中调试意外行为,然后将更改应用到源模型。

1.要再次启用模型编辑功能,请终止模型切片器模式。

terminate(obj)

2.导航至切片模型中包含意外行为的区域。

open_system('sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled')

该子系统中的 AND Logical Operator 模块在其第二个输入端口上附加了一个截断的 true 常量。这个 true 常量表示,在此切片模型的受限时间窗口内,第二个输入端口始终为 true,从而导致巡航控制系统不会进入“已取消”状态。

3.使用 slslicertrace 查看连接到第二个输入端口的块,从而导航到源系统中等效的 AND Logical Operator 模块。

h = slslicertrace('SOURCE',...
 'sldvSliceCruiseControlHarness_sliced/Model/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp1')
hilite_system(h)
h =

   1.4130e+03

在当前配置中,此子系统中的 OR Logical Operator 模块始终为 true。将 OR Logical Operator 模块更改为 AND Logical Operator 模块即可纠正此错误。

4.在进行编辑之前,创建巡航控制模型和测试框架模型的新副本。

save_system('sldvSliceCruiseControl','sldvSliceCruiseControl_fixed')
save_system('sldvSliceCruiseControlHarness','sldvSliceCruiseControlHarness_fixed')

5.更新测试框架中的模型引用,使其指向新保存的模型。

set_param('sldvSliceCruiseControlHarness_fixed/Model',...
    'ModelNameDialog','sldvSliceCruiseControl_fixed.slx')

6.使用出错的 Logical Operator 模块的模块路径来修复错误。

set_param('sldvSliceCruiseControl_fixed/CruiseControlMode/opMode/resumeCondition/hasCanceled/LogicOp2','LogicOp','AND')

7.使用固定模型仿真测试框架 45 秒,以确认修正后的行为。

sim('sldvSliceCruiseControlHarness_fixed')

现在显示,预期运行模式与实际运行模式相同。

清理

要完成演示,请保存并关闭所有模型,并删除模型切片器配置对象。

save_system('sldvSliceCruiseControl_fixed')
save_system('sldvSliceCruiseControlHarness_fixed')
close_system('sldvSliceCruiseControl_fixed')
close_system('sldvSliceCruiseControlHarness_fixed')
close_system('sldvSliceCruiseControlHarness_sliced')
clear obj