Main Content

Simulink 枚举

枚举数据是指仅限于一组有限值的数据。枚举数据类型是一个 MATLAB® 类,它定义一组枚举值。每个枚举值包括一个枚举名称和一个基础整数,该数字由软件在内部以及生成的代码中使用。

开始在建模上下文中使用枚举之前,您应该了解 枚举 中提供的信息。

要定义在 Simulink® 模型中使用的枚举,请选择以下方法之一:

  • 使用函数 Simulink.defineIntEnumType。这种枚举在 MATLAB 会话期间有效。

  • 通过创建以下内置类的子类来构建永久枚举类:

    • 许多内置整数数据类型,例如 int8uint16

    • Simulink.IntEnumType

  • 使用函数 Simulink.importExternalCTypes 为您的外部 C 代码定义的枚举数据类型 (enum) 创建 Simulink 表示。

    使用此方法可以帮助您:

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

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

    • 生成可与现有 C 代码一起编译成一个应用程序的 C 代码 (Simulink Coder™)。

有关详细信息,请参阅定义 Simulink 枚举

以下示例说明如何在 Simulink 和 Stateflow® 中使用枚举。

示例目的
Data Typing in Simulink说明如何使用 Simulink 中的数据类型,包括枚举数据类型
Simulate a Media Player (Stateflow)说明如何使用包含 Stateflow 图的 Simulink 模型中的枚举数据类型

有关在 Stateflow 中使用枚举的信息,请参阅枚举数据 (Stateflow)

支持枚举的 Simulink 构造

概述

通常,所有 Simulink 工具和构造都支持枚举类型,因为枚举类型非常适合以下用途:表示程序状态和控制程序逻辑。Simulink 编辑器、端口值标签、引用模型、子系统、封装、总线、数据记录以及大多数其他 Simulink 功能都支持枚举类型,并且没有任何特殊要求。

枚举类型不适用于数学计算,因此计算数值输出的模块(与将数值输入传递到输出不同)不支持枚举类型。因此,即使每个枚举值都具有一个基础整数,枚举类型也不被视为数值类型。有关详细信息,请参阅 计算中的枚举值

大多数不支持枚举类型的功能显然不能支持它们。因此,Simulink 文档通常仅在必要时才会提及不支持枚举类型,以防误解,或是为了说明例外情况。有关可能支持枚举类型但实际不支持枚举类型的某些构造的信息,请参阅Simulink 枚举限制

模块支持

许多 Simulink 模块支持枚举类型。每个模块参考页的“数据类型支持”部分说明了该模块支持的所有数据类型。

特别是,以下类别的 Simulink 模块的所有成员都支持枚举类型:

类支持

以下 Simulink 类支持枚举类型:

  • Simulink.ValueType

  • Simulink.Signal

  • Simulink.Parameter

  • Simulink.AliasType

  • Simulink.BusElement

记录枚举数据

顶层模型输出端口、To Workspace 模块和 Scope 模块都可以导出枚举值。信号和状态记录可以处理枚举数据,就像对任何其他数据一样。支持所有记录格式。有关详细信息,请参阅 保存仿真的运行时数据

导入枚举数据

顶层模型输入端口和 From Workspace 模块可以在仿真期间输出枚举信号。必须采用 StructureStructure with Timetimeseries 对象来提供数据。在指定的仿真时间之间,不会对枚举值进行插值。有关详细信息,请参阅 加载用于仿真的信号数据

Simulink 枚举限制

枚举和示波器

如果 Scope 模块显示的是枚举信号,只有当示波器曾经在仿真期间处于打开状态时,垂直轴才会显示枚举值的名称。如果您是在任何仿真发生之前或是在两个仿真之间首次打开 Scope 模块,则该模块仅会显示数值。仿真开始时,枚举名称将替换数值,之后每次打开 Scope 模块时枚举名称都会出现。

当一个 Floating Scope 模块显示多个信号时,仅当所有信号具有相同的枚举类型时,枚举值的名称才会出现在 Y 轴上。如果 Floating Scope 模块显示多种类型的枚举信号或任何数值信号,则不显示名称,而且任何枚举值都以其基础整数表示。

Switch 模块的枚举类型

Switch 模块的控制输入可以是 Simulink 支持的任何数据类型。但是,枚举不支持 u2 ~=0 模式。如果控制输入具有一个枚举,请选择以下方法之一来指定传递第一个输入的条件:

  • 选择 u2 >= 阈值u2 > 阈值,并指定与控制输入相同的枚举类型的阈值。

  • 使用 Relational Operator 模块进行比较,然后将此比较的布尔结果提供给 Switch 模块的控制端口。

不支持枚举的情形

结合 Simulink 使用枚举数据类型时存在以下限制:

  • 包不能包含枚举类定义。

  • If Action 模块不支持枚举。

  • 生成的代码不支持记录枚举数据。

  • 自定义 Stateflow 目标不支持枚举类型。

另请参阅

| |

相关主题