コード マッピング エディター – C
モデル要素とコード インターフェイス定義の関連付け
説明
コード マッピング エディターは、モデル要素をコード インターフェイス定義に関連付けるグラフィカル インターフェイスです。モデルからコードを生成すると、コード ジェネレーターは、指定された定義を、関連付けられたモデル要素から生成するコードに適用します。モデル参照階層内の各モデルに独自のコード マッピングがあります。
定義には以下を含めることができます。
ストレージ クラス - ストレージ クラスはモデル データ要素からコードを生成するための一連の仕様です。外観やデータ型などのプロパティを定義します。
関数カスタマイズ テンプレート - 関数カスタマイズ テンプレートはエントリポイント関数を生成するための一連の仕様です。関数名と引数関連の識別子の命名規則などのプロパティを定義します。
メモリ セクション - メモリ セクションは、特定のコード要素を格納するように指定された、コンピューター メモリ内の場所のことです。
サービス インターフェイス - サービス インターフェイスは、関数プロトタイプと通信方法を定義する一連の仕様です。定義されたそれぞれのインターフェイスは、生成されたモデル コードによってターゲット プラットフォームで呼び出すことができる関数に対応します。生成されたモデル コードによって調整サービスおよび測定サービスが使用され、それぞれモデル要素を調整および測定します。モデル要素の通信のために、送信側、受信側、データ転送の各サービスが使用されます。ターゲット プラットフォームのクロックに関するリアルタイム情報を取得するためにタイマー サービスが使用されます。サービス インターフェイスの詳細については、Service Interfacesを参照してください。
モデルに対して指定するシステム ターゲット ファイルおよびその他の設定により、構成で使用可能なコード インターフェイス定義のタイプが決まります。残りはコード ジェネレーターによって自動的に決定されます。
GRT システム ターゲット ファイルを使用するように構成されたモデルでは、ストレージ クラスの定義のみを構成できます。各データ要素カテゴリについて、モデル全体を通じて使用する既定のストレージ クラスを関連付けます。次に、必要に応じて、個別のデータ要素についてストレージ クラスを指定することで既定値をオーバーライドします。
ERT システム ターゲット ファイルを使用するように構成されたモデルは、データ インターフェイス構成またはサービス インターフェイス構成のいずれかを使用して構成することができます。
データ インターフェイス構成を使用して構成された ERT モデルでは、データ要素の各カテゴリをモデル全体で使用する既定のストレージ クラスに関連付け、エントリポイント関数の各カテゴリをモデル全体で使用する既定の関数カスタマイズ テンプレートに関連付けます。次に、必要に応じて、個別のデータ要素についてストレージ クラスを指定し、個別のエントリポイント関数について関数カスタマイズ テンプレートを指定することで既定の定義をオーバーライドします。構成によっては、指定されたストレージ クラスまたは関数カスタマイズ テンプレートに加えてメモリ セクションを明示的に指定することができます。これが可能なのは、指定されたストレージ クラスまたは関数カスタマイズ テンプレートの定義にメモリ セクションが含まれていない場合です。たとえば、次のスクリーンショットに示すように、モデルの [Inports] カテゴリの既定ストレージ クラスとして [Default] を指定するときです。

サービス インターフェイス ディクショナリは、タイプでソートされたサービス インターフェイス定義を含む Embedded Coder® ディクショナリです。サービス タイプごとに、ディクショナリ内の定義の 1 つがそのタイプの既定サービスとして選択されています。さらに、ディクショナリにはストレージ クラス、メモリ セクション、関数カスタマイズ テンプレートの定義が含まれています。ディクショナリは、エントリポイント関数の各カテゴリの既定の関数カスタマイズ テンプレートを指定します。
ERT モデルがサービス コード インターフェイスを定義する共有 Embedded Coder ディクショナリにリンクされている場合、これはそのモデルがサービス インターフェイス構成を使用して構成されていることを意味します。既定では、このようなモデルから生成されるコードは、ディクショナリに指定された既定の定義に従っています。ただし、コード マッピング エディターを使用して既定のコード インターフェイス定義をオーバーライドできます。そのためには、個別のエントリポイント関数をディクショナリの関数カスタマイズ テンプレートに関連付け、個別のモデル要素をディクショナリのサービスに関連付けます。
コード生成用にデータ要素を構成するには、以下のコード マッピング エディターのタブを使用します。
データの既定の設定 (データ インターフェイス構成を使用する GRT モデルおよび ERT モデルのみに適用可能)
関数の既定の設定 (データ インターフェイス構成を使用する ERT モデルのみに適用可能)
関数 (ERT モデルのみに適用可能)
入力端子
出力端子
データ転送 (サービス インターフェイス構成を使用する ERT モデルのみに適用可能)
パラメーター
データ ストア
信号/状態
要素の型と指定した値によっては、設定できる追加の構成可能コード マッピング プロパティがある場合があります。追加プロパティを構成するには、行の末尾にある鉛筆アイコン
を選択して、ダイアログ ボックスを開きます。たとえば、このスクリーンショットは、[Auto] ストレージ クラスが設定されたルートレベルの入力端子の鉛筆アイコンをクリックしたときに開くダイアログ ボックスを示しています。

