主要内容

在结构中组织相关块参数定义

当您使用数值MATLAB时®变量要在模型中设置块参数值,大型模型可以累积多个变量,增加维护的努力并导致变量名称长度增长。

相反,您可以将这些参数值组织成结构。每个结构是单个变量,并且结构的每个字段存储数字参数值。您可以将有意义的名称分配给结构,子结构和字段以指示每个值的目的。

使用结构:

  • 减少必须维护的工作区变量的数量。

  • 避免工作区变量之间的名称冲突。

    您不能在相同的作用域中创建两个具有相同名称的变量,例如在基本工作区中。在创建结构时,必须为每个字段提供一个名称,但多个结构可以每个包含使用相同名称的字段。因此,您可以使用每个结构和子结构作为名称空间这可以防止字段名彼此冲突,以及与同一作用域中的其他变量名冲突。

  • 从逻辑上对块参数值集进行分组。例如,使用嵌套结构清楚地标识每个子系统或引用模型使用的参数值。

如果使用蒙版参数或模型参数将参数值传递给系统的组件,则可以使用结构来减少必须维护的各个掩码参数或模型参数的数量。您可以通过单个结构变量而不是传递多个变量。

有关创建和操纵MATLAB结构的基本信息,请参阅结构.有关在模型中设置块参数值的基本信息,请参见设置块参数值

要使用结构初始化总线信号,请参阅指定总线元素的初始条件

创建和使用参数结构

这个示例展示了如何在模型中创建和使用参数结构。

模型的例子f14使用基本工作区中的多个变量来设置块参数值。例如,当您打开模型时,它会创建变量ZW.兆瓦Mq在基本工作区中。将这些变量组织成单个结构变量:

  1. 在命令提示符处,打开示例模型。

    f14

  2. 在命令提示符下,创建参数结构我的收获.通过使用目标变量的值设置字段值。

    mygains.zw= Zw; myGains.Mw = Mw; myGains.Mq = Mq;

  3. 在模型管理器中的模型层次结构窗格中,单击基本工作空间.在内容窗格中,右键单击该变量Mq并选择找到用过的地方

  4. 选择一个系统对话框,单击节点f14然后点击好啊.点击好啊当被问及如何更新图表时。

  5. 内容窗格中,右键单击标记为Gain1的块对应的行并选择属性.这时会打开Gain1块对话框。

  6. 的值获得参数来自MqmyGains。Mq然后点击好啊

  7. 内容窗格中,右键单击Transfer Fcn.1块对应的行并选择属性

  8. 的值分母系数参数来自[1,-MQ][1,-myGains.Mq]然后点击好啊

  9. 模型层次结构窗格中,单击基本工作空间.使用找到用过的地方查找使用变量的块兆瓦ZW..在块对话框中,根据表替换对变量名的引用。

    变量名 更换名字
    兆瓦 myGains。兆瓦
    ZW. mygains.zw

  10. 清除旧变量。

    清晰的ZW.兆瓦Mq

的字段,每个修改后的块参数现在使用我的收获结构体。每个结构字段的数值等于您清除的对应变量的值。

您可以迁移模型以使用单个参数结构,而不是多个工作区变量。

存储现场值中的数据类型信息

使用结构或结构数组来组织使用非数据类型的参数值双倍的,则可以在创建结构时显式指定类型。在创建结构时,使用类型化表达式,例如单(15.23)指定字段值。

myParams。获得= single(15.23);

如果以后要更改字段值,必须记住再次显式指定类型。如果不指定类型,字段值将使用数据类型双倍的而不是:

myParams。获得= 15.23;%“增益”字段现在使用数据类型“double”而不是“single”。

为了保留类型说明,可以使用下标赋值给字段赋一个新值:

%分配“单个”类型的值。myParams。获得= single(15.23);%分配新值,同时保留“单个”。myParams.Gain (,) = 11.79;

要匹配定点数据类型,请使用fi(定点设计师)对象。

通过创建参数对象控制字段数据类型和特征

一个金宝app仿真软件。参数对象允许您将块参数的值与其数据类型分开。如果使用参数对象存储结构或结构数组,则可以创建金宝app仿真软件。公共汽车用于用作整个结构的数据类型的对象。

