主要内容

使用枚举数据金宝app模型

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

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

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

定义金宝app枚举

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

定义一个金宝app枚举类

  1. 创建一个类定义

  2. 可选地自定义枚举

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

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

创建金宝app枚举类

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

  • 将类定义为的子类金宝app仿真软件。IntEnumType.您还可以将枚举类型基于以下内置整数数据类型之一:int8uint8int16uint16,int32

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

考虑下面的例子:

< Simulink. classdef Ba金宝appsicColorsIntEnumType枚举红色(0)黄色(1)蓝色(2)结束结束

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

枚举节指定三个枚举值。

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

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

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

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

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

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

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

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

定制金宝app枚举

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

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

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

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

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

除非另行指定,枚举的默认值是枚举类定义中的第一个值。要指定不同的默认值,请添加您自己的默认值getDefaultValue方法方法部分。下面的代码显示了getDefaultValue方法:

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

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

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

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

例如:

< Simulink. classdef Ba金宝appsicColorsIntEnumType枚举红色(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红色的

    例如,考虑以下类定义:

    < Simulink. classdef Ba金宝appsicColorsIntEnumType枚举红色(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”、“蓝”,……“HeaderFile”、“mybasiccolors.h’,……“DataScope”、“进口”,……“AddClassNameToEnumNames”,真正的);
  • 金宝appSimulink.importExternalCTypes-创建枚举数据类型的金宝appSimulink表示(枚举),您现有的C代码定义。

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

永久存储枚举类型定义

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

模拟与枚举

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

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

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

模型的输出如下所示:

数据类型转换OrigToInt指定一个输出数据类型int32整数的舍入模式:地板上,因此该块转换正弦波块输出,它出现在范围显示,以整数为周期:1210121.的数据类型转换IntToColor使用这些值从枚举类型中选择颜色BasicColors通过引用它们的基础整数。

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

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

指定枚举作为数据类型

定义枚举后,就可以像使用任何其他数据类型一样使用它了。因为枚举是类而不是实例,所以必须使用前缀?或枚举:将枚举指定为数据类型时。你必须使用前缀在MATLAB命令窗口中。但是,您可以在Simulink模型中使用任何一个前缀。金宝app枚举:有同样的效果吗前缀,但枚举:首选,因为它在图形用户界面的上下文中更不言自明。

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

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

不能为定义为枚举的信号设置最小值或最大值,因为最小和最大值的概念与枚举的目的无关。如果将枚举信号的最小值或最大值从默认值更改[],则更新模型时发生错误。看到计算中的枚举值为更多的信息。

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

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

获取关于枚举成员的信息

使用的函数枚举:

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

  • 以编程方式获取枚举值

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

获取关于枚举类的信息

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

  • 默认枚举成员

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

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

枚举值显示

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

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

非唯一整数枚举值

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

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

实例化枚举

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

实例化中枚举MATLAB

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

bcy = BasicColors。黄色的bcy= Yellow

制表符完成用于枚举。例如,如果你输入:

bcy = BasicColors。<选项卡>

在MATLAB中展示了BasicColors按字母顺序排列:

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

铸造中枚举MATLAB

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

bcb = BasicColors(2

还可以将枚举值强制转换为其基础整数:

>> 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块)表示程序状态和控制程序逻辑。当Simuli金宝appnk块比较枚举值时,所比较的值必须是相同的枚举类型。该块基于枚举值的基础整数(而不是枚举类定义中的顺序)来比较枚举值。

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

铸造枚举信号

如果输入到数据块的所有枚举值的基础整数都在数字类型范围内,则可以使用数据类型转换块将枚举信号转换为任何数字类型的信号。否则,在模拟过程中发生错误。

类似地,您可以使用数据类型转换块将任意整数类型的信号转换为枚举信号,前提是数据类型转换块的每个输入值都是枚举类型中某个值的基础整数。否则,在模拟过程中发生错误。

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

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

枚举块参数的转换

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

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

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

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

另请参阅

||

相关的话题