Main Content

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

Simulink.LookupTable 类

包: Simulink
超类:

存储和共享查找表和断点数据,为 ASAP2 和 AUTOSAR 代码生成配置数据

描述

Simulink.LookupTable 类的对象存储查找表和断点数据。您可以在查找表模块(如 n-D Lookup Table 模块)中使用该数据。通过该对象,可以为表和断点集指定数据类型和代码生成设置。

在将所有表和断点集数据存储在单个 Simulink.LookupTable 对象中时,在生成的代码中,所有这些数据都会出现在一个单独的结构体中。要配置 STD_AXIS 代码生成以进行标定,请使用此方法。

要在多个查找表之间共享断点(例如用于生成 COM_AXIS 代码),请在一个或多个 Prelookup 模块中使用 Simulink.Breakpoint 对象。在 Interpolation Using Prelookup 模块中使用 Simulink.LookupTable 对象。然后,配置查找表对象以引用断点对象。有关详细信息,请参阅为查找表打包共享断点和表数据

要从 Simulink.LookupTable 进行子类化并从此基类继承,请键入以下语法作为类定义文件的第一行,其中 myLookuptable 是新类的名称:

classdef myLookuptable < Simulink.LookupTable

有关子类化的示例,请参阅定义数据类

如果向子类添加属性,可以通过在 MATLAB® 命令行中显示子类对象来查看它们。在属性对话框中,这些属性显示在一个新选项卡中。

构造

LUTObj = Simulink.LookupTable 返回具有默认属性值的 Simulink.LookupTable 对象 LUTObj

要使用模型资源管理器创建 Simulink.LookupTable 对象,请使用工具栏上的按钮 。对象的默认名称是 Object

“属性”对话框

断点设定设置为“显式”(默认值)显示属性对话框的以下视图。

对话框底部包含表和断点数据值。有关此表区域的详细信息,请参阅Edit Lookup Table Data with Lookup Table Spreadsheet。此表的内容等效于属性,当断点设定属性设置为“等间距”或“引用”时可见。

表维度数

查找表的维数。指定最大为 30(含该值)的整数值。例如,要表示三维查找表,请指定整数 3

表数据的信息。您可以配置下列特性:

表数据。指定至少具有两个元素的数值向量或多维数组。

断点设定属性设置为“显式”时,表数据与对话框底部可见的表格接口的内容相同。有关此表区域的详细信息,请参阅Edit Lookup Table Data with Lookup Table Spreadsheet

注意

仅当断点设定设置为“等间距”或“引用”时,此属性才会出现。

只要表达式返回数值向量或多维数组,您还可以使用包含数学运算符的表达式,如 sin(1:0.5:30)。当您点击应用确定时,对象执行表达式并使用结果设置此属性的值。

当您将数据类型设置为 auto 时,要设置,请使用类型化表达式(如 single([1 2 3]))或者使用 fi (Fixed-Point Designer) 构造函数来嵌入 fi 对象。

当您指定具有三个或更多维度的表数据时,将数据显示为包含对 reshape 函数的调用的表达式。要编辑该数据中的值,请修改 reshape 调用的第一个参数,该参数将所有值包含在一个串行化向量中。当沿某个维度添加或删除元素时,还必须更正表示修改后的维度的长度的参数。

您可以通过在查找表模块中使用更直观的界面来编辑此数据。请参阅从 MATLAB 中导入查找表数据

数据类型

表数据的数据类型。默认设置是“自动”,这意味着表数据将从您在中指定的值获取数据类型。如果使用非类型化表达式(如 [1 2 3])来设置,则表数据使用数据类型 double。如果您指定类型化表达式(如 single([1 2 3]))或 fi 对象,则表数据将使用由该表达式或对象指定的数据类型。也支持枚举数据类型。

您可以显式指定整数数据类型、半精度数据类型、浮点数据类型、定点数据类型或数据类型表达式,例如 Simulink.AliasType 对象的名称。

有关 Simulink® 中数据类型的详细信息,请参阅 Simulink 支持的数据类型。要决定如何控制 Simulink.LookupTableSimulink.Breakpoint 对象中表和断点数据的数据类型,请参阅Control Data Types of Lookup Table Objects (Simulink Coder)

维度

查找表数据的维度长度。

