该模型说明了Simulink®变体子系统。金宝app变体子系统允许您为子系统提供多种实现,其中在模拟期间只有一个实现是活动的。您可以在不修改模型的情况下以编程方式交换主动实现并将其替换为其他实现之一。
变体子系统块包含两个或多个子子系统,其中一个子子系统在模型执行期间处于活动状态。活动子子系统被称为活跃的变体。您可以通过在基础工作空间中的值更改变量的值,或者通过使用变体子系统块对话框手动选择变体选择来编程方式切换变量子系统块的活动变量。这积极的变体在模型编译期间,通过Simulink以编程方式连接到变体子系统的Inport和Outport块。金宝app
以编程方式控制变体选择,a金宝appsimulink.variant.
对象与变体子系统块对话框中的每个子子系统相关联。金宝appsimulink.variant.
对象是在MATLAB®CASE工作区中创建的。这些对象有一个名为的属性状况
,这是一种表达式,它评估了布尔值,并用于确定活动变量子子系统。例如,定义
VSS_LINEAR_CONTROLLER 金宝app= Simulink.Variant(“VSS_MODE = = 1”);
在基本工作空间中创建金宝appsimulink.variant.
构造函数参数的对象('vss_mode == 1')
变体激活时定义。使用“变体子系统”对话框,然后将您联系VSS_LINEAR_CONTROLLER
与变体子系统中的一个子子系统。定义
vss_mode = 1
在基础工作区中,激活VSS_LINEAR_CONTROLLER
变体。条件参数可以是一个简单的表达由标量变量,枚举,平等,不等式,&&和〜。括号()可用于优先级分组。
此示例中的模型使用以下变体对象和变体控制变量,该变量在Matlab Base工作空间中定义:
VSS_LINEAR_CONTROLLER 金宝app= Simulink.Variant(“VSS_MODE = = 1”);
vss_nonlinear_controller 金宝app= simulink.variant('vss_mode == 2');
VSS_MODE = 2;
打开示例模型sldemo_variant_subsystems.
跑了preloadfcn.定义文件 - > ModelProperties - >回调
。这将基本工作区填充了名为Controller的变量子系统块的变量:
图1:示例模型,sldemo_variant_subsystems.
指定金宝appsimulink.variant.
对象为控制器子系统关联,右键单击控制器子系统并选择子系统参数
,这将打开控制器子系统块对话框。
控制器子系统块对话框指定两个潜在的变体。两种变体又与两者相关联金宝appsimulink.variant.
对象VSS_LINEAR_CONTROLLER
和VSS_NONLINEAR_CONTROLLER
,存在于基础工作区中。这些对象有一个名为的属性状况,该表达式的计算结果为布尔值,并确定哪个变量是活动的。该条件也显示在变体子系统块对话框中。的条件属性在本例中VSS_LINEAR_CONTROLLER
和VSS_NONLINEAR_CONTROLLER
是vss_mode == 1
和vss_mode == 2
, 分别。变量vss_mode.
驻留在基础工作区中,可以是标准MATLAB变量或a金宝appSimulink.Parameter.
。
如果在变体子系统参数对话框中没有相关的变体对象或一个“%”(注释)字符前缀变体对象,则认为子子系统被注释掉,并且在模型执行期间不使用。
图2:控制器子系统块的内容
在变体子系统块中,您可以放置Inport,Outport和子系统块。在这个例子中,线性控制器
子系统块与Variant对象相关联,VSS_LINEAR_CONTROLLER
,而且非线性控制器
子系统块与Variant对象相关联,VSS_NONLINEAR_CONTROLLER
。
在变体子系统中不允许信号连接。金宝appSimulink在模拟模型时,以编程方式将Inport和Outport块连接到主动变体。
模拟使用线性控制器
变体,定义:
vss_mode = 1
在基础工作区中,然后模拟模型。
图3:模拟使用这件线性控制器
变体
模拟使用非线性控制器
,定义
vss_mode = 2
在基础工作区中,然后模拟模型。
图4:模拟使用这件非线性控制器
变体
这sldemo_variant_subsystems_enum
模型说明了以下内容金宝appsimulink.variant.
能力:
1。枚举:MATLAB枚举类可用于提高变体对象条件中的可读性。
2。重用:金宝appsimulink.variant.
可以在不同的变体子系统块中重用对象。
此示例使用以下变量在Matlab Base工作空间中定义:
vsse_linear_controller 金宝app= simulink.variant(...'vsse_mode == sldemo_vss_controller_type.linear')
vsse_nonlinear_controller 金宝app= simulink.variant(...'vsse_mode == sldemo_vss_controller_type.nonlinear')
vsse_mode = sldemo_vss_controller_type.linear.
vsse_prototype 金宝app= simulink.variant(...'vsse_mode_build == sldemo_vss_build_type.prototype')
vsse_production 金宝app= simulink.variant(...'vsse_mode_build == sldemo_vss_build_type.production')
vsse_mode_build = sldemo_vss_build_type.production.
在这些金宝appsimulink.variant.
对象,我们使用枚举类,sldemo_vss_BUILD_TYPE.m, 和sldemo_vss_controller_type.m.定义金宝appsimulink.variant.
状况提高可读性的参数。
三个过滤器变量子系统块,滤波器1,滤波器2和滤波器3都使用vsse_prototype.
和vsse_production.
金宝appsimulink.variant.
对象。
打开示例模型sldemo_variant_subsystems_enum
跑了preloadfcn.定义文件 - > ModelProperties - >回调
。这将基本工作区填充了Variant子系统块的变量:
图5:示例模型,sldemo_variant_subsystems_enum
您可以使用Simulink®Co金宝appder™从包含Variant子系统块的模型生成代码。默认情况下,生成的代码仅包含活动变量。或者,您可以为C预处理器条件保护的所有变体生成代码(#如果
那#elif.
那#万一
)使用嵌入式编码器™时。
要生成预处理器条件,可以在变量子系统块的子系统中放置的块类型受到限制。在代码生成过程中,一个合并块放置在变量子系统内的每个OUTPORT块的输入中,并连接到变体子系统内的子子系统。因此,对合并块的限制适用于变体子系统块的内容。仅在生成代码时执行限制检查。此外,变体子系统块的子系统必须是原子子系统,它是通过选择的归因于原子单位子系统参数对话框的参数。
预处理器条件的代码生成是活动的:
在“配置参数”对话框的“代码生成”窗格中选择了嵌入式编码器目标。
这覆盖变体条件并使用以下变体是不是在“变体子系统块”参数对话框中选择。
当预处理器条件的代码生成处于活动状态时,生成的代码包含由C预处理器条件保护的变体子系统块的所有子子系统。在这种情况下,延迟了活动变量的选择,直到生成的代码的编译时间。只有在C宏中编码的一个变体对象必须评估为true(是活动的)。
此外,变体控制变量(例如vss_mode.
和vsse_mode.
以上)必须是金宝appSimulink.Parameter.
指定如何的对象#定义
对于变量控制变量,在生成的代码中管理。为了sldemo_variant_subsystems.
,你可以清除vss_mode.
从基础工作区中加倍。用Model Explorer - 金宝app> Simulink Root - > Base Workspace
添加一个新的金宝appSimulink.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
有关变量子系统的代码生成的更多信息,请参阅嵌入式编码器文档。