主要内容

为引用模型中的模块参数配置特定于实例的值

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

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

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

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

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

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

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

  3. 在模型数据编辑器,通过选择参量属性,将变量或对象配置为模型参量。

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

    您也可以将 Simulink.Parameter 对象的值留空。请参阅定义模型参量而不指定默认值

  5. 在引用可重用模型的每个 Model 模块中,为模块参数指定特定于实例的值。特定于实例的值的维度和数据类型必须与模型参量定义的对应项匹配。如果不指定值,该参量将使用模型层次结构中在它下方指定的最后一个值。在顶层模型中,您可以将诊断配置参数模型参量没有显式最终值配置为在可设置模型参量值的最顶层 Model 模块使用此默认值(而不是提供显式值)时生成错误或警告。

  6. 在中间模型中,除了为模块参数指定特定于实例的值之外,您还可以通过选择参量属性指定是否可以在层次结构的下一个更高层级覆盖该参数。

定义模型参量而不指定默认值

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

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

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

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

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

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

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

此示例让您了解表示压力传感器系统的模型引用层次结构。此示例说明如何在引用的压力传感器模型中配置模块参数,以便为模型的每个实例使用不同值。

有关仅使用您在命令提示符下输入的命令的示例,请参阅Parameterize a Referenced Model Programmatically。有关涉及代码生成的示例,请参阅Specify Instance-Specific Parameter Values for Reusable Referenced Model (Simulink Coder)

浏览模型层次结构

打开压力传感器模型 PressureSensor

open_system('PressureSensor')

此模型根据最小和最大压力值检查输入压力。如果压力在指定的超时期限内超出此范围,则输出信号设置为 1。模型工作区参数 sensor_params.min_presssensor_params.max_presssensor_params.timeout 表示最小压力、最大压力和超时期限。

打开模型 SensorArray

open_system('SensorArray')

此模型包含引用 PressureSensor 模型的四个 Model 模块。

打开模型 SensorHarness

open_system('SensorHarness')

此测试框架包含引用 SensorArray 模型的 Model 模块。该框架向每个压力传感器馈送越来越大的输入压力,并将每个传感器的输出信号发送到示波器。

检查 PressureSensor 模型中的模块参数赋值

为了使压力传感器模型的每个实例使用它自己的模块参数值,您必须通过使用 MATLAB® 变量或 Simulink.Parameter 对象来设置模块参数值。被赋值的变量或参数对象必须存储在模型工作区中,并且必须配置为模型参量。

要检查压力传感器模型中的模块参数赋值,请执行以下操作:

  1. 更新模型层次结构。在 SensorHarness 模型中,在建模选项卡上,点击更新模型

  2. PressureSensor 模型中,在建模选项卡上,点击模型数据编辑器

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

  4. 在过滤器框中,键入 sensor

在过滤后的表中,您可以看到模型工作区包含参数 sensor_params。参数 sensor_params 是包含 min_pressmax_presstimeout 字段的结构体。结构体的字段作为值赋给 maxPressXminPressX 模块中的模块参数,以及生成输出信号的 Compare To Constant 模块中的参数。

要允许引用压力传感器模型的 Model 模块覆盖默认值并为这些模块参数提供特定于实例的值,请注意 sensor_params 已选中参量复选框以将参数配置为模型参量。

要查看 sensor_params 结构体的默认值,请在列中点击。然后点击具有三个纵点的按钮,并选择打开变量编辑器

检查传感器数组中特定于实例的模块参数赋值

SensorArray 模型包含引用 PressureSensor 模型的四个 Model 模块。

要检查每个引用的压力传感器模型的特定于实例的模块参数赋值,请执行以下操作:

  1. PressureArray 模型中,在建模选项卡上,点击模型数据编辑器

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

在模型数据编辑器中,您可以看到模型工作区包含四个参数:p1p2p3p4。其中每个参数的值都包含一个具有字段 min_pressmax_presstimeout 的结构体。参数 p1p2p3p4 分别为 Sensor1Sensor2Sensor3Sensor4 中的 sensor_params 参数提供特定于实例的值。

请注意,p1p2p3p4 已选中参量复选框,以便父 SensorHarness 模型可以覆盖 SensorArray 模型提供的模块参数值,并为测试目的提供它自己的值。

要查看或更改赋给每个 Model 模块的模块参数的值,请在 p1p2p3p4列中点击。然后点击具有三个纵点的按钮,并选择打开变量编辑器

在测试框架中检查特定于实例的模块参数赋值

此层次结构中的顶层模型 SensorHarnessSensorArray 模型的测试框架。

在模型数据编辑器中,您可以看到模型工作区包含参数 pSensorArray,该参数包含嵌套的 sensor_params 结构体数组,这些结构体为模型参量 p1p2p3p4 提供新值。

使用变量编辑器,您可以更新这些结构体的值,并使用不同的最小和最大压力以及超时来测试数组中的传感器。在模型数据编辑器中,在 pSensorArray列中点击,然后点击具有三个纵点的按钮,并选择打开变量编辑器

在选择测试值后,在建模选项卡上,点击运行来测试模型。关联的示波器显示压力传感器的输出信号,以便您看到每个传感器的压力何时超出范围。

更改模型参量名称或值

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

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

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

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

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

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

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

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

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

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

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

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

Simulink.LookupTableSimulink.Breakpoint 对象配置特定于实例的数据

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

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