既定では、信号はモデルのコード マッピングには追加されません。コード生成用に信号を構成するには、信号をモデル コード マッピングに追加します。信号追加の詳細については、信号をモデル コード マッピングに追加を参照してください。信号削除の詳細については、信号をモデル コード マッピングから削除を参照してください。
コード マッピング エディター – C を開く
エディターを開くには、次のいずれかを行います。
Simulink® エディターのモデル キャンバスで、右下隅にあるパースペクティブ コントロールをクリックし、[コード] を選択します。次に、[コード マッピング] タブをクリックします。
Simulink Coder™ アプリまたは Embedded Coder アプリを開きます。次に、Simulink エディター ウィンドウの左下隅にある [コード マッピング] タブをクリックします。
Simulink Coder アプリまたは Embedded Coder アプリを開きます。次に、Simulink ツールストリップの [C コード] タブにある [準備] セクションで、[コード インターフェイス] 、 [個々の要素コードのマッピング] を選択します。
例
Simulink Coder を使用してルートレベルの Inport と Outport のコード生成を構成する
ルートレベルの Inport ブロックと Outport ブロックについてのモデル全体のコード生成を構成します。大量のデータを使用する大規模なモデルの場合は特に、既定の構成を適用すると時間を節約できます。既定のマッピングを適用した後、個々のデータ要素のマッピングを調整できます。ルートレベルの In Bus Element ブロックと Out Bus Element ブロックについてコード生成を構成するには、例と同じワークフローを使用します。
MATLAB® コマンド ウィンドウで次のコマンドを入力して、モデル
ConfigurationRapidPrototypingInterfaceを開きます。openExample("ConfigurationRapidPrototypingInterface")Simulink Coder アプリを開きます。[C コード] タブにコード マッピング エディターも表示されます。
生成ファイル ConfigurationRapidPrototypingInterface.h および ConfigurationRapidPrototypingInterface.c で入力端子と出力端子のグローバル変数を宣言および定義するようにコード ジェネレーターを構成します。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
[データの既定の設定] タブで、[Inports and Outports] の下にある [入力端子] の行を選択します。次に、ストレージ クラスを
[ImportedExternPointer]に設定します。[出力端子] のストレージ クラスを[ExportedGlobal]に設定します。選択した 2 つのデータ要素のカテゴリについて、エディターで既定のストレージ クラス設定が更新されます。
コード マッピング エディターで、[入力端子] タブをクリックします。ストレージ クラスが
Autoに設定されている場合、コード ジェネレーターは最適化を目的として関連するコードの表現を削除または変更する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。入力端子に対して既定の構成であるストレージ クラス
ImportedExternPointerを強制的に使用するようにコード ジェネレーターを構成します。Ctrl キーを押しながら入力端子を選択します。選択したいずれかの入力端子に対して、ストレージ クラスを[Model default: ImportedExternPointer]に設定します。選択した入力端子について、エディターでストレージ クラス設定が更新されます。モデルのルートレベルの出力端子に対してストレージ クラス
ExportedGlobalを強制的に使用するようにコード ジェネレーターを構成します。[出力端子] タブをクリックします。Out2の行を選択します。次に、ストレージ クラスを[Model default: ExportedGlobal]に設定します。
既定の構成の設定をオーバーライドする必要がある場合など、個々のデータ要素のプロパティを構成するには、それぞれのデータ要素のタイプに対応するタブを使用します。この例では、Inport ブロック In1 の既定のストレージ クラス設定をオーバーライドします。
既定では、入力端子と出力端子の変数に対して、コード ジェネレーターはモデルの Inport ブロックまたは Outport ブロックの名前に基づいて名前を付けます。ストレージ クラス設定が Auto 以外のデータ要素を構成する場合、ストレージ クラス プロパティ [識別子] を設定することで、個々の要素に対するその既定の設定をオーバーライドできます。このプロパティを使用すると、モデルの設計を変更することなくコードの識別子を指定できます。
この例では、Inport ブロックと Outport ブロックの [識別子] を設定します。
コード マッピング エディターで、[入力端子] タブをクリックします。
In1について、ストレージ クラスを[ImportedExtern]に設定します。各入力端子の行を選択します。次に、鉛筆アイコン
をクリックして、[識別子] プロパティを以下のように設定します。In1をinput1に設定します。In2をinput2に設定します。In3をinput3に設定します。In4をinput4に設定します。
[出力端子] をクリックします。
出力端子
Out1を選択します。鉛筆アイコン
をクリックして、[識別子] プロパティを outputに設定します。
コードを生成し、Inport ブロックと Outport ブロックについての生成されたコードが想定どおりであることを確認します。以下に例を示します。
ConfigurationRapidPrototypingInterface_private.hに次の宣言が含まれます。/* Imported (extern) block signals */ extern real_T input1; /* '<Root>/In1' */ /* Exported data declaration */ /* Data with Imported storage (pointer) */ extern real_T *input2; /* '<Root>/In2' */ extern real_T *input3; /* '<Root>/In3' */ extern real_T *input4; /* '<Root>/In4' */
ConfigurationRapidPrototypingInterface.hに次の宣言が含まれます。/* Data with Exported storage */ extern real_T output; /* '<Root>/Out1' */
次のコード フラグメントは、生成されたエントリポイント ステップ関数で
In1を表す変数input1が使用されていることを示しています。/* Model step function */ void ConfigurationRapidPrototypingInterface_step(void) { /* DataStoreWrite: '<Root>/Data Store Write' incorporates: * Constant: '<Root>/Constant1' * Constant: '<Root>/Constant2' * Inport: '<Root>/In1' * Logic: '<Root>/LogOp' * RelationalOperator: '<Root>/RelOp1' * RelationalOperator: '<Root>/RelOp2' */ mode = ((input1 > 10.0) || (input1 < -10.0)); . . .
データ コード インターフェイスを使用して Embedded Coder によりルートレベルの Inport と Outport のコード生成を構成する
ルートレベルの Inport ブロックと Outport ブロックについてのモデル全体のコード生成を構成します。大量のデータを使用する大規模なモデルの場合は特に、既定の構成を適用すると時間を節約できます。既定のマッピングを適用した後、個々のデータ要素のマッピングを調整できます。ルートレベルの In Bus Element ブロックと Out Bus Element ブロックについてコード生成を構成するには、例と同じワークフローを使用します。
MATLAB コマンド ウィンドウで次のコマンドを入力して、モデル
RollAxisAutopilotを開きます。現在の作業ディレクトリに含まれる外部コード ファイルは次のとおりです。openExample("RollAxisAutopilot")roll_input_data.croll_input_data.hroll_heading_mode.croll_heading_mode.h
Embedded Coder アプリを開きます。
コード ジェネレーターの処理を次のように構成します。
ヘッダー ファイル
roll_input_data.hを使用して、モデルの Inport ブロックを表す変数を宣言する。モデルの Outport ブロックの変数を別個のグローバル変数として表す。
出力変数を
roll_output_data.cで定義し、それらをroll_output_data.hで宣言する。Inport ブロックのコードでコード ジェネレーターが生成する変数に使用する名前を構成する。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
[データの既定の設定] タブで、[Inports and Outports] の下にある [入力端子] の行を選択します。次に、ストレージ クラスを
[ImportFromFile]に設定します。鉛筆アイコン
をクリックし、[ヘッダー ファイル] を roll_input_data.hに設定します。モデル要素カテゴリ [出力端子] のストレージ クラスを
[ExportToFile]に設定します。[ヘッダー ファイル] を
roll_output_data.h、[定義ファイル] をroll_output_data.cに設定します。
コード マッピング エディターで、[入力端子] タブをクリックします。各 Inport のストレージ クラスは
Autoに設定されています。これは、コード ジェネレーターが最適化を目的として関連するコードの表現を削除または変更する可能性があることを意味しています。最適化が不可能な場合、コード ジェネレーターは入力端子に対して既定の構成を適用します。入力端子に対して既定の構成であるストレージ クラス
ImportFromFileを強制的に適用して、外部ヘッダー ファイルroll_input_data.hを使用するようにコード ジェネレーターを構成します。Ctrl キーを押しながら入力端子を選択します。選択したいずれかの入力端子に対して、ストレージ クラスを[Model default: ImportFromFile]に設定します。選択した入力端子について、エディターでストレージ クラス設定が更新されます。
入力端子の変数 HDG_Mode について、既定のソースの場所をオーバーライドします。その変数は外部ファイル roll_heading_mode.h で宣言されています。
コード マッピング エディターで、[入力端子] タブをクリックします。
HDG_Modeの行を選択します。[ストレージ クラス] を
ImportFromFileに設定します。鉛筆アイコン
をクリックし、[ヘッダー ファイル] を roll_heading_mode.hに設定します。Inport ブロックのコードで外部ファイル
roll_input_data.hおよびroll_heading_mode.hの変数名と一致する変数名を生成するようにコード ジェネレーターを構成します。[入力端子] タブで、各 Inport ブロックを選択し、鉛筆アイコン
をクリックして [識別子] をブロック名に設定します。ストレージ クラスが [自動]以外の値に設定されている場合、[識別子] ストレージ クラス プロパティの値を指定できます。[識別子] プロパティを空のままにすると、コード ジェネレーターはモデリング要素に関連付けられているブロックまたは信号の名前を使用します。
コード生成およびビルド プロセスに外部ソース ファイルの roll_input_data.c と roll_heading_mode.c を含めます。モデル コンフィギュレーション パラメーター [ソース ファイル] を roll_input_data.c roll_heading_mode.c に設定します。
モデルを保存します。
コードを生成し、Inport ブロックと Outport ブロックについての生成されたコードが想定どおりであることを確認します。
ストレージ クラスに関連付けられた次のヘッダー ファイルが
RollAxisAutopilot.hに含まれている。#include "roll_output_data.h" #include "roll_input_data.h" #include "roll_heading_mode.h"
roll_heading_mode.cにroll_heading_mode.hが含まれ、変数HDG_Modeが定義されている。#include "roll_heading_mode.h" boolean_T HDG_Mode;
roll_input_data.hで宣言された変数がroll_input_data.cで定義されている。#include "roll_input_data.h" boolean_T AP_Eng; real32_T HDG_Ref; real32_T Rate_FB; real32_T Phi; real32_T Psi; real32_T TAS; real32_T Turn_Knob;
次のエクスポートされたデータの定義が
roll_output_data.cに含まれている。real32_T Ail_Cmd;
次のエクスポートされたデータの宣言が
roll_output_data.hに含まれている。extern real32_T Ail_Cmd;
データ コード インターフェイスを使用して Embedded Coder によりエントリポイント関数に対する既定の関数名を構成する
既定では、コード ジェネレーターは識別子の命名規則 $R$N を使用してエントリポイント関数に名前を付けます。$R は最上位モデルの名前です。$N は関数の名前 (initialize、step、terminate など) です。生成されたコードを既存の外部コードと統合するか、命名規約またはガイドラインに準拠するには、既定の命名規則を調整できます。この例では、$R$ にテキスト文字列 myproj_ を接頭辞として追加する方法を示します。既定の命名規則を調整すると、特にコード ジェネレーターによって各レートに固有の関数 step が生成されるマルチレート モデルの場合は時間を節約できます。
MATLAB コマンド ウィンドウで次のコマンドを入力して、モデル
MultirateMultitaskingを開きます。openExample("MultirateMultitasking")Embedded Coder アプリを開きます。Simulink ツールストリップで [C コード] タブが開きます。ステータス バーの近くにある [コード マッピング - コンポーネント インターフェイス] を選択して、[コード マッピング エディター] ペインを開くことができます。
命名規則 myproj_$R$N を定義する関数カスタマイズ テンプレートを作成します。
Embedded Coder ディクショナリを開きます。[C コード] タブで、[コード インターフェイス] 、 [Embedded Coder ディクショナリ (モデル)] を選択します。
[データ インターフェイス] ペインで [関数カスタマイズ テンプレート] を選択します。
中央のペインで [作成] をクリックします。
右側のペインで [名前] に
myproj_FunctionTemplateを指定します。[関数の命名規則] を
myproj_$R$Nとして指定します。Embedded Coder ディクショナリを閉じます。
[C コード] タブで、[コード インターフェイス] 、 [既定のコード マッピング] を選択します。
[関数の既定の設定] タブをクリックします。
[初期化/終了] と [実行] の関数カテゴリについて、既定の関数カスタマイズ テンプレートを
Defaultからmyproj_FunctionTemplateに変更します。
モデルを保存します。
コードを生成し、エントリポイント関数の名前を確認します。
void myproj_MultirateMultitasking_step0(void) /* Sample time: [1.0s, 0.0s] */
{
(rtM->Timing.RateInteraction.TID0_1)++;
if ((rtM->Timing.RateInteraction.TID0_1) > 1) {
rtM->Timing.RateInteraction.TID0_1 = 0;
}
if (rtM->Timing.RateInteraction.TID0_1 == 1) {
rtDW.RateTransition = rtDW.RateTransition_Buffer0;
}
rtY.Out2 = 2.0 * rtDW.RateTransition + rtU.In1_1s;
rtY.Out1 = (3.0 * rtDW.RateTransition + rtU.In1_1s) * 5.0 + rtY.Out2;
}
/* Model step function for TID1 */
void myproj_MultirateMultitasking_step1(void) /* Sample time: [2.0s, 0.0s] */
{
rtDW.RateTransition_Buffer0 = rtDW.Integrator_DSTATE;
rtDW.Integrator_DSTATE += 2.0 * rtU.In2_2s;
}
void myproj_MultirateMultitasking_initialize(void)
{
/* (no initialization code required) */
}
void myproj_MultirateMultitasking_terminate(void)
{
/* (no terminate code required) */
}データ コード インターフェイスを使用して Embedded Coder により個別のエントリポイント関数をカスタマイズする
モデルについて、ステップ関数や Simulink 関数など、ほとんどのエントリポイント関数の名前と実行関数の引数をカスタマイズできます。この例では、モデル RollAxisAutopilot のエントリポイント関数をカスタマイズする方法を示します。
MATLAB コマンド ウィンドウで次のコマンドを入力して、モデル
RollAxisAutopilotを開きます。現在の作業ディレクトリに含まれる外部コード ファイルは次のとおりです。openExample("RollAxisAutopilot")roll_input_data.croll_input_data.hroll_heading_mode.croll_heading_mode.h
Embedded Coder アプリを開きます。Simulink ツールストリップで [C コード] タブが開きます。ステータス バーの近くにある [コード マッピング - コンポーネント インターフェイス] を選択して、[コード マッピング エディター] ペインを開くことができます。
[C コード] タブで、[コード インターフェイス] 、 [個々の要素コードのマッピング] を選択します。[Functions] タブが選択された状態のコード マッピング エディターが開きます。
[ソース]
Periodic:D1で、ステップ (実行) 関数の名前をカスタマイズします。[関数名] 列で、名前roll_runを入力します。step関数の引数をカスタマイズします。[関数プレビュー] 列でプロトタイプのハイパーリンクをクリックして、step関数の構成ダイアログ ボックスを開きます。[ステップ関数プロトタイプの引数を設定] を選択します。
引数の既定の構成を表示するテーブルを開くには、[既定値を取得] をクリックします。
引数をカスタマイズします。
[C 戻り引数] ドロップダウン リストから
[Ail_Cmd]を選択します。それぞれの端子の [C 識別子名] フィールドで、それらの既定の名前から接頭辞
arg_を削除します。HDG_Mode入力端子の [C 型修飾子] ドロップダウン リストから[ポインター]を選択します。[C 識別子名] フィールドで、名前をHDG_Mode_Ptrに変更します。
[適用] をクリックし、関数のプロトタイプに変更が反映されることを確認します。

[検証] をクリックして変更を検証します。
[OK] をクリックします。
コードを生成します。
生成された C ファイル
RollAxisAutopilot.cで更新内容を確認します。更新されたstep関数 (roll_run) を探すには、[検索] フィールドを使用します。step関数を選択して、そのプロトタイプを確認します。real32_T roll_run(real32_T Phi, real32_T Psi, real32_T Rate_FB, real32_T TAS, boolean_T AP_Eng, boolean_T *HDG_Mode_Ptr, real32_T HDG_Ref, real32_T Turn_Knob)
関連する例
- C Data Code Interface Configuration for Model Interface Elements
- データ構成アプローチの選択
- 生成されたコードでのデータ表示を制御するストレージ クラスの選択
- Configure Default C Code Generation for Categories of Data Elements and Functions
- 生成された C 関数インターフェイスをモデルのエントリポイント関数用に構成
- Customize Generated Entry Point C Functions
- C コード生成のための信号データの構成
パラメーター
バージョン履歴
R2018a で導入