要使用符号维度,请指定字符向量。请参阅Implement Dimension Variants for Array Sizes in Generated Code (Embedded Coder)

最小

表数据中元素的最小值。默认值为空,即 []。您可以指定实数数值。

有关 Simulink 如何使用此属性的详细信息,请参阅指定模块参数的最小值和最大值

最大

表数据中元素的最大值。默认值为空,即 []。您可以指定实数数值。

有关 Simulink 如何使用此属性的详细信息,请参阅指定模块参数的最小值和最大值

存储的整数最小值

对于具有定点数据类型的 Simulink.LookupTable 对象,它是表数据中元素的最小值,指定为存储的整数值。该值派生自真实值最小。此属性仅在属性对话框中可用。

存储的整数最大值

对于具有定点数据类型的 Simulink.LookupTable 对象,它是表数据中元素的最大值,指定为存储的整数值。该值派生自真实值最大。此属性仅在属性对话框中可用。

单位

查找表中元素的物理单位。您可以指定文本,如 degC。请参阅 Simulink 模型中的单位指定

字段名称

生成的代码中结构体字段的名称。如果将 Simulink.LookupTable 对象配置为以结构体形式显示在生成的代码中,则此字段存储表数据。默认值为 Table。要更改字段名称,请指定文本。

描述

查找表的描述。您可以指定文本,如 This lookup table describes the action of a pump

断点

断点集信息。每行都是一个断点集。要配置更多断点集,请在表维数框中指定整数值。

对于断点集,您可以配置下列特性:

设定

断点集信息来源,指定为“显式值”(默认值)、“引用”或“等间距”。

  • 要将所有表和断点集数据存储在 Simulink.LookupTable 对象中,请将设定设置为“显式值”。

    Simulink.LookupTable 对象作为单个结构体变量显示在生成的代码中。

  • 要将表数据存储在 Simulink.LookupTable 对象中并将断点集数据存储在 Simulink.Breakpoint 对象中,请将设定设置为“引用”。

    Simulink.LookupTable 对象作为包含表数据的单独数组变量显示在生成的代码中。每个 Simulink.Breakpoint 对象都显示为包含断点集数据的单独数组或结构体变量。

  • 要将表数据和等间距断点存储在 Simulink.LookupTable 对象中,请将设定设置为“等间距”。使用第一个点间距参数生成一组等间距断点。

注意

设定设置为“显式值”或“等间距”时,可以更改查找表对象生成的结构体中可调大小、断点和表条目的顺序。

支持可调大小

指定在生成的代码中支持调整表的有效大小。在代码中,表示对象的结构体会针对每个断点向量增加一个字段。每个增加的字段存储对应断点向量的长度。您可以更改每个字段的值以调整表的有效大小。

仅当设定设置为“显式值”或“等间距”时,此属性才会出现。

注意

如果通过将设定设置为“引用”在 Simulink.Breakpoint 对象中存储断点数据,则要支持在生成的代码中调整表大小,请使用每个 Simulink.Breakpoint 对象的支持可调大小属性。

断点集的数据。指定至少具有二个元素的数值向量。

注意

仅当“断点设定”设置为“等间距”或“引用”时,此属性才会出现。当断点设定属性设置为“显式”时,断点集数据与对话框底部可见的表格接口的内容相同。有关此表区域的详细信息,请参阅Edit Lookup Table Data with Lookup Table Spreadsheet

只要表达式返回数值向量,您还可以使用包含数学运算符的表达式,如 sin(1:0.5:30)。当您点击应用确定时,对象执行表达式并使用结果设置此属性的值。

当您将数据类型设置为 auto 时,要设置,请使用类型化表达式(如 single([1 2 3]))或者使用 fi (Fixed-Point Designer) 构造函数来嵌入 fi 对象。

您可以通过在查找表模块中使用更直观的界面来编辑此数据。请参阅从 MATLAB 中导入查找表数据

数据类型

断点集的数据类型。默认设置是 auto,这意味着断点集从您在中指定的值获取数据类型。如果使用非类型化表达式(如 [1 2 3])来设置,则断点数据使用数据类型 double。如果您指定类型化表达式(如 single([1 2 3]))或 fi 对象,则断点数据将使用由该表达式或对象指定的数据类型。