根据断点设定属性的值,为 Simulink.LookupTable 对象指定特定于实例的值。

  • 断点设定属性设置为显式值等间距时,查找表对象的特定于实例的值可以是:

    • Simulink.LookupTable 对象

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

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

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

  • 断点设定属性设置为引用时,Simulink.LookupTable 对象的特定于实例的值可以是:

    • Simulink.LookupTable 对象。在这种情况下,Simulink 只将查找表对象的属性传递给子模型。这允许您相互独立地配置 Simulink.LookupTable 对象和 Simulink.Breakpoint 对象的模型参量,并重用这些对象作为多个 Model 模块的实例参数。

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

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

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

    在这种情况下,如果将 Simulink.LookupTable 引用的 Simulink.Breakpoint 对象配置为模型参量,则 Simulink.Breakpoint 对象的特定于实例的值可以是:

    • Simulink.Breakpoint 对象。

    • 定义断点的数值数组。数组必须与断点对象的设计定义匹配。Simulink 使用数组中的值合成 Simulink.Breakpoint 对象。

    • 数值数组变量或结构体字段的名称。

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

  • 模型参量定义的每个字段必须在结构体中指定,并且字段的数目和名称必须匹配。例如,虽然只有来自引用类型的 Simulink.LookupTable 对象的表数据传递给子模型,但您仍必须在结构体中指定断点数据,否则 Simulink 会报告错误。

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

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

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

指定 Simulink.LookupTable 对象的特定于实例的值

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

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

首先,创建一个表示可重用算法的模型。将 Simulink.LookupTable 对象配置为您的模型要使用的模型参量。

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

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

  3. 目录窗格中,对于 LUTArg,选中参量列中的复选框。

  4. 表维数设置为 2。在断点表格区域中,对BP1BP2 数据指定值。例如,通过在 MATLAB 表达式框中输入下列值来配置表和断点数据。

    • - [3 4;1 2]

    • BP1 - [1 2]

    • BP2 - [3 4]

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

  5. 结构体类型定义下,将名称设置为 LUTArg_Type

  6. 点击应用

  7. 目录窗格中,对于 LUTArg,选中参量列中的复选框。

  8. 在引用模型的 n-D Lookup Table 模块中将数据设定设置为查找表对象。将名称设置为 LUTArg

  9. 保存模型。

接下来,创建一个使用该可重用算法的模型,并为 Simulink.LookupTable 对象指定特定于实例的值。

  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,在实例参数选项卡上,将 LUTArg 的值设置为 LUTForInst1

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

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

Simulink.LookupTableSimulink.Breakpoint 对象指定特定于实例的值

此示例说明如何将 Simulink.LookupTable 对象的特定于实例的值指定为新 Simulink.LookupTable 对象。该示例还说明如何为 Simulink.LookupTable 对象引用的 Simulink.Breakpoint 对象指定特定于实例的值。

首先,创建一个表示可重用算法的模型。配置 Simulink.Breakpoint 对象和引用该 Simulink.Breakpoint 对象的 Simulink.LookupTable 作为模型参量。

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

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

  3. 目录窗格中,对于 LUTArg,选中参量列中的复选框。

  4. 表维数设置为 1

  5. 将表数据的值指定为 [1 2]

  6. 断点设定设置为引用

  7. 断点部分,将名称设置为 BP1

  8. 在模型工作区中添加一个 Simulink.Breakpoint 对象。将该对象命名为 BP1,并将值指定为 [3 4]

  9. 目录窗格中,对于 BP1,选中参量列中的复选框。

接下来,创建一个使用可重用算法的模型,并为 Simulink.LookupTable 对象和 Simulink.Breakpoint 对象指定特定于实例的值。

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

  2. 在命令提示符下,对于模型实例 Model,在模型工作区中创建一个 Simulink.LookupTable 对象和一个 Simulink.Breakpoint 对象。您也可以在数据字典或基础工作区中创建这些对象。

    LUTForInst1 = Simulink.LookupTable;
    BPForInst1 = Simulink.Breakpoint;
    
  3. 为对象指定断点和表数据。您必须为 LUTForInst1 指定断点信息,以便特定于实例的值的设定与模型参量设定匹配。但是,只有表数据被推送到子模型。

    LUTForInst1.Table.Value = [7 8];
    LUTForInst1.BreakpointsSpecification = 'Reference';
    LUTForInst1.Breakpoints = {'BPForInst1'};
    BPForInst1.Breakpoints.Value = [5 6];
    
  4. ex_arg_BP 模型中,对于模型实例 Model,在实例参数选项卡上,将 LUTArg 的值设置为 LUTForInst1,将 BP1 的值设置为 BPForInst1

  5. 对于模型实例 Model1,在模型工作区中创建另一个 Simulink.LookupTable 对象,并指定表和断点数据。您也可以在数据字典或基础工作区中创建 Simulink.LookupTable 对象。

    LUTForInst2 = Simulink.LookupTable;
    BPForInst2 = Simulink.Breakpoint;
    
    BPForInst2.Breakpoints.Value = [11 12];
    LUTForInst2.Table.Value = [9 10];
    LUTForInst2.BreakpointsSpecification = 'Reference';
    LUTForInst2.Breakpoints = {'BPForInst2'};
    
  6. 对于此模型实例,使用数组来为 Simulink.Breakpoint 对象指定特定于实例的值。

    BPArrayForInst2 = [11 12];
    
  7. ex_arg_BP 模型中,对于模型实例 Model1,在实例参数选项卡上,将 LUTArg 的值设置为 LUTForInst2。对于此模型实例,将 BP1 的值设置为数组 BPArrayForInst2

另请参阅

对象

模块

主题