Main Content

カスタム データ型のファイル配置の制御

既定では、データ型オブジェクト (Simulink.AliasTypeSimulink.Bus など) とカスタムの列挙型を使用して信号やブロック パラメーターのデータ型を指定すると、モデルから生成されたコードに型の定義 (たとえば typedef ステートメントなど) が含まれます。他の既存のコードとの生成コードの統合を簡単にしたり、生成コードをモジュール化したりするために、オブジェクトと列挙型のプロパティを調整して型定義のファイル配置を制御できます。

データ スコープとヘッダー ファイル

生成コードにおけるカスタム型定義のファイル配置を制御するには、データ型オブジェクトの DataScope プロパティと HeaderFile プロパティを次の表に従って設定します。MATLAB® ファイルで定義する列挙型についても同様に、getDataScope メソッドと getHeaderFile メソッドの戻り引数を同じように設定します。

  • typename はカスタム データ型の名前です。

  • filename はヘッダー ファイルの名前です。

  • model はモデルの名前です。

目的DataScope の指定内容HeaderFile の指定内容
model_types.h に型定義をエクスポートするAuto
作成したヘッダー ファイル filename から型定義をインポートするAuto または Importedfilename (必要な場合は拡張子 .h を含める)
生成されたヘッダー ファイル filename.h に型定義をエクスポートするExportedfilename または filename.h
生成されたヘッダー ファイル typename.h に型定義をエクスポートするExported

データ型定義をインポートすると (たとえば DataScopeImported に設定)、生成されるモデル コードにおいて、型定義の代わりにヘッダー ファイルの #include 命令が作成されます。定義を含むヘッダー ファイルを提供します。リンカー エラーを回避するには、インポートしたヘッダー ファイルの先頭に #pragma once などのインクルード ガードを追加する必要があります。

データ型置換に関する考慮事項

  • [カスタム データ型名を指定] コンフィギュレーション パラメーターを使用して、生成コード内の Simulink® Coder™ の組み込みデータ型を独自のデータ型に置換した場合 (モデル コンフィギュレーション パラメーター: コード生成のデータ型置換を参照)、typedef ステートメントおよび #include 命令は model_types.h にではなく rtwtypes.h に配置されます。

  • Simulink.AliasType オブジェクトまたは Simulink.NumericType オブジェクトをデータ型置換で使用する場合、オブジェクトの DataScope プロパティを Exported に設定できません。そのため、コード ジェネレーターで対応する typedef ステートメントを生成する場合は、ステートメントのファイル配置を制御できません。ただし、DataScopeImported に設定することで、外部コードで提供される typedef ステートメントを再利用するようにコードを構成することは可能です。

    回避策として、データ型オブジェクトをデータ型置換として使用する代わりに、オブジェクトを使用してモデル内の個々のデータ項目のデータ型を設定します。多数のデータ項目の構成には、モデル データ エディターを使用してデータ型の伝播や継承を利用できます。詳細については、Specify Custom Names Using Data Replacement Type Paneを参照してください。

複素数データ型の定義のインポート

Simulink.AliasType オブジェクトでは複素数データ (i) を使用できます。この場合、型定義を外部コードからインポートするように生成コードを構成するには (たとえば DataScope プロパティを Imported に設定)、コードに 2 つの補完的な typedef ステートメントが必要になります。

外部ヘッダー ファイル myAliasTypes.h で、データ型 IAT_int32 を 32 ビット整数のエイリアスとして定義するとします。IAT_int32cIAT_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_int32cIAT_int32 の両方を使用して複素数データ (変数) が生成されます。

マクロ ガード

生成されたヘッダー ファイルに 1 つ以上のデータ型定義をエクスポートすると、ファイルには RTW_HEADER_filename_h の形式のファイルレベルのマクロ ガードが含まれます。

次のプロパティをもつ複数の Simulink.AliasType オブジェクト mySingleAliasmyDoubleAlias、および myIntAlias を使用するとします。

  • DataScopeExported に設定

  • HeaderFilemyTypes.h に設定

コードを生成すると、ガードされたファイル myTypes.htypedef ステートメントが含まれます。

#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.h にデータ型定義をエクスポートすると、ファイルにはそれぞれの typedef ステートメントに対する _DEFINED_TYPEDEF_FOR_typename_ の形式のマクロ ガードが含まれます。次のプロパティをもつ Simulink.AliasType オブジェクト mySingleAlias を使用するとします。

  • DataScopeAuto に設定

  • HeaderFile の指定なし

コードを生成すると、ファイル model_types.h にガードされた typedef ステートメントが含まれます。

#ifndef _DEFINED_TYPEDEF_FOR_mySingleAlias_
#define _DEFINED_TYPEDEF_FOR_mySingleAlias_

typedef real32_T mySingleAlias;

#endif

参考

| |

関連するトピック