当您使用数字matlab时®变量来设置模型中的块参数值,大型模型可能会积累许多变量,增加维护工作,并导致变量名的长度增加。
相反,您可以将这些参数值组织成结构。每个结构都是一个变量,结构的每个字段存储一个数值参数值。您可以为结构、子结构和字段分配有意义的名称,以指示每个值的用途。
使用结构:
减少必须维护的工作区变量数。
避免工作区变量之间的名称冲突。
您不能在相同的作用域中创建两个具有相同名称的变量,例如在基本工作区中。在创建结构时,必须为每个字段提供一个名称,但多个结构可以每个包含使用相同名称的字段。因此,您可以使用每个结构和子结构作为命名空间这可以防止字段名称彼此冲突,并且在相同范围内具有其他变量名称。
逻辑上的块参数值组。例如,使用嵌套结构来清楚地识别每个子系统或引用的模型使用的参数值。
如果使用掩码参数或模型参数将参数值传递给系统的组件,则可以使用结构来减少必须维护的单个掩码参数或模型参数的数量。可以传递一个结构变量,而不是多个变量。
有关创建和操作MATLAB结构的基本信息,请参见结构.有关在模型中设置块参数值的基本信息,请参见设置块参数值.
使用结构初始化总线信号,请参阅为总线元素指定初始条件.
这个示例展示了如何在模型中创建和使用参数结构。
模型的例子F14
使用基本工作区中的多个变量来设置块参数值。例如,当您打开模型时,它会创建变量Zw
,m
, 和MQ.
在基本工作区中。将这些变量组织成单个结构变量:
在命令提示符处,打开示例模型。
F14
在命令提示符处,创建参数结构弥补者
.通过使用目标变量的值设置字段值。
mygains.zw = zw;mygains.mw = mw;mygains.mq = mq;
在模型资源管理器中,在模型层次结构窗格,点击基本工作空间.在里面内容窗格中,右键单击该变量MQ.
并选择找到所使用的地方.
在里面选择一个系统对话框中,单击节点F14并点击好的.点击好的当被问及如何更新图表时。
在里面内容窗格中,右键单击标记为Gain1的块对应的行并选择属性.这时会打开Gain1块对话框。
的值获得参数从MQ.
来mygains.mq.
并点击好的.
在里面内容窗格中,右键单击Transfer Fcn.1块对应的行并选择属性.
的值分母系数参数从(1, mq)
来[1,-mygains.mq]
并点击好的.
在里面模型层次结构窗格,点击基本工作空间.用找到所使用的地方查找使用变量的块m
和Zw
.在块对话框中,根据表替换对变量名的引用。
变量名 | 更换名字 |
---|---|
m |
mygains.mw |
Zw |
myGains。Zw |
清除旧的变量。
清晰的ZwmMQ.
的字段,每个修改后的块参数现在使用弥补者
结构。每个结构字段的数值等于您清除的相应变量的值。
您可以迁移模型以使用单个参数结构而不是多个工作空间变量。例如,看到迁移到结构参数.
使用结构或结构阵列来组织使用除此之外的数据类型的参数值双
,您可以在创建结构时显式指定类型。创建结构时,请使用键入的表达式,例如单(15.23)
指定字段值。
myParams。获得= single(15.23);
如果要稍后更改字段值,则必须记得重新清晰指定类型。如果未指定类型,则字段值使用数据类型双
而不是:
myParams。获得= 15.23;%字段“增益”现在使用数据类型“双”而不是“单”。
为了保留类型说明,可以使用下标赋值给字段赋一个新值:
%指定类型为“single”的值。myParams。获得= single(15.23);%赋新值,同时保持类型“single”。MyParams.gain(:) = 11.79;
要匹配定点数据类型,请使用FI.
(定点设计师)对象。
一个万博1manbetxSimulink.Parameter.
对象允许您将块参数的值与其数据类型分开。如果使用参数对象来存储结构或结构数组,则可以创建一个万博1manbetxsimulink.bus.
对象用作整个结构的数据类型。
你可以使用总线对象和参数对象来显式控制:
每个字段的数据类型。当您使用这种技术时,您不必记住使用类型化表达式或下标赋值来设置字段值。
每个字段的复杂性、维度和单位。
如果字段表示可调谐参数值,则每个字段的最小值和最大值。
整个结构的形状。的形状结构的关键是字段的数量、名称和层次结构。
从模型生成的代码中结构的可调性。
创建参数结构myParams
.
myParams =结构(...'subsystema'结构(...'获得', 15.23,...'抵消',89,...'在里面',0.59),...'subsystemb'结构(...多项式系数的(5.32 - 7.99),...'抵消'57,...“Init1”, 1.76,...“Init2”,2.76)...);
使用功能万博1manbetxSimulink.Bus.createObject
创建万博1manbetxsimulink.bus.
表示结构和子结构的对象。
万博1manbetxsimulink.bus.createobject(myparams)
因为myParams
包含两个独特的子结构,函数创建三个万博1manbetxsimulink.bus.
对象:一个名叫SLBUS1.
代表父结构myParams
,一个叫SubsystemA
子结构的SubsystemA
,还有一个叫SubsystemB
子结构的SubsystemB
.
重命名总线对象SLBUS1.
作为myparamstype.
.
myParamsType = slBus1;清晰的SLBUS1.
存储结构myParams
在一个万博1manbetxSimulink.Parameter.
对象。
myparams = 万博1manbetxsimulink.parameter(ymparams);
的价值
属性包含该结构。
将参数对象的数据类型设置为总线对象myparamstype.
.
myparams.datatype =.“巴士:myParamsType”;
打开总线编辑器以查看总线对象。
buseditor
在里面模型层次结构窗格中,单击节点SubsystemA。在里面内容窗格中,根据图设置字段数据类型。
可以选择设置子结构的字段数据类型SubsystemB
.
的参数对象myParams
存储参数结构。参数对象的数据类型是总线对象myparamstype.
.在仿真和代码生成之前,参数对象将字段值投递给BUS对象中指定的数据类型。
若要使用其中一个字段来设置块参数值,请指定一个表达式,例如myParams.SubsystemB.Init1
.
要在命令提示符处访问字段值,请使用价值
属性的参数。因为总线对象控制字段数据类型,所以不需要使用类型化表达式来设置字段值。
myParams.Value.SubsystemA.Gain = 12.79;
总线对象严格控制场特性和结构形状。例如,如果您设置双元素字段的值myParams.SubsystemB.Coeffs
对于一个三个元素数组,模型在设置块参数值时会生成错误。要更改字段的维度,请修改元素多项式系数
在总线对象中SubsystemB
.
创建总线对象创建后,请参阅创建和指定simulink.bus对象万博1manbetx和保存sim万博1manbetxulink.bus对象.
假设您使用该字段myparams.subsystema.gain.
的值获得A.参数获得块。如果要将字段的数据类型匹配块的输出信号的数据类型,则不能依赖上下文敏感数据键入(请参阅上下文敏感的数据类型).考虑使用万博1manbetxsimulink.aliaStype.
或者万博1manbetx仿真软件。NumericType
对象设置字段的数据类型和信号。如果不使用数据类型对象,则必须记得在更改信号的数据类型时更改字段的数据类型。
在命令提示符下,创建一个万博1manbetxsimulink.aliaStype.
对象,该对象表示数据类型单
.
myType = 万博1manbetxSimulink.AliasType;myType。基类型=“单”;
在里面获得块对话框中信号的属性标签,设置输出数据类型来我的风格
.
在命令提示符处,打开总线编辑器。
buseditor
在里面模型层次结构窗格中,选择总线对象SubsystemA
.在里面内容窗格中,设置字段的数据类型获得
来我的风格
.
现在,这个的输出信号获得块和结构字段myparams.subsystema.gain.
属性指定的数据类型基础型号
财产我的风格
.
有关数据类型对象的更多信息,请参见万博1manbetxsimulink.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 =结构(...'subsystema'结构(...'获得'Gain_SubsystemA,...'抵消',offset_subsystema,...'在里面'Init_SubsystemA),...'subsystemb'结构(...多项式系数的,coeffs_subsystemb,...'抵消'Offset_SubsystemB,...“Init1”Init1_SubsystemB,...“Init2”Init2_SubsystemB)...);
单结构变量myParams
包含子系统中块的所有参数信息。因为每个子结构都充当一个名称空间,所以可以定义抵消
字段不止一次。
用来抵消
字段从子结构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)。初始化
.
您还可以在A中分区一系列结构对于每个子系统块。当模型重复执行算法时,该技术可帮助您组织工作空间变量,例如通过在向量信号上迭代算法。例如,看到使用每个子系统的a重复算法.
如果使用模型参数在引用模型的多个实例中指定不同的参数值,则可以使用结构数组来组织模型参数值。在引用的模型工作区中,创建一个结构变量,并配置模型以使用该结构作为模型参数。使用结构的字段设置模型中的块参数值。然后,在基本工作空间中创建结构数组或父模型链接到的数据字典。在一个或多个父模型中,使用数组中的每个结构作为模型参数的值模型块。数组中的每个结构存储引用模型的一个实例的参数值。
模型的例子sldemo_mdlref_datamngt.
包含三个实例(模型块)的掩码引用模型sldemo_mdlref_counter_datamngt
.基础工作区变量IC1
,IC2
,Param1
, 和Param2
是万博1manbetxSimulink.Parameter.
其值是结构的对象。父模型使用这些变量来设置屏蔽参数的值模型块。自IC1
结构上相同IC2
, 和Param1
来Param2
,您可以将这四个结构组合成两个结构数组。
打开示例父模型。
sldemo_mdlref_datamngt.
该模型创造了四个万博1manbetxSimulink.Parameter.
对象。
打开示例引用的模型。
sldemo_mdlref_counter_datamngt
模型工作区定义了两个模型参数,CounterICs
和CounterParams
,其值是结构。模型中的块使用这些结构的字段来设置参数值。
在模型中sldemo_mdlref_datamngt.
,打开模型数据编辑器(在建模选项卡上,单击模型数据编辑器).在模型数据编辑器中,检查参数选项卡。
在模型中,单击其中一个模型块。
模型数据编辑器将突出显示与所选掩码参数对应的行模型块。该块使用掩码参数来设置被引用模型定义的两个模型参数的值,sldemo_mdlref_counter_datamngt
.每个模型块使用来自基工作区的四个参数对象的不同组合来设置参数值。
在模型数据编辑器中价值列,单击其中一个单元格以开始编辑相应掩码参数的值(例如,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 |
param(1) |
IC1 |
IC(1) |
Param2 |
Param(2) |
IC2 |
IC(2) |
每个模型块设置模型参数的值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(ymparams);myparams.datatype =.“巴士:myParamsType”;
若要使用其中一个字段来设置块参数值,请指定一个表达式,例如myParams(2)。抵消
.
要在命令提示符处访问字段值,请使用价值
属性的参数。
myParams.Value(2)。抵消= 129;
在迁移模型以使用参数结构之前,发现目标模型中的所有块以及使用您打算替换的变量的其他模型。
例如,假设模型中的两个块使用工作区变量Myvar.
.如果你创建一个结构myParams
与一个领域Myvar.
,并将参数值设置为仅其中一个块myParams.myVar
,其他块继续使用变量Myvar.
.如果你删除Myvar.
,模型会产生一个错误,因为剩下的块需要被删除的变量。
要发现所有使用变量的块:
打开所有可能使用该变量的模型。如果模型处于模型引用层次结构中,则只能打开顶部模型。
在模型数据编辑器或模型资源管理器中内容窗格中,右键单击变量并选择找到所使用的地方.模型资源管理器显示使用变量的所有块。
您只能在开放的模型中发现变量的使用情况。在迁移到参数结构之前,打开所有可能使用目标变量的模型。有关确定模型中变量使用的更多信息,请参见查找使用特定变量的块.
或者,您可以避免删除Myvar.
.但是,如果您更改myParams.myVar
的值,则必须记住更改Myvar.
匹配。
您可以组合多个独立的变量或参数对象(例如万博1manbetxSimulink.Parameter.
)存储到单个变量或参数对象中的结构(要组合参数对象,请参见将现有的参数对象组合成一个结构).然而,生成的变量或对象作为一个单独的实体。因此,您不能将不同的代码生成设置(如存储类)应用于结构中的各个字段。
当你使用参数对象来设置块参数值时(例如,你可以应用存储类),将对象组合成一个单独的结构:
创建一个MATLAB结构并将其存储在一个变量中。要设置字段值,请使用每个现有参数对象存储的参数值。
将变量转换为参数对象。创建和使用万博1manbetxsimulink.bus.
对象作为参数对象的数据类型(参见通过创建参数对象来控制现场数据类型和特征).
选择要应用于生成的参数对象的存储类。您只能选择一个存储类,它适用于整个结构。
传输参数元数据,例如闵
和最大限度
属性的现有参数对象的相应属性万博1manbetxsimulink.bus.Element
总线对象中的对象。
例如,假设您有三个单独的参数对象。
coeff = 万博1manbetxsimulink.parameter(17.5);coeff.min = 14.33;coeff.datatype =.“单一”;多项式系数。StorageClass ='ExportedGlobal';init = 万博1manbetxSimulink.Parameter (0.00938);init。闵= -0.005; init.Max = 0.103; init.DataType =“单一”;init。StorageClass ='模型默认';抵消= Simul万博1manbetxink.Parameter (199);偏移量。数据类型='uint8';offset.storageClass =.'ExportedGlobal';
创建一个结构变量。
MyParams.Coeff = Coeff.Value;myparams.init = init.Value;myparams.offset = offset.Value;
将变量转换为参数对象。
myparams = 万博1manbetxsimulink.parameter(ymparams);
创建一个总线对象并将其用作参数对象的数据类型。
万博1manbetxSimulink.Bus.createObject (myParams.Value);paramsDT = (slBus1)复印件;myparams.datatype =.'总线:paramsdt';
将元数据从旧参数对象传输到总线对象中的总线元素。
%Coeff.paramsdt.elements(1).min = coeff.min;paramsdt.elements(1).datatype = coeff.datatype;% 在里面paramsDT.Elements(2)。Min = init.Min;paramsDT.Elements(2)。Max = init.Max;paramsDT.Elements(2)。数据类型=init。DataType;%抵消paramsdt.Elements(3).datatype = offset.datatype;
要帮助您编写执行此传输操作的脚本,可以使用特性
找到总线元素和旧参数对象具有共同的属性的功能。要列出结构字段,以便您可以迭代它们,使用场上名字
功能。
将存储类应用于参数对象。
myParams。StorageClass ='ExportedGlobal';
现在,您可以使用字段myParams
,来设置块参数值,而不是旧的参数对象。
您可以将参数结构配置为在生成的代码中显示为结构和结构阵列。有关使用参数结构生成代码的信息,请参阅将数据组织到生成代码中的结构中(万博1manbetxSimulink编码器).
您用于设置块参数的字段的值必须是枚举类型的数字或枚举类型。字段的值可以是真实或复杂的标量,矢量或多维数组。
如果结构的任何字段的值是多维数组,则无法在仿真期间调整任何字段值。
结构阵列中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段都必须在整个数组中具有相同的特征:
字段名
数字数据类型,例如单
或者int32
复杂性
维
假设您定义了两个结构数组。
paramStructArray =...结构('Sensor1'int16 (7),'Sensor2',单身(9.23))...struct('Sensor1'int32 (9),'Sensor2'单(11.71)));
您不能在块参数中使用任何字段,因为字段传感器1.
在每个结构中使用不同的数据类型。
参数结构不支持在生成的代码中键入的上下文敏感数据。万博1manbetx如果在代码中可调参数结构,则结构的字段使用您使用键入的表达式或a指定的数字数据类型万博1manbetxsimulink.bus.
对象。如果您不使用类型化表达式或万博1manbetxsimulink.bus.
对象时,结构的字段使用双
数据类型。
当您在查找表块之间共享数据时,请考虑使用万博1manbetx仿真软件。LookupTable
和万博1manbetx仿真软件。断点
对象,而不是存储和分组数据的结构。该技术通过清楚地将数据标识为查找表的一部分并显式地将断点数据与表数据关联起来,提高了模型的可读性。看到包共享断点和查找表的表数据.
您可以创建符合A的参数结构塑造
您现有的C代码定义的类型定义。使用这个技巧:
用Simulink替换现有的C代码万博1manbetx®模型。
在Simulink中集成了现有的C代码进行模拟(例如,使用遗留代码工具)。万博1manbetx例如,看到集成C函数,其参数是指向结构体的指针.
生成C代码(万博1manbetxSimulink Coder™)您可以使用现有的C代码编译为单个应用程序。例如,看到在生成的代码和外部代码之间交换结构化和枚举数据(嵌入式编码器).
在MATLAB中,将参数结构存储在参数对象中,并使用总线对象作为数据类型(参见通过创建参数对象来控制现场数据类型和特征).根据C代码创建总线对象塑造
类型,使用万博1manbetxsimulink.importexternalctypes.
功能。