Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

参数化可重用引用模型的实例

当您使用多个 Model 模块引用同一模型时,您可以将模块参数配置为对模型的每个实例使用相同值或不同值。例如,您可以配置 Gain 模块的 Gain 参数。要使用不同值,请创建并使用模型参数来设置模块参数的值。对于某些应用,仅当您可以将每个实例配置为对模块参数使用不同值(例如控制器的设定值或滤波器系数)时,才能重用引用模型。

为可重用模型的每个实例指定不同值

对于可重用引用模型中的模块参数,要为模型的每个实例指定不同值,请执行以下操作:

  1. 在引用模型的模型工作区中创建一个 MATLAB® 变量或 Simulink.Parameter 对象。

    • 使用 MATLAB 变量可以方便维护。

    • 使用 Simulink.Parameter 对象可以更好地控制模型参数的最小值和最大值、数据类型和其他属性。

  2. 使用变量或参数对象设置模块参数值。(可选)使用相同的变量或对象来设置其他模块参数值。

  3. 通过选择 Argument 属性,将变量或对象配置为模型参数。

    在您直接仿真此模型时,模块参数使用变量或对象存储在模型工作区中的值。当将此模型作为引用模型进行仿真时,配置为模型参数的形参从其父模型获得其值。

    如果使用 Simulink.Parameter 对象来设置模块参数值,则只要在模型引用层次结构父级的某个位置提供显式值,就可以在对象的值保留为空(Value 设置为 '[]')的情况下将模型作为引用模型进行编译和仿真。在这种情况下,您无法直接仿真模型。当该值为空时,您必须为该对象提供 Data TypeDimensions。为对象提供 MinMax 值是可选的。虽然您指定了空值,Simulink® 仍会合成 Value(请参阅 Simulink.Parameter)。

  4. 在引用可重用模型的每个 Model 模块中,为模块参数指定特定于实例的值。如果不指定值,该参数将使用模型层次结构中在它下方指定的最后一个值。在顶层模型中,您可以将诊断配置参数 No explicit final value for model arguments 配置为在可设置模型参数值的最顶层 Model 模块使用此默认值(而不是提供显式值)时生成错误或警告。

  5. 在中间模型中,除了为模块参数指定特定于实例的值之外,您还可以指定是否可以在层次结构的下一级覆盖该参数。

将多个参数组合成一个结构体

当您将一个模型配置为使用多个模型参数时,请考虑在模型工作区中使用结构体而不是单独的变量。当您要添加、重命名或删除参数时,此方法能减少维护工作。您可以使用 Variable Editor 或命令提示符修改结构体,而不是手动将模型工作区中的参数与 Model 模块中的参数值同步。

如果您拥有 Simulink Coder™ 许可证,此方法还可以减少引用模型函数(如输出 (step) 函数)的形参消耗的 ROM。

要创建和使用结构体来设置模块参数值,请参阅在结构体中组织相关的模块参数定义

参数化引用模型

此示例说明如何以交互方式配置一个引用模型的多个实例,以对同一模块参数使用不同值。有关仅使用命令提示符参数化引用模型的示例,请参阅Parameterize a Referenced Model Programmatically。有关涉及代码生成的示例,请参阅Specify Instance-Specific Parameter Values for Reusable Referenced Model (Simulink Coder)

将引用模型配置为使用模型参数

要为引用模型配置模型参数,必须在模型工作区中创建 MATLAB 变量或 Simulink.Parameter 对象。此示例将 Simulink.Parameter 对象配置为模型参数,不在对象中存储默认值,而是依赖父模型引用层次结构来提供显式值。没有默认值,模型无法直接仿真,必须作为引用模型进行仿真。

创建包含 Gain 模块和 Discrete Filter 模块的模型 ex_model_arg_ref

