主要内容

不同的子系统

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

变型子系统概述

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

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

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

在基本工作区中创建万博1manbetx仿真软件。变体对象,该对象的构造函数参数(“VSS_MODE = = 1”)定义变量何时处于活动状态。然后使用变体子系统对话框进行关联VSS_LINEAR_CONTROLLER使用变体子系统中的一个子子系统。定义

VSS_MODE = 1

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

使用不同的子系统

本例中的模型使用了MATLAB base workspace中定义的变量对象和变量控制变量如下:

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

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

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

如果在变量子系统参数对话框中没有关联的变量对象,或者变量对象前面有一个'%'(注释)字符,那么子子系统将被认为已注释掉,并且在模型执行期间不使用。

图2:Controller子系统块内容

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

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

切换积极的变异

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

VSS_MODE = 1

,然后模拟模型。

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

使用非线性控制器,定义

VSS_MODE = 2

,然后模拟模型。

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

枚举和重用

sldemo_variant_subsystems_enum模型演示了以下内容万博1manbetx仿真软件。变体功能:

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

2.重用:万博1manbetx仿真软件。变体对象可以在不同的变体子系统块中重用。

这个例子使用了在MATLAB基础工作空间中定义的以下变量:

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

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

VSSE_MODE = sldemo_vss_CONTROLLER_TYPE。线性

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。生产

在这些万博1manbetx仿真软件。变体对象,我们使用枚举类,sldemo_vss_BUILD_TYPE.m,sldemo_vss_CONTROLLER_TYPE.m定义万博1manbetx仿真软件。变体条件参数,以提高可读性。

三个过滤器变量子系统块,Filter1、Filter2和Filter3都使用VSSE_PROTOTYPEVSSE_PRODUCTION万博1manbetx仿真软件。变体对象。

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

图5:模型的例子中,sldemo_variant_subsystems_enum

代码生成

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

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

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

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

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

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

此外,变量控制变量(如VSS_MODEVSSE_MODE以上)必须万博1manbetx仿真软件。参数对象的#定义的变量控制变量在生成的代码中管理。为sldemo_variant_subsystems,你可以清除VSS_MODE从基本工作空间Double。使用模型资源管理器-> Simulink万博1manbetx Root -> Base Workspace添加一个新的万博1manbetx仿真软件。参数命名VSS_MODE.指定的参数价值作为12,数据类型作为int32,存储类作为ImportedDefine自定义属性作为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 . conf . conf . conf . conf . conf . conf . conf . conf . conf . conf . conf

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

另请参阅

||

相关的话题

外部网站