Main Content

控制信号的数据类型

要控制 Simulink® 模型中某个信号的数据类型,您可以为对应的模块输出指定数据类型。

您还可以通过以下方式之一在模型中引入特定数据类型的新信号:

  • 通过根级 Inport 模块或 From Workspace 模块,将所需类型的信号数据从 MATLAB® 工作区加载到您的模型中。

  • 在您的模型中创建一个 Constant 模块,并将其参数设置为所需的类型。

  • 使用 Data Type Conversion 模块将信号转换为所需的数据类型。

默认情况下,Simulink 模块决定了其输出的数据类型。许多模块允许您使用一个模块参数(通常称为输出数据类型)来覆盖模块的默认类型,并显式指定输出数据类型。例如,输出数据类型参数出现在 Constant 模块对话框的信号属性窗格中。

有关详细信息,请参阅以下主题:

有关此方面的信息...请参阅...

您可以指定的有效数据类型值

输入有效数据类型值

可帮助您指定有效数据类型值的助手

使用数据类型助手指定数据类型

同时为多个模块指定有效的数据类型值

使用模型数据编辑器进行批量编辑

输入有效数据类型值

一般情况下,您可以将输出数据类型指定为以下任意值:

有效的数据类型值因模块而异。您可以使用模块的数据类型参数关联的下拉菜单来查看该模块支持的数据类型。例如,Data Store Memory 模块对话框中的数据类型下拉菜单列出了它支持的数据类型,如下所示。

有关特定模块支持的数据类型的详细信息,请参阅 Simulink 文档中有关该模块的说明。

数据类型继承规则

模块可从各种来源继承数据类型,包括它们连接的信号和特定的模块参数。您可以将数据类型参数的值指定为一个规则,通过它决定输出信号如何继承其数据类型。要查看模块支持的继承规则,请使用模块对话框中的数据类型下拉菜单。下表列出了您可以选择的典型规则。

继承规则描述
Inherit: Inherit via back propagation

Simulink 在数据类型传播过程中自动确定模块的输出数据类型(请参阅数据类型传播)。在这种情况下,模块使用下游模块或信号对象的数据类型。

Inherit: Same as input

模块的输出信号使用其唯一的输入信号的数据类型。

Inherit: Same as first input

模块的输出信号使用其第一个输入信号的数据类型。

Inherit: Same as second input

模块的输出信号使用其第二个输入信号的数据类型。

Inherit: Inherit via internal rule

模块使用内部规则确定其输出数据类型。内部规则会根据嵌入式目标硬件的属性选择一种能够优化数值准确性、性能和所生成代码大小的数据类型。本软件并非在任何情况下都能同时优化效率和数值准确性。

如果您为信号应用继承的数据类型,仅当您更新模块图之后,Simulink 才会确定该信号的具体数据类型。

  • 要在模块图上显示此数据类型,请参阅端口数据类型

  • 要以可搜索、可排序的表形式查看多个信号的具体数据类型,请使用模型数据编辑器(在建模选项卡上,点击模型数据编辑器)。数据类型列的右侧显示每个信号的具体数据类型。有关详细信息,请参阅模型数据编辑器

内置数据类型

您可以将数据类型参数的值指定为内置数据类型(例如,singleboolean)的名称。要查看模块支持的内置数据类型,请使用模块对话框中的数据类型下拉菜单。要查看支持的所有内置数据类型的列表,请参阅 Simulink 支持的数据类型

数据类型表达式

您可以将数据类型参数的值指定为计算结果为数值数据类型对象的表达式。只需在模块对话框的数据类型字段中输入表达式即可。一般情况下,可以输入以下表达式之一:

  • fixdt 命令

    将数据类型参数的值指定为调用 fixdt 函数的命令。此函数允许您创建描述定点或浮点数据类型的 Simulink.NumericType 对象。

  • 数据类型对象名称

    将数据类型参数的值指定为表示数据类型的数据对象的名称。您从类中实例化的 Simulink 数据对象(例如 Simulink.NumericTypeSimulink.AliasType)可以简化在模型范围内更改输出数据类型的任务,并允许您为数据类型使用自定义别名。有关 Simulink 数据对象的详细信息,请参阅数据对象

使用模型数据编辑器进行批量编辑

您可以使用模型数据编辑器同时为多个信号指定相同的数据类型。使用这种方法,您可以通过一次性配置多个 InportOutport 模块的数据类型和其他属性来设计模型接口(请参阅Configure Data Interfaces)。您还可以在模块算法中精细控制任意信号的数据类型。

例如,飞机纵向飞行控制 示例中的 slexAircraftExample 模型包含许多 Gain 模块。假设要将模型根级别的三个 Gain 模块的输出数据类型指定为 single。您可以按下面所示完成此任务:

  1. 在模型数据编辑器(在建模选项卡上,点击模型数据编辑器)中,检查信号选项卡。

  2. 筛选内容框旁边,点击基于所选项进行筛选按钮切换模式。

  3. 在模型的顶层,选择表示三个 Gain 模块的输出的信号线(标记为 ZwMwMq)。模型数据编辑器显示与三个信号对应的三行。

  4. 在模型数据编辑器中,选择所有三个信号(行)。例如,您可以按 Ctrl+A,或按住 Shift 并点击列的首行和尾行。

  5. 点击三者之中任一信号在数据类型列中的单元格。从下拉列表中,选择“单个”。模型数据编辑器会将此选择应用于所有选定的行。

