变体子系统

这个模型说明的Simulink变种子系统。金宝app变异子系统让你提供一个子系统,其中模拟过程中只有一个实施积极的多种实现。您可以通过编程换出积极落实,并与其它实现的一个替换它,而无需修改模型。

变子系统的概述

变体型子系统块包含两个或两个以上子子系统,其中一个子模型执行期间是活动的。活动子子系统被称为积极变种。可以通过在基座的工作区改变的变量的值编程切换变子系统块的活性变体,或通过手动重写使用变体子系统块对话的变体选择。该活性变种模型编译期间编程有线连接到变子系统通过Simulink中的运行轨迹和出口框。金宝app

有计划的控制变量选择,一金宝appSimulink.Variant目的是利用在变体子系统块对话框每个子子系统相关联。金宝appSimulink.Variant对象在MATLAB®基础工作区中创建。这些对象都有一个属性命名条件,这是一个表达式,计算结果为布尔值,并且用于确定所述活性变体子子系统。例如,定义

VSS_LINEAR_CONTROLLER 金宝app= Simulink.Variant( 'VSS_MODE == 1');

在基本工作区中创建一个金宝appSimulink.Variant对象的构造参数,其中( 'VSS_MODE == 1')当所述变体是活性定义。使用变子系统对话框,你再联想VSS_LINEAR_CONTROLLER与变子系统中的子子系统之一。定义

VSS_MODE = 1

在底座的工作区,激活VSS_LINEAR_CONTROLLER变种。条件参数可以是简单表达由标量变量,枚举,平等,不平等的,&&,和〜。括号()可以被用于优先分组。

异形词的使用子系统

此示例中的模型使用下列变体的目的和变型的控制变量,它们在MATLAB基工作区定义为:

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 - >回调。此填充有用于命名控制器的变体子系统块中的变量的基础工作区:

图1:示例性的模型,sldemo_variant_subsystems

要指定金宝appSimulink.Variant对象协会控制器子系统,在控制子系统右键单击并选择子系统参数,这将打开控制器子系统块对话框

该控制器子系统模块对话框指定了两个潜在的变体。这两种变体又与两个关联金宝appSimulink.Variant对象VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER,其存在于基工作区。这些对象都有一个属性命名条件的表达式,该表达式计算为布尔值,并确定哪个变量是活动的。条件也显示在变量子系统块对话框中。在本例中,条件属性为VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLERVSS_MODE == 1VSS_MODE == 2, 分别。变量VSS_MODE驻留在基底的工作区,并且可以是标准的MATLAB变量或金宝appSimulink.Parameter

如果没有相关的变异体对象或“%”(评论)字符前缀在变子系统的变种对象参数对话框,那么孩子子系统被视为注释和模型执行过程中不使用。

图2:控制器子系统块的内容

在一个变体子系统块,你可以把运行轨迹,外港和子系统模块。在这个例子中,线性控制器子系统块与所述变体对象相关联,VSS_LINEAR_CONTROLLER非线性控制器子系统块与所述变体对象相关联,VSS_NONLINEAR_CONTROLLER

信号连接未在变子系统允许的。金宝app模拟模型时的Simulink编程导线了INPORT和出口框的活性变体。

交换活性变

为了模拟使用线性控制器变种,定义:

VSS_MODE = 1

在基座工作区,然后模拟模型。

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

为了模拟使用非线性控制器,定义

VSS_MODE = 2

在基座工作区,然后模拟模型。

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

枚举和重用

sldemo_variant_subsystems_enum模型说明了以下金宝appSimulink.Variant功能:

1。枚举:MATLAB枚举类可以用于改善在所述变体对象的条件可读性。

2。重用:金宝appSimulink.Variant对象可以在不同的变体子系统块被重新使用。

此示例使用它们在MATLAB基工作区定义以下变量:

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.msldemo_vss_CONTROLLER_TYPE.m定义金宝appSimulink.Variant条件这改善可读性的参数。

三个滤变子系统模块,过滤器1,过滤器2和过滤器3全部使用VSSE_PROTOTYPEVSSE_PRODUCTION金宝appSimulink.Variant对象。

打开示例模型sldemo_variant_subsystems_enum运行PreLoadFcn在定义文件 - > ModelProperties - >回调。此填充有用于变体子系统块中的变量的基础工作区:

图5:示例性的模型,sldemo_variant_subsystems_enum

代码生成

您可以使用的Simulink编码金宝app器™从含变子系统一个块模型生成代码。默认情况下,生成的代码只包含活性变体。另外,对所有变体通过C预处理器守卫您可以生成代码(#如果#elif指令#万一)使用嵌入式编码器™时。

为了产生预处理条件,块,你可以一个变子系统模块的孩子子系统内放置的类型是有限的。在代码生成过程中,一个合并块被放置在所述变体子系统内的每个外港块的输入端和连接到所述变体子系统中的子子系统。因此,放置在合并块限制适用于变子系统块的内容。生成代码时的限制检查时才执行。另外,变子系统模块的孩子子系统必须是原子子系统,这是通过选择创建治疗以原子单位该子系统的参数参数对话框。

代码生成预处理条件的被激活时,

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

  2. 覆盖变种条件和使用后的变体选定的变体子系统块参数对话框。

当代码生成预处理条件的激活时,生成的代码包含由C预处理器保护的变体子系统块的所有子子系统。在这种情况下,活性变体的选择被延迟,直到所产生的代码的编译时间。仅一个是C宏编码的变体对象,必须为真(是活动的)。

此外,所述变体控制变量(例如VSS_MODEVSSE_MODE以上)必须金宝appSimulink.Parameter对象指定如何#限定的用于所述变体的控制变量在生成的代码进行管理。为了sldemo_variant_subsystems,你可以清除VSS_MODE从基部的工作区的两倍。用模型浏览器 - > Simulink金宝app的根 - >基工作区添加一个新的金宝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 SLDEMO_VARIANT_SUBSYSTEM_VDEF_H的#define VSS_MODE 1 #ENDIF

见嵌入式编码器文档代码生成器变种子系统的详细信息。