Main Content

生成さたにおける列挙型データ使用使用

列挙データ型

“列挙”ははたの値制约れるれるデータ。“列挙データ”は,“列挙型の値" のセットを定義する MATLAB®クラスです。各列挙型の値は、ソフトウェアが生成コード内で内的に使用する“列挙型名前”と“使用可能”から构成れます。はは基础颜色と名付けられた列挙データ型用の MATLAB クラス定義です。これはこの節の例に使用されます。

classDef basiccolors 
             

列挙データ型と Simulink®モデル内での使用法に関する基本的な情報については、Simulink モデルでの列挙型データの使用を参照してください。Stateflow®チャート内の列挙データ型の詳細については、列挙データ型定义(状态流)を参照してください。

列挙へ整数データ型指定指定

列挙に対しを指定ことにより以下可能。。。

  • スーパークラスによるコードでの列挙データ型のサイズ制御制御

  • RAM/ROMの使用量削减削减

  • コードの移植の向上

  • レガシ コードとの統合の改善

次の整数データ型を指定できます。

  • int8

  • uint8

  • int16

  • uint16

  • int32

  • Simulink.IntEnumType。お使いのハードウェア プラットフォームの符号付き整数の範囲にある値を指定します。

MATLABファイルにおけるクラスの使用

整数データ型のサイズを指定するには、整数データ型から列挙型クラスを導出します。

classdef颜色枚举红色(0)绿色(1)蓝色(2)结尾结尾

コードジェネレーター次コードを生成し。。

typedef int8_t颜色;#Define Red(((颜色)0)#Define Green((颜色)1)#Define Blue(((颜色)2)

关数Simulink.defineIntEnumTypeの使用

整数データ型のサイズを指定するには、名前と値のペアStorageTypeを整数型として指定。。

