枚举数据是受限于有限组值的数据。一个枚举数据类型是一个MATLAB®类的集合枚举值.每个枚举值由枚举的名字和一个潜在的整数软件在内部和生成的代码中使用。
有关Simulink中枚举的基本概念信息万博1manbetx®,请参阅万博1manbetx仿真软件枚举.
有关生成带有枚举的代码的信息,请参见在生成的代码中使用枚举数据(万博1manbetx仿真软件编码器).
要定义可以在Simulink模型中使用的枚举数据类型,请使用以下方法之一:万博1manbetx
类定义枚举类classdef
在MATLAB文件中。
使用函数万博1manbetxSimulink.defineIntEnumType
.您不需要一个脚本文件来定义类型。有关更多信息,请参见函数参考页。
使用函数万博1manbetxSimulink.importExternalCTypes
来创建枚举数据类型的Si万博1manbetxmulink表示(枚举
),你的外部C代码定义。
可选地,将枚举定义永久存储在Simulink数据字典中。万博1manbetx看到永久存储枚举类型定义.
要创建一个Simulin万博1manbetxk枚举类,请在类定义中:
的子类定义该类万博1manbetx仿真软件。IntEnumType
.还可以将枚举类型基于以下内置整数数据类型之一:int8
,uint8
,int16
,uint16
,int32
.
添加一个枚举
块,它指定带有基础整数值的枚举值。
考虑下面的例子:
classdef BasicColors < 万博1manbetxSimulink. classIntEnumType枚举红色(0)黄色(1)蓝色(2)结束结束
第一行定义了一个从内置类派生的基于整数的枚举万博1manbetx仿真软件。IntEnumType
.枚举是基于整数的,因为IntEnumType
是从int32
.
的枚举
节指定三个枚举值。
枚举值 | 枚举的名字 | 潜在的整数 |
---|---|---|
红色(0) |
红色的 |
0 |
黄色(1) |
黄色的 |
1 |
蓝色(2) |
蓝色的 |
2 |
在定义在Simulink环境中使用的枚举类时,请考虑以下事项:万博1manbetx
关于万博1manbetx枚举定制。您可以通过在类定义中实现特定的静态方法来万博1manbetx定制Simulink枚举。如果使用适当的语法定义这些方法,则可以在模拟过程中和在生成的代码中更改类的行为。
该表显示了您可以实现的自定义枚举的方法。
静态方法 | 目的 | 默认值无实现方法 | 自定义返回值 | 使用上下文 |
---|---|---|---|---|
getDefaultValue |
指定类的默认枚举成员。 | 枚举定义中指定的第一个成员 | 一个字符向量,包含类中枚举成员的名称(参见实例化枚举) | 模拟和代码生成 |
getDescription |
指定枚举类的说明。 | ” |
包含类型描述的字符向量 | 代码生成 |
getHeaderFile |
指定头文件的名称。该方法getDataScope 确定文件的重要性。 |
” |
一个字符向量,包含定义枚举类型的头文件的名称 | 代码生成 |
getDataScope |
指定生成的代码是导出还是导入枚举数据类型的定义。使用方法getHeaderFile 指定生成的或包含的定义类型的头文件。 |
“汽车” |
之一:“汽车” ,“出口” ,或“进口” |
代码生成 |
addClassNameToEnumNames |
指定是否在生成的代码中给类名加上前缀。 | 假 |
真正的 或假 |
代码生成 |
有关应用于代码生成的这些方法的更多示例,请参见自定义枚举数据类型(万博1manbetx仿真软件编码器).
指定一个默认枚举值。万博1manbetx当您没有提供其他初始值时,Simulink和相关生成的代码使用枚举的默认值对枚举数据进行基础值初始化。例如,尚未执行的有条件执行子系统中的枚举信号具有枚举的默认值。如中所述,如果安全强制转换失败,生成的代码将使用枚举的默认值枚举的类型转换(万博1manbetx仿真软件编码器).
除非另有指定,否则枚举的默认值是枚举类定义中的第一个值。若要指定不同的默认值,请添加自己的默认值getDefaultValue
的方法方法
部分。类的shellgetDefaultValue
方法:
function retVal = getDefaultValue() % getDefaultValue指定默认枚举成员。返回此枚举类的有效成员,以指定默认值。如果不定义此方法,则Simulink使用第一个成员。。万博1manbetxretVal =学.EnumName;结束
要自定义此方法,请提供的值
它指定所需的默认值。学。EnumName
学
必须是方法所在的类的名称。
EnumName
必须是该类中定义的枚举值的名称。
例如:
classdef BasicColors < 万博1manbetxSimulink. classIntEnumType枚举红色(0)黄色(1)蓝色(2)结束方法(Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end
本例将默认值定义为BasicColors。蓝色的
.如果此方法不出现,则默认值为BasicColors。红色的
,因为它是枚举类定义中列出的第一个值。
的看似多余的规范学
在同一类的定义中是必要的,因为getDefaultValue
返回默认枚举值的实例,而不仅仅是值的名称。因此,该方法需要一个要实例化的对象的完整规范。看到实例化枚举更多信息。
您可以在MATLAB文件中定义枚举。
定义文件的名称必须与枚举的名称完全匹配,包括大小写。例如,枚举的定义BasicColors
必须驻留在名为BasicColors.m
.否则,MATLAB将无法找到定义。
必须在单独的文件中定义每个类定义。
将每个定义文件保存到MATLAB搜索路径上。MATLAB在必要时搜索路径以找到定义。
要将文件或文件夹添加到MATLAB搜索路径,输入目录
在MATLAB命令提示符。有关更多信息,请参见什么是MATLAB搜索路径?,路径名
目录
,savepath
.
您不需要执行枚举类定义来使用枚举。唯一的要求,如前面的项目符号所示,是定义文件在MATLAB搜索路径上。
您可以通过编辑和保存包含该定义的文件来更改枚举的定义。您不需要通知MATLAB类定义已经更改。在保存文件时,MATLAB会自动读取修改后的定义。但是,如果存在任何反映前一个类定义的类实例(枚举值),则类定义更改不会完全生效。这样的实例可能存在于基本工作区中,也可能被缓存。
下表解释了从基本工作区和缓存中删除枚举实例的选项。
If In Base Workspace… | 如果在缓存中… |
---|---|
做以下任何一件事:
|
|
类似地,如果使用万博1manbetxSimulink.defineIntEnumType
,您可以使用相同的函数重新定义该类,即使实例存在。然而,你不能改变StorageType
对于实例存在时的类。
有关应用枚举更改的详细信息,请参见已修改类的自动更新.
如果你有MATLAB外部定义的枚举,想要导入到Simulink环境中使用,你可以通过调用以下函数之一来编程实现:万博1manbetx
万博1manbetxSimulink.defineIntEnumType
-定义一个枚举,你可以在MATLAB中使用,就好像它是由一个类定义文件定义的。除了指定枚举类名和值外,每个函数调用还可以指定:
描述枚举类的字符向量。
哪一个枚举值是默认值。
对于代码生成,你可以指定:
头文件,其中为生成的代码定义了枚举。
代码生成器是否将类名作为前缀应用于枚举成员—例如,BasicColors_Red
或红色的
.
作为一个例子,考虑下面的类定义:
classdef BasicColors < 万博1manbetxSimulink. classIntEnumType枚举红色(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中使用的相同的类:
万博1manbetxSimulink.defineIntEnumType(“BasicColors”,…{'红','黄','蓝'},[0;1;2],…“描述”,“基本颜色”,…'DefaultValue', 'Blue',…'HeaderFile', 'mybasiccolors.h',…'DataScope', 'Imported',…“AddClassNameToEnumNames”,真正的);
万博1manbetxSimulink.importExternalCTypes
-创建枚举数据类型的万博1manbetxSimulink表示(枚举
),你现有的C代码定义。
如果一个MATLAB函数块使用枚举类型,配置模型配置参数包括(# include
)从你的外部头文件的类型定义。看到控件导入的总线和枚举类型定义.
是使用类文件还是使用函数来定义枚举万博1manbetxSimulink.defineIntEnumType
,您可以永久地将枚举定义存储在Simulink数据字典中。万博1manbetx链接到字典的模型可以使用枚举。有关更多信息,请参见数据字典中的枚举.
考虑下面的枚举类定义-BasicColors
使用枚举值红色的
,黄色的
,蓝色的
,蓝色的
默认值为:
classdef BasicColors < 万博1manbetxSimulink. classIntEnumType枚举红色(0)黄色(1)蓝色(2)结束方法(Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end
一旦MATLAB知道了这个类定义,您就可以在Simulink和Stateflow中使用枚举万博1manbetx®模型。中显示特定于状态流中的枚举的信息枚举数据(Stateflow).下面的Simulink模型使万博1manbetx用了上面定义的枚举:
模型的输出如下所示:
的数据类型转换块OrigToInt指定一个输出数据类型的int32
而且整数舍入模式:地板上
,因此块转换正弦波的顶部图中显示的块输出范围显示为整数的循环:1
,2
,1
,0
,1
,2
,1
.的数据类型转换块IntToColor使用这些值从枚举类型中选择颜色BasicColors
通过引用它们的底层整数。
结果是颜色的循环:黄色的
,蓝色的
,黄色的
,红色的
,黄色的
,蓝色的
,黄色的
如图中图所示。的枚举常量块EnumConst输出黄色的
,在第二个图中显示为一条直线。的关系操作符Block比较常量黄色的
颜色循环中的每一个值。它输出1
(真正的
)当黄色的
小于当前颜色,和0
(假
)否则,如图3所示。
比较所使用的排序顺序是比较值的基础整数的数字顺序,不枚举值在枚举类定义中出现的词汇顺序。在这个例子中,这两个顺序是相同的,但它们不一定是相同的。看到将枚举指定为数据类型而且计算中的枚举值更多信息。
定义了枚举之后,就可以像使用任何其他数据类型一样使用它。因为枚举是类而不是实例,所以必须使用前缀?或枚举:
当指定枚举为数据类型时。您必须使用前缀?
在MATLAB命令窗口中。但是,您可以在Simulink模型中使用任意一个前缀。万博1manbetx枚举:
与?的效果相同?
前缀,但枚举:
是首选,因为它在图形用户界面的上下文中更加自解释。
根据上下文,键入枚举:
后跟枚举的名称,或选择Enum: <类名>
从菜单(例如,对于输出数据类型Block参数),并替换<类名>
.
若要使用“数据类型助手”,请设置模式来枚举
,然后输入枚举的名称。例如,在前面的模型中数据类型转换块IntToColor,它输出类型的信号BasicColors
,具有以下输出信号规格:
不能为定义为枚举的信号设置最小值或最大值,因为最小和最大值的概念与枚举的目的无关。的默认值更改枚举信号的最小值或最大值[]
,更新模型时会出现错误。看到计算中的枚举值更多信息。
的函数枚举
而且万博1manbetxSimulink.data.getEnumTypeInfo
返回关于枚举数据类型的信息。
使用函数枚举
:
返回一个数组,该数组包含MATLAB命令窗口中枚举类的所有枚举值
以编程方式获取枚举值
向接受枚举值的数组或向量的Simulink块参数万博1manbetx提供值,例如情况下条件参数
使用函数万博1manbetxSimulink.data.getEnumTypeInfo
返回关于枚举类的信息,例如:
默认枚举成员
在生成的代码中定义类型的头文件的名称
生成的代码中用于存储枚举成员基础上的整数值的数据类型
在可能的情况下,Simulink按名称万博1manbetx显示枚举值,而不是按底层整数值。但是,底层整数可能影响中显示的值范围而且浮动范围块。
块…… | 对价值展示的影响… |
---|---|
范围 | 在显示枚举信号时,枚举值的名称在Y轴上显示为标签。名称按其基础整数给出的顺序出现,最小值位于底部。 |
浮动范围 | 当显示具有相同枚举的信号时,名称出现在Y轴上,就像出现在a上一样范围块。如果浮动范围块显示混合数据类型,不显示名称,任何枚举值都由它们的底层整数表示。 |
枚举中的多个值可以具有相同的基础整数值,如中所述将枚举指定为数据类型.当发生这种情况时,坐标轴上的值范围块输出或输入显示块输出总是枚举类定义中列出的具有共享基础整数的第一个值。例如:
虽然枚举常量块输出真正的
,两个在
而且真正的
有相同的基础整数,和在
在类定义中首先定义枚举
部分。因此,显示块显示在
.同样,一个范围轴只显示在
,从来没有真正的
,无论两个值中的哪一个输入到范围块。
在使用枚举之前,必须实例化它。您可以在MATLAB、Simulink模型或状态流图中实例化枚举。万博1manbetx语法在所有上下文中都是相同的。
要在MATLAB中实例化一个枚举,输入类名称
.EnumName
在MATLAB命令窗口中。实例是在基本工作区中创建的。例如,如果BasicColors
定义为创建Simul万博1manbetxink枚举类,你可以输入:
bcy = BasicColors。黄色的bcy= Yellow
制表符补全适用于枚举。例如,如果您输入:
bcy = BasicColors.. bcy = BasicColors.
MATLAB展示了的组成和方法BasicColors
按字母顺序排列:
双击一个元素或方法将其插入到您按下的位置<选项卡>
.看到代码建议和完成更多信息。
在MATLAB中,你可以直接从一个整数转换为枚举值:
bcb = BasicColors(2
你也可以从枚举值转换为它的基础整数:
>> bci = int32(bcb) bci = 2
无论哪种情况,MATLAB都会以相关数据类型的1x1数组返回强制转换的结果。
尽管可以进行强制转换,但在枚举值和为枚举类定义的整数等等物可能发生更改的情况下,枚举值的使用并不健壮。
要在Simulink模型中实例化一个枚举,您可以输入万博1manbetx类名称
.EnumName
作为对话框中的值。例如,考虑以下模型:
的枚举常量块EnumConst,它输出枚举值黄色的
,将该值定义为:
您可以输入任何计算为枚举值的有效MATLAB表达式,包括数组和工作空间变量。例如,您可以输入BasicColors (1)
,或者如果您之前执行过bcy = BasicColors。黄色的
在MATLAB命令窗口中,您可以输入bcy
.另一个例子是,您可以输入一个数组,例如[BasicColors。红色的,BasicColors。黄色的,BasicColors。蓝色)
.
你可以使用常数块来输出枚举值。但是,该块显示不应用于枚举类型的参数,例如输出最小而且输出最大.
如果你创建一个万博1manbetx仿真软件。参数
对象作为枚举,则必须指定价值参数作为枚举成员数据类型与枚举:
还是?前缀,如在将枚举指定为数据类型.
你不能对象的枚举成员的整数值价值参数。看到计算中的枚举值更多信息。因此,即使for的整数值为BasicColors。黄色的
是1
.
同样的语法和考虑也适用于Stateflow。看到枚举数据(Stateflow)更多信息。
通过设计,Simuli万博1manbetxnk防止枚举值在数学计算中被用作数值,即使枚举类是MATLAB的子类int32
类。因此,枚举类型不能作为数字类型,尽管它的基础整数存在。例如,不能将枚举信号直接输入到增益块。
可以使用数据类型转换块在整数类型和枚举类型之间或在两个枚举类型之间进行双向转换。也就是说,您可以使用数据类型转换块将枚举信号转换为整数信号(由枚举信号值的底层整数组成),并将得到的整数信号输入到增益块。看到浇铸枚举信号更多信息。
Simulink中的枚举类型是用来表示程万博1manbetx序状态和控制程序逻辑的块,比如Relational Operator块和Switch块。当一个Simu万博1manbetxlink块比较枚举值时,比较的值必须具有相同的枚举类型。该块基于枚举值的基础整数比较它们,而不是它们在枚举类定义中的顺序。
当像Switch块或Multiport Switch块这样的块在多个数据信号中进行选择,并且任何数据信号都是枚举类型的,那么所有的数据信号都必须是相同的枚举类型。当一个块同时输入控制和数据信号时,就像Switch和Multiport Switch那样,控制信号类型不需要与数据信号类型匹配。
可以使用数据类型转换块将枚举信号转换为任何数值类型的信号,前提是输入到该块的所有枚举值的基础整数都在数值类型的范围内。否则,在模拟过程中会出现错误。
类似地,可以使用数据类型转换块将任意整数类型的信号转换为枚举信号,前提是输入到数据类型转换块的每个值都是枚举类型中某个值的基础整数。否则,在模拟过程中会出现错误。
不能使用数据类型转换块将任何非整数数据类型的数值信号转换为枚举类型。例如,使用的模型使用枚举进行模拟需要两个数据转换块将一个正弦波转换为枚举值。
第一个块铸造双
来int32
,第二个块铸造int32
来BasicColors
.不能将复杂信号强制转换为枚举类型,而不管其实部和虚部的数据类型。
不能将任何数值数据类型的块参数强制转换为枚举数据类型。例如,假设an枚举常量Block指定了价值的2
和一个输出数据类型的枚举:BasicColors
:
发生错误是因为规范隐式地转换为双
值转换为枚举类型。即使数值在算术上对应于枚举类型中的枚举值之一,也会发生错误。
不能将枚举的块形参强制转换为任何其他数据类型。例如,假设a常数Block指定了恒定值的BasicColors。蓝色的
和一个输出数据类型的int32
.
出现错误是因为规范隐式地将枚举值转换为数值类型。即使枚举值的基础整数是有效的,也会发生错误int32
.
枚举
|万博1manbetxSimulink.data.getEnumTypeInfo
|万博1manbetxSimulink.defineIntEnumType