Main Content

本页面提供的是上一版软件的文档。当前版本中已删除对应的英文页面。

可变子系统

此模型说明 Simulink® 可变子系统。可变子系统允许您为一个子系统提供多个实现,但在仿真期间只有其中一个实现处于活动状态。您可通过编程方式换出活动实现并用其他实现之一替换它,而无需修改模型。

可变子系统概述

Variant Subsystem 模块包含两个或更多子级子系统,其中一个子级子系统在模型执行期间处于激活状态。激活的子级子系统称为活动变体。您可以通过编程方式在基础工作区中更改变量值来切换可变子系统模块的激活变体,或通过手动方式在可变子系统模块对话框中覆盖变体选择来进行切换。在模型编译期间,活动变体由 Simulink 通过编程方式连接到可变子系统的 Inport 和 Outport 模块。

为了以编程方式控制变体选择,在 Variant Subsystem 模块对话框中将每个子级子系统与一个 Simulink.Variant 对象相关联。Simulink.Variant 对象在 MATLAB® 基础工作区中创建。这些对象具有一个名为 Condition 的属性,它是一个计算结果为布尔值的表达式,用于确定激活的可变子级子系统。例如,在基础工作区中定义

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

会创建一个 Simulink.Variant 对象,其中构造函数参数 ('VSS_MODE==1') 定义变体何时处于活动状态。然后,您通过使用 Variant Subsystem 对话框将 VSS_LINEAR_CONTROLLER 与可变子系统中的一个子级子系统相关联。在基础工作区中定义

VSS_MODE=1

会激活 VSS_LINEAR_CONTROLLER 变体。条件参数可以是一个由标量变量、枚举、等式、不等式、&& 和 ~ 组成的简单表达式。括号 () 可用于优先级分组。

使用可变子系统

此示例中的模型使用在 MATLAB 基础工作区中定义的以下变体对象和变体控制项变量:

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

VSS_NONLINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==2');

VSS_MODE=2;

打开示例模型 sldemo_variant_subsystems 会运行在 File -> ModelProperties -> Callbacks 中定义的 PreLoadFcn。这会用名为 Controller 的 Variant Subsystem 模块的变量填充基础工作区:

图 1:示例模型 sldemo_variant_subsystems

要为 Controller 子系统指定 Simulink.Variant 对象关联,请右键点击 Controller 子系统并选择 Subsystem Parameters,这将打开 Controller 子系统模块对话框

Controller 子系统模块对话框指定两种可能的变体。这两种变体又与基础工作区中存在的两个 Simulink.Variant 对象 VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER 相关联。这些对象具有一个名为 Condition 的属性,该属性是计算结果为布尔值的表达式,用于确定哪个变体处于活动状态。条件也显示在 Variant Subsystem 模块对话框中。在此示例中,VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER 的 Condition 属性分别为 VSS_MODE == 1VSS_MODE == 2。变量 VSS_MODE 位于基础工作区中,可以是标准 MATLAB 变量或 Simulink.Parameter

如果在 Variant Subsystem 参数对话框中没有相关联的变体对象或变体对象的前缀为“%”(注释)字符,则系统会认为该子级子系统被注释掉且不会在模型执行期间使用。

图 2:Controller 子系统模块的内容

在 Variant Subsystem 模块中,可以放置 Inport、Outport 和 Subsystem 模块。在此示例中,Linear Controller 子系统模块与变体对象 VSS_LINEAR_CONTROLLER 相关联,Nonlinear Controller 子系统模块与变体对象 VSS_NONLINEAR_CONTROLLER 相关联。

可变子系统中不允许存在信号连接。在对模型进行仿真时,Simulink 以编程方式将 Inport 和 Outport 模块连接到活动变体。

切换活动变体

要使用 Linear Controller 变体进行仿真,请在基础工作区中定义:

VSS_MODE=1

然后对模型进行仿真。

图 3:使用 Linear Controller 变体的仿真

要使用 Nonlinear Controller 进行仿真,请在基础工作区中定义