您可以显式指定整数数据类型、浮点数据类型、定点数据类型或数据类型表达式,例如 Simulink.AliasType 对象的名称。

有关 Simulink 中数据类型的详细信息,请参阅 Simulink 支持的数据类型。要决定如何控制 Simulink.LookupTableSimulink.Breakpoint 对象中表和断点数据的数据类型,请参阅Control Data Types of Lookup Table Objects (Simulink Coder)

维度

断点集的维度长度。

要使用符号维度,请指定字符向量。请参阅Implement Dimension Variants for Array Sizes in Generated Code (Embedded Coder)

最小

断点集中元素的最小值。默认值为空,即 []。您可以指定实数数值。

有关 Simulink 如何使用此属性的详细信息,请参阅指定模块参数的最小值和最大值

最大

断点集中元素的最大值。默认值为空,即 []。您可以指定实数数值。

有关 Simulink 如何使用此属性的详细信息,请参阅指定模块参数的最小值和最大值

单位

断点集中元素的物理单位。您可以指定文本,如 degF。请参阅 Simulink 模型中的单位指定

字段名称

生成的代码中结构体字段的名称。此字段存储断点集数据。对于第一个断点集,默认值为 BP1;对于第二个断点集,默认值为 BP2。要更改字段名称,请指定文本。

可调大小名称

生成的代码中结构体字段的名称。此字段存储断点集的长度(元素的数量),生成的代码算法用它来确定表的大小。要在代码执行期间调整表的有效大小,请更改内存中此结构体字段的值。对于第一个断点集,默认名称为 N1;对于第二个断点集,默认名称为 N2。要更改字段名称,请指定文本。

此列仅在您选择支持可调大小时才会显示。

描述

断点集的描述。您可以指定文本,如 This breakpoint set represents the pressure input

第一个点

等间距断点数据中的第一个点。当设定设置为“等间距”时,此参数可用。

间距

等间距断点数据中各点之间的间距。当设定设置为“等间距”时,此参数可用。

名称

存储此断点集信息的 Simulink.Breakpoint 对象的名称。

仅当设定设置为“引用”时,此列才会出现。

第一个点名称

存储第一个点的信息的 Simulink.Breakpoint 对象的名称。当设定设置为“等间距”时,此参数可用。

间距名称

存储间距信息的 Simulink.Breakpoint 对象的名称。当设定设置为“等间距”时,此参数可用。

数据定义:存储类

生成的代码中结构体变量(设定设置为“显式值”或“等间距”时)或数组变量(设置为“引用”时)的存储类。变量存储表数据,如果变量是结构体,则存储断点集数据。默认设置是“自动”。

有关存储类的详细信息,请参阅模型接口元素的 C 代码生成配置 (Simulink Coder)

如果您有 Embedded Coder®,则可以选择自定义存储类。有关自定义存储类的信息,请参阅使用 Struct 存储类将参数数据组织为结构体 (Embedded Coder)

数据定义:标识符

生成的代码中结构体变量(设定设置为“显式值”或“等间距”时)或数组变量(设置为“引用”时)的替代名称。默认值为空,在这种情况下,生成的代码使用 Simulink.LookupTable 对象的名称作为结构体或数组变量的名称。要设置标识符,请指定文本。

要启用此属性,请将数据定义:存储类设置为“自动”以外的其他选项。

数据定义:对齐

生成的代码中的数据对齐边界。为结构体或数组变量分配的数据的起始内存地址是您指定的值的倍数。默认值为 -1,它允许代码生成器根据使用情况确定最佳对齐。

指定不超过 128 并且是 2 的幂的正整数。有关使用数据对齐进行代码替换的详细信息,请参阅Data Alignment for Code Replacement (Embedded Coder)

结构体类型定义:名称

结构体变量在生成的代码中使用的结构体类型的名称。默认值为空。请指定文本。

仅当设定设置为“显式值”或“等间距”时,此属性才会出现。

结构体类型定义:数据作用域

结构体类型定义的范围(从您的自定义代码导入或从生成的代码导出)。默认值为“自动”。当您选择“自动”时:

  • 如果您没有在结构体类型定义:头文件框中指定值,则生成的代码将结构体类型定义导出到文件 model_types.hmodel 是模型的名称。

  • 如果您在结构体类型定义:头文件框中指定值(如 myHdr.h),则生成的代码从 myHdr.h 中导入结构体类型定义。