要将 Gain 模块的 Gain 参数和 Discrete Filter 模块的 Numerator 参数配置为模型参数,请执行以下步骤:

  1. 在模型中,在 Modeling 选项卡上,点击 Model Data Editor

  2. 在模型数据编辑器中,选择 Parameters 选项卡。

  3. 使用 Value 列将 Gain 参数的值设置为变量,例如 gainArg

  4. gainArg 的旁边,点击操作按钮 并选择 Create

  5. 在 Create New Data 对话框中,将 Value 设置为 Simulink.Parameter,将 Location 设置为 “Model Workspace”。点击 Create

  6. Simulink.Parameter 属性对话框中,将 Data Type 设置为 “double” 且 Dimension 设置为 1。将该值留空(Value 设置为 '[]')。为对象提供 MinMax 值是可选的。

  7. 要将对象配置为模型参数,请选择 Argument

  8. 点击 OK

  9. Discrete Filter 模块的 Numerator 参数重复步骤 4 至 9。在本例中,创建一个名为 coeffArgSimulink.Parameter 对象。

请记住,如果没有为参数对象设置值,模型本身无法成功编译。

在父模型中设置模型参数值

在仿真父模型时,可重用引用模型的每个实例都使用您在父模型中指定的参数值。此示例说明如何在模型层次结构的每层上将模型参数作为可调参数在 Model 模块上显示。

创建一个模型 ex_model_arg,该模型使用前面示例中可重用模型 ex_model_arg_ref 的多个实例。

要为模型引用层次结构中的模型参数设置特定于实例的值,请执行以下操作:

  1. 在模型中,在 Modeling 选项卡上,点击 Model Data Editor

  2. 在模型数据编辑器中,选择 Parameters 选项卡。模型数据编辑器显示四行,它们对应于您可以为两个 Model 模块指定的特定于实例的参数。

  3. 使用模型数据编辑器设置 ModelModel1 中参数的值。默认情况下,模型参数使用模型层次结构中在它下方指定的最后一个值(由值 <from below> 指示)。用下图中的值替换默认值。

  4. 要在模型层次结构的下一级覆盖这些参数的值,请选中 Argument 列中的复选框。默认情况下,该复选框未选中。

    您还可以在每个 Model 模块中配置特定于实例的参数。在模块对话框中,选择 Instance parameters 选项卡。

  5. 创建模型 ex_model_arg_top,该模型包含引用 ex_model_argModel 模块。

  6. 在模型数据编辑器中,点击 Show/refresh additional information 按钮。在 Parameters 选项卡上,您可以看到引用模型中作为可调参数显示的每个特定于实例参数。在此处,您可以为模型层次结构中 coeffArggainArg 参数的所有实例创建一个参数值集。

    默认情况下,每个实例都使用模型层次结构中在它下方指定的最后一个值。在本例中,模型数据编辑器显示 <from_below>。如果您选中 Argument 复选框以向父模型公开参数,Value 显示为 <inherited>,表示运行时值现在来自该父模型。

    更新模型图后,编辑器还会显示实例的编译值。要导航到此默认值,请点击编译值旁边具有三个纵点的按钮,然后选择 “Navigate to default value from below”。最后指定值的引用模型在模型画布的新选项卡中打开,模型数据编辑器突出显示包含模块参数的行。

将多个模型参数组合为单个结构体

当您要添加、重命名或删除参数时,可以使用结构体来减少维护工作量。使用结构体时,模型的数学功能是相同的。

要用 ex_model_arg_refex_model_arg 的结构体替换参数值,请执行以下步骤:

  1. 在命令提示符下,创建一个结构体。为 ex_model_arg_ref 工作区中的每个参数对象添加一个字段。

    structForInst1.gain = 3.17;
    structForInst1.coeff = 1.05;
    
  2. 将该结构体存储在一个 Simulink.Parameter 对象中。

    structForInst1 = Simulink.Parameter(structForInst1);
    
  3. 打开模型资源管理器。在引用模型 ex_model_arg_ref 中,在 Modeling 选项卡上,点击 Model Explorer

  4. 使用模型资源管理器将参数对象从基础工作区复制到 ex_model_arg_ref 模型工作区中。

  5. 在模型工作区中,将 structForInst1 重命名为 structArg

  6. Contents 窗格中,将 structArg 配置为唯一的模型参数。

  7. ex_model_arg_ref 模型中,在模型数据编辑器的 Parameters 选项卡中,将 Gain 参数的值设置为 structArg.gain 并将 Numerator 参数的值设置为 structArg.coeff

  8. 保存模型。

  9. 在命令提示符下,将基础工作区中的现有结构体复制为 structForInst2

    structForInst2 = copy(structForInst1);
    
  10. 使用与在 Model 模块中设置模型参数值相同的数值来设置两个结构体中的字段值。

    structForInst1.Value.gain = 2.98;
    structForInst1.Value.coeff = 0.98;
    
    structForInst2.Value.gain = 3.34;
    structForInst2.Value.coeff = 1.11;
    
  11. 在顶层模型 ex_model_arg 中,使用模型数据编辑器设置参数值,如下图所示。

