主要内容

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

当你使用数值MATLAB®变量来设置模型中的块参数值,大型模型可能会积累许多变量,增加维护工作,并导致变量名的长度增加。

相反,您可以将这些参数值组织成结构。每个结构都是一个变量,结构的每个字段存储一个数值参数值。您可以为结构、子结构和字段分配有意义的名称,以指示每个值的用途。

使用结构:

  • 减少您必须维护的工作空间变量的数量。

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

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

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

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

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

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

创建和使用参数结构

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

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

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

    f14

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

    myGains.Zw=Zw;Mw=Mw;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.Mw
    Zw myGains。Zw

  10. 清除旧的变量。

    清晰的Zw兆瓦Mq

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

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

在字段值中存储数据类型信息

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

myParams。获得= single(15.23);

如果您希望稍后更改字段值,则必须记住再次显式指定类型。如果不指定类型,字段值将使用数据类型而不是:

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

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

%指定类型为“single”的值。myParams。获得= single(15.23);%赋新值,同时保持类型“single”。参数增益(:)=11.79;

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

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

一个金宝appSimulink.参数对象允许您将块参数的值与其数据类型分开。如果使用参数对象存储结构或结构数组,则可以创建金宝app模拟总线对象用作整个结构的数据类型。

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

  • 每个字段的数据类型。当您使用这种技术时,您不必记住使用类型化表达式或下标赋值来设置字段值。

  • 每个字段的复杂性、维度和单位。

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

  • 整个结构的形状。的形状结构的关键是字段的数量、名称和层次结构。

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

  1. 创建参数结构myParams

    myParams =结构(...“SubsystemA”结构(...“获得”, 15.23,...“抵消”, 89,...“Init”,0.59),...“SubsystemB”结构(...多项式系数的(5.32 - 7.99),...“抵消”57岁的...“Init1”, 1.76,...“Init2”,2.76)...);

  2. 使用的函数金宝appSimulink.Bus.createObject创建金宝app模拟总线表示结构和子结构的对象。

    金宝appSimulink.Bus.createObject (myParams)

    因为myParams包含两个独特的子结构,函数创建三个金宝app模拟总线对象:一个名叫slBus1来表示父结构myParams,一个叫SubsystemA子结构的SubsystemA,还有一个叫SubsystemB子结构的SubsystemB

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

    myParamsType = slBus1;清晰的slBus1

  4. 存储结构myParams在一个金宝appSimulink.参数对象。

    myParams = 金宝appSimulink.Parameter (myParams);

    价值属性包含该结构。

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

    myParams。数据类型=“巴士:myParamsType”

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

    buseditor

  7. 模型层次结构窗格中,单击节点SubsystemA。在目录窗格中,根据图设置字段数据类型。

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

的参数对象myParams存储参数结构。参数对象的数据类型是总线对象粘虫.在模拟和代码生成之前,参数对象将字段值转换为您在总线对象中指定的数据类型。

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

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

myParams.Value.SubsystemA.Gain = 12.79;

总线对象严格控制场特性和结构形状。例如,如果您设置双元素字段的值myParams.SubsystemB.Coeffs对于三元素数组,设置块参数值时,模型会生成错误。要更改字段的尺寸,请修改元素多项式系数在总线对象中SubsystemB

要在创建总线对象后对其进行操作,请参见创建并指定Simulink.Bus对象金宝app保存模型。金宝app总线对象

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

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

  1. 在命令提示下,创建一个金宝app仿真软件。AliasType对象,该对象表示数据类型

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

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

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

    buseditor

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

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

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

管理结构变量

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

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

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

例如,假设您创建了名为SubsystemASubsystemB在你的模型。你可以使用诸如Offset_SubsystemAOffset_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”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)。初始化

组织可重用组件和迭代算法的参数值

您还可以将结构数组划分为为每个子系统块当模型重复执行算法时,此技术可以帮助您组织工作空间变量,例如通过在向量信号上迭代算法。有关示例,请参见为每个子系统重复一个算法

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