要显式指定数据范围,请执行下列操作:

  • 要将结构体类型定义从自定义代码导入生成的代码中,请选择“已导入”。

  • 要从生成的代码中导出结构体类型定义,请选择“已导出”。

如果您没有在结构体类型定义:头文件框中指定值,则生成的代码将从 StructName.h 导入或向其导出类型定义。StructName 是您使用属性结构体类型定义:名称指定的名称。

仅当设定设置为“显式值”或“等间距”时,此属性才会出现。

结构体类型定义:头文件

包含结构体类型定义的头文件的名称。您可以从创建的头文件导入定义,或者将定义导出到生成的头文件中。要控制结构体类型的范围,请调整结构体类型定义:数据作用域属性的设置。

仅当设定设置为“显式值”或“等间距”时,此属性才会出现。

表和断点值编辑区域

表和断点数据的信息。您可以在相关联的文本框中输入 MATLAB 表达式,或直接在附带的表中添加数据。选择所需的数据类型:

  • ” - 表数据。指定至少具有两个元素的数值向量或多维数组。

    只要表达式返回数值向量或多维数组,您还可以使用包含数学运算符的表达式,如 sin(1:0.5:30)。当您按 Enter 键时,对象执行表达式并使用结果设置此属性的值。

    当您指定具有三个或更多维度的表数据时,表将数据显示为包含对 reshape 函数的调用的表达式。要编辑该数据中的值,请修改 reshape 调用的第一个参数,该参数将所有值包含在一个串行化向量中。当沿某个维度添加或删除元素时,还必须更正表示修改后的维度的长度的参数。

    您可以在查找表模块中使用更直观的界面来编辑此数据。请参阅从 MATLAB 中导入查找表数据

  • BP”N - 断点集的数据。

    指定至少具有二个元素的数值向量。

    只要表达式返回数值向量,您还可以使用包含数学运算符的表达式,如 sin(1:0.5:30)。当您按 Enter 键时,对象执行表达式并使用结果设置此属性的值。

    您可以通过在查找表模块中使用更直观的界面来编辑此数据。请参阅从 MATLAB 中导入查找表数据

在表中输入或操作数据既简单又直观。像 Microsoft® Excel® 电子表格一样,您可以使用表进行以下操作:

  • 选择表元素

  • 使用标准键盘快捷方式,例如:

    • 复制 - Ctrl+C

    • 粘贴 - Ctrl+V

    • 撤消 - Ctrl+Z

    • 删除

    • 重做 - Shift+Ctrl+Z

属性

全部展开

断点集信息,指定为由 Simulink.lookuptable.Breakpoint 对象组成的向量、字符向量元胞数组或 Simulink.lookuptable.Evenspacing 对象的向量。

如果使用由 Simulink.lookuptable.Breakpoint 对象组成的向量,则每个对象表示一个断点集。要使用由 Simulink.lookuptable.Breakpoint 组成的对象向量,请将属性 BreakpointsSpecification 设置为 'Explicit values'

如果使用字符向量元胞数组,则每个字符向量表示一个 Simulink.Breakpoint 对象的名称。要使用字符向量元胞数组,请将属性 BreakpointsSpecification 设置为 'Reference'

如果使用 Simulink.lookuptable.Evenspacing 对象的向量,则每个对象表示一个断点集。要使用由 Simulink.lookuptable.Evenspacing 组成的对象向量,请将属性 BreakpointsSpecification 设置为 'Even Spacing'

断点集信息的来源,指定为 'Explicit values'(默认值)、'Even spacing''Reference'。请参阅断点 > 设定参数。

数据类型: char

存储查找表和断点集的结构体变量(BreakpointsSpecification 设置为 'Explicit values''Even spacing' 时)或数组变量(设置为 'Reference' 时)的代码生成设置,指定为 Simulink.CoderInfo 对象。您可以使用此嵌入对象指定存储类或自定义存储类。请参阅 Simulink.CoderInfo

结构体变量在生成的代码中使用的结构体类型的设置,指定为 Simulink.lookuptable.StructTypeInfo 对象。

