主要内容

不同的子系统

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

变体子系统概述

一个变体子系统块包含两个或更多个子子系统,其中一个子子系统在模型执行期间处于活动状态。活动子子系统称为活跃的变体。通过更改全局工作区中的变量值,或者使用变量子系统块对话框手动覆盖变量选择,您可以以编程方式切换变量子系统块的活动变量。的活跃的变体在模型编译期间,通过Simulink以编程方式连接到变量子系统的输入和输出块。万博1manbetx

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

注意:您可以在MATLAB®全局工作空间、模型工作空间、掩码工作空间或数据字典中指定变量控件。

例如,定义VSS_LINEAR_CONTROLLER 万博1manbetx= Simulink.Variant(“VSS_MODE = = 1”);

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

VSS_MODE = 1

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

使用不同的子系统

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

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中定义的文件>模型属性>回调。这将使用名为Controller的变量子系统块的变量来填充全局工作区:

open_system (“sldemo_variant_subsystems”)

图1:模型的例子中,sldemo_variant_subsystems

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

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

如果在变量子系统参数对话框中没有相关的变量对象,或者在变量对象的前面加上'%'(注释)字符,那么子子系统就被认为被注释掉了,并且在模型执行过程中不会被使用。

open_system (“sldemo_variant_subsystems /控制器”);

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

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

在不同的子系统中不允许信号连接。万博1manbetx在模拟模型时,Simulink以编程方式将输入和输出块连接到活动变量。

切换积极的变异

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

VSS_MODE = 1

在全局工作区中,然后模拟模型。

open_system (“sldemo_variant_subsystems /控制器”,“参数”);close_system (“sldemo_variant_subsystems /控制器”) VSS_MODE = 1;%#ok(由sldemo_variant_子系统使用)sim卡sldemo_variant_subsystems;

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

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

VSS_MODE = 2

在全局工作区中,然后模拟模型。

VSS_MODE = 2;%(由sldemo_variant_子系统使用)sim卡sldemo_variant_subsystems;

图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仿真软件。变体条件提高可读性的参数。

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

注意:枚举类的名称必须在数据类型名称和全局工作区变量名称中唯一,并且区分大小写。

打开示例模型sldemo_variant_subsystems_enum运行PreLoadFcn中定义的文件>模型属性>回调。这将用变量子系统块的变量来填充全局工作区:

open_system (“sldemo_variant_subsystems_enum”)

图5:模型的例子中,sldemo_variant_subsystems_enum

使用枚举类型作为变量控制变量生成代码

可以使用枚举类型为用作变量控制值的整数提供有意义的名称。

考虑到模型rtwdemo_preprocessor_subsys

在MATLAB编辑器中,定义将枚举值映射到有意义的名称的类。

如果没有正确定义枚举类型,将显示一个错误。下面是一些会导致错误的场景。

无效的清晰度:在这种情况下,万博1manbetx仿真软件。IntEnumType没有定义。

无效的definition2:在这种情况下,变量没有初始化。

输入变量控制表达式,如下例所示:

图6:块的参数

在全局工作区中定义V的值。例如,V = 2;该值可以是一个普通的MATLAB变量或万博1manbetx仿真软件。参数对象。但是,该值不能是枚举类型。

现在用以下工具生成代码变体激活时间设置为代码编译。示例代码如下所示。

图7:生成的代码

有关使用万博1manbetx仿真软件。变体万博1manbetx仿真软件。参数对象或MATLAB变量作为变量控制变量,见用于指定变体控件的方法部分变体控制的介绍

有关变体子系统的代码生成的更多信息,请参阅嵌入式编码器文档。

更多关于

变体系统设计