カスタム データ型のファイル配置の制御
既定では、データ型オブジェクト (Simulink.AliasType や Simulink.Bus など) とカスタムの列挙型を使用して信号やブロック パラメーターのデータ型を指定すると、モデルから生成されたコードに型の定義 (たとえば typedef ステートメントなど) が含まれます。他の既存のコードとの生成コードの統合を簡単にしたり、生成コードをモジュール化したりするために、オブジェクトと列挙型のプロパティを調整して型定義のファイル配置を制御できます。
データ スコープとヘッダー ファイル
生成コードにおけるカスタム型定義のファイル配置を制御するには、データ型オブジェクトの DataScope プロパティと HeaderFile プロパティを次の表に従って設定します。MATLAB® ファイルで定義する列挙型についても同様に、getDataScope メソッドと getHeaderFile メソッドの戻り引数を同じように設定します。
はカスタム データ型の名前です。typenameはヘッダー ファイルの名前です。filenameはモデルの名前です。model
| 目的 | DataScope の指定内容 | HeaderFile の指定内容 |
|---|---|---|
に型定義をエクスポートする | Auto | 空 |
作成したヘッダー ファイル から型定義をインポートする | Auto または Imported | (必要な場合は拡張子 .h を含める) |
生成されたヘッダー ファイル に型定義をエクスポートする | Exported | または |
生成されたヘッダー ファイル に型定義をエクスポートする | Exported | 空 |
データ型定義をインポートすると (たとえば DataScope を Imported に設定)、生成されるモデル コードにおいて、型定義の代わりにヘッダー ファイルの #include 命令が作成されます。定義を含むヘッダー ファイルを提供します。リンカー エラーを回避するには、インポートしたヘッダー ファイルの先頭に #pragma once などのインクルード ガードを追加する必要があります。
メモ
HeaderFile プロパティを設定すると、次の文字はサポートされません。
*?
これらの文字は、先頭または末尾の区切り記号として使用される場合にのみサポートされます。
"— たとえば、"abc.h"はサポートされますが、ab"c.hはサポートされません。<および>— たとえば、<abc.h>はサポートされますが、a>bc.hはサポートされません。
データ型置換に関する考慮事項
[カスタム データ型名を指定] コンフィギュレーション パラメーターを使用して、生成コード内の Simulink® Coder™ の組み込みデータ型を独自のデータ型に置換した場合 (モデル コンフィギュレーション パラメーター: コード生成のデータ型置換を参照)、
typedefステートメントおよび#include命令はにではなくmodel_types.hrtwtypes.hに配置されます。Simulink.AliasTypeオブジェクトまたはSimulink.NumericTypeオブジェクトをデータ型置換で使用する場合、オブジェクトのDataScopeプロパティをExportedに設定できません。そのため、コード ジェネレーターで対応するtypedefステートメントを生成する場合は、ステートメントのファイル配置を制御できません。ただし、DataScopeをImportedに設定することで、外部コードで提供されるtypedefステートメントを再利用するようにコードを構成することは可能です。回避策として、データ型オブジェクトをデータ型置換として使用する代わりに、オブジェクトを使用してモデル内の個々のデータ項目のデータ型を設定します。多数のデータ項目の構成には、モデル データ エディターを使用してデータ型の伝播や継承を利用できます。詳細については、Specify Custom Names Using Data Replacement Type Paneを参照してください。
複素数データ型の定義のインポート
Simulink.AliasType オブジェクトでは複素数データ (i) を使用できます。この場合、型定義を外部コードからインポートするように生成コードを構成するには (たとえば DataScope プロパティを Imported に設定)、コードに 2 つの補完的な typedef ステートメントが必要になります。
外部ヘッダー ファイル myAliasTypes.h で、データ型 IAT_int32 を 32 ビット整数のエイリアスとして定義するとします。IAT_int32 と cIAT_int32 の 2 つの型をファイルで定義しなければなりません。
#ifndef myAliasTypes_H_ #define myAliasTypes_H_ #include "rtwtypes.h" typedef int32_T IAT_int32; typedef cint32_T cIAT_int32; #endif
Simulink.AliasType オブジェクトは 2 つ作成する必要はありません。この例では、オブジェクト IAT_int32 を 1 つだけ作成します。これにより、生成コードで IAT_int32 と cIAT_int32 の両方を使用して複素数データ (変数) が生成されます。
マクロ ガード
生成されたヘッダー ファイルに 1 つ以上のデータ型定義をエクスポートすると、ファイルには RTW_HEADER_ の形式のファイルレベルのマクロ ガードが含まれます。 filename_h
次のプロパティをもつ複数の Simulink.AliasType オブジェクト mySingleAlias、myDoubleAlias、および myIntAlias を使用するとします。
DataScopeをExportedに設定HeaderFileをmyTypes.hに設定
コードを生成すると、ガードされたファイル myTypes.h に typedef ステートメントが含まれます。
#ifndef RTW_HEADER_myTypes_h_ #define RTW_HEADER_myTypes_h_ #include "rtwtypes.h" typedef real_T myDoubleAlias; typedef real32_T mySingleAlias; typedef int16_T myIntAlias; #endif
にデータ型定義をエクスポートすると、ファイルにはそれぞれの model_types.htypedef ステートメントに対する _DEFINED_TYPEDEF_FOR_ の形式のマクロ ガードが含まれます。次のプロパティをもつ typename_Simulink.AliasType オブジェクト mySingleAlias を使用するとします。
DataScopeをAutoに設定HeaderFileの指定なし
コードを生成すると、ファイル にガードされた model_types.htypedef ステートメントが含まれます。
#ifndef _DEFINED_TYPEDEF_FOR_mySingleAlias_ #define _DEFINED_TYPEDEF_FOR_mySingleAlias_ typedef real32_T mySingleAlias; #endif
参考
Simulink.AliasType | Simulink.NumericType | Simulink.Bus