如果将 BreakpointsSpecification 设置为 'Reference',则 Simulink.LookupTable 对象不会作为结构体出现在生成的代码中。代码生成器忽略此属性。

用于生成支持调整表有效大小的代码的选项,指定为 truefalse。请参阅支持可调大小参数。

数据类型: logical

表数据的信息,指定为 Simulink.lookuptable.Table 对象。

复制语义

句柄。要了解句柄类如何影响复制操作,请参阅复制对象

示例

表示一维查找表

  1. 创建名为 LUTObjSimulink.LookupTable 对象。

    LUTObj = Simulink.LookupTable;

  2. 指定表数据。

    LUTObj.Table.Value = [1.1 2.2 3.3 4.4 5.5];

  3. 指定断点集数据。

    LUTObj.Breakpoints(1).Value = [-2 -1 0 1 2];

  4. 指定生成的代码中结构体类型的名称。

    LUTObj.StructTypeInfo.Name = 'myLUTStruct';

您可以在 1-D Lookup Table 模块对话框中使用 LUTObj。在该模块中,将数据设定设置为“查找表对象”,并将名称设置为 LUTObj

要查看数据,请使用Edit Lookup Table Data with Lookup Table Spreadsheet中所述的属性对话框。

表示二维查找表

  1. 创建名为 LUTObjSimulink.LookupTable 对象。

    LUTObj = Simulink.LookupTable;

  2. 指定表数据。

    LUTObj.Table.Value = [1.1 2.2 3.3 4.4 5.5; ...
                              6.6 7.7 8.8 9.9 10.1];

  3. 指定断点集数据。在 Breakpoints 属性中,使用向量索引 2 设置第二个断点集中的值。

    LUTObj.Breakpoints(1).Value = [-1 1];
    
    LUTObj.Breakpoints(2).Value = [-2 -1 0 1 2];
    

    LUTObj 创建一个 Simulink.lookuptable.Breakpoint 对象作为 Breakpoints 属性值中的第二个向量元素。除 Value 属性外,新对象采用默认属性值。

  4. 指定生成的代码中结构体类型的名称。

    LUTObj.StructTypeInfo.Name = 'myLUTStruct';

您可以在 2-D Lookup Table 模块对话框中使用 LUTObj

要查看数据,请使用Edit Lookup Table Data with Lookup Table Spreadsheet中所述的属性对话框。

建立一个首值为 1 且所有值均匀间隔的第二断点集

要建立一个首值为 1 且所有值均匀间隔的第二断点集,请使用 Breakpoint 对象。

  1. 创建名为 LUTObjSimulink.LookupTable 对象。

    LUTObj=Simulink.LookupTable
    
    LUTObj = 
    
      LookupTable with properties:
    
                           Table: [1×1 Simulink.lookuptable.Table]
        BreakpointsSpecification: 'Explicit values'
                     Breakpoints: [1×1 Simulink.lookuptable.Breakpoint]
              SupportTunableSize: 0
                       CoderInfo: [1×1 Simulink.CoderInfo]
                  StructTypeInfo: [1×1 Simulink.lookuptable.StructTypeInfo]
  2. 将断点属性设置为等间距。

    LUTObj.BreakpointsSpecification='Even spacing'
    
    LUTObj = 
    
      LookupTable with properties:
    
                           Table: [1×1 Simulink.lookuptable.Table]
        BreakpointsSpecification: 'Even spacing'
                     Breakpoints: [1×1 Simulink.lookuptable.Evenspacing]
              SupportTunableSize: 0
                       CoderInfo: [1×1 Simulink.CoderInfo]
                  StructTypeInfo: [1×1 Simulink.lookuptable.StructTypeInfo]
  3. 获取断点的属性。

    LUTObj.Breakpoints(1)
    
    
    ans = 
    
      Evenspacing with properties:
    
             FirstPoint: 0
                Spacing: 1
               DataType: 'auto'
                    Min: []
                    Max: []
                   Unit: ''
         FirstPointName: 'BPFirstPoint1'
            SpacingName: 'BPSpacing1'
        TunableSizeName: 'N1'
            Description: ''
  4. 要设置第一个点属性,请使用 Breakpoint 对象的 FirstPoint 属性。

    LUTObj.Breakpoints(1).FirstPoint=1
  5. 要设置间距属性,请使用 Breakpoint 对象。

    LUTObj.Breakpoints(1).Spacing=2
  6. 获取断点的属性。

    LUTObj.Breakpoints(1)
    
    ans = 
    
      Evenspacing with properties:
    
             FirstPoint: 1
                Spacing: 2
               DataType: 'auto'
                    Min: []
                    Max: []
                   Unit: ''
         FirstPointName: 'BPFirstPoint1'
            SpacingName: 'BPSpacing1'
        TunableSizeName: 'N1'
            Description: ''