模型的例子sldemo\U mdlref\U datamngt包含三个实例(模型块)的掩码引用模型sldemo_mdlref_counter_datamngt.基本工作区变量IC1IC2Param1,Param2金宝appSimulink.参数值为结构的对象。父模型使用这些变量设置模型块。自IC1在结构上与IC2,Param1Param2,您可以将这四个结构组合成两个结构数组。

  1. 打开示例父模型。

    sldemo\U mdlref\U datamngt

    模型创建了四个金宝appSimulink.参数对象。

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

    sldemo_mdlref_counter_datamngt

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

  3. 在模型中sldemo\U mdlref\U datamngt,打开模型数据编辑器(位于建模选项卡上,单击模型数据编辑器)。在模型数据编辑器中,检查参数选项卡。

  4. 在模型中,单击模型块。

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

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

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

    变量编辑器显示参数对象存储一个结构。的结构Param2IC2与中的结构具有相同的字段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通过使用数组中的一个结构集成电路.类似地,每个块设置的值CounterParams通过使用Param

强制结构数组中的一致性

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

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

创建结构数组。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 (myParams);myParamsType = slBus1;清晰的slBus1%创建参数对象并设置数据类型。myParams=Si金宝appmulink.Parameter(myParams);myParams.DataType=“巴士:myParamsType”

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

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

myParams.Value(2)。抵消= 129;

创建一个常值信号结构

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

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

  • 在将模型移植为使用参数结构之前,请先查找目标模型以及使用要替换的变量的其他模型中的所有块。

    例如,假设模型中的两个块使用工作区变量myvar#.如果你创建一个结构myParams有一块田myvar#,并仅将其中一个块中的参数值设置为myParams.myVar,另一个块继续使用该变量myvar#.如果你删除myvar#,模型会产生一个错误,因为剩下的块需要被删除的变量。

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

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

    2. 在模型数据编辑器或模型资源管理器中目录窗格中,右键单击变量并选择发现在使用. 模型管理器显示使用变量的所有块。

    您只能在开放的模型中发现变量的使用情况。在迁移到参数结构之前,打开所有可能使用目标变量的模型。有关确定模型中变量使用的更多信息,请参见查找使用特定变量的块

    或者,您可以避免删除myvar#.但是,如果您更改myParams.myVar的值,则必须记住更改myvar#来匹配。

  • 您可以组合多个独立的变量或参数对象(例如金宝appSimulink.参数)存储到单个变量或参数对象中的结构(要组合参数对象,请参见将现有的参数对象组合成一个结构).然而,生成的变量或对象作为一个单独的实体。因此,您不能将不同的代码生成设置(如存储类)应用于结构中的各个字段。

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

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

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

  2. 将变量转换为参数对象。创建并使用金宝app模拟总线对象作为参数对象的数据类型(请参阅通过创建参数对象控制字段数据类型和特征).

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

  4. 传输参数元数据,例如最小值马克斯属性的现有参数对象的相应属性金宝app模拟总线Element总线对象中的对象。

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

coeff=Si金宝appmulink.Parameter(17.5);coeff.Min=14.33;coeff.DataType=“单一”;多项式系数。StorageClass =“ExportedGlobal”;init = 金宝appSimulink.Parameter (0.00938);init。最小值= -0.005; init.Max = 0.103; init.DataType =“单一”;init。StorageClass =“模型默认”;抵消= Simul金宝appink.Parameter (199);偏移量。数据类型=“uint8”; offset.StorageClass=“ExportedGlobal”

  1. 创建一个结构变量。

    myParams.coeff=coeff.Value;myParams.init=init.Value;myParams.offset=offset.Value;

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

    myParams = 金宝appSimulink.Parameter (myParams);

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

    金宝appSimulink.Bus.createObject (myParams.Value);paramsDT = (slBus1)复印件;myParams。数据类型='总线:paramsDT'

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

    %多项式系数参数元素(1).Min=系数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;

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

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

    myParams。StorageClass =“ExportedGlobal”

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

生成代码中的参数结构

您可以将参数结构配置为在生成的代码中显示为结构和结构数组。有关使用参数结构生成代码的信息,请参见在生成的代码中将数据组织到结构中(金宝app仿真软件编码器)

参数结构的局限性

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

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

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

    • 字段名

    • 数字数据类型,例如int32

    • 复杂性

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

    paramStructArray =...结构(“sensor1”int16 (7),“传感器2”,单身(9.23))...结构(“sensor1”int32 (9),“传感器2”单(11.71)));

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

  • 在生成的代码中,参数结构不支持上下文敏感的数据类型。金宝app如果参数结构在代码中是可调优的,则结构的字段将使用您通过使用类型化表达式或金宝app模拟总线对象。如果您不使用类型化表达式或金宝app模拟总线对象时,结构的字段使用数据类型。

为查找表打包共享断点和表数据

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

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

您可以创建一个符合结构您现有的C代码定义的类型定义。使用这个技巧:

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

相关的话题