该模型说明了Simulink®变体子系统。万博1manbetx变体子系统允许您为一个子系统提供多个实现,其中在模拟期间只有一个实现是活动的。您可以通过编程方式替换活动实现,并将其替换为其他实现之一,而无需修改模型。
变体子系统块包含两个或多个子子系统,其中一个子子系统在模型执行期间是活动的。活动子子系统被称为活跃的变体。您可以通过在基础工作空间中的值更改变量的值,或者通过使用变体子系统块对话框手动选择变体选择来编程方式切换变量子系统块的活动变量。的活跃的变体在模型编译期间,通过Simulink以编程方式连接到变体子系统的import和Outport块。万博1manbetx
要以编程方式控制变量选择,a万博1manbetxsimulink.variant.
对象与变体子系统块对话框中的每个子子系统相关联。万博1manbetxsimulink.variant.
对象是在MATLAB®CASE工作区中创建的。这些对象有一个名为的属性条件
,它是一个表达式,计算结果为布尔值,并用于确定活动的变体子子系统。例如,定义
vss_linear_controller 万博1manbetx= simulink.variant('vss_mode == 1');
在基础工作区中创建一个万博1manbetxsimulink.variant.
构造函数参数的对象('vss_mode == 1')
定义变量何时处于活动状态。然后使用变体子系统对话框进行关联vss_linear_controller.
与变体子系统中的一个子子系统。定义
vss_mode = 1
在基本工作区中,激活vss_linear_controller.
变体。条件参数可以是简单的表达式由标量变量、枚举、等式、不等式、&&、~组成。括号()可用于优先分组。
此示例中的模型使用以下变体对象和变体控制变量,该变量在Matlab Base工作空间中定义:
vss_linear_controller 万博1manbetx= simulink.variant('vss_mode == 1');
VSS_NONLINEAR_CONTROLLER 万博1manbetx= Simulink.Variant(“VSS_MODE = = 2”);
vss_mode = 2;
打开示例模型sldemo_variant_subsystems.
运行PreLoadFcn定义文件-> ModelProperties ->回调
。这将基本工作区填充了名为Controller的变量子系统块的变量:
图1:示例模型,sldemo_variant_subsystems.
指定万博1manbetxsimulink.variant.
对象关联的Controller子系统,右键单击Controller子系统并选择子系统参数
,这将打开控制器子系统块对话框。
Controller子系统块对话框指定了两种可能的变体。这两个变体依次与这两个相关联万博1manbetxsimulink.variant.
对象vss_linear_controller.
和vss_nonlinear_controller.
,存在于基础工作区中。这些对象有一个名为的属性条件,一种评估到布尔值的表达式,并确定哪个变体是活动的。该条件也显示在变体子系统块对话框中。在此示例中,条件属性vss_linear_controller.
和vss_nonlinear_controller.
是vss_mode == 1
和vss_mode == 2
, 分别。变量VSS_MODE
驻留在基本工作空间中,可以是标准的MATLAB变量或万博1manbetxSimulink.Parameter.
。
如果没有关联的变体对象或'%'(注释)字符,则为变量子系统参数对话框中的变体对象,则被认为是子系统注释出并在模型执行期间未使用。
图2:Controller子系统块内容
在变体子系统块中,可以放置导入、输出和子系统块。在这个例子中线性控制器
子系统块与变量对象相关联,vss_linear_controller.
,非线性控制器
子系统块与变量对象相关联,vss_nonlinear_controller.
。
在变型子系统中不允许信号连接。万博1manbetx在模拟模型时,Simulink以编程方式将import和Outport块连接到活动变体。
模拟使用线性控制器
变量定义:
vss_mode = 1
,然后模拟模型。
图3:模拟使用线性控制器
变体
模拟使用非线性控制器
, 定义
vss_mode = 2
,然后模拟模型。
图4:模拟使用非线性控制器
变体
的sldemo_variant_subsystems_enum.
模型说明了以下内容万博1manbetxsimulink.variant.
功能:
1.枚举:MATLAB枚举类可用于提高变体对象条件中的可读性。
2.重用:万博1manbetxsimulink.variant.
对象可以在不同的变体子系统块中重用。
此示例使用以下变量在Matlab Base工作空间中定义:
VSSE_LINEAR_CONTROLLER 万博1manbetx=仿真软件。变体(…“VSSE_MODE = = sldemo_vss_CONTROLLER_TYPE.LINEAR”)
vsse_nonlinear_controller 万博1manbetx= simulink.variant(...'vsse_mode == sldemo_vss_controller_type.nonlinear')
vsse_mode = sldemo_vss_controller_type.linear.
VSSE_PROTOTYPE 万博1manbetx=仿真软件。变体(…“VSSE_MODE_BUILD = = sldemo_vss_BUILD_TYPE.PROTOTYPE”)
VSSE_PRODUCTION 万博1manbetx=仿真软件。变体(…“VSSE_MODE_BUILD = = sldemo_vss_BUILD_TYPE.PRODUCTION”)
vsse_mode_build = sldemo_vss_build_type.production.
在这些万博1manbetxsimulink.variant.
对象,我们使用枚举类,sldemo_vss_build_type.m.m., 和sldemo_vss_CONTROLLER_TYPE.m定义万博1manbetxsimulink.variant.
条件参数,以提高可读性。
三个过滤器变量子系统块,Filter1、Filter2和Filter3都使用VSSE_PROTOTYPE
和vsse_production.
万博1manbetxsimulink.variant.
对象。
打开示例模型sldemo_variant_subsystems_enum.
运行PreLoadFcn定义文件-> ModelProperties ->回调
。这将基本工作区填充了Variant子系统块的变量:
图5:示例模型,sldemo_variant_subsystems_enum.
您可以使用Simulink®Co万博1manbetxder™从包含Variant子系统块的模型生成代码。默认情况下,生成的代码仅包含活动变量。或者,您可以为C预处理器条件保护的所有变体生成代码(#如果
,# elif
,#万一
),当使用Embedded Coder™时。
要生成预处理器条件,可以在变量子系统块的子系统中放置的块类型受到限制。在代码生成过程中,一个合并块放置在变量子系统内的每个OUTPORT块的输入中,并连接到变体子系统内的子子系统。因此,对合并块的限制适用于变体子系统块的内容。仅在生成代码时执行限制检查。此外,变体子系统块的子系统必须是原子子系统,它是通过选择的当作原子单位对待“子系统参数”对话框的参数。
预处理器条件的代码生成是活动的:
在“配置参数”对话框的“代码生成”窗格中选择了嵌入式编码器目标。
的重写变量条件并使用下面的变量是不在“变型子系统”块参数对话框中选择。
当预处理器条件的代码生成处于活动状态时,生成的代码包含由C预处理器条件保护的变体子系统块的所有子子系统。在这种情况下,延迟了活动变量的选择,直到生成的代码的编译时间。只有在C宏中编码的一个变体对象必须评估为true(是活动的)。
此外,变量控制变量(如VSS_MODE
和VSSE_MODE
以上)必须是万博1manbetxSimulink.Parameter.
对象的#定义
对于变量控制变量,在生成的代码中管理。为了sldemo_variant_subsystems.
,你可以清除VSS_MODE
从基础工作区中加倍。用模型资源管理器-> Simulink万博1manbetx Root -> Base Workspace
添加一个新的万博1manbetxSimulink.Parameter.
命名为VSS_MODE
。指定参数价值作为1
或者2
,数据类型作为INT32.
, 和存储类作为ImportedDefine.
与自定义属性头文件作为sldemo_variant_subsystems_vdef.h
。然后你应该在当前工作目录中创建这个头文件:
/ *文件:sldemo_variant_subsystems_vdef.h * / #ifndef sldemo_variant_subsystem_vdef_h #define stlemo_variant_subsystem_vdef_h #define vss_mode 1 #endif
有关不同子系统的代码生成的更多信息,请参阅Embedded Coder文档。