Simulink 枚举
枚举数据是指仅限于一组有限值的数据。枚举数据类型是一个 MATLAB® 类,它定义一组枚举值。每个枚举值包括一个枚举名称和一个基础整数,该数字由软件在内部以及生成的代码中使用。
开始在建模上下文中使用枚举之前,您应该了解 枚举 中提供的信息。
要定义在 Simulink® 模型中使用的枚举,请选择以下方法之一:
使用函数
Simulink.defineIntEnumType
。这种枚举在 MATLAB 会话期间有效。通过创建以下内置类的子类来构建永久枚举类:
许多内置整数数据类型,例如
int8
和uint16
Simulink.IntEnumType
使用函数
Simulink.importExternalCTypes
为您的外部 C 代码定义的枚举数据类型 (enum
) 创建 Simulink 表示形式。使用此方法可以帮助您:
将现有 C 代码替换为 Simulink 模型。
集成现有 C 代码以便在 Simulink 中进行仿真(例如,通过使用代码继承工具)。
生成可与现有 C 代码一起编译成一个应用程序的 C 代码 (Simulink Coder™)。
有关详细信息,请参阅定义 Simulink 枚举。
以下示例说明如何在 Simulink 和 Stateflow® 中使用枚举。
示例 | 目的 |
---|---|
Data Typing in Simulink | 说明如何使用 Simulink 中的数据类型,包括枚举数据类型 |
Model Media Player by Using Enumerated Data (Stateflow) | 说明如何使用包含 Stateflow 图的 Simulink 模型中的枚举数据类型 |
有关在 Stateflow 中使用枚举的信息,请参阅枚举数据 (Stateflow)。
支持枚举的 Simulink 构造
概述
通常,所有 Simulink 工具和构造都支持枚举类型,因为枚举类型非常适合以下用途:表示程序状态和控制程序逻辑。Simulink 编辑器、Simulink 调试器、端口值显示、引用模型、子系统、封装、总线、数据记录以及大多数其他 Simulink 功能都支持枚举类型,并且没有任何特殊要求。
枚举类型不适用于数学计算,因此计算数值输出的模块(与将数值输入传递到输出不同)不支持枚举类型。因此,即使每个枚举值都具有一个基础整数,枚举类型也不被视为数值类型。有关详细信息,请参阅 计算中的枚举值。
大多数不支持枚举类型的功能显然不能支持它们。因此,Simulink 文档通常仅在必要时才会提及不支持枚举类型,以防误解,或是为了说明例外情况。有关可能支持枚举类型但实际不支持枚举类型的某些构造的信息,请参阅Simulink 枚举限制。
模块支持
以下 Simulink 模块支持枚举类型:
Constant(但 Enumerated Constant 为首选)
Probe(仅限输入)
Relay(仅限输出)
以下类别的 Simulink 模块的所有成员都支持枚举类型:
支持总线的模块(请参阅Bus-Capable Blocks)
直通模块:
具有状态,如 Data Store Memory 和 Unit Delay 模块。
没有状态,如 Mux 模块。
除上面提到的那些模块之外,许多 Simulink 模块支持枚举类型,但它们要么属于上面列出的类别之一,要么很少与枚举类型结合使用。每个模块参考页的“数据类型支持”部分说明了该模块支持的所有数据类型。
类支持
以下 Simulink 类支持枚举类型:
Simulink.ValueType
Simulink.Signal
Simulink.Parameter
Simulink.AliasType
Simulink.BusElement
记录枚举数据
顶层模型输出端口、To Workspace 模块和 Scope 模块都可以导出枚举值。信号和状态记录可以处理枚举数据,就像对任何其他数据一样。支持所有记录格式。From File 模块不支持枚举数据。请改为使用 From Workspace 模块,并结合使用某种方法在文件和工作区之间传输数据。有关详细信息,请参阅 保存仿真的运行时数据。
导入枚举数据
顶层模型输入端口和 From Workspace 模块可以在仿真期间输出枚举信号。必须采用 Structure
、Structure with Time
或 TimeSeries
对象来提供数据。在指定的仿真时间之间不会对枚举值进行插值。From File 模块仅生成 double
类型的数据,因此它们不支持枚举类型。有关详细信息,请参阅 加载用于仿真的信号数据。
Simulink 枚举限制
枚举和示波器
如果 Scope 模块显示的是枚举信号,只有当示波器曾经在仿真期间处于打开状态时,垂直轴才会显示枚举值的名称。如果您是在任何仿真发生之前或是在两个仿真之间首次打开 Scope 模块,则该模块仅会显示数值。仿真开始时,枚举名称将替换数值,之后每次打开 Scope 模块时枚举名称都会出现。
当一个 Floating Scope 模块显示多个信号时,仅当所有信号具有相同的枚举类型时,枚举值的名称才会出现在 Y 轴上。如果 Floating Scope 模块显示多种类型的枚举信号或任何数值信号,则不显示名称,而且任何枚举值都以其基础整数表示。
Switch 模块的枚举类型
Switch 模块的控制输入可以是 Simulink 支持的任何数据类型。但是,枚举不支持 “u2 ~=0
” 模式。如果控制输入具有一个枚举,请选择以下方法之一来指定传递第一个输入的条件:
选择 “
u2 >= 阈值
”或 “u2 > 阈值
”,并指定与控制输入相同的枚举类型的阈值。使用 Relational Operator 模块进行比较,然后将此比较的布尔结果提供给 Switch 模块的控制端口。
不支持枚举的情形
结合 Simulink 使用枚举数据类型时存在以下限制:
包不能包含枚举类定义。
If Action 模块不支持枚举。
生成的代码不支持记录枚举数据。
自定义 Stateflow 目标不支持枚举类型。
另请参阅
enumeration
| Simulink.defineIntEnumType
| Simulink.data.getEnumTypeInfo