主要内容

使用枚举数据金宝app模型

枚举数据是限制在有限值集合内的数据。一个枚举数据类型是MATLAB®类,该类定义了一组枚举值。每个枚举值由一个枚举的名字和一个潜在的整数在软件内部和生成的代码中使用。

有关Simulink中枚举的基本概念信息金宝app®,请参阅金宝app仿真软件枚举

有关使用枚举生成代码的信息,请参见在生成的代码中使用枚举数据(金宝app仿真软件编码器)

定义金宝app枚举

要定义一个可以在Simulink模型中使用的枚举数据类型,可以使用以下方法之一:金宝app

定义工作流金宝app枚举类

  1. 创建一个类定义

  2. 可选地,自定义枚举

  3. 可以选择将枚举保存在MATLAB文件中

  4. 可选地,将枚举定义永久存储在Simulink数据字典中。金宝app看到永久存储枚举类型定义

创建金宝app枚举类

要创建一个Simulin金宝appk枚举类,在类定义中:

  • 的子类定义类金宝app仿真软件。IntEnumType。你也可以在这些内置整数数据类型的基础上创建枚举类型:int8uint8int16uint16,int32

  • 添加一个枚举块,该块使用基础整数值指定枚举值。

考虑下面的例子:

classdef BasicColors < 金宝appSimulink。IntEnumType枚举红色(0)黄色(1)蓝色(2)结束结束

第一行定义了一个从内置类派生的基于整数的枚举金宝app仿真软件。IntEnumType。枚举是基于整数的,因为IntEnumType来源于int32

枚举节指定三个枚举值。

枚举值 枚举的名字 潜在的整数
红色(0) 红色的 0
黄色(1) 黄色的 1
蓝色(2) 蓝色的 2

在定义要在Simulink环境中使用的枚举类时,请考虑以下事项:金宝app

  • 枚举类的名称在数据类型名称和基本工作空间变量名称中必须是唯一的,并且区分大小写。

  • 中的基础整数值枚举Section在类中和跨类型中不必是唯一的。

  • 通常,一组枚举值的基础整数是连续且单调递增的,但它们不必是连续的或有序的。

  • 对于模拟,底层整数可以是任意的int32价值。使用MATLAB函数intminintmax求出极限。

  • 对于代码生成,每个底层整数值必须在目标硬件上表示为整数,这可能会施加不同的限制。看到配置系统目标文件(金宝app仿真软件编码器)了解更多信息。

有关超类的更多信息,请参见转换为超类值。有关在基础值有多个名称时如何处理枚举类的信息,请参见如何别名枚举名称

定制金宝app枚举

关于金宝app枚举定制。可以通过在类定义中实现特定的静态方法来定金宝app制Simulink枚举。如果使用适当的语法定义这些方法,则可以在模拟期间和生成的代码中更改类的行为。

该表显示了可以实现的自定义枚举的方法。