VSS_MODE=2

然后对模型进行仿真。

图 4:使用 Nonlinear Controller 变体的仿真

枚举和重用

sldemo_variant_subsystems_enum 模型说明以下 Simulink.Variant 功能:

1.枚举:MATLAB 枚举类可用于提高变体对象条件中的可读性。

2.重用:Simulink.Variant 对象可以在不同 Variant Subsystem 模块中重用。

此示例使用在 MATLAB 基础工作区中定义的以下变量:

VSSE_LINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.LINEAR')

VSSE_NONLINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.NONLINEAR')

VSSE_MODE=sldemo_vss_CONTROLLER_TYPE.LINEAR

VSSE_PROTOTYPE=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PROTOTYPE')

VSSE_PRODUCTION=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PRODUCTION')

VSSE_MODE_BUILD=sldemo_vss_BUILD_TYPE.PRODUCTION

在这些 Simulink.Variant 对象中,我们使用枚举类 sldemo_vss_BUILD_TYPE.msldemo_vss_CONTROLLER_TYPE.m 来定义 Simulink.Variant Condition 参数,以提高可读性。

三个筛选器 Variant Subsystem 模块,Filter1、Filter2 和 Filter3 都使用 VSSE_PROTOTYPEVSSE_PRODUCTION Simulink.Variant 对象。

打开示例模型 sldemo_variant_subsystems_enum 会运行在 File -> ModelProperties -> Callbacks 中定义的 PreLoadFcn。这会用 Variant Subsystem 模块的变量填充基础工作区:

图 5:示例模型 sldemo_variant_subsystems_enum

代码生成

您可以使用 Simulink® Coder™ 从包含 Variant Subsystem 模块的模型中生成代码。默认情况下,生成的代码只包含活动变体。或者,当使用 Embedded Coder™ 时,您可以为由 C 预处理器条件句(#if#elif#endif)保护的所有变体生成代码。

为了生成预处理器条件句,可以放在 Variant Subsystem 模块的子级子系统中的模块的类型是有限的。在代码生成过程中,系统将一个 Merge 模块放置在可变子系统中每个 Outport 模块的输入端,并连接到可变子系统中的子级子系统。因此,对 Merge 模块的限制会应用于 Variant Subsystem 模块的内容。限制检查仅在生成代码时执行。此外,Variant Subsystem 模块的子级子系统必须为原子子系统,它们是通过选择 Subsystem 参数对话框的 Treat as atomic unit 参数创建的。

预处理器条件句的代码生成在以下情况下处于活动状态:

  1. 在 Configuration Parameters 对话框的 Code Generation 窗格中选择了 Embedded Coder 目标。

  2. 在 Variant Subsystem 模块参数对话框中选择 Override variant conditions and use following variant

预处理器条件句的代码生成处于活动状态时,生成的代码包含受 C 预处理器条件句保护的 Variant Subsystem 模块的所有子级子系统。在这种情况下,活动变体的选择会推迟到编译生成的代码时。只有一个在 C 宏中编码的变体对象的计算结果必须为 true(活动)。

此外,变体控制项变量(如上面的 VSS_MODEVSSE_MODE)必须为 Simulink.Parameter 对象,这些对象指定如何在生成代码中管理变体控制项变量的 #define。对于 sldemo_variant_subsystems,您可以从基础工作区中清除 VSS_MODE 双精度值。使用 Model Explorer -> Simulink Root -> Base Workspace 添加一个名为 VSS_MODE 的新 Simulink.Parameter。将参数 Value 指定为 12,将 Data Type 指定为 int32,将 Storage class 指定为 ImportedDefineCustom attributes Header file 指定为 sldemo_variant_subsystems_vdef.h。然后,您应在当前工作目录中创建以下标头:

/* File: sldemo_variant_subsystems_vdef.h */
#ifndef SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define VSS_MODE 1
#endif

有关可变子系统的代码生成的详细信息,请参阅 Embedded Coder 文档。

另请参阅

| |

相关主题

外部网站