使用总线对象作为结构体的数据类型

您可以使用 Simulink.Bus 对象作为结构体的数据类型。该对象可确保特定于实例的结构体的特征(例如字段的名称和顺序)与模型工作区中结构体的特征相匹配。

  1. 在命令提示符下,使用函数 Simulink.Bus.createObject 创建一个 Simulink.Bus 对象。对象中元素的层次结构与结构体字段的层次结构相匹配。对象的默认名称是 slBus1

    Simulink.Bus.createObject(structForInst1.Value);
    
  2. 通过复制总线对象,将其重命名为 myParamStructType

    myParamStructType = copy(slBus1);
    
  3. ex_model_arg 的模型数据编辑器中,点击 Show/refresh additional information 按钮。现在,模型数据编辑器包含与基础工作区中的参数对象 structForInst1structForInst2 对应的行。

  4. 使用 Data Type 列将 structForInst1structForInst2 的数据类型设置为 Bus: myParamStructType

  5. ex_model_arg_ref 的模型数据编辑器中,使用模型数据编辑器将 structArg 的数据类型设置为 Bus: myParamStructType

更改模型参数名称或值

要在引用模型的上下文中重命名模型参数,请执行以下操作:

  • 查找引用该模型的所有 Model 模块,并保存每个模块指定的特定于实例的参数值。使用 get_param 函数查询每个模块的 InstanceParameters 参数,该参数是一个结构体数组。该结构体包含四个字段:NameValuePathArgument

    您必须保存特定于实例的参数值,因为重命名操作会丢弃 Model 模块中的值。

  • 在模型数据编辑器中,右键点击引用模型的模型工作区中的变量或对象,然后选择 Rename All。重命名操作会更改变量或对象的名称,并在整个模型中更改对它的引用。有关详细信息,请参阅创建、编辑和管理工作区变量

  • 使用参数的新名称,将参数值重新应用于 Model 模块。要以编程方式在 Model 模块中设置参数值,请参阅Instance parameters, Instance parametersInstance parametersInstance parameters

自定义可重用组件的用户界面

当您设计可重用的引用模型以供团队的其他成员使用时,您可以对整个引用模型应用封装。然后,您可以自定义用户与 Model 模块交互的方式,包括设置特定于实例的值。

使用此方法还可以更轻松地以编程方式指定特定于实例的值。如果您创建并使用名为 gainMask 的封装参数,以编程方式将名为 myModelBlock 的模型实例的值设置为 0.98,则您的用户可以在命令提示符下使用以下命令:

set_param('myModelBlock','gainMask','0.98')

如果将封装应用于引用模型,则模型封装仅显示直接子级模型中特定于实例的参数。它不显示从后代模型提升的特定于实例的参数。

如果要在不封装模型的情况下设置特定于实例的值,请使用模块的 InstanceParameters 参数。有关详细信息,请参阅Parameterize a Referenced Model Programmatically

有关封装模型的信息,请参阅Introduction to System Mask

为查找表配置特定于实例的数据

当您使用 Simulink.LookupTable 对象来存储和配置 ASAP2 或 AUTOSAR 代码生成(例如,STD_AXIS 或 CURVE)的查找表数据时,您可以将对象配置为模型参数。然后,您可以为组件的每个实例指定唯一的表数据和断点数据。

您不能将 Simulink.Breakpoint 对象用作模型参数。

您可以将 Simulink.LookupTable 参数的实例特定值指定为父模型中的新 Simulink.LookupTable 或指定为简单的 MATLAB 结构体或数组。

当您将 Specification 设置为 Explicit valueEven spacing 时,该值可以是:

  • 有效的 MATLAB 结构体变量的名称,如 Model1_LUT2

  • 字面值结构体表达式,如 struct(‘Table’, …, ‘BP1’, …, ‘BP2’, …)

  • 返回有效结构体的其他表达式,如 Params.Model1.LUT2 或对 MATLAB 函数的调用

