使用变量控制变量变异块
这一主题解释了如何使用控制变量变异块不同类型的变体。
考虑到slexVariantSubsystems
模型。
的控制器
子系统块对话框指定两个潜在变量线性控制器
和非线性控制器
。线性控制器
和非线性控制器
块与变异条件表达式V = = 1
和V = = 2
。在这里,V
变量控制变量,确定活动的选择。你可以改变V
根据你的要求这些类型。
金宝appSimulink.VariantControlVariables for Coherent Switching of Choices in Variant Blocks
金宝appSimulink.VariantObjects for Variant Condition Reuse of Variant Blocks
金宝appSimulink.VariantControlVariables for Coherent Switching of Choices in Variant Blocks
你可以把控制变量类型的一个变体金宝appSimulink.VariantControl
激活时间与变体。金宝appSimulink.VariantControl
变体变量帮助你控制开关变量前后一致地元素,如块和参数。
考虑一个组块,代表了一种设计选择,每个街区都有相同的变异类型的控制变量金宝appSimulink.VariantControl
。如果你将这些块的变体激活时间继承Simulink.Va金宝appriantControl
块继承激活时间控制变量的变体。因此,所有的块具有相同的激活时间和同时被激活产生合理的仿真结果和有效的代码。
您可以定义金宝appSimulink.VariantControl
类型的控制变量存储位置中列出存储位置变异控制变量(操作数)的变体。
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
块的参数对话框控制器
布洛克:
1。指定变量的控制,V = = 1
和V = = 2
。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“V = = 1”)set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“V = = 2”)
2。集变体激活时间来继承Simulink.Va金宝appriantControl
继承激活时间V
。
set_param (“slexVariantSubsystems /控制器”,“VariantActivationTime”,“继承Simulink.Va金宝appriantControl”)
在定义一个基本工作空间金宝appSimulink.VariantControl
对象,V
。将其值设置为1
激活时间,变体更新图
,然后模拟模型。
V = 金宝appSimulink.VariantControl (“价值”,1“ActivationTime”,“更新图”)
V = VariantControl属性:值:1 ActivationTime:“更新图”
在模拟过程中,控制器
块继承了更新图
激活时间V
和线性控制器
块变得活跃。
双击控制器
块的积极选择。
sim卡(“slexVariantSubsystems”);
如果你改变的价值V
来2
,非线性控制器
在模拟块变得活跃。你可以改变的价值V
使用这个命令或金宝appSimulink.VariantControl
对话框。
V。Value = 2; sim (“slexVariantSubsystems”);
如果你改变的变体激活时间V
来更新图分析所有的选择
,控制器
块继承了更新图分析所有的选择
激活时间V
。你可以观察到继承的激活时间使用CompiledVariantActivationTime
。
V。ActivationTime =“更新图分析所有的选择”;sim卡(“slexVariantSubsystems”);get_param (“slexVariantSubsystems /控制器”,“CompiledVariantActivationTime”)
ans = '更新图分析所有的选择'
标量变量控制变量快速原型的变体
标量MATLAB®版本控制变量允许您快速原型变体的选择当你还构建模型。标量MATLAB变异控制变量帮助你更加关注构建变体的选择比在发展中激活这些选择的表达式。
您可以定义标量控制变量存储位置中列出存储位置变异控制变量(操作数)的变体。
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
块的参数对话框控制器
块,指定变量控制在其最简单的形式作为标量变量,V = = 1
和V = = 2
。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“V = = 1”)set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“V = = 2”)
在基本工作空间,定义一个变量控制变量,V
设置它的值1
,然后模拟模型。
V = 1;
在模拟过程中,线性控制器
块变得活跃。双击控制器
块的积极选择。
sim卡(“slexVariantSubsystems”);
同样的,如果你改变的价值V
来2
,非线性控制器
在模拟块变得活跃。
V = 2;sim卡(“slexVariantSubsystems”);
金宝appSimulink.Parameter
控制变量类型的变体块代码生成的变体
如果您打算为模型生成代码块包含变种,指定变量作为控制变量金宝appSimulink.Parameter
对象。金宝appSimulink.Parameter
对象允许您指定其他属性,比如数据类型和存储类,和控制变量控制的外观和位置变量生成的代码。
您可以定义一个变量控制变量的类型
金宝appSimulink.Parameter
只有在基本工作空间或在数据字典。定义金宝appSimulink.Parameter
面具或模型中的控制变量类型的变体工作区不支持。金宝app为控制变量存储位置变量的更多信息,见存储位置变异控制变量(操作数)的变体。金宝appSimulink.Parameter
以外的对象的内部结构和数据类型金宝appSimulink.Bus
不支持对象。金宝app
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
在MATLAB编辑器中,定义一个金宝appSimulink.Parameter
对象,V
。
V = 金宝appSimulink.Parameter;V。Value = 1; V.DataType =“int32”;V.CoderInfo。StorageClass =“自定义”;V.CoderInfo。CustomStorageClass =“ImportedDefine”;V.CoderInfo.CustomAttributes。HeaderFile =“rtwdemo_importedmacros.h”;
请注意:
变量定义为控制变量金宝appSimulink.Parameter
列出的对象可以有任何存储类存储类激活时间为不同的变体。
你也可以一个标量变量控制变量转换成一个金宝appSimulink.Parameter
对象。有关更多信息,请参见不同控制变量转换成仿真软件。金宝app参数对象。
指定金宝appSimulink.Parameter
对象作为块中的变量控制变量控制器的参数对话框。同时,改变变体激活时间来代码编译
。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“V = = 1”)set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“V = = 2”)set_param (“slexVariantSubsystems /控制器”,“VariantActivationTime”,代码编译的)
确保线性控制器
和非线性控制器
块都是原子的。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“TreatAsAtomicUnit”,“上”);set_param (“slexVariantSubsystems /控制器/非线性控制器”,“TreatAsAtomicUnit”,“上”);
在模拟过程中,线性控制器
块变得活跃。双击控制器
块的积极选择。
sim卡(“slexVariantSubsystems”);
同样的,如果你改变的价值V
来2
,非线性控制器
在模拟块变得活跃。
V value = 2;sim卡(“slexVariantSubsystems”);
从模型中生成代码。关于如何生成代码的信息,请参阅使用嵌入式编码器生成代码(嵌入式编码)。
生成的代码包含线性和非线性预处理条件的选择#如果
和# elif
因为代码编译
激活时间。变异的控制变量V
使用宏定义-#定义
指令-在头文件demos_macro.h
。你可以控制的外观和位置V
在生成的代码中,防止优化消除存储V
使用存储类属性。有关更多信息,请参见存储类激活时间为不同的变体。
% demos_macro.h% / *导出的数据定义* /%% / *定义自定义存储类:定义* /% # define V 1 / *引用:% * < S1 > /线性控制器的% * < S1 > /非线性控制器的% * /% # endif / * RTW_HEADER_demo_macros_h_ * /
枚举类型来改善代码的可读性变异控制变量的变异
使用枚举类型给整数有意义的名称作为变量值的控制。枚举类型数据的更多信息,参见使用枚举数据在仿真软件模型金宝app。
在MATLAB®编辑器中,定义类,枚举值映射到有意义的名称。
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
在基本工作空间中,定义的类枚举值映射到有意义的名称。
在这里,EngType
是一个基于整数枚举类,它来源于内置的数据类型,int32
。这个类有两个枚举值,线性
和非线性
。这些枚举值有潜在的整数值0
和1
。
类型EngType
classdef EngType <仿金宝app真软件。IntEnumType枚举小(1)大(2)方法(静态)函数结束retVal = addClassNameToEnumNames () % addClassNameToEnumNames指定是否要添加类名称%作为前缀,枚举成员名称生成的代码。%返回true或false。%如果您没有定义这个方法,没有添加前缀。retVal = true;结束结束结束
指定枚举名称变异控制变量的块参数对话框控制器
块。同时,改变变体激活时间来代码编译
。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“V = = EngType.Small”)set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“V = = EngType.Big”)set_param (“slexVariantSubsystems /控制器”,“VariantActivationTime”,代码编译的)
确保线性控制器
和非线性控制器
块都是原子的。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“TreatAsAtomicUnit”,“上”);set_param (“slexVariantSubsystems /控制器/非线性控制器”,“TreatAsAtomicUnit”,“上”);
定义变量控制变量,V
在基本工作空间,指定它的价值EngType.Small
然后模拟模型。
V = EngType.Small;
在模拟过程中,线性控制器
块变得活跃。双击控制器
块的积极选择。
sim卡(“slexVariantSubsystems”);
生成的代码使用枚举类型包含的名称值而不是整数。在这里,值1
和2
被表示为EngType_Small
和EngType_Big
。
% slexVariantSubsystems_types.h%的ifndef V% # define V EngType_Small% # endif%%的ifndef DEFINED_TYPEDEF_FOR_EngType_% # define DEFINED_TYPEDEF_FOR_EngType_%% typedef int32_T EngType;%% / * enum EngType * /% # define EngType_Small(1) / *默认值* /% # define EngType_Big (2)% # endif% slexVariantSubsystems.c%空白slexVariantSubsystems_step(空白)% {% #如果V = = EngType_Small%的逻辑线性控制器% # elif V = = EngType_Big%非线性控制器的逻辑% # endif%}
注意,变体街区启动激活时间,只有枚举定义使用这些技术支持:金宝app
通过子类化内置整数数据类型
int8
,int16
,int32
,uint8
,或uint16
,或者通过子类化金宝appSimulink.IntEnumType
这些枚举也支持当永久地存储在一个仿真软件®数据字典。金宝app金宝app看到枚举的数据字典。
金宝appSimulink.VariantObjects for Variant Condition Reuse of Variant Blocks
识别模型需要的变量值之后,您可以构建复杂的变异条件控制激活你的变体块通过定义变量条件金宝appSimulink.Variant
对象。金宝appSimulink.Variant
对象允许您跨模型和重用常见变异条件帮助你封装复杂的变异条件表达式。
您可以指定整个表达式或变量条件只有内部的变量控制变量条件
财产的金宝appSimulink.Variant
对象。
请注意:
您可以定义一个变量控制变量的类型
金宝appSimulink.Variant
只有在基本工作空间或在数据字典。定义变量控制使用金宝appSimulink.Variant
面具中的对象不支持或模型的工作区。金宝app为控制变量存储位置变量的更多信息,见存储位置变异控制变量(操作数)的变体。使用
金宝appSimulink.Variant
不支持内部结构。金宝app
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
在MATLAB®命令窗口,定义变量控制表达式金宝appSimulink.Variant
对象。
V_LinearController = 金宝appSimulink.Variant (“V = = 1”);V_NonLinearController = 金宝appSimulink.Variant (“V = = 2”);
指定金宝appSimulink.Variant
对象作为块中的变量控制变量控制器的参数对话框。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“V_LinearController”)set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“V_NonLinearController”)
打开块参数对话框控制器
块模型。的条件列的变量的选择表自动显示的布尔条件金宝appSimulink.Variant
对象代表。
设置变量控制变量的值V
作为1
和模拟模型。
V = 1;sim卡(“slexVariantSubsystems”);
在模拟过程中,线性控制器
块变得活跃。双击控制器
块的积极选择。使用这种方法,您可以开发复杂的变异条件表达式是可重用的。
结构组相关变量控制变量的变异
使用MATLAB®结构元素进行分组控制变量相关的变体。你可以控制生成的代码结构的特点和结构在内存的位置。有关更多信息,请参见结构体
。
请注意,您可以定义一个变量控制变量的类型结构只有在基本工作空间或在数据字典。定义结构类型的变体面具或模型中的控制变量工作区不支持。金宝app为控制变量存储位置变量的更多信息,见存储位置变异控制变量(操作数)的变体。
打开slexVariantSubsystems
模型。
open_system (“slexVariantSubsystems”);
VSS_MODE = 2
在基本工作空间,定义一个结构控制变量来存储相关的变体。将字段添加到使用点符号结构。
控制器。线性= 1; Controller.NonLinear = 0;
块的参数对话框控制器
块,指定控件使用点符号变体。同时,改变变体激活时间来代码编译
。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“VariantControl”,“Controller.Linear = = 1”);set_param (“slexVariantSubsystems /控制器/非线性控制器”,“VariantControl”,“Controller.NonLinear = = 1”);set_param (“slexVariantSubsystems /控制器”,“VariantActivationTime”,代码编译的);
确保线性控制器
和非线性控制器
块都是原子的。
set_param (“slexVariantSubsystems /控制器/线性控制器”,“TreatAsAtomicUnit”,“上”);set_param (“slexVariantSubsystems /控制器/非线性控制器”,“TreatAsAtomicUnit”,“上”);
模拟模型。在模拟过程中,线性控制器
块变得活跃。
sim卡(“slexVariantSubsystems”);
双击控制器
块的积极选择。
现在,从模型中生成代码。关于如何生成代码的信息,请参阅使用嵌入式编码器生成代码(嵌入式编码)。
生成的代码包含线性和非线性预处理条件的选择#如果
和# elif
因为代码编译
激活时间。
生成的头文件slexVariantSubsystems_types.h
定义一个结构类型,有一个随机的名字和初始化变量Controller_Linear
和Controller_NonLinear
。
%的ifndef Controller_Linear% # define Controller_Linear 1% # endif%%的ifndef Controller_NonLinear% # define Controller_NonLinear 0% # endif%%的ifndef DEFINED_TYPEDEF_FOR_struct_XfS20q0AY2qBc3cwjMQEtF_% # define DEFINED_TYPEDEF_FOR_struct_XfS20q0AY2qBc3cwjMQEtF_%% typedef struct {% real_T线性;% real_T非线性;%}struct_XfS20q0AY2qBc3cwjMQEtF;
源文件slexVariantSubsystems.c
定义的逻辑Controller_Linear
和Controller_NonLinear
选择。
%空白slexVariantSubsystems_step(空白)% {% #如果Controller_Linear = = 1%的逻辑线性控制器% # elif Controller_NonLinear = = 1%非线性控制器的逻辑% # endif%}
有关更多信息,请参见组织数据结构生成的代码(嵌入式编码)。