主要内容

万博1manbetx模型

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

有关Simulink中枚举的基本概念信息万博1manbetx®,请参阅万博1manbetx仿真软件枚举

有关生成带有枚举的代码的信息,请参见在生成的代码中使用枚举数据(万博1manbetx仿真软件编码器)

定义万博1manbetx枚举

要定义可以在Simulink模型中使用的枚举数据类型,请使用以下方法之一:万博1manbetx

定义的工作流程万博1manbetx枚举类

  1. 创建一个类定义

  2. 可选地,自定义枚举

  3. 可选地,将枚举保存在MATLAB文件中

  4. 可选地,将枚举定义永久存储在Simulink数据字典中。万博1manbetx看到永久存储枚举类型定义

创建万博1manbetx枚举类

要创建一个Simulin万博1manbetxk枚举类,请在类定义中:

  • 的子类定义该类万博1manbetx仿真软件。IntEnumType.还可以将枚举类型基于以下内置整数数据类型之一:int8uint8int16uint16,int32

  • 添加一个枚举块,它指定带有基础整数值的枚举值。

考虑下面的例子:

classdef BasicColors < 万博1manbetxSimulink. classIntEnumType枚举红色(0)黄色(1)蓝色(2)结束结束

第一行定义了一个从内置类派生的基于整数的枚举万博1manbetx仿真软件。IntEnumType.枚举是基于整数的,因为IntEnumType是从int32

枚举节指定三个枚举值。

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

在定义在Simulink环境中使用的枚举类时,请考虑以下事项:万博1manbetx

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

  • 中的底层整数值枚举Section在类内和跨类型之间不必是唯一的。

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

  • 对于模拟,基础整数可以是任意整数int32价值。使用MATLAB函数intmin而且intmax求极限。

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

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

定制万博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文件

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

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

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

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

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

  • 您不需要执行枚举类定义来使用枚举。唯一的要求,如前面的项目符号所示,是定义文件在MATLAB搜索路径上。

更改并重新加载枚举类

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

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

If In Base Workspace… 如果在缓存中…

做以下任何一件事:

  • 定位并删除特定的过时实例。

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

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

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

类似地,如果使用万博1manbetxSimulink.defineIntEnumType,您可以使用相同的函数重新定义该类,即使实例存在。然而,你不能改变StorageType对于实例存在时的类。

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

将从外部定义的枚举导入到MATLAB

如果你有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而且整数舍入模式:地板上,因此块转换正弦波的顶部图中显示的块输出范围显示为整数的循环:1210121.的数据类型转换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

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

bcy = BasicColors。黄色的bcy= Yellow

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

bcy = BasicColors. . bcy = BasicColors.

MATLAB展示了的组成和方法BasicColors按字母顺序排列:

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

类型转换枚举MATLAB

在MATLAB中,你可以直接从一个整数转换为枚举值:

bcb = BasicColors(2

你也可以从枚举值转换为它的基础整数:

>> bci = int32(bcb) bci = 2

无论哪种情况,MATLAB都会以相关数据类型的1x1数组返回强制转换的结果。

尽管可以进行强制转换,但在枚举值和为枚举类定义的整数等等物可能发生更改的情况下,枚举值的使用并不健壮。

中的枚举实例化万博1manbetx(或Stateflow

要在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,第二个块铸造int32BasicColors.不能将复杂信号强制转换为枚举类型,而不管其实部和虚部的数据类型。

铸造枚举块参数

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

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

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

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

另请参阅

||

相关的话题