要将模型转换为严格的单精度设计,请参阅Validate a Floating-Point Embedded Model

在独立算法、数据路径、模型和总线元素之间共享数据类型

有些情况下,您不能依赖数据类型继承(请参阅数据类型继承规则)来确保不同数据项(例如 Simulink.Bus 对象中的并行数据路径中的信号线或总线元素)的数据类型相同。这种情况下,您可以在工作区或数据字典中创建 Simulink.NumericTypeSimulink.AliasType 对象。

如果您不想通过创建别名来重命名共享的数据类型,可以创建一个 Simulink.NumericType 对象。将 IsAlias 属性设置为 false(默认值)。

此示例说明如何使用 Simulink.NumericType 对象在同一模型中的两个查找表模块之间共享输出数据类型。

  1. 打开 容错燃油控制系统建模 示例模型 sldemo_fuelsys

    openExample('simulink_automotive/ModelingAFaultTolerantFuelControlSystemExample')
    sldemo_fuelsys

    该模型在基础工作区中创建 Simulink.NumericType 对象。其中一个对象名为 s16En15

  2. 在命令提示符下,检查 s16En15 的属性。

    s16En15
    s16En15 = 
    
      NumericType with properties:
    
        DataTypeMode: 'Single'
             IsAlias: 0
           DataScope: 'Auto'
          HeaderFile: ''
         Description: ''

    此对象表示内置的 Simulink 数据类型 single

  3. 在模型中,导航到 fuel_rate_control/airflow_calc 子系统中。

  4. 建模选项卡上,点击模型数据编辑器。在模型数据编辑器中,检查信号选项卡。

  5. 在模型中,点击 Pumping Constant 模块的输出信号。模型数据编辑器的数据类型列显示信号数据类型设置为 s16En15

  6. 点击 Ramp Rate Ki 模块的输出信号。此模块的输出数据类型也设置为 s16En15

  7. 更新模块图,如有必要,可将数据类型列拉宽。该列的右侧显示两个查找表模块使用数据类型 single

  8. 在命令提示符下配置 s16En15,以表示数据类型 double

    s16En15.DataTypeMode = 'Double';

  9. 更新模块图。

    两个查找表模块的输出信号现在都使用数据类型 double。由于数据类型继承的缘故,其他信号(如 e0e1)获得相同的数据类型。

要确保同一模型中的算法或数据路径之间数据类型等同,也可以使用诸如 Data Type PropagationData Type Conversion Inherited 之类的模块。使用这些模块时,不需要创建和永久存储数据类型对象。但是,您不能使用此类模块在不同模型中的信号之间共享数据类型,除非这些模型位于同一个模型引用层次结构中。

为信号数据重用自定义 C 数据类型

在模型中,您可以创建符合现有 C 代码定义的自定义 C 数据类型(如结构体)的信号。使用这些信号可以:

  • 将现有 C 代码替换为 Simulink 模型。

  • 集成 C 代码以进行 Simulink 仿真(例如,通过使用代码继承工具)。

  • 准备生成可与现有代码集成的代码 (Simulink Coder™)。

使用以下方法匹配您的自定义数据类型:

  • 对于结构体类型,创建一个 Simulink.Bus 对象。使用该对象作为总线信号的数据类型。请参阅总线的数据类型

  • 对于枚举,创建一个枚举类并将其用作信号的数据类型。请参阅在 Simulink 模型中使用枚举数据

  • 要匹配表示某基本数据类型的别名的 typedef 语句,请使用 Simulink.AliasType 对象作为信号的数据类型。请参阅 Simulink.AliasType

要创建这些类和对象,可以使用 Simulink.importExternalCTypes 函数。

如果模型中的 MATLAB Function 模块或 Stateflow® 图使用导入的枚举或结构体类型,请将模型配置参数配置为包含 (#include) 来自外部头文件的类型定义。请参阅控制导入的总线和枚举类型定义(对于 MATLAB Function 模块)以及访问 Stateflow 图中的自定义代码变量和函数 (Stateflow)Integrate Custom Structures in Stateflow Charts (Stateflow)(对于图)。

确定使用继承设置的信号的数据类型

如果信号使用继承的数据类型设置(例如 “Inherit: Inherit via internal rule”,这是大多数模块的默认设置)确定信号用于仿真的有意义数据类型,则更新模块图,然后使用以下一种或两种方法:

  • 在 Simulink 编辑器的调试选项卡上,选择叠加信息并导航到端口部分。选择要显示的端口数据类型。数据类型显示在每个信号旁边的模块图上。有关详细信息,请参阅端口数据类型

  • 检查模型数据编辑器(在建模选项卡上,点击模型数据编辑器)中数据类型列的右侧。有关详细信息,请参阅模型数据编辑器

使用这些方法检查数据类型可以帮助您:

  • 从更高的层次上为模型设计数据类型策略。

  • 调试由于量化和溢出而造成的数值问题。

  • 使模型在共享时更容易理解。

有关详细信息,请参阅端口数据类型

尽管设置改变,但数据类型依然为 double

如果在您配置模块参数(如输出数据类型)之后,模型中的许多数据项(信号、参数和状态)仍然使用 double 数据类型,请确认未将该模型配置为覆盖数据类型。请参阅Control Data Type Override

另请参阅

| |

相关主题