金宝appsimulink.defineintenumtype('颜色',{'红色的',,,,“绿色”,,,,'蓝色的'},。。。[0;1;2],'storageType',,,,'int8'

コードジェネレーター次コードを生成し。。

typedef int8_t颜色;#Define Red(((颜色)0)#Define Green((颜色)1)#Define Blue(((颜色)2)

列挙データ型カスタマイズ

列挙データするモデルからコードをする场合以下静的メソッドメソッドをを実装実装実装しして,,中および生成生成さされれたたコード

  • getDefaultValue— 列挙データ型の既定値を指定します。

  • GetDescription— 列挙データ型の記述を指定します。

  • Getheaderfile— 生成されたコードに型を定義するヘッダー ファイルを指定します。

  • getDataScope- 生成コードデータのをのヘッダーにししたり,ヘッダーファイルからエクスポートエクスポートするかかどうどうかかを。

  • AddClassNametoenumnames— 生成コードでクラス名を接頭辞にするかどうかを指定します。

このメソッドうち最初のであるであるgetDefaultValueはシミュレーションコードの両方关连しており,既定の列挙値の指定で说明て​​ます。その他他はコードにのみのみ关连ししますます。。。列挙列挙のの动作ををカスタマイズカスタマイズカスタマイズするするするにには方法(静态)セクションにます型をしない场合は,方法(静态)セクションをます以下の表,メソッドそれぞれ与えるデータののです。

静的メソッド 目的 メソッドをしない场合値値 カスタムの戻り値
getDefaultValue クラスの既定の列挙型メンバーを指定します。 列挙型定義で指定された最初のメンバー クラスに列挙型メンバーの名前を含む文字ベクトル (列挙型のインスタンスの作成を参照)。
GetDescription 列挙型の记述指定します。 '' 型の説明を含む文字ベクトル。
Getheaderfile ヘッダーファイル名前をします。メソッドgetDataScopeは,の性を判断し。。 ''

列挙型するヘッダーの名前を文字。。。

既定では、生成された#包括命令は,<および>の代わりに、プリプロセッサの区切り記号であるを使用します。命令#include を生成するには、カスタムの戻り値を''として指定します。

getDataScope 生成コード型の型定义をまたはエクスポートかどうかをを指定ししメソッドメソッドメソッドGetheaderfileを使用,を定义ヘッダーが生成れているか含まれてているかかししし '汽车' '汽车'“出口”'Imported'のいずれか。
AddClassNametoenumnames 生成コード内でクラス名に接頭辞を付けるかどうかを指定します。 错误的 真的または错误的

説明の指定

列挙データの说明指定するに,メソッドを列挙型のクラスの方法(静态)セクションに含め。

函数retval = getDescription()%getDescription数据类型的可选描述。retval ='描述';结尾

MATLAB 文字ベクトルをdescriptionに置き換えます。列挙型を定義する生成コードには指定された説明が含まれます。

生成コードの型定义インポートインポート

生成コード列挙のデータ型を,外部ファイルで定义されるれるようにするするには,,以下以下以下の方法(静态)セクションに含め。

功能retval =Getheaderfile()% GETHEADERFILE Specifies the file that defines this type in generated code.%方法getDataScope确定指定文件的重要性。retval ='imported_enum_type.h';结尾功能retval =getDataScope()%getDataScope指定生成的代码导入还是导出此类型。% Return one of:%'auto':在Model_Types.h中定义类型,或导入如果指定标题文件% 'Exported': define type in a generated header file% 'Imported': import type definition from specified header file%如果您不定义此方法,DataScope默认情况下为“自动”。retval ='Imported';结尾

模型_types.hで型を定義する (既定の動作) のではなく、生成コードは次のように#包括ステートメントをてされたヘッダー定义をインポートし。。

#include“导入_enum_type.h”

コードのインポートれたファイル作成され。列挙型ののデータ型型を定义Getheaderfileによって指定た名をしてヘッダーをしなければなりませ。。

既存の C コード列挙型に対応する Simulink 列挙型を作成するには、関数金宝appsimulink.importexternalctypesを使用します。

生成コードの型定义エクスポートエクスポート

列挙型を定义するファイル别に生成には,,以下ののメソッドをを列挙の方法(静态)セクションに含め。

功能retval =getDataScope()%getDataScope指定生成的代码导入还是导出此类型。% Return one of:%'auto':在Model_Types.h中定义类型,或导入如果指定标题文件% 'Exported': define type in a generated header file% 'Imported': import type definition from specified header file%如果您不定义此方法,DataScope默认情况下为“自动”。retval =“出口”;结尾功能retval =Getheaderfile()% GETHEADERFILE Specifies the file that defines this type in generated code.%方法getDataScope确定指定文件的重要性。retval ='exported_enum_type.h';结尾

生成コード列挙定义をされたヘッダーファイルexported_enum_type.hにエクスポートし。

クラス名接头辞を追加

既定の設定では、生成コード内の列挙型の値は列挙型クラス定義内のものと同じ名前をもちます。その代わりに、コードがクラス名による接頭辞を列挙型クラス内のすべての列挙型の値に追加することもできます。この方法を使用して、識別子の競合を回避したり、コードの読みやすさを向上させることもできます。クラス名に追加する接頭辞を指定するには、このメソッドを列挙型クラスの方法(静态)セクションに含め。

功能retval =AddClassNametoenumnames()% ADDCLASSNAMETOENUMNAMES Specifies whether to add the class name% as a prefix to enumeration member names in generated code.% Return true or false.%如果您不定义此方法,则不会添加前缀。retval = true;结尾

戻り値を真的に指定して、クラス名の接頭辞追加を有効にするか、错误的に指定して接頭辞追加を抑制します。真的を指定する場合、クラス内の列挙型の各値は、EnumTypename_enumnameとして生成コード内で表示されます。列挙データ型の列挙型の例基础颜色についてはコードのデータ型は次ようなる场合ががます。

#ifndef _defined_typedef_for_basiccolors_ #define _defined_typedef_for_for_basiccolors_ typeDef enum {basiccolors_red = 0, / *默认值 * / basiccolors_yellow = 1,basiccolors_blue_blue_blue_blue = 2,basiccolors;#万一

列挙型の名基础颜色は列挙のそれぞれに接头辞表示されます。

重复する型メンバーの使用の制御

ヘッダーから型をインポートとき,コード生成中に列挙列挙型型メンバーメンバー名名名をを使用するかかをを制御制御できできますます。。重复重复するする列挙列挙列挙列挙型メンバーは,,,,[重复する型名]をしコード生成に异なる异なる型で重复列挙メンバー名名を许可许可许可许可するするか,エラーエラーまたはまたは警告警告警告メッセージメッセージを生成生成ししますStorageTypeを持ち次仕様持つ场合に使用できます。

  • DataScope'Imported'に设定さている

  • StorageType'int8''int16''int32''uint8',または'uint16'に设定さている

  • 价值は同じである

以下にを示します。

typedef int32_t enum {red = 0,Yellow = 1,blue = 2,} a;typedef int32_t enum {black = 0,yellow = 1,white = 2,} b;
列挙値一种およびbにおいて,にクラスの接头辞付けるなくなくなく黄色的列挙型メンバーを持つことができ、コードの可読性を向上できます。

生成さたにおける列挙の実装の制御

列挙型基础颜色を定义し。を使用て生成れたたコードで型定义を実装実装するするように指定指定

  • 枚举ブロック。ネイティブ型は列挙型基となる整数型。

  • typedefステートメントと一連の#定义マクロ。typedefステートメントは,int8などの特定の整数データ型の列挙型名を基にします。マクロにより、列挙型メンバーは基となる整数値に関連付けられます。

枚举ブロックを使用した列挙型の実装

枚举ブロックを使用して型定義を実装するには、次を行います。

  • Simulink で、スクリプト ファイル内でclassdefブロックをし列挙型定义します。型Simulink.IntEnumTypeから列挙を导出し。。

  • または,关数Simulink.defineIntEnumTypeを使用します。プロパティStorageTypeは指定ないでください。

コードをする场合は,枚举ブロックに型定義が表示されます。

#ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ #define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef enum { Red = 0, /* Default value */ Yellow, Blue, } BasicColors; #endif

特定の整数型を使用した列挙型の実装

typedefステートメントと#定义マクロをて定义を実装する,次を行い。。

  • Simulink で、スクリプト ファイル内でclassdefブロックを使用し、列挙型を定義します。int8などの特定の整数型から列挙型を導出します。

  • または,关数Simulink.defineIntEnumTypeを使用します。int8などのの型を使用しプロパティプロパティStorageTypeを指定し。

コードをすると,ががtypedefステートメントおよび一连の#定义マクロとしてされます。

#ifndef _DEFINED_TYPEDEF_FOR_BasicColors_ #define _DEFINED_TYPEDEF_FOR_BasicColors_ typedef int8_T BasicColors; #define Red ((BasicColors)0) /* Default value */ #define Yellow ((BasicColors)1) #define Blue ((BasicColors)2) #endif

既定では、生成されたファイル模型_types.hには列挙型の型定義が含まれます。

列挙値の型キャスト

安全なキャスト

金宝appsimulink数据类型转换ブロックは型信号を。は入力を列挙型の元となる値のいずれいずれかかににに

入力値が列挙型の値の元となる値と一致しない場合には、Simulink は安全なキャストを挿入して、入力値を列挙型の既定値に置き換えます。

安全なの有效化化化

Simulink Data Type Conversion ブロックまたは Stateflow ブロックのコード生成において行われる列挙型の安全なキャストを有効または無効にできます。

安全なキャストを制御するには、[整数オーバーで]ブロック パラメーターを有効または無効にします。パラメーターは以下のように動作します。

  • 有效:Simulink は、シミュレーション中に一致しない入力値を列挙値の既定値と置き換えます。安全なキャストの関数がコード生成中に生成されます。

  • 无效:一致しない入力値に対して、Simulink はシミュレーション中にエラーを生成します。安全なキャストの関数がコード生成中に省略されます。この場合、コードはより効率的になります。ただし、このコードは実行時エラーに対してはより脆弱になります。

生成コードの安全な关数关数

この例では、列挙値基础颜色に対する安全なの关数int32_T ET08_safe_cast_to_BasicColors32ビットビット生成される,コードでどのように使用されているいるかを示してて

static int32_T ET08_safe_cast_to_BasicColors(int32_T input) { int32_T output; /* Initialize output value to default value for BasicColors (Red) */ output = 0; if ((input >= 0) && (input <= 2)) { /* Set output value to input value if it is a member of BasicColors */ output = input; } return output; }
この关数,値が列挙型型のいずれの元元となるなる値値ととと一致一致なかっなかった场合场合にににははは,,列挙

ブロックの[整数オーバーで]パラメーターが场合に,この关数生成には使用されません。

列挙型の制限

  • 生成されたコードでは、ログ列挙型データはサポートされません。

参考

||

关连するトピック