控制查找表和断点集的代码生成

创建名为 LUTObjSimulink.LookupTable 对象。

LUTObj = Simulink.LookupTable;

指定表数据。

LUTObj.Table.Value = [1.00 2.25 3.50 4.75 6.00; ...
                          7.25 8.50 9.75 11.00 12.25];

指定断点集数据。在 Breakpoints 属性中,使用数组索引 2 创建一个额外的 Simulink.lookuptable.BreakpointInfo 对象,它表示第二个断点集。

LUTObj.Breakpoints(1).Value = [-1 1];

LUTObj.Breakpoints(2).Value = [-2 -1 0 1 2];

指定查找表和每个断点集的数据类型。

LUTObj.Table.DataType = 'fixdt(1,16,2)';

LUTObj.Breakpoints(1).DataType = 'int16';

LUTObj.Breakpoints(2).DataType = 'int16';

为在生成的代码中存储表数据和断点集的结构体字段指定唯一名称。

LUTObj.Table.FieldName = 'myTable';

LUTObj.Breakpoints(1).FieldName = 'myBPSet1';

LUTObj.Breakpoints(2).FieldName = 'myBPSet2';

使用存储类 ExportedGlobal 从生成的代码中导出结构体变量定义。

LUTObj.CoderInfo.StorageClass = 'ExportedGlobal';

在生成的代码中将结构体类型命名为 LUTStructType。将结构体类型定义导出到名为 myLUTHdr.h 的生成的头文件。

LUTObj.StructTypeInfo.Name = 'LUTStructType';
LUTObj.StructTypeInfo.DataScope = 'Exported';
LUTObj.StructTypeInfo.HeaderFileName = 'myLUTHdr.h';

在模型中的 n-D Lookup Table 模块中,将数据设定设置为 Lookup table object,并将名称设置为 LUTObj

load_system('myModel_LUTObj')
set_param('myModel_LUTObj/Lookup Table','DataSpecification','Lookup table object',...
    'LookupTableObject','LUTObj')

从模型中生成代码。

slbuild('myModel_LUTObj')
### Starting build procedure for: myModel_LUTObj
### Generated code for 'myModel_LUTObj' is up to date because no structural, parameter or code replacement library changes were found.
### Successful completion of code generation for: myModel_LUTObj

Build Summary

0 of 1 models built (1 models already up to date)
Build duration: 0h 0m 2.141s

生成的代码在生成的头文件 myLUTHdr.h 中定义结构体类型 LUTStructType

file = fullfile('myModel_LUTObj_ert_rtw','myLUTHdr.h');
rtwdemodbtype(file,'typedef struct {','} LUTStructType;',1,1)
typedef struct {
  int16_T myBPSet1[2];
  int16_T myBPSet2[5];
  int16_T myTable[10];
} LUTStructType;

该代码使用全局结构体变量 LUTObj 来存储表和断点集数据。表数据基于指定的定点数据类型进行定标。