当您将 Specification 设置为 Reference 时,该值可以是:

  • 字面数值数组值,如 [1 5 7; 2 8 13]

  • 数值数组变量的名称,如 Model1_LUT2

  • 返回有效数值数组的其他表达式,如 Params.Model1.LUT2 或对 MATLAB 函数的调用

当您将 Simulink.LookupTable 参数的实例特定值指定为结构体时,需要遵循以下规则:

  • 模型参数定义的每个字段必须在结构体中指定,并且字段的数目和名称必须匹配。

  • 结构体中表的维度和断点数据必须与模型参数定义的对应项相匹配。

  • 如果结构体字段的数据类型为 double,则该值将转换为对应模型参数字段的数据类型。否则,该值必须与对应模型参数字段的数据类型相匹配。

对于任何仿真模式和代码生成,都可以将该值指定为简单的数值。对于代码生成,如果使用存储类 Auto 配置模型参数,则生成的代码中不会保留结构体或数值数组变量。如果将存储类设置为任何其他值,则结构体或数值数组与其他模型参数类似,因为该值用于初始化生成的代码中的可调参数。

此示例说明如何将 Simulink.LookupTable 参数的实例特定值指定为新 Simulink.LookupTable 和 MATLAB 结构体。

有关使用查找表和命令提示符参数化引用模型的示例,请参阅Configure Instance-Specific Data for Lookup Tables Programmatically

在引用模型中配置模型参数

  1. 创建表示可重用算法的模型 ex_arg_LUT_ref

  2. 使用模型资源管理器,在模型工作区中添加一个 Simulink.LookupTable 对象。您可以使用 Add Simulink LookupTable 按钮 。为对象 LUTArg 命名。

  3. Number of table dimensions 设置为 2。在 TableBreakpoints 表格区域中,对 “Table”、“BP1” 和 “BP2” 数据指定值。例如,通过在 MATLAB 表达式框中输入下列值来配置表和断点数据。

    • Table” - [3 4;1 2]

    • BP1” - [1 2]

    • BP2” - [3 4]

    当您直接从 ex_arg_LUT_ref 仿真或生成代码时,模型将使用这些值。

  4. Struct Type definition 下,将 Name 设置为 LUTArg_Type

  5. 点击 Apply

  6. Contents 窗格中,对于 LUTArg,选中 Argument 列中的复选框。

  7. 在引用模型的 n-D Lookup Table 模块中将 Data specification 设置为 “Lookup table object”。将 Name 设置为 LUTArg

  8. 保存模型。

创建特定于实例的参数值

  1. 创建一个模型 ex_arg_LUT,该模型使用可重用算法两次。

  2. 在命令提示符下,在基础工作区中创建一个 Simulink.LookupTable 对象。您也可以在数据字典中创建 Simulink.LookupTable 对象。

    LUTForInst1 = Simulink.LookupTable;
  3. 为对象指定断点和表数据。

    LUTForInst1.Table.Value = [8 7; 6 5];
    LUTForInst1.Breakpoints(1).Value = [5 6];
    LUTForInst1.Breakpoints(2).Value = [3 4];
    
  4. 指定一个结构体类型名称。将此名称与引用模型工作区中对象指定的名称相匹配。

    LUTForInst1.StructTypeInfo.Name = 'LUTArg_Type';
    
  5. 使用结构体为第二个 Model 模块创建实例特定的参数值。为结构体指定断点和表数据。

    StructForInst2.Table = [9 8; 7 7];
    StructForInst2.BP1 = [3 4];
    StructForInst2.BP2 = [5 6];
    
  6. ex_arg_LUT 模型中,对于模型实例 Model,在 Instance parameters 选项卡上,将 LUTArg 的值设置为 LUTForInst1

  7. 对于模型实例 Model1,将 LUTArg 设置为 StructForInst2

ex_arg_LUT_ref 的一个实例使用存储在基础工作区中的 Simulink.LookupTable 对象中的表和断点数据,另一个实例使用存储在结构体中的表和断点数据。

另请参阅

| |

相关示例

详细信息