你可以使用总线对象和参数对象来显式控制:

  • 每个字段的数据类型。使用此技术时,您不必记住使用键入的表达式或下标分配来设置字段值。

  • 每个字段的复杂性,尺寸和单位。

  • 如果字段表示可调参数值,则每个字段的最小值和最大值。

  • 整个结构的形状。的形状结构是字段的数字,名称和层次结构。

  • 从模型生成的代码中结构的可调性。

  1. 创建参数结构my

    myParams =结构(...“子系统”,struct(...“收益”, 15.23,...“抵消”,89,...“初始化”0.59),...“子系统”,struct(...'coeffs',[5.32 7.99],...“抵消”,57,...'init1', 1.76,...'init2', 2.76)...);

  2. 使用函数金宝appSimulink.Bus.createObject创造金宝app仿真软件。公共汽车代表结构和子结构的对象。

    金宝appSimulink.Bus.createObject(myParams)

    因为my包含两个唯一的子结构,该函数创建三个金宝app仿真软件。公共汽车对象:一个名为slBus1来表示父结构my,一个叫SubsystemA对于子结构SubsystemA,一个名字SubsystemB对于子结构SubsystemB

  3. 重命名总线对象slBus1作为myParamsType

    myParamsType=slBus1;清楚的slBus1

  4. 存储结构my在一个金宝app仿真软件。参数对象。

    myParams=Si金宝appmulink.Parameter(myParams);

    价值参数对象的属性包含结构。

  5. 将参数对象的数据类型设置为总线对象myParamsType

    myparams.datatype =.'总线:myparamstype';

  6. 打开总线编辑器以查看总线对象。

    buseditor

  7. 模型层次结构窗格,单击节点子系统。在内容窗格中,根据图设置字段数据类型。

  8. (可选)设置子结构的字段数据类型SubsystemB

参数对象my存储参数结构。参数对象的数据类型为总线对象myParamsType。在模拟和代码生成之前,参数对象将字段值强制转换为在总线对象中指定的数据类型。

若要使用其中一个字段来设置块参数值,请指定一个表达式,例如myParams.SubsystemB.Init1

要在命令提示符处访问字段值,请使用价值属性的参数。因为总线对象控制字段数据类型,所以不需要使用类型化表达式来设置字段值。

myParams.Value.SubsystemA.Gain = 12.79;

总线对象严格控制场特性和结构形状。例如,如果您设置双元素字段的值myparams.subsystemb.coeffs.对于三元素数组,当您设置块参数值时,模型生成一个错误。要更改字段的维度,请修改元素COEFFS.在总线对象中SubsystemB

若要在创建总线对象后对它们进行操作,请参见创建和指定Simulink。金宝app总线对象保存Sim金宝appulink.Bus对象

匹配字段数据类型与信号数据类型

假设您使用该字段myParams.SubsystemA.Gain设置值的值获得a中的参数获得如果希望字段的数据类型与块的输出信号的数据类型匹配,则不能依赖上下文相关的数据类型(请参阅上下文敏感的数据类型).考虑使用A.金宝appSimulink.AliasType或者一个金宝app仿真软件。NumericType对象来设置字段和信号的数据类型。如果不使用数据类型对象,则必须记住在更改信号的数据类型时更改字段的数据类型。

  1. 在命令提示符处,创建一个金宝appSimulink.AliasType对象,该对象表示数据类型

    myType = 金宝appSimulink.AliasType;myType。基类型=“单”;

  2. 获得块对话框,在信号属性选项卡,设置输出数据类型myType

  3. 在命令提示符下,打开总线编辑器。

    buseditor

  4. 模型层次结构窗格中,选择总线对象SubsystemA.在内容窗格,设置字段的数据类型获得myType

现在,这个的输出信号获得块体和结构场myParams.SubsystemA.Gain属性指定的数据类型基类型的属性myType

有关数据类型对象的更多信息,请参见金宝appSimulink.AliasType金宝app仿真软件。NumericType

管理结构变量

要创建、修改和检查值为结构的变量,可以使用变量编辑器。有关更多信息,请参见以交互方式修改结构和阵列变量

通过创建嵌套结构来定义参数层次结构

要进一步组织块参数值,请创建嵌套结构的层次结构。

例如,假设您创建了名为SubsystemASubsystemB在您的模型中。您可以使用以下变量Offset_subsystema.Offset_subsystemb.设置子系统中的块参数值。

增益子系统=15.23;偏移子系统=89;初始子系统=0.59;系数子系统=[5.32 7.99];偏移子系统=57;初始1子系统=1.76;初始2子系统=2.76;

为每个子系统创建包含子结构的参数结构。使用现有变量的值来设置字段值。

myParams =结构(...“子系统”,struct(...“收益”,gain_subsystema,...“抵消”,偏移量_子系统,...“初始化”Init_SubsystemA),...“子系统”,struct(...'coeffs',Coeffs_子系统b,...“抵消”Offset_SubsystemB,...'init1'Init1_SubsystemB,...'init2',init2_subsystemb)...);

单一结构变量my包含子系统中块的所有参数信息。因为每个子结构都充当一个名称空间,所以可以定义抵消字段不止一次。

使用抵消字段从子结构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的算法

