文档

万博1manbetx模型

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

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

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

定义万博1manbetx枚举

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

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

  1. 创建类定义

  2. 可选地,自定义枚举

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

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

创建万博1manbetx枚举类

要创建Simulink枚万博1manbetx举类,请在类定义中:

  • 的子类定义类万博1manbetx仿真软件。IntEnumType.你也可以将枚举类型建立在以下内置整数数据类型的基础上:int8uint8int16uint16,int32

  • 添加一个枚举块,它使用底层整数值指定枚举值。

考虑下面的例子:

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

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

枚举节指定三个枚举值。

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

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

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

  • 中的基础整数值枚举节在类内和跨类型之间不需要是唯一的。

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

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

  • 对于代码生成,每个底层整数值必须可以在目标硬件上表示为整数,这可能会施加不同的限制。看到配置系统目标文件(万博1manbetxSimulink Coder)和硬件实现面板获取更多信息。

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

定制万博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。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搜索路径?(MATLAB),目录,savepath

  • 使用该枚举不需要执行枚举类定义。正如前面提到的,唯一的要求是定义文件必须位于MATLAB搜索路径上。

更改和重载枚举类

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

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

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

做以下其中一件事:

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

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

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

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

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

导入外部定义的枚举到MATLAB

如果您有MATLAB外部定义的枚举,并且希望导入以在Simulink环境中使用,则可以通过调用以下函数之一以编程方式实现:万博1manbetx

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

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

    • 哪个枚举值是默认值。

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

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

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

    例如,考虑以下类定义:

    classdef BasicColors < 万博1manbetxSimulink。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中使用的相同的类:

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

如果一个MATLAB函数block或statflow®图表中使用枚举类型,则配置模型配置参数以包括(# include)外部头文件中的类型定义。看到控件导入的总线和枚举类型定义(MATLAB函数块),集成自定义C/ c++代码模拟(statflow)(用于图表)。

永久存储枚举类型定义

是使用类文件还是使用函数定义枚举万博1manbetxSimulink.defineIntEnumType,可以永久地将枚举定义存储在Simulink数据字典中。万博1manbetx链接到字典的模型可以使用枚举。有关更多信息,请参见数据字典中的枚举

使用枚举进行模拟

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

classdef BasicColors < 万博1manbetxSimulink。IntEnumType枚举红色(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命令窗口中枚举类的所有枚举值

  • 以编程方式获取枚举值

  • 将值提供给接受枚举值的数组或向量的Simulin万博1manbetxk块参数,例如情况下条件Switch Case块的参数

获取有关枚举类的信息

使用函数万博1manbetxSimulink.data.getEnumTypeInfo返回关于枚举类的信息,例如:

  • 默认的枚举成员

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

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

枚举值显示

在任何可能的情况下,Simulink根万博1manbetx据名称显示枚举值,而不是根据底层整数值。但是,底层整数可能会影响中显示的值范围而且浮动范围块。

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

具有非唯一整数的枚举值

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

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

实例化枚举

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

实例化枚举MATLAB

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

bcy = BasicColors。黄色的bcy= Yellow

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

bcy = BasicColors.

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

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

MATLAB

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

bcb =基本颜色(2)bcb =蓝色

你也可以将枚举值转换为它的底层整数:

>> bci = int32(bcb) bci = 2

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

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

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

若要实例化Simulink模型中的枚举,可以输入万博1manbetx类名称EnumName作为对话框中的值。例如,考虑以下模型:

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

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

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

如果你创建一个万博1manbetx仿真软件。参数对象作为枚举时,必须指定价值参数作为枚举成员,而数据类型枚举:还是?前缀,如中所解释将枚举指定为数据类型

不能属性的枚举成员的整数值价值参数。看到计算中的枚举值获取更多信息。因此,即使为的整数值,下面的操作也会失败BasicColors。黄色的1

同样的语法和注意事项也适用于statflow。看到枚举数据(状态流)以获取更多信息。

计算中的枚举值

根据设计,Simuli万博1manbetxnk防止枚举值在数学计算中用作数值,即使枚举类是MATLAB的子类int32类。因此,尽管枚举类型的基础整数存在,但它不能作为数字类型发挥作用。例如,不能将枚举信号直接输入到增益块。

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

Simulink中的枚举类型旨在表示程序万博1manbetx状态和控制程序逻辑的块,如关系操作符块和Switch块。当一个Simu万博1manbetxlink块比较枚举值时,比较的值必须具有相同的枚举类型。该块基于枚举值的底层整数(而不是它们在枚举类定义中的顺序)比较枚举值。

当像Switch块或Multiport Switch块这样的块在多个数据信号中选择时,并且任何数据信号都是枚举类型,所有数据信号必须具有相同的枚举类型。当一个块同时输入控制和数据信号时,如Switch和Multiport Switch,控制信号类型不需要与数据信号类型匹配。

铸造枚举信号

可以使用数据类型转换块将枚举信号转换为任何数字类型的信号,前提是输入到块的所有枚举值的底层整数都在数字类型的范围内。否则,模拟时会出现错误。

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

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

第一个块int32,第二个块进行施放int32BasicColors.不能将复杂信号强制转换为枚举类型,而不管其实部和虚部的数据类型。

铸造枚举块参数

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

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

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

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

另请参阅

||

相关的话题

这个话题有用吗?