当你使用数字MATLAB时®在模型中设置块参数值的变量,大型模型可能会积累许多变量,增加维护的工作量,并导致变量名的长度增加。
相反,您可以将这些参数值组织到结构中。每个结构都是一个变量,结构的每个字段都存储一个数值参数值。您可以为结构、子结构和字段分配有意义的名称,以指示每个值的用途。
使用结构来:
减少必须维护的工作空间变量的数量。
避免工作区变量之间的名称冲突。
您不能在相同的作用域中(例如在基本工作空间中)创建具有相同名称的两个变量。创建结构时,必须为每个字段提供名称,但多个结构可以每个包含使用相同名称的字段。因此,您可以将每个结构和子结构用作名称空间这可以防止字段名彼此之间以及与同一作用域中的其他变量名冲突。
逻辑上分组块参数值集。例如,使用嵌套结构来清楚地识别每个子系统或引用模型使用的参数值。
如果使用掩码参数或模型参数将参数值传递给系统的组件,则可以使用结构来减少必须维护的单个掩码参数或模型参数的数量。您可以传递一个结构变量,而不是传递多个变量。
有关创建和操作MATLAB结构的基本信息,请参见结构(MATLAB)。有关在模型中设置块参数值的基本信息,请参见设置块参数值.
若要使用结构初始化总线信号,请参见指定总线信号的初始条件.
这个例子展示了如何在模型中创建和使用参数结构。
示例模型f14
使用来自基本工作区的多个变量来设置块参数值。例如,当您打开模型时,它会创建变量Zw
,兆瓦
,Mq
在基本工作区中。将这些变量组织成一个结构变量:
在命令提示符下,打开示例模型。
f14
在命令提示符下,创建参数结构myGains
.使用目标变量的值设置字段值。
myGains。Zw= Zw; myGains.Mw = Mw; myGains.Mq = Mq;
在模型资源管理器中模型层次结构窗格中,单击基本工作空间.在内容窗格中,右键单击该变量Mq
并选择找到使用的地方.
在选择一个系统对话框中,单击该节点f14并点击好吧.点击好吧当被问及更新图表时。
在内容窗格中,右键单击标记为Gain1的块对应的行并选择属性.打开Gain1块对话框。
的值获得参数从Mq
来myGains。Mq
并点击好吧.
在内容窗格中,右键单击“Transfer Fcn.1”块对应的行,选择属性.
的值分母系数参数从(1, mq)
来[1, -myGains。Mq)
并点击好吧.
在模型层次结构窗格中,单击基本工作空间.使用找到使用的地方来定位使用这些变量的块兆瓦
而且Zw
.在块对话框中,根据表替换对变量名的引用。
变量名 | 更换名字 |
---|---|
兆瓦 |
myGains。兆瓦 |
Zw |
myGains。Zw |
清除旧的变量。
清晰的Zw兆瓦Mq
中的每个修改的块参数现在都使用myGains
结构。每个结构字段的数值等于已清除的相应变量的值。
你可以使用这些函数万博1manbetxSimulink.BlockDiagram.createVarStruct
而且万博1manbetxSimulink.BlockDiagram.applyVarStruct
迁移模型以使用单个参数结构而不是多个工作空间变量。有关示例,请参见迁移到结构参数.
使用结构体或结构体数组来组织使用其他数据类型的参数值双
,可以在创建结构时显式指定类型。在创建结构时,使用类型化表达式,例如单(15.23)
指定字段值。
myParams。获得= single(15.23);
如果以后想更改字段值,必须记得再次显式指定类型。如果不指定类型,则字段值使用数据类型双
而不是:
myParams。获得= 15.23;字段'Gain'现在使用数据类型'double'而不是'single'。
为了保留类型规范,你可以使用下标赋值给字段赋一个新值:
指定类型为“single”的值。myParams。获得= single(15.23);%分配新值,同时保留类型“单一”。myParams.Gain(:) = 11.79;
类来设置字段值,以匹配定点数据类型fi
对象。
一个万博1manbetx仿真软件。参数
对象允许将块参数的值与其数据类型分开。如果使用参数对象存储结构或结构数组,则可以创建万博1manbetx仿真软件。公共汽车
对象作为整个结构的数据类型使用。
你可以使用总线对象和参数对象显式控制:
每个字段的数据类型。使用此技术时,不必记得使用类型化表达式或下标赋值来设置字段值。
每个领域的复杂性、维度和单位。
如果字段表示可调参数值,则每个字段的最小值和最大值。
整个结构的形状。的形状结构的一部分是字段的数量、名称和层次结构。
从模型生成的代码中结构的可调性。
创建参数结构myParams
.
myParams = struct(...“SubsystemA”结构(...“获得”, 15.23,...“抵消”, 89,...“Init”0.59),...“SubsystemB”结构(...多项式系数的(5.32 - 7.99),...“抵消”57岁的...“Init1”, 1.76,...“Init2”, 2.76)...);
使用函数万博1manbetxSimulink.Bus.createObject
创建万博1manbetx仿真软件。公共汽车
表示结构和子结构的对象。
万博1manbetxSimulink.Bus.createObject (myParams)
因为myParams
包含两个独特的子结构,函数创建三个万博1manbetx仿真软件。公共汽车
对象:一个名为slBus1
来表示父结构myParams
,其中一个名为SubsystemA
对于子结构SubsystemA
,还有一个叫SubsystemB
对于子结构SubsystemB
.
重命名总线对象slBus1
作为myParamsType
.
myParamsType = slBus1;清晰的slBus1
存储结构myParams
在一个万博1manbetx仿真软件。参数
对象。
myParams = 万博1manbetxSimulink.Parameter(myParams);
的价值
参数对象的属性包含结构。
将参数对象的数据类型设置为总线对象myParamsType
.
myParams。数据类型=“巴士:myParamsType”;
打开总线编辑器以查看总线对象。
buseditor
在模型层次结构窗格中,单击“SubsystemA”节点。在内容窗格中,根据图设置字段数据类型。
可选地,为子结构设置字段数据类型SubsystemB
.
参数对象myParams
存储参数结构。参数对象的数据类型是总线对象myParamsType
.在模拟和代码生成之前,参数对象将字段值转换为您在总线对象中指定的数据类型。
若要使用其中一个字段来设置块参数值,请指定表达式,如myParams.SubsystemB.Init1
.
要在命令提示符中访问字段值,请使用价值
参数对象的属性。由于总线对象控制字段数据类型,因此不需要使用类型化表达式来设置字段值。
myparams . value . subsystem . gain = 12.79;
总线对象严格控制了现场特性和结构形状。例如,如果您设置了两个元素字段的值myParams.SubsystemB.Coeffs
对于三元素数组,当您设置块参数值时,模型将生成一个错误。要更改字段的尺寸,请修改元素多项式系数
在总线对象中SubsystemB
.
若要在创建总线对象后操作它们,请参见修改总线对象而且保存和导入总线对象.
假设你用这个场myParams.SubsystemA.Gain
属性的值获得参数。获得块。如果希望字段的数据类型与块的输出信号的数据类型相匹配,则不能依赖上下文敏感的数据类型(请参阅上下文敏感的数据类型).考虑使用万博1manbetx仿真软件。AliasType
或者一个万博1manbetx仿真软件。NumericType
对象设置字段和信号的数据类型。如果不使用数据类型对象,则必须记住在更改信号的数据类型时更改字段的数据类型。
在命令提示符下,创建一个万博1manbetx仿真软件。AliasType
表示数据类型的对象单
.
myType = 万博1manbetxSimulink.AliasType;myType。BaseType = 'single';
在获得块对话框,在信号的属性选项卡,设置输出数据类型来myType
.
在命令提示符下,打开总线编辑器。
buseditor
在模型层次结构窗格中,选择总线对象SubsystemA
.在内容窗格中,设置字段的数据类型获得
来myType
.
现在,两个输出信号获得块和结构字段myParams.SubsystemA.Gain
方法指定的数据类型基类型
的属性myType
.
有关数据类型对象的详细信息,请参见万博1manbetx仿真软件。AliasType
而且万博1manbetx仿真软件。NumericType
.
要创建、修改和检查值为结构的变量,可以使用变量编辑器。有关更多信息,请参见交互式修改结构和数组变量.
要进一步组织块参数值,请创建嵌套结构的层次结构。
例如,假设您创建了名为SubsystemA
而且SubsystemB
在你的模型中。您可以使用诸如Offset_SubsystemA
而且Offset_SubsystemB
设置子系统中的块参数值。
Gain_SubsystemA = 15.23;Offset_SubsystemA = 89;Init_SubsystemA = 0.59;Coeffs_SubsystemB = [5.32 7.99];Offset_SubsystemB = 57;Init1_SubsystemB = 1.76;Init2_SubsystemB = 2.76;
创建一个包含每个子系统的子结构的参数结构。使用现有变量的值来设置字段值。
myParams = struct(...“SubsystemA”结构(...“获得”Gain_SubsystemA,...“抵消”Offset_SubsystemA,...“Init”Init_SubsystemA),...“SubsystemB”结构(...多项式系数的Coeffs_SubsystemB,...“抵消”Offset_SubsystemB,...“Init1”Init1_SubsystemB,...“Init2”Init2_SubsystemB)...);
单一结构变量myParams
包含子系统中块的所有参数信息。因为每个子结构充当一个名称空间,所以可以定义抵消
Field不止一次。
使用抵消
字段从子结构SubsystemB
作为块参数的值,在块对话框中指定参数值作为表达式myParams.SubsystemB.Offset
.
要组织具有相似特征的参数结构,可以创建一个变量,其值为结构数组。此技术帮助您参数化包含算法的多个实例的模型,例如库子系统或使用模型参数的引用模型。
假设您在一个模型中创建了两个相同的子系统。
假设每个子系统中的块需要三个数值来设置参数值。创建一个包含两个结构的数组来存储值。
myParams(1)。获得= 15.23; myParams(1).Offset = 89; myParams(1).Init = 0.59; myParams(2).Gain = 11.93; myParams(2).Offset = 57; myParams(2).Init = 2.76;
数组中的每个结构存储其中一个子系统的三个参数值。
若要在某个子系统中设置块参数的值,请指定引用数组中某个结构的字段的表达式。例如,使用表达式myParams(2)。初始化
.
类型中的结构数组也可以进行分区每个子系统块。当模型重复执行某个算法时,这种技术可以帮助您组织工作空间变量,例如通过在矢量信号上迭代算法。有关示例,请参见为每个子系统重复一种算法.
如果您使用模型参数跨引用模型的多个实例指定不同的参数值,那么您可以使用结构数组来组织模型参数值。在引用的模型工作区中,创建一个结构变量,并配置模型以使用该结构作为模型参数。使用结构的字段来设置模型中的块参数值。然后,在基本工作区或父模型链接到的数据字典中创建结构数组。在父模型或多个模型中,使用数组中的每个结构作为模型参数的值模型块。数组中的每个结构存储引用模型的一个实例的参数值。
示例模型sldemo_mdlref_datamngt
包含三个实例(模型块)的屏蔽引用模型sldemo_mdlref_counter_datamngt
.基本工作区变量IC1
,IC2
,Param1
,Param2
是万博1manbetx仿真软件。参数
值为结构的对象。对象上的掩码参数值,父模型使用这些变量来设置模型块。自IC1
在结构上是相同的IC2
,Param1
来Param2
,您可以将这四个结构组合成两个结构数组。
打开示例父模型。
sldemo_mdlref_datamngt
模型创建了这四个万博1manbetx仿真软件。参数
基本工作区中的对象。
打开示例引用模型。
sldemo_mdlref_counter_datamngt
模型工作区定义了两个模型参数,CounterICs
而且CounterParams
,其值为结构。模型中的块使用这些结构的字段来设置参数值。
在模型中sldemo_mdlref_datamngt
,打开模型数据编辑器(视图>模型数据编辑器).在模型数据编辑器中,检查参数选项卡。
在模型中,单击其中一个模型块。
“模型数据编辑器”突出显示与所选对象上的两个掩码参数对应的行模型块。该块使用mask参数来设置由引用模型定义的两个模型参数的值,sldemo_mdlref_counter_datamngt
.每一个模型Block使用来自基本工作区的四个参数对象的不同组合来设置参数值。
在模型数据编辑器中价值列时,单击其中一个单元格开始编辑相应掩码参数的值(例如,IC1
).在参数值旁边,单击操作按钮并选择开放.打开参数对象的属性对话框。
属性对话框中价值框中,单击操作按钮并选择打开变量编辑器.
变量编辑器显示参数对象存储结构。的结构Param2
而且IC2
和里面的结构有相同的场Param1
而且IC1
但是不同的字段值。
在命令提示符中,将四个参数对象组合为两个参数对象,其值为结构的数组。
通过复制Param1创建一个新的参数对象。Param = Param1.copy;使用Param2中的结构作为新对象中的第二个结构。Param.Value(2) = Param2.Value;Param的值现在是一个包含两个结构的数组。删除旧对象Param1和Param2。清晰的Param1Param2通过复制IC1创建一个新的参数对象。使用IC2中的结构作为新对象中的第二个结构。IC = IC1.copy;IC.Value(2) = IC2.Value;清晰的IC1IC2
在父模型的“模型数据编辑器”中,使用价值列,根据表替换掩码参数的值
之前的值 | 新值 |
---|---|
Param1 |
参数(1) |
IC1 |
集成电路(1) |
Param2 |
参数(2) |
IC2 |
集成电路(2) |
每一个模型Block设置模型参数的值CounterICs
通过使用数组中的一个结构集成电路
.类似地,每个块设置的值CounterParams
通过使用中的一种结构参数
.
结构数组中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段必须在整个数组中具有相同的特征。您可以使用参数对象和总线对象来强制结构之间的这种一致性。
要使用一个形参对象来表示一个形参结构的数组,请将该对象的值设置为结构的数组:
创建结构数组。myParams(1)。获得= 15.23; myParams(1).Offset = 89; myParams(1).Init = 0.59; myParams(2).Gain = 11.93; myParams(2).Offset = 57; myParams(2).Init = 2.76;创建总线对象。万博1manbetxSimulink.Bus.createObject (myParams);myParamsType = slBus1;清晰的slBus1创建参数对象并设置数据类型。myParams = 万博1manbetxSimulink.Parameter(myParams);myParams。数据类型=“巴士:myParamsType”;
若要使用其中一个字段来设置块参数值,请指定表达式,如myParams(2)。抵消
.
要在命令提示符中访问字段值,请使用价值
参数对象的属性。
myParams.Value(2)。Offset = 129;
在您将模型迁移到使用参数结构之前,在目标模型和其他使用您打算替换的变量的模型中发现所有的块。
例如,假设模型中的两个块使用工作区变量myvar#
.如果你创建一个结构myParams
有一个领域myvar#
,并只将其中一个块的参数值设置为myParams.myVar
,另一个块继续使用该变量myvar#
.如果你删除myvar#
,模型会产生一个错误,因为剩下的块需要删除的变量。
使用实例发现所有使用变量的块:
打开所有可能使用该变量的模型。如果模型在模型引用层次结构中,则只能打开顶部模型。
在Model Explorer中右键单击变量内容窗格并选择找到使用的地方.Model Explorer显示了使用该变量的所有块。
您只能在开放的模型中发现变量的使用情况。在迁移到参数结构之前,打开可能使用目标变量的所有模型。有关确定模型中变量使用情况的更多信息,请参见查找使用特定变量的块.
或者,你也可以避免删除myvar#
.的值myParams.myVar
结构字段时,必须记得更改值myvar#
来匹配。
您可以组合多个单独的变量或参数对象(例如万博1manbetx仿真软件。参数
)转换为存储在单个变量或参数对象中的结构(要组合参数对象,请参阅将现有参数对象组合成结构).但是,生成的变量或对象作为单个实体。因此,您不能将不同的代码生成设置(例如存储类)应用于结构中的各个字段。
当你使用参数对象来设置块参数值时(例如,这样你就可以应用存储类),将对象组合成一个单一的结构:
创建一个MATLAB结构并将其存储在一个变量中。若要设置字段值,请使用每个现有参数对象存储的参数值。
将变量转换为参数对象。创建和使用万博1manbetx仿真软件。公共汽车
对象作为参数对象的数据类型(请参阅通过创建参数对象控制字段数据类型和特征).
选择要应用于结果参数对象的存储类。您只能选择一个存储类,它适用于整个结构。
传输参数元数据,例如最小值
而且马克斯
属性的现有参数对象,以对应的属性万博1manbetx仿真软件。公共汽车Element
总线对象中的对象。
例如,假设您有三个单独的参数对象。
coeff = 万博1manbetxSimulink.Parameter(17.5);多项式系数。最小值= 14.33; coeff.DataType =“单一”;多项式系数。StorageClass =“ExportedGlobal”;init = 万博1manbetxSimulink.Parameter(0.00938);init。最小值= -0.005; init.Max = 0.103; init.DataType =“单一”;init。StorageClass =“模型默认”;offset = 万博1manbetxSimulink.Parameter(199);偏移量。数据类型=“uint8”;偏移量。StorageClass =“ExportedGlobal”;
创建一个结构变量。
myParams。coeff = coeff. value;myParams。init = init. value;myParams。offset = offset. value;
将变量转换为参数对象。
myParams = 万博1manbetxSimulink.Parameter(myParams);
创建一个总线对象,并将其用作参数对象的数据类型。
万博1manbetxSimulink.Bus.createObject (myParams.Value);paramsDT = copy(slBus1);myParams。数据类型=“巴士:paramsDT”;
将元数据从旧参数对象传输到总线对象中的总线元素。
%多项式系数paramsDT.Elements(1)。Min = coff .Min;paramsDT.Elements(1)。数据类型=多项式系数。DataType;%初始化paramsDT.Elements(2)。Min =初始值。Min;paramsDT.Elements(2)。Max =初始值。Max;paramsDT.Elements(2)。数据类型=init。DataType;%抵消paramsDT.Elements(3)。数据类型=偏移量。DataType;
为帮助您编写执行此传输操作的脚本,可以使用属性
函数查找总线元素和旧参数对象共有的属性。要列出结构字段以便遍历它们,请使用字段名
函数。
将存储类应用于参数对象。
myParams。StorageClass =“ExportedGlobal”;
现在,您可以使用的字段myParams
,而不是旧的参数对象,来设置块参数值。
您可以配置参数结构,使其在生成的代码中显示为结构和结构数组。有关生成带有参数结构的代码的信息,请参见在生成的代码中将数据组织成结构(万博1manbetx仿真软件编码器)。
用于设置块参数的字段的值必须是数字或枚举类型。字段的值可以是实数或复标量、向量或多维数组。
如果结构的任何字段的值是多维数组,则在模拟期间不能调优任何字段值。
结构数组中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段必须在整个数组中具有相同的特征:
字段名
数值型数据类型,例如单
或int32
复杂性
维
假设您定义了一个包含两个结构的数组。
paramStructArray =...结构(“sensor1”int16 (7),“sensor2”、单(9.23))...结构(“sensor1”int32 (9),“sensor2”单(11.71)));
不能在块参数中使用任何字段,因为字段sensor1
在每个结构中使用不同的数据类型。
在生成的代码中,参数结构不支持上下文敏感的数据类型。万博1manbetx如果参数结构在代码中是可调的,则结构的字段使用您通过使用类型化表达式或类来指定的数值数据类型万博1manbetx仿真软件。公共汽车
对象。如果不使用类型化表达式或万博1manbetx仿真软件。公共汽车
对象时,结构的字段使用双
数据类型。
在查找表块之间共享数据时,考虑使用万博1manbetx仿真软件。LookupTable
而且万博1manbetx仿真软件。断点
对象,而不是结构来存储和分组数据。这种技术通过清楚地将数据标识为查找表的一部分,并显式地将断点数据与表数据关联起来,从而提高了模型的可读性。看到打包用于查找表的共享断点和表数据.
可以创建符合的参数结构结构体
现有C代码定义的类型定义。使用这个技巧:
用Simulink替换现有的C代码万博1manbetx®模型。
在Simulink中集成现有的C代码进行仿真(例如,通过使用遗留代码工具)。万博1manbetx有关示例,请参见集成C函数,其参数是指向结构的指针.
生成C代码(万博1manbetx仿真软件编码器™),你可以用现有的C代码编译成一个应用程序。有关示例,请参见在生成的代码和外部代码之间交换结构化和枚举数据(嵌入式编码)。
在MATLAB中,将参数结构存储在参数对象中,并使用总线对象作为数据类型(参见通过创建参数对象控制字段数据类型和特征).根据c代码创建总线对象结构体
键入,使用万博1manbetxSimulink.importExternalCTypes
函数。