当您使用数字matlab时®变量要在模型中设置块参数值,大型模型可以累积多个变量,增加维护的努力并导致变量名称长度增长。
相反,您可以将这些参数值组织成结构。每个结构是单个变量,并且结构的每个字段存储数字参数值。您可以将有意义的名称分配给结构,子结构和字段以指示每个值的目的。
使用结构:
减少必须维护的工作区变量数。
避免工作区变量之间的名称冲突。
您无法在同一范围内创建两个具有相同名称的两个变量,例如在基础工作区中。创建结构时,必须提供每个字段的名称,但多个结构每个都可以包含使用相同名称的字段。因此,您可以使用每个结构和子结构作为一个命名空间这可以防止字段名称彼此冲突,并且在相同范围内具有其他变量名称。
逻辑上的块参数值组。例如,使用嵌套结构来清楚地识别每个子系统或引用的模型使用的参数值。
如果使用蒙版参数或模型参数将参数值传递给系统的组件,则可以使用结构来减少必须维护的各个掩码参数或模型参数的数量。您可以通过单个结构变量而不是传递多个变量。
有关创建和操纵MATLAB结构的基本信息,请参阅结构。有关在模型中设置块参数值的基本信息,请参阅设置块参数值。
使用结构初始化总线信号,请参阅为总线元素指定初始条件。
此示例显示如何在模型中创建和使用参数结构。
示例模型F14
使用来自基本工作区的多个变量来设置块参数值。例如,当您打开模型时,它会创建变量ZW.
那m
, 和MQ.
在基础工作区。要将这些变量组织成单个结构变量:
在命令提示符处,打开示例模型。
F14
在命令提示符下,创建参数结构弥补者
。使用目标变量的值设置字段值。
mygains.zw = zw;mygains.mw = mw;mygains.mq = mq;
在模型资源管理器中,在模型层次结构窗格,点击基础工作区。在里面内容窗格,右键单击变量MQ.
并选择找到所使用的地方。
在里面选择一个系统对话框,单击节点F14然后点击行。点击行当被问及更新图表时。
在里面内容窗格,右键单击与标记为GAIN1的块对应的行并选择特性。将打开GAIN1块对话框。
改变价值获得参数从MQ.
到mygains.mq.
然后点击行。
在里面内容窗格,右键单击与传输FCN.1块对应的行并选择特性。
改变价值分母系数参数从[1,-MQ]
到[1,-mygains.mq]
然后点击行。
在里面模型层次结构窗格,点击基础工作区。采用找到所使用的地方找到使用变量的块m
和ZW.
。在“块”对话框中,根据表替换对变量名称的引用。
变量的名称 | 替换名称 |
---|---|
m |
mygains.mw |
ZW. |
mygains.zw. |
清除旧变量。
清除ZW.mMQ.
每个修改的块参数现在使用一个字段弥补者
结构体。每个结构字段的数值等于您清除的对应变量的值。
您可以迁移模型以使用单个参数结构而不是多个工作空间变量。例如,看到迁移到结构参数。
使用结构或结构阵列来组织使用除此之外的数据类型的参数值双倍的
,您可以在创建结构时显式指定类型。创建结构时,请使用键入的表达式,例如单(15.23)
指定字段值。
MyParams.gain =单身(15.23);
如果要稍后更改字段值,则必须记得重新清晰指定类型。如果未指定类型,则字段值使用数据类型双倍的
反而:
MyParams.gain = 15.23;%字段“增益”现在使用数据类型“双”而不是“单”。
要保留类型规范,可以使用下标分配来为该字段分配新值:
%分配“单个”类型的值。MyParams.gain =单身(15.23);%分配新值,同时保留“单个”。MyParams.gain(:) = 11.79;
要匹配固定点数据类型,请使用a设置字段值FI.
(定点设计师)目的。
一种金宝appSimulink.Parameter.
对象允许您将块参数的值与其数据类型分开。如果使用参数对象来存储结构或结构数组,则可以创建一个金宝appsimulink.bus.
用于用作整个结构的数据类型的对象。
您可以使用总线对象和参数对象进行显式控制:
每个字段的数据类型。使用此技术时,您不必记住使用键入的表达式或下标分配来设置字段值。
每个字段的复杂性,尺寸和单位。
如果字段表示可调谐参数值,则每个字段的最小值和最大值。
整个结构的形状。这形状结构是字段的数字,名称和层次结构。
从模型生成的代码中结构的可调性。
创建参数结构my
。
myparams = struct(......'subsystema',struct(......'获得',15.23,......'抵消',89,......'在里面',0.59),......'subsystemb',struct(......'coeffs',[5.32 7.99],......'抵消'57,......'init1',1.76,......'init2',2.76)......);
使用功能金宝appsimulink.bus.createobject.
去创造金宝appsimulink.bus.
代表结构和子结构的对象。
金宝appsimulink.bus.createobject(myparams)
因为my
包含两个唯一的子结构,该函数创建三个金宝appsimulink.bus.
对象:一个名为SLBUS1.
代表父结构my
,一个名字子系统
对于子结构子系统
,一个名字subsystemb.
对于子结构subsystemb.
。
重命名总线对象SLBUS1.
作为myparamstype.
。
myparamstype = slbus1;清除SLBUS1.
存储结构my
在一个金宝appSimulink.Parameter.
目的。
myparams = 金宝appsimulink.parameter(ymparams);
这价值
参数对象的属性包含结构。
将参数对象的数据类型设置为总线对象myparamstype.
。
myparams.datatype =.'总线:myparamstype';
打开总线编辑器以查看总线对象。
巴士
在里面模型层次结构窗格,单击节点子系统。在里面内容窗格,根据图设置字段数据类型。
(可选)设置子结构的字段数据类型subsystemb.
。
参数对象my
存储参数结构。参数对象的数据类型是总线对象myparamstype.
。在仿真和代码生成之前,参数对象将字段值投递给BUS对象中指定的数据类型。
要使用其中一个字段来设置块参数值,请指定诸如myparams.subsystemb.init1.
。
要在命令提示符处访问字段值,请使用价值
参数对象的属性。由于总线对象控制字段数据类型,因此无需使用键入的表达式来设置字段值。
myparams.value.subsystema.gain = 12.79;
总线对象严格控制现场特征和结构的形状。例如,如果设置了双元素字段的值myparams.subsystemb.coeffs.
对于一个三个元素数组,模型在设置块参数值时会生成错误。要更改字段的维度,请修改元素COEFFS.
在公共汽车对象subsystemb.
。
创建总线对象创建后,请参阅创建和指定simulink.bus对象金宝app和保存sim金宝appulink.bus对象。
假设您使用该字段myparams.subsystema.gain.
设置值的值获得A.参数获得堵塞。如果要将字段的数据类型匹配块的输出信号的数据类型,则不能依赖上下文敏感数据键入(请参阅上下文敏感数据键入)。考虑使用A.金宝appsimulink.aliaStype.
或者金宝appsimulink.numerictype.
对象设置字段的数据类型和信号。如果不使用数据类型对象,则必须记得在更改信号的数据类型时更改字段的数据类型。
在命令提示符下,创建一个金宝appsimulink.aliaStype.
代表数据类型的对象单身的
。
mytype = 金宝appsimulink.aliaStype;mytype.baseType ='单';
在里面获得块对话框,在信号属性标签,设置输出数据类型到我的风格
。
在命令提示符下,打开总线编辑器。
巴士
在里面模型层次结构窗格,选择总线对象子系统
。在里面内容窗格,设置字段的数据类型获得
到我的风格
。
现在,两个输出信号都是获得块和结构字段myparams.subsystema.gain.
使用您使用使用的数据类型使用基础型号
财产我的风格
。
有关数据类型对象的详细信息,请参阅金宝appsimulink.aliaStype.
和金宝appsimulink.numerictype.
。
要创建,修改和检查其值是结构的变量,可以使用变量编辑器。有关更多信息,请参阅以交互方式修改结构和阵列变量。
要进一步组织块参数值,请创建嵌套结构的层次结构。
例如,假设您创建名为的子系统子系统
和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',struct(......'获得',gain_subsystema,......'抵消',offset_subsystema,......'在里面',init_subsystema),......'subsystemb',struct(......'coeffs',coeffs_subsystemb,......'抵消',offset_subsystemb,......'init1',init1_subsystemb,......'init2',init2_subsystemb)......);
单结构变量my
包含子系统中块的所有参数信息。因为每个子结构充当命名空间,所以您可以定义抵消
领域不止一次。
用来抵消
来自子结构的字段subsystemb.
作为块参数的值,指定块对话框中的参数值作为表达式myparams.subsystemb.offset.
。
要组织具有相似特性的参数结构,可以创建一个单个变量,其值是一系列结构。此技术可帮助您参数化包含算法的多个实例的模型,例如库子系统或使用模型参数的引用模型。
假设您在模型中创建了两个相同的子系统。
假设每个子系统中的块需要三个数值来设置参数值。创建两个结构数组以存储值。
迈帕夏(1).gain = 15.23;MyParams(1).Offset = 89;肌巴(1).init = 0.59;迈帕夏(2).gain = 11.93;MyParams(2).offset = 57;ymparams(2).init = 2.76;
阵列中的每个结构都存储其中一个子系统的三个参数值。
要在其中一个子系统中设置块参数的值,请指定引用阵列中的一个结构字段的表达式。例如,使用表达式迈帕夏(2).init
。
您还可以在A中分区一系列结构对于每个子系统堵塞。当模型重复执行算法时,该技术可帮助您组织工作空间变量,例如通过在向量信号上迭代算法。例如,看到使用每个子系统的a重复算法。
如果使用模型参数在引用模型的多个实例上指定不同的参数值,则可以使用结构阵列来组织模型参数值。在引用的模型工作空间中,创建一个结构变量并配置模型以将结构用作模型参数。使用结构的字段设置模型中的块参数值。然后,在基础工作空间或数据字典中创建一个结构数组或父模型或模型链接的数据字典。在父模型或模型中,将数组中的每个结构用作模型参数的值模型堵塞。阵列中的每个结构存储引用模型的一个实例的参数值。
示例模型sldemo_mdlref_datamngt.
包含三个实例(模型屏蔽引用模型的块sldemo_mdlref_counter_datamngt.
。基础工作区变量IC1.
那IC2.
那param1
, 和param2.
是金宝appSimulink.Parameter.
其值是结构的对象。父模型使用这些变量来设置屏蔽参数的值模型块。自从IC1.
结构上相同IC2.
, 和param1
到param2.
,您可以将这四个结构组合成两个结构阵列。
打开示例父模型。
sldemo_mdlref_datamngt.
该模型创造了四个金宝appSimulink.Parameter.
基础工作区中的对象。
打开示例引用的模型。
sldemo_mdlref_counter_datamngt.
模型工作区定义了两个模型参数,计数器
和逆决
,其值是结构。模型中的块使用这些结构的字段来设置参数值。
在模型中sldemo_mdlref_datamngt.
,打开模型数据编辑器(在造型选项卡,单击模型数据编辑器)。在模型数据编辑器中,检查参数标签。
在模型中,单击其中一个模型块。
模型数据编辑器突出显示所选两个掩码参数对应的行模型堵塞。该块使用掩码参数设置引用模型定义的两个模型参数的值,sldemo_mdlref_counter_datamngt.
。每个模型块使用来自Base Workspace的四个参数对象的不同组合来设置参数值。
在模型数据编辑器中价值列,单击其中一个单元格以开始编辑相应掩码参数的值(例如,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;清除IC1.IC2.
在父模型中,在模型数据编辑器中,使用价值列以根据表格替换掩模参数的值
以前的价值 | 新价值 |
---|---|
param1 |
param(1) |
IC1. |
IC(1) |
param2. |
Param(2) |
IC2. |
IC(2) |
每个模型块设置模型参数的值计数器
通过使用阵列中的一个结构我知道了
。同样,每个块设置值逆决
通过使用其中一个结构帕纳
。
结构阵列中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段都必须在整个数组中具有相同的特征。您可以使用参数对象和总线对象来强制结构中的这种均匀性。
要使用参数对象来表示参数结构数组,请将对象的值设置为结构数组:
%创建结构数组。迈帕夏(1).gain = 15.23;MyParams(1).Offset = 89;肌巴(1).init = 0.59;迈帕夏(2).gain = 11.93;MyParams(2).offset = 57;ymparams(2).init = 2.76;%创建总线对象。金宝appsimulink.bus.createobject(yemparams);myparamstype = slbus1;清除SLBUS1.%创建参数对象并设置数据类型。myparams = 金宝appsimulink.parameter(ymparams);myparams.datatype =.'总线:myparamstype';
要使用其中一个字段来设置块参数值,请指定诸如MyParams(2).offset
。
要在命令提示符处访问字段值,请使用价值
参数对象的属性。
MyParams.Value(2).offset = 129;
您可以使用一个结构持续的块创建传输多个数字常量的单个总线信号。有关更多信息,请参阅持续的。有关总线信号的信息,请参阅虚拟总线。
在迁移模型以使用参数结构之前,发现目标模型中的所有块以及使用您打算替换的变量的其他模型。
例如,假设模型中的两个块使用工作区变量Myvar.
。如果您创建了一个结构my
与一个领域Myvar.
,并将参数值设置为仅其中一个块MyParams.myvar.
,其他块继续使用变量Myvar.
。如果你删除Myvar.
,模型生成错误,因为剩余块需要删除的变量。
要发现使用变量的所有块:
打开可能使用变量的所有型号。如果模型位于模型引用层次结构中,则可以仅打开顶部模型。
在模型数据编辑器或模型资源管理器中内容窗格,右键单击变量并选择找到所使用的地方。模型资源管理器显示使用变量的所有块。
您只能在打开的型号中发现可变的使用。在迁移到参数结构之前,请打开可能使用目标变量的所有型号。有关确定模型中的可变用法的详细信息,请参阅查找使用特定变量的块。
或者,您可以避免删除Myvar.
。但是,如果您更改值MyParams.myvar.
结构字段,您必须记得更改值Myvar.
匹配。
您可以组合多个单独的变量或参数对象(例如金宝appSimulink.Parameter.
)在一个变量或参数对象中存储的结构(组合参数对象,请参阅将现有参数对象组合成一个结构)。但是,生成的变量或物体充当单个实体。因此,您无法将不同的代码生成设置(例如Storage类)应用于结构中的各个字段。
当您使用参数对象来设置块参数值(例如,您可以应用存储类),将对象组合成一个结构:
创建MATLAB结构并将其存储在变量中。要设置字段值,请使用每个现有参数对象存储的参数值。
将变量转换为参数对象。创建和使用金宝appsimulink.bus.
对象作为参数对象的数据类型(参见通过创建参数对象来控制现场数据类型和特征)。
选择存储类以应用于生成的参数对象。您只能选择一个存储类,该类适用于整个结构。
传输参数元数据,如闵
和最大限度
现有参数对象的属性,到相应的属性金宝appsimulink.busement.
总线对象中的对象。
例如,假设您有三个单独的参数对象。
coeff = 金宝appsimulink.parameter(17.5);coeff.min = 14.33;coeff.datatype =.'单身的';coeff.storageclass ='ExportedGlobal';init = 金宝appsimulink.parameter(0.00938);init.min = -0.005;init.max = 0.103;init.datatype =.'单身的';init.storageClass =.'模型默认';offset = 金宝appsimulink.parameter(199);offset.datatype =.'uint8';offset.storageClass =.'ExportedGlobal';
创建一个结构变量。
MyParams.Coeff = Coeff.Value;myparams.init = init.Value;myparams.offset = offset.Value;
将变量转换为参数对象。
myparams = 金宝appsimulink.parameter(ymparams);
创建总线对象并将其用作参数对象的数据类型。
金宝appsimulink.bus.createobject(myparams.value);paramsdt = copy(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).datatype = init.datatype;% 抵消paramsdt.Elements(3).datatype = offset.datatype;
要帮助您编写执行此传输操作的脚本,可以使用特性
找到总线元素和旧参数对象具有共同的属性的功能。要列出结构字段,以便您可以迭代它们,使用场上名字
功能。
将存储类应用于参数对象。
MyParams.StorageClass =.'ExportedGlobal';
现在,您可以使用字段my
,而不是旧的参数对象,以设置块参数值。
您可以将参数结构配置为在生成的代码中显示为结构和结构阵列。有关使用参数结构生成代码的信息,请参阅将数据组织到生成代码中的结构中(金宝appSimulink编码器)。
您用于设置块参数的字段的值必须是枚举类型的数字或枚举类型。字段的值可以是真实或复杂的标量,矢量或多维数组。
如果结构的任何字段的值是多维数组,则无法在仿真期间调整任何字段值。
结构阵列中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段都必须在整个数组中具有相同的特征:
字段名称
数字数据类型,例如单身的
要么INT32.
复杂
方面
假设您定义了两个结构数组。
paramstructarray =.......[struct('Sensor1',INT16(7),'Sensor2',单身(9.23))......struct('Sensor1',int32(9),'Sensor2',单(11.71))];
您不能在块参数中使用任何字段,因为该字段传感器1.
在每个结构中使用不同的数据类型。
参数结构不支持在生成的代码中键入的上下文敏感数据。金宝app如果在代码中可调参数结构,则结构的字段使用您使用键入的表达式或a指定的数字数据类型金宝appsimulink.bus.
目的。如果您不使用键入的表达式或金宝appsimulink.bus.
对象,结构的字段使用双倍的
数据类型。
在查找表块之间共享数据时,请考虑使用金宝appsimulink.lockuptable.
和金宝appsimulink.breakpoint.
对象而不是存储和分组数据的结构。通过清楚地识别数据作为查找表的一部分,并且将该技术提高了模型可读性,并将断点数据与表数据明确地关联。看包共享断点和查找表的表数据。
您可以创建符合A的参数结构塑造
输入您现有的C代码定义的定义。使用此技术:
用simulink替换现有的c代码金宝app®模型。
在Simulink中集成了现有的C代码进行模拟(例如,使用遗留代码工具)。金宝app例如,看到集成C功能,其参数是指向结构的指针。
生成C代码(金宝appSimulink Coder™)您可以使用现有的C代码编译为单个应用程序。例如,看到在生成和外部代码之间交换结构化和枚举数据(嵌入式编码器)。
在MATLAB中,将参数结构存储在参数对象中并使用总线对象作为数据类型(参见通过创建参数对象来控制现场数据类型和特征)。根据C代码创建总线对象塑造
类型,使用金宝appsimulink.importexternalctypes.
功能。