如果使用模型参数在引用模型的多个实例中指定不同的参数值,则可以使用结构数组来组织模型参数值。在引用的模型工作区中,创建一个结构变量,并配置模型以使用该结构作为模型参数。使用结构的字段设置模型中的块参数值。然后,在基本工作空间中创建结构数组或父模型链接到的数据字典。在一个或多个父模型中,使用数组中的每个结构作为模型参数的值模型块。阵列中的每个结构存储引用模型的一个实例的参数值。

模型的例子sldemo_mdlref_datamngt包含三个实例(模型屏蔽引用模型的块sldemo_mdlref_counter_datamngt..基本工作空间变量IC1IC2param1param2.金宝app仿真软件。参数对象的值是结构。控件上的掩码参数使用这些变量设置值模型块。自IC1结构上是相同的吗IC2param1param2.,您可以将这四个结构组合成两个结构数组。

  1. 打开示例父模型。

    sldemo_mdlref_datamngt

    该模型创建了四个金宝app仿真软件。参数基础工作区中的对象。

  2. 打开示例引用的模型。

    sldemo_mdlref_counter_datamngt.

    模型工作区定义了两个模型参数,CounterICs逆决,其值是结构。模型中的块使用这些结构的字段来设置参数值。

  3. 在模型中sldemo_mdlref_datamngt,打开模型数据编辑器(在建模选项卡上,单击模型数据编辑器).在模型数据编辑器中,检查参数标签。

  4. 在模型中,单击其中一个模型块。

    模型数据编辑器将突出显示与所选掩码参数对应的行模型块。该块使用掩码参数来设置被引用模型定义的两个模型参数的值,sldemo_mdlref_counter_datamngt..每个模型块使用来自基工作区的四个参数对象的不同组合来设置参数值。

  5. 在模型数据编辑器中价值列中,单击其中一个单元格开始编辑相应遮罩参数的值(例如,IC1).在参数值旁边,单击操作按钮并选择开放。将打开参数对象的属性对话框。

  6. 属性对话框中,在价值框中,单击操作按钮并选择打开变量编辑器

    变量编辑器显示参数对象存储一个结构。的结构param2.IC2具有与?中的结构相同的字段param1IC1而是不同的字段值。

  7. 在命令提示符处,将四个参数对象合并为两个参数对象,其值为结构数组。

    %通过复制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

  8. 在父模型中,在模型数据编辑器中使用价值列以根据表替换遮罩参数的值

    先前值 新价值
    param1 参数(1)
    IC1 集成电路(1)
    param2. 参数(2)
    IC2 集成电路(2)

每个模型块设置模型参数的值CounterICs通过使用数组中的一个结构集成电路。类似地,每个块设置逆决通过使用参数

强制结构数组中的一致性

结构数组中的所有结构都必须具有相同的字段层次结构。层次结构中的每个字段在整个数组中都必须具有相同的特征。可以使用参数对象和总线对象在结构之间实现这种一致性。

若要使用参数对象表示参数结构数组,请将该对象的值设置为结构数组:

%创建结构数组。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;%创建总线对象。金宝appsimulink.bus.createobject(yemparams);myParamsType=slBus1;清楚的slBus1%创建参数对象并设置数据类型。myParams=Si金宝appmulink.Parameter(myParams);myParams.DataType='总线:myparamstype';

若要使用其中一个字段来设置块参数值,请指定一个表达式,例如MyParams(2).offset

要在命令提示符处访问字段值,请使用价值属性的参数。

MyParams.Value(2).offset = 129;

创建常值信号的结构

你可以在常数块创建传输多个数字常量的单个总线信号。有关更多信息,请参见常数.有关总线信号的信息,请参见虚拟总线

迁移到参数结构之前的注意事项

  • 在将模型迁移到使用参数结构之前,发现目标模型和其他模型中使用您想要替换的变量的所有块。

    例如,假设模型中的两个块使用workspace变量迈瓦尔.如果你创建一个结构my与一个字段迈瓦尔,并将其中一个块中的参数值设置为myParams.myVar,另一个块继续使用该变量迈瓦尔。如果你删除迈瓦尔,模型会产生一个错误,因为剩下的块需要被删除的变量。

    要发现所有使用变量的块:

    1. 打开可能使用变量的所有型号。如果模型位于模型引用层次结构中,则可以仅打开顶部模型。

    2. 在模型数据编辑器或模型资源管理器中内容窗格中,右键单击变量并选择找到用过的地方.模型资源管理器将显示使用该变量的所有块。

    您只能在打开的型号中发现可变的使用。在迁移到参数结构之前,请打开可能使用目标变量的所有型号。有关确定模型中的可变用法的详细信息,请参阅查找使用特定变量的块

    或者,您可以避免删除迈瓦尔.但是,如果您更改myParams.myVar的值,则必须记住更改迈瓦尔相配。

  • 您可以组合多个单独的变量或参数对象(例如金宝app仿真软件。参数)存储到单个变量或参数对象中的结构(要组合参数对象,请参见将现有的参数对象组合成一个结构).但是,生成的变量或物体充当单个实体。因此,您无法将不同的代码生成设置(例如Storage类)应用于结构中的各个字段。

将现有的参数对象组合成一个结构

当你使用参数对象来设置块参数值时(例如,你可以应用存储类),将对象组合成一个单独的结构:

  1. 创建一个MATLAB结构并将其存储在一个变量中。要设置字段值,请使用每个现有参数对象存储的参数值。

  2. 将变量转换为参数对象。创建和使用金宝app仿真软件。公共汽车对象作为参数对象的数据类型(请参见通过创建参数对象控制字段数据类型和特征).

  3. 选择要应用于生成的参数对象的存储类。您只能选择一个存储类,它适用于整个结构。

  4. 传输参数元数据,例如分钟马克斯属性的现有参数对象的相应属性金宝appsimulink.busement.总线对象中的对象。

例如,假设您有三个单独的参数对象。

系数=Simul金宝appink.参数(17.5);最小系数=14.33;系数数据类型='单身的';多项式系数。StorageClass =“ExportedGlobal”;init = 金宝appSimulink.Parameter (0.00938);init。分钟= -0.005; init.Max = 0.103; init.DataType ='单身的';init。StorageClass =“模型默认值”;offset = 金宝appsimulink.parameter(199);offset.datatype =.‘uint8’;偏移量。StorageClass =“ExportedGlobal”;

  1. 创建一个结构变量。

    myParams。多项式系数= coeff.Value;myParams。init = init.Value;myParams。抵消= offset.Value;

  2. 将变量转换为参数对象。

    myParams=Si金宝appmulink.Parameter(myParams);

  3. 创建一个总线对象并将其用作参数对象的数据类型。

    金宝appsimulink.bus.createobject(myparams.value);paramsdt = copy(SLBUS1);myparams.datatype =.“巴士:paramsDT”;

  4. 将元数据从旧参数对象传输到总线对象中的总线元素。

    %科夫paramsDT.Elements(1)。Min = coeff.Min;paramsDT.Elements(1)。数据类型=多项式系数。DataType;%初始化paramsDT.Elements(2)。Min = init.Min;paramsDT.Elements(2)。Max = init.Max;paramsDT.Elements(2)。数据类型=init。DataType;% 抵消paramsDT.Elements(3).DataType=offset.DataType;

    要帮助编写执行此传输操作的脚本,可以使用性质函数来查找总线元素和旧参数对象的共同属性。要列出结构字段以便可以对其进行迭代,请使用字段名函数。

  5. 将存储类应用于参数对象。

    myParams。StorageClass =“ExportedGlobal”;

现在,您可以使用my,而不是旧的参数对象,以设置块参数值。

生成的代码中的参数结构

可以配置参数结构,使其以结构和结构数组的形式出现在生成的代码中。有关使用参数结构生成代码的信息,请参见在生成的代码中将数据组织成结构(金宝appSimulink编码器)

参数结构的局限性

  • 用于设置块参数的字段的值必须为数字或枚举类型。字段的值可以是实或复标量、向量或多维数组。

  • 如果结构的任何字段的值是多维数组,则不能在模拟期间调优任何字段值。

  • 结构数组中的所有结构必须具有相同的字段层次结构。层次结构中的每个字段在整个数组中必须具有相同的特征:

    • 字段名称

    • 数字数据类型,例如INT32.

    • 复杂性

    假设您定义了一个由两个结构组成的数组。

    paramStructArray =...结构(“传感器1”int16 (7),“sensor2”、单(9.23))...结构(“传感器1”,int32(9),“sensor2”,单(11.71))];

    您不能在块参数中使用任何字段,因为字段传感器1在每个结构中使用不同的数据类型。

  • 参数结构不支持在生成的代码中键入上下文相关的数据。如果参金宝app数结构在代码中是可调的,则结构的字段将使用您通过使用类型化表达式或金宝app仿真软件。公共汽车对象。如果您不使用类型化表达式或金宝app仿真软件。公共汽车对象,结构的字段使用双倍的数据类型。

包共享断点和查找表的表数据

当您在查找表块之间共享数据时,请考虑使用金宝app仿真软件。LookupTable金宝app仿真软件。断点对象,而不是存储和分组数据的结构。该技术通过清楚地将数据标识为查找表的一部分并显式地将断点数据与表数据关联起来,提高了模型的可读性。看到包共享断点和查找表的表数据

根据现有C代码中的结构类型创建参数结构

您可以创建符合结构体现有C代码定义的类型定义。使用此技术可以:

在MATLAB中,将参数结构存储在参数对象中,并使用总线对象作为数据类型(参见通过创建参数对象控制字段数据类型和特征).根据c代码创建总线对象结构体输入,使用金宝appSimulink.ImportTexternalTypes函数。

相关话题