文档

可变子系统

该模型说明了Simulink®变体子系统。万博1manbetx变体子系统允许您为一个子系统提供多个实现,其中在模拟期间只有一个实现是活动的。您可以通过编程方式替换活动实现,并将其替换为其他实现之一,而无需修改模型。

变型子系统概述

变体子系统块包含两个或多个子子系统,其中一个子子系统在模型执行期间是活动的。活动子子系统被称为活跃的变体. 通过更改基本工作区中变量的值,或使用“变量子系统块”对话框手动覆盖变量选择,可以通过编程方式切换变量子系统块的活动变量。这个活跃的变体在模型编译期间,通过Simulink以编程方式连接到变体子系统的import和Outport块。万博1manbetx

要以编程方式控制变量选择,a万博1manbetxSimulink.变体对象与变体子系统块对话框中的每个子子系统相关联。万博1manbetxSimulink.变体对象是在MATLAB®基本工作空间中创建的。这些对象有一个名为条件,它是一个表达式,计算结果为布尔值,并用于确定活动的变体子子系统。例如,定义

VSS_线性_控制器=Simulink.Va万博1manbetxriant('VSS_MODE==1');

在基本工作区中创建万博1manbetxSimulink.变体对象,其中包含构造函数参数('VSS_MODE==1')定义变量何时处于活动状态。然后使用变体子系统对话框进行关联VSS_LINEAR_CONTROLLER变量子系统中的一个子系统。定义

VSS_模式=1

在基本工作区中,激活VSS_LINEAR_CONTROLLER变体。条件参数可以是简单的表达式由标量变量、枚举、等式、不等式、&&、~组成。括号()可用于优先分组。

使用不同的子系统

本例中的模型使用以下变量对象和变量控制变量,这些变量在MATLAB基本工作空间中定义:

VSS_线性_控制器=Simulink.Va万博1manbetxriant('VSS_MODE==1');

VSS_NONLINEAR_CONTROLLER 万博1manbetx= Simulink.Variant(“VSS_MODE = = 2”);

VSS_模式=2;

打开示例模型sldemo_变型_子系统运行PreLoadFcn定义于文件-> ModelProperties ->回调. 这将使用名为Controller的变量子系统块的变量填充基本工作空间:

图1:示例模型,sldemo_变型_子系统

指定万博1manbetxSimulink.变体对象关联的Controller子系统,右键单击Controller子系统并选择子系统参数,这将打开控制器分系统对话框

Controller子系统块对话框指定了两种可能的变体。这两个变体依次与这两个相关联万博1manbetxSimulink.变体对象VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER,它们存在于基本工作区中。这些对象有一个名为条件,该表达式的计算结果为布尔值,并确定哪个变量是活动的。该条件也显示在变体子系统块对话框中。在这个例子中,的条件属性VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLERVSS_模式==1VSS_模式==2变量VSS_MODE驻留在基本工作空间中,可以是标准的MATLAB变量或万博1manbetx仿真软件。参数

如果在“变量子系统参数”对话框中没有关联的变量对象或变量对象的前缀为“%”(注释)字符,则子系统将被视为已注释掉,并且在模型执行期间不使用。

图2:Controller子系统块内容

在变体子系统块中,可以放置导入、输出和子系统块。在这个例子中线性控制器子系统块与变量对象相关联,VSS_LINEAR_CONTROLLER,非线性控制器子系统块与变量对象相关联,VSS_NONLINEAR_CONTROLLER

在变型子系统中不允许信号连接。万博1manbetx在模拟模型时,Simulink以编程方式将import和Outport块连接到活动变体。

切换主动变量

使用线性控制器变量定义:

VSS_模式=1

,然后模拟模型。

图3:模拟使用线性控制器变体

使用非线性控制器定义

VSS_模式=2

,然后模拟模型。

图4:模拟使用非线性控制器变体

枚举和重用

sldemo_变量_子系统_枚举模型说明了以下内容万博1manbetxSimulink.变体功能:

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

2.重新使用:万博1manbetxSimulink.变体对象可以在不同的变体子系统块中重用。

此示例使用MATLAB基本工作空间中定义的以下变量:

VSSE_LINEAR_CONTROLLER 万博1manbetx=仿真软件。变体(…“VSSE_MODE = = sldemo_vss_CONTROLLER_TYPE.LINEAR”)

VSSE\U非线性控制器=Simulink.Vari万博1manbetxant(…'VSSE\U MODE==sldemo\U vss\U控制器类型.非线性')

VSSE\u模式=sldemo\u vss\u控制器\u类型。线性

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.变体对象,我们使用枚举类,sldemo\u vss\u BUILD\u TYPE.m,及sldemo_vss_CONTROLLER_TYPE.m定义万博1manbetxSimulink.变体条件参数,以提高可读性。

三个过滤器变量子系统块,Filter1、Filter2和Filter3都使用VSSE_PROTOTYPEVSSE_生产万博1manbetxSimulink.变体对象。

打开示例模型sldemo_变量_子系统_枚举运行PreLoadFcn定义于文件-> ModelProperties ->回调. 这将使用变量子系统块的变量填充基本工作区:

图5:示例模型,sldemo_变量_子系统_枚举

代码生成

您可以使用Simulink®编码万博1manbetx器™ 从包含变量子系统块的模型生成代码。默认情况下,生成的代码仅包含活动变量。或者,您可以为受C预处理器条件保护的所有变量生成代码(#如果# elif#恩迪夫),当使用Embedded Coder™时。

要生成预处理器条件,可以放置在变量子系统块的子子系统中的块类型是有限的。在代码生成过程中,一个合并块放置在变量子系统内每个输出端口块的输入端,并连接到变量子系统内的子子子系统。因此,对合并块的限制适用于可变子系统块的内容。限制检查仅在生成代码时执行。此外,变量子系统块的子子系统必须是原子子系统,通过选择当作原子单位对待“子系统参数”对话框的参数。

时,预处理器条件的代码生成是活动的

  1. 在“配置参数”对话框的“代码生成”窗格中选择嵌入式编码器目标。

  2. 重写变量条件并使用下面的变量在“变型子系统”块参数对话框中选择。

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

此外,变量控制变量(如VSS_MODEVSSE_MODE以上)必须是万博1manbetx仿真软件。参数对象的#定义在生成的代码中管理变量的。对于sldemo_变型_子系统,您可以清除VSS_MODE从基本工作区加倍。使用模型资源管理器-> Simulink万博1manbetx Root -> Base Workspace添加新的万博1manbetx仿真软件。参数命名VSS_MODE.指定的参数价值作为12,数据类型作为int32,及存储类作为ImportedDefine(自定义)自定义属性头文件作为sldemo_variant_subsystems_vdef.h.然后你应该在当前工作目录中创建这个头文件:

/*文件:sldemo_variant_SUBSYSTEM_vdef.h*/#ifndef sldemo_variant_SUBSYSTEM_vdef#h#定义sldemo_variant_SUBSYSTEM_vdef#h#定义VSS_模式1#

有关不同子系统的代码生成的更多信息,请参阅Embedded Coder文档。

这个话题有用吗?