file = fullfile('myModel_LUTObj_ert_rtw','myModel_LUTObj.c');
rtwdemodbtype(file,'LUTStructType LUTObj = {','/* Variable: LUTObj',1,1)
LUTStructType LUTObj = {
  { -1, 1 },

  { -2, -1, 0, 1, 2 },

  { 4, 29, 9, 34, 14, 39, 19, 44, 24, 49 }
} ;                                    /* Variable: LUTObj

生成使用条件编译的维度长度的代码

假设您的人工代码根据条件分配内存,并根据您指定为 #define 宏的维度长度初始化查找表。此示例说明如何生成使用外部表和断点数据的代码。

符号维度要求您使用基于 ERT 的系统目标文件,该文件需要 Embedded Coder®。

探查外部代码

在当前文件夹中,将下列宏定义复制到名为 ex_myHdr_LUT.h 的头文件中。

#include "rtwtypes.h"

#ifndef _HEADER_MYHDR_H_
#define _HEADER_MYHDR_H_

#define bp1Len 2
#define bp2Len 2

typedef struct {
  real_T BP1[bp1Len];
  real_T BP2[bp2Len];
  real_T Table[bp1Len * bp2Len];
} LUTObj_Type;

extern LUTObj_Type LUTObj;

#endif

将以下静态初始化代码复制到名为 ex_mySrc_LUT.c 的源文件中。

#include "ex_myHdr_LUT.h"

#if bp1Len == 2 && bp1Len == 2
LUTObj_Type LUTObj = {
  { 1.0, 2.0 },

  { 3.0, 4.0 },

  { 3.0, 2.0, 4.0, 1.0 }
} ;         
#endif

#if bp1Len == 3 && bp1Len == 3
LUTObj_Type LUTObj = {
  { 1.0, 2.0, 3.0 },

  { 4.0, 5.0, 6.0 },

  { 1.0, 6.0, 2.0, 3.0, 8.0, 9.0, 5.0, 4.0, 7.0 }
} ;     
#endif

要生成导入此数据的代码,请在 MATLAB 中创建 bp1Lenbp2Len 作为 Simulink.Parameter 对象。创建 LUTObj 作为 Simulink.LookupTable 对象。使用参数对象为 Simulink.LookupTable 对象中的表和断点集数据指定维度长度。

创建示例模型

使用 n-D Lookup Table 模块创建示例模型 ex_LUTObj。在 Lookup Table 模块对话框的表和断点选项卡上,将表维数设置为 2

open_system('ex_LUTObj')

创建 Simulink.LookupTable 对象

在模型资源管理器的模型层次结构窗格中,选择基础工作区

在工具栏上,点击添加 Simulink LookupTable 按钮。名为 ObjectSimulink.LookupTable 对象出现在基础工作区中。

目录窗格(中间窗格)中,将该对象重命名为 LUTObj

或者,在命令提示符下创建该对象:

LUTObj = Simulink.LookupTable;

配置 Simulink.LookupTable 对象

目录窗格中,选择新对象 LUTObj。属性对话框出现在对话框窗格(右窗格)中。

表维数设置为 2

下,将设置为 [3 4; 2 1]

断点下的第一行中,将设置为 [1 2]

断点下的第二行中,将设置为 [3 4]。点击应用

结构体类型定义下,将数据作用域设置为 Imported。将头文件设置为 ex_myHdr_LUT.h。将名称设置为 LUTObj_Type

在 Lookup Table 模块对话框中,将数据设定设置为 Lookup table object。将名称设置为 LUTObj。点击应用

或者,要配置对象和模块,请使用以下命令:

LUTObj.Breakpoints(1).Value = [1 2];
LUTObj.Breakpoints(2).Value = [3 4];
LUTObj.Table.Value = [3 4; 2 1];
LUTObj.StructTypeInfo.DataScope = 'Imported';
LUTObj.StructTypeInfo.HeaderFileName = 'ex_myHdr_LUT.h';
LUTObj.StructTypeInfo.Name = 'LUTObj_Type';
set_param('ex_LUTObj/Lookup Table','LookupTableObject','LUTObj')
set_param('ex_LUTObj/Lookup Table',...
    'DataSpecification','Lookup table object')

使代码生成器能够将 Simulink.Parameter 对象用作指定维度长度的宏。选择配置参数允许符号维度设定

set_param('ex_LUTObj','AllowSymbolicDim','on')

创建表示宏 bp1Lenbp2LenSimulink.Parameter 对象。要生成从头文件 ex_myHdr_LUT.h 导入宏的代码,请应用存储类 ImportedDefine

bp1Len = Simulink.Parameter(2);
bp1Len.Min = 2;
bp1Len.Max = 3;
bp1Len.DataType = 'int32';
bp1Len.CoderInfo.StorageClass = 'Custom';
bp1Len.CoderInfo.CustomStorageClass = 'ImportedDefine';
bp1Len.CoderInfo.CustomAttributes.HeaderFile = 'ex_myHdr_LUT.h';

bp2Len = Simulink.Parameter(2);
bp2Len.Min = 2;
bp2Len.Max = 3;
bp2Len.DataType = 'int32';
bp2Len.CoderInfo.StorageClass = 'Custom';
bp2Len.CoderInfo.CustomStorageClass = 'ImportedDefine';
bp2Len.CoderInfo.CustomAttributes.HeaderFile = 'ex_myHdr_LUT.h';

配置现有 Simulink.LookupTable 对象 LUTObj 以使用 Simulink.Parameter 对象。通过使用参数对象的名称来设置断点集数据和表数据的维度长度。

LUTObj.Breakpoints(1).Dimensions = '[1 bp1Len]';
LUTObj.Breakpoints(2).Dimensions = '[1 bp2Len]';
LUTObj.Table.Dimensions = '[bp1Len bp2Len]';

通过应用存储类 ImportFromFileLUTObj 配置为导入的数据。要导入 LUTObj 的定义,请将文件 ex_mySrc_LUT.c 的名称添加到模型配置参数配置参数 > 代码生成 > 自定义代码 > 附加编译信息 > 源文件中。

LUTObj.CoderInfo.StorageClass = 'Custom';
LUTObj.CoderInfo.CustomStorageClass = 'ImportFromFile';
LUTObj.CoderInfo.CustomAttributes.HeaderFile = 'ex_myHdr_LUT.h';

set_param('ex_LUTObj','CustomSource','ex_mySrc_LUT.c')

生成和检查代码

配置模型以从生成的代码编译可执行文件。

set_param('ex_LUTObj','GenCodeOnly','off')

从模型中生成代码。

slbuild('ex_LUTObj')
### Starting build procedure for: ex_LUTObj
### Successful completion of build procedure for: ex_LUTObj

Build Summary

Top model targets built:

Model      Action                       Rebuild Reason                                    
==========================================================================================
ex_LUTObj  Code generated and compiled  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 33.82s

在代码生成报告中,查看生成的文件 ex_LUTObj.h。该文件通过包含头文件 ex_myHdr_LUT.h 来导入宏定义和结构体类型定义。

file = fullfile('ex_LUTObj_ert_rtw','ex_LUTObj.h');
rtwdemodbtype(file,'#include "ex_myHdr_LUT.h"','#include "ex_myHdr_LUT.h"',1,1)
#include "ex_myHdr_LUT.h"

在源文件 ex_LUTObj.c 中,模型 step 函数中的代码算法将断点和表数据传递给执行表查找的函数。该算法还传递 bp1Len,以便查找函数可以遍历表数据的行和列,这些行和列在生成的代码中显示为串行化的一维数组。

file = fullfile('ex_LUTObj_ert_rtw','ex_LUTObj.c');
rtwdemodbtype(file,'/* Model step function */','/* Model initialize function */',1,0)
/* Model step function */
void ex_LUTObj_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Inport: '<Root>/In1'
   *  Inport: '<Root>/In2'
   *  Lookup_n-D: '<Root>/Lookup Table'
   */
  ex_LUTObj_Y.Out1 = look2_binlcapw(ex_LUTObj_U.In1, ex_LUTObj_U.In2,
    (&(LUTObj.BP1[0])), (&(LUTObj.BP2[0])), (&(LUTObj.Table[0])),
    ex_LUTObj_ConstP.LookupTable_maxIndex, (uint32_T)bp1Len);
}

限制

  • 您不能将 Simulink.Breakpoint 对象或引用 Simulink.Breakpoint 对象的 Simulink.LookupTable 对象用作可重用组件的实例特定参数数据。例如,您不能将这些对象用作:

    • 模型工作区中的模型参数或 Model 模块中的模型参数值。

    • CodeReuse Subsystem 模块上的封装参数的值。

    • 通过创建自定义库来重用的子系统上的封装参数的值。

    但是,对于不引用 Simulink.Breakpoint 对象的独立 Simulink.LookupTable 对象,您可以将它们用于上述目的。

  • 当子系统中的模块使用 Simulink.LookupTableSimulink.Breakpoint 对象时,不能仅对子系统设置数据类型覆盖。此时,请对整个模型设置数据类型覆盖。

版本历史记录

在 R2016b 中推出