静态方法 目的 默认值无实现方法 自定义返回值 使用上下文
getDefaultValue 指定类的默认枚举成员。 枚举定义中指定的第一个成员 包含类中枚举成员名称的字符向量(参见实例化枚举 仿真和代码生成
getDescription 指定枚举类的描述。 '' 包含类型描述的字符向量 代码生成
getHeaderFile 指定头文件的名称。该方法getDataScope确定文件的重要性。 '' 一个字符向量,包含定义枚举类型的头文件的名称 代码生成
getDataScope 指定生成的代码是导出还是导入枚举数据类型的定义。使用这个方法getHeaderFile指定定义类型的生成或包含的头文件。 “汽车” 之一:“汽车”“出口”,或“进口” 代码生成
addClassNameToEnumNames 指定是否在生成的代码中为类名加上前缀。 真正的 代码生成

有关这些方法应用于代码生成的更多示例,请参见自定义枚举数据类型(金宝app仿真软件编码器)

指定默认枚举值。金宝app当您不提供其他初始值时,Simulink和相关生成的代码使用枚举的默认值对枚举数据进行基值初始化。例如,在条件执行的子系统中尚未执行的枚举信号具有枚举的默认值。如果安全强制转换失败,生成的代码将使用枚举的默认值,如枚举的类型强制转换(金宝app仿真软件编码器)

除非另外指定,否则枚举的默认值是枚举类定义中的第一个值。要指定不同的默认值,请添加您自己的默认值getDefaultValue方法的方法部分。的shellgetDefaultValue方法:

function retVal = getDefaultValue() % getDefaultValue默认枚举成员。返回此枚举类的有效成员以指定默认值。如果你没有定义这个方法,Simulink将使用第一个成员。金宝appretVal =EnumName;结束

若要自定义此方法,请提供的值学。EnumName它指定所需的默认值。

  • 必须是方法所在的类的名称。

  • EnumName必须是在该类中定义的枚举值的名称。

例如:

classdef BasicColors < 金宝appSimulink。IntEnumType枚举红色(0)黄色(1)蓝色(2)结束方法(Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end

本例将默认值定义为BasicColors。蓝色的。如果此方法未出现,则默认值为BasicColors。红色的,因为这是枚举类定义中列出的第一个值。

的看似多余的说明在同一个类的定义中是必要的,因为getDefaultValue返回默认枚举值的实例,而不仅仅是值的名称。因此,该方法需要对实例化的内容进行完整的说明。看到实例化枚举了解更多信息。

将枚举保存为MATLAB文件

您可以在MATLAB文件中定义枚举。

  • 定义文件的名称必须与枚举的名称完全匹配,包括大小写。例如,枚举的定义BasicColors必须驻留在名为BasicColors.m。否则,MATLAB将找不到定义。

  • 必须在单独的文件中定义每个类的定义。

  • 将每个定义文件保存在MATLAB搜索路径上。MATLAB在必要时搜索路径以查找定义。

    要将文件或文件夹添加到MATLAB搜索路径,请键入目录路径名在MATLAB命令提示符下。有关更多信息,请参见什么是MATLAB搜索路径?目录,savepath

  • 您不需要执行枚举类定义来使用枚举。如上所述,唯一的要求是定义文件位于MATLAB搜索路径上。

更改和重新加载枚举类

可以通过编辑并保存包含枚举定义的文件来更改枚举的定义。您不需要通知MATLAB类定义已经更改。MATLAB在保存文件时自动读取修改后的定义。但是,如果存在任何反映先前类定义的类实例(枚举值),则类定义更改不会完全生效。这些实例可能存在于基本工作区中,也可能被缓存。

下表解释了从基本工作区和缓存中删除枚举实例的选项。

如果在基本工作区… 如果在缓存中…

做以下其中一件事:

  • 查找和删除特定的过时实例。

  • 控件从工作区中删除所有内容清晰的命令。

  • 通过关闭在前一个类定义生效时更新或模拟的所有模型来删除过时的实例。

  • 清除函数并关闭缓存类实例的模型。

类似地,如果通过使用定义枚举类金宝appSimulink.defineIntEnumType,即使存在实例,也可以使用相同的函数重新定义该类。然而,你无法改变StorageType为实例存在时的类。

有关应用枚举更改的详细信息,请参见自动更新修改类

导入外部定义的枚举MATLAB

如果您想导入MATLAB外部定义的枚举以在Simulink环境中使用,则可以通过调用以下函数之一以编程方式实现:金宝app

  • 金宝appSimulink.defineIntEnumType-定义一个枚举,可以在MATLAB中使用,就像它是由类定义文件定义的一样。除了指定枚举类名和值外,每个函数调用还可以指定:

    • 描述枚举类的字符向量。

    • 哪个枚举值是默认值。

    对于代码生成,您可以指定:

    • 为生成的代码定义枚举的头文件。

    • 代码生成器是否将类名作为前缀应用于枚举成员—例如,BasicColors_Red红色的

    作为一个例子,考虑下面的类定义:

    classdef BasicColors < 金宝appSimulink。IntEnumType枚举红色(0)黄色(1)蓝色(2)结束方法(Static = true) function retVal = getDescription() retVal = 'Basic colors...'; end function retVal = getDefaultValue() retVal = BasicColors.Blue; end function retVal = getHeaderFile() retVal = 'mybasiccolors.h'; end function retVal = addClassNameToEnumNames() retVal = true; end end end

    下面的函数调用定义了在MATLAB中使用的相同类:

    金宝appSimulink.defineIntEnumType(“BasicColors”,…{'红色','黄色','蓝色'},[0;1;2],…“描述”、“基本色”、……'DefaultValue', 'Blue',…'HeaderFile', 'mybasiccolors.h',…'DataScope', 'Imported',…“AddClassNameToEnumNames”,真正的);
  • 金宝appSimulink.importExternalCTypes-创建枚举数据类型的金宝appSimulink表示(枚举),您现有的C代码定义。

如果一个MATLAB函数块在您的模型中使用枚举类型,配置模型配置参数以包括(# include)外部头文件中的类型定义。看到控制导入总线和枚举类型定义

永久存储枚举类型定义

通过使用类文件还是使用函数来定义枚举金宝appSimulink.defineIntEnumType,可以将枚举定义永久存储在Simulink数据字典中。金宝app链接到字典的模型可以使用枚举。有关更多信息,请参见数据字典中的枚举

用枚举进行模拟

考虑下面的枚举类定义-BasicColors具有枚举值红色的黄色的,蓝色的,蓝色的默认值为:

classdef BasicColors < 金宝appSimulink。IntEnumType枚举红色(0)黄色(1)蓝色(2)结束方法(Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end

一旦MATLAB知道了这个类的定义,就可以在Simulink和Stateflow中使用枚举金宝app®模型。特定于状态流中枚举的信息出现在枚举数据(Stateflow)。下面的Simulink模型使金宝app用了上面定义的枚举:

模型的输出如下所示:

数据类型转换OrigToInt指定一个输出数据类型int32整数舍入模式:地板上,所以代码块将正弦波块输出,它出现在范围显示一个整数循环:1210121。的数据类型转换IntToColor使用这些值从枚举类型中选择颜色BasicColors通过引用它们的底层整数。

结果是颜色的循环:黄色的蓝色的黄色的红色的黄色的蓝色的黄色的,如图中所示。的枚举常量EnumConst输出黄色的,在第二张图中以直线形式出现。的关系操作符块比较常量黄色的到颜色循环中的每个值。它输出1真正的)当黄色的小于当前颜色,和0),如第三张图所示。

比较所使用的排序顺序是被比较值的基础整数的数字顺序,枚举值在枚举类定义中出现的词法顺序。在本例中,这两个顺序是相同的,但它们不必相同。看到将枚举指定为数据类型计算中的枚举值了解更多信息。

将枚举指定为数据类型

一旦定义了枚举,就可以像使用其他数据类型一样使用它。因为枚举是类而不是实例,所以必须使用前缀?或枚举:将枚举指定为数据类型时。必须使用前缀在MATLAB命令窗口中。但是,您可以在Simulink模型中使用这两种前缀。金宝app枚举:有相同的效果前缀,但枚举:是首选,因为它在图形用户界面的上下文中更易于解释。

根据上下文,类型枚举:后跟枚举或选择的名称Enum: <类名>从菜单中(例如,对于输出数据类型块参数),并替换<类名>

若要使用数据类型助手,请设置模式枚举,然后输入枚举的名称。例如,在前面的模型中,数据类型转换IntToColor,它输出类型为的信号BasicColors,其输出信号规格如下:

不能为定义为枚举的信号设置最小值或最大值,因为最小值和最大值的概念与枚举的目的无关。的默认值更改枚举信号的最小值或最大值[],更新模型时会出现错误。看到计算中的枚举值了解更多信息。

获取关于枚举数据类型的信息

的函数枚举金宝appSimulink.data.getEnumTypeInfo返回关于枚举数据类型的信息。

获取有关枚举成员的信息

使用函数枚举:

  • 返回一个数组,其中包含MATLAB命令窗口中枚举类的所有枚举值

  • 以编程方式获取枚举值

  • 将这些值提供给一个Simulink块参数,该参数金宝app接受枚举值的数组或向量,例如情况下条件参数

获取关于枚举类的信息

使用函数金宝appSimulink.data.getEnumTypeInfo返回关于枚举类的信息,例如:

  • 默认枚举成员

  • 在生成的代码中定义类型的头文件的名称

  • 生成的代码中用于存储枚举成员基础上的整数值的数据类型

枚举值显示

只要有可能,Simulink就会按名称金宝app显示枚举值,而不是按基础整数值显示枚举值。但是,底层整数可能会影响中的值显示范围浮动范围块。

块…… 影响价值展示…
范围 在显示枚举信号时,枚举值的名称作为标签显示在Y轴上。名称按照其基础整数给出的顺序出现,最低值在底部。
浮动范围 当显示具有相同枚举的信号时,名称显示在Y轴上,就像它们显示a一样范围块。如果浮动范围块显示混合数据类型,不显示名称,并且任何枚举值都由其基础整数表示。

非唯一整数的枚举值

枚举中的多个值可以具有相同的基础整数值,如将枚举指定为数据类型。发生这种情况时,轴上的值范围块输出或输入显示块输出始终是枚举类定义中列出的具有共享底层整数的第一个值。例如:

虽然枚举常量块输出真正的,两个真正的有相同的底层整数,并且在类定义中首先定义枚举部分。因此,显示块显示。同样,一个范围轴只显示,从来没有真正的,无论两个值中的哪一个输入到范围块。

实例化枚举

在使用枚举之前,必须实例化它。您可以在MATLAB、Simulink模型或状态流图表中实例化枚举。金宝app语法在所有上下文中都是相同的。

实例化中的枚举MATLAB

要在MATLAB中实例化枚举,请输入类名称EnumName在MATLAB命令窗口中。实例是在基本工作区中创建的。例如,如果BasicColors定义为创建Simul金宝appink枚举类,你可以输入:

bcy = BasicColors。黄色的bcy= Yellow

制表符补全适用于枚举。例如,输入:

bcy = BasicColors.< font face =宋体

MATLAB显示的要素和方法BasicColors按字母顺序排列:

双击一个元素或方法,将其插入到按下的位置<选项卡>。看到代码建议和完成了解更多信息。

中强制转换枚举MATLAB

在MATLAB中,您可以直接从整数强制转换为枚举值:

bcb = BasicColors(2) bcb = Blue

你也可以将枚举值强制转换为其底层整数:

>> bci = int32(bcb) bci = 2

在任何一种情况下,MATLAB都会以相关数据类型的1x1数组返回强制转换的结果。

虽然可以进行类型转换,但是在为枚举类定义的枚举值和等效整数可能发生变化的情况下,枚举值的使用并不健壮。

实例化中的枚举金宝app(或Stateflow

要在Simulink模型中实例化枚举,可以输入金宝app类名称EnumName作为对话框中的值。例如,考虑以下模型:

枚举常量EnumConst,它输出枚举值黄色的,将该值定义如下:

您可以输入任何计算为枚举值的有效MATLAB表达式,包括数组和工作空间变量。例如,您可以输入BasicColors (1),或者你之前是否执行过死刑bcy = BasicColors。黄色的在MATLAB命令窗口中,可以输入bcy。作为另一个示例,您可以输入一个数组,例如[BasicColors。红色的,BasicColors。黄色的,BasicColors。蓝色)

你可以使用常数块以输出枚举值。但是,该块显示的参数不适用于枚举类型,例如输出最小输出最大

如果你创建一个金宝app仿真软件。参数对象作为枚举时,必须指定价值参数作为枚举成员,而数据类型枚举:还是?前缀,如将枚举指定为数据类型

不能类的枚举成员的整数值价值参数。看到计算中的枚举值了解更多信息。因此,即使为的整数值也会失败BasicColors。黄色的1

同样的语法和注意事项也适用于statflow。看到枚举数据(Stateflow)了解更多信息。

计算中的枚举值

通过设计,Simuli金宝appnk防止枚举值被用作数学计算中的数值,即使枚举类是MATLAB的子类int32类。因此,尽管存在其基础整数,枚举类型仍不能作为数字类型使用。例如,不能将枚举信号直接输入增益块。

可以使用数据类型转换块在整数类型和枚举类型之间或在两个枚举类型之间进行任意方向的转换。也就是说,您可以使用数据类型转换块将枚举信号转换为整数信号(由枚举信号值的底层整数组成),并将结果整数信号输入到增益块。看到枚举信号的转换了解更多信息。

Simulink中的枚举类型旨在表示程序金宝app状态,并在诸如关系操作符块和Switch块之类的块中控制程序逻辑。当一个Simu金宝applink块比较枚举值时,所比较的值必须具有相同的枚举类型。该块基于枚举值的基础整数比较枚举值,而不是基于枚举类定义中的顺序。

当一个block(如Switch block或Multiport Switch block)在多个数据信号中进行选择时,如果任意一个数据信号是枚举类型的,那么所有的数据信号必须是相同的枚举类型。当一个块同时输入控制信号和数据信号时,如Switch和Multiport Switch,控制信号类型不必与数据信号类型匹配。

枚举信号的转换

可以使用数据类型转换块将枚举信号强制转换为任何数字类型的信号,只要输入到该块的所有枚举值的基础整数都在数字类型的范围内。否则,在模拟过程中会出现错误。

类似地,您可以使用数据类型转换块将任意整数类型的信号强制转换为枚举信号,只要输入到数据类型转换块的每个值都是枚举类型中某个值的底层整数。否则,在模拟过程中会出现错误。

不能使用数据类型转换块将任何非整数数据类型的数字信号强制转换为枚举类型。中使用的模型用枚举进行模拟需要两个数据转换块将正弦波转换为枚举值。

第一个块强制转换int32,第二个块进行强制类型转换int32BasicColors。无论其实部和虚部的数据类型如何,都不能将复杂信号强制转换为枚举类型。

浇注枚举块参数

不能将任何数字数据类型的块参数强制转换为枚举数据类型。例如,假设an枚举常量块指定价值2和一个输出数据类型枚举:BasicColors

发生错误是因为规范隐式地强制转换值转换为枚举类型。即使数值在算术上对应于枚举类型中的一个枚举值,也会发生错误。

不能将枚举的块参数强制转换为任何其他数据类型。例如,假设a常数块指定恒定值BasicColors。蓝色的和一个输出数据类型int32

发生错误是因为规范隐式地将枚举值强制转换为数字类型。即使枚举值的基础整数是有效的,也会发生错误int32

另请参阅

||

相关的话题