Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

C コード生成用のモデル データ インターフェイスの構成

生成されたコードを外部コードと統合するため、またはコーディング標準およびガイドラインに準拠するコードを生成するために、生成されたコードにブロック パラメーターや信号線などのモデル内のデータ要素が表示される方法を構成できます。データ要素のカテゴリに対する既定のコード生成設定を構成し、コード マッピング エディターまたはコード マッピング API を使用して個別の要素を構成できます。たとえば、次のような設定を構成できます。

  • 生成ファイルおよび外部ファイル (エクスポート ファイルおよびインポート ファイル) 内での宣言と定義の配置の制御。

  • 複数のデータ項目の構造体へのパッケージング。

  • ストレージ型修飾子 const および volatile の適用。

この例では、モデル例 rtwdemo_configinterface のコード生成についてデータ要素を構成する方法を示します。

モデル例の確認

モデル例 rtwdemo_configinterface. を開きます。

model = 'rtwdemo_configinterface';
open_system(model)

この例は、次のモデル データ要素をコード生成用に構成する方法を示します。

  • Inport ブロック In1In2In3 および In4

  • Outport ブロック Out1

  • モデル パラメーター引数 LOWER および UPPER

  • モデル パラメーター K1Table1、および Table2

  • ローカル データストア mode

  • Lookup Table ブロック Table1 および Table2 をソースとする信号線

  • 状態 X (遅延)

Inport ブロックの既定の設定の構成

  1. Embedded Coder アプリを開きます。

  2. [C コード] タブで、[コード インターフェイス][既定のコード マッピング] を選択します。

  3. コード マッピング エディターの [Inports and Outports] でカテゴリ [Inports] を選択します。既定のストレージ クラスを ImportFromFile に設定します。

  4. プロパティ インスペクターで、[Header File]exInDataLut.h に設定します。

Outport ブロックの既定の設定を構成する

  1. [Data Defaults] タブの [Inports and Outports] で、カテゴリ [Outports] を選択します。既定のストレージ クラスを ExportToFile に設定します。

  2. プロパティ インスペクターで、[Header File]exOutSys.h に、[Definition File]exOutSys.c に設定します。

パラメーターの既定の設定の構成

  1. [Data Defaults] タブの [Parameters] で、カテゴリ [Model parameter arguments] を選択します。ストレージ クラスを Default に設定したままにします。この設定で、コード ジェネレーターは引数インスタンスごとに個別のメモリ領域を割り当てます。

  2. カテゴリ [Model parameters] を選択します。リンク テキスト 'Auto' will be inlined は、コード ジェネレーターが既定の設定でモデル パラメーターをインライン化するように構成されていることを示します。この例の場合、モデル パラメーターが調整可能になるように構成します。'Auto' will be inlined をクリックします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスが開きます。

  3. モデル コンフィギュレーション パラメーター [既定のパラメーター動作]Tunable に設定します。変更を保存し、ダイアログ ボックスを閉じます。コード マッピング エディターで、リンク テキストが 'Auto' will be tunable に変更されます。

  4. コード マッピング エディターで、[Model parameters] カテゴリが選択された状態で、ストレージ クラスを ConstVolatile に設定します。

信号、状態、およびデータストアの既定の設定の構成

  1. [Data Defaults] タブの [Signals] で、カテゴリ [Signals,states, and internal data] を選択します。既定のストレージ クラスを FileScope に設定します。

  2. 共有ローカル データストアの既定のコード マッピングを構成します。カテゴリ [Shared local data stores] を選択します。ストレージ クラスを Volatile に設定します。

  3. モデルを保存します。

個々の Inport ブロックに対するコード生成設定を構成する

  1. コード マッピング エディターで、[入力端子] タブをクリックします。エディターには、モデル内にあるルートレベルの Inport ブロックと In Bus Element ブロックの名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。各 Inport のストレージ クラスは Auto に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラス ImportedFromFile を指定します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを Model default に設定します。既定のコンフィギュレーションをオーバーライドするには、その Inport のコード生成に関する要件を満たすストレージ クラスを指定します。

  2. コード ジェネレーターを構成し、既定のストレージ クラスが Inport In2In3、および In4 に設定されるように適用します。これら 3 つの Inport の行を選択します。次に、選択したいずれかの Inport に対して、ストレージ クラスを Model default: ImportFromFile に設定します。選択した 3 つの Inport のストレージ クラスは Model default: ImportFromFile に変更されます。

  3. Inport In1 については、既定のストレージ クラス設定をオーバーライドします。ストレージ クラスを ImportFromFile に設定します。プロパティ インスペクターで、[Header File]exInDataMem.h に設定します。

  4. 生成されたコード内の変数が外部ヘッダーおよび定義ファイル内のインターフェイス名と一致するように、Inport のコード識別子を構成します。コード マッピング エディターで、各 Inport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを input1input2input3input4 の値に設定します。

個々の Outport ブロックに対するコード生成設定を構成する

  1. コード マッピング エディターで、[出力端子] タブをクリックします。エディターには、モデル内にあるルートレベルの Outport ブロックと Out Bus Element ブロックの名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。モデル例の Outport のストレージ クラスは Auto に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。

  2. 最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを Model default: ExportToFile に設定します。選択した Outport のストレージ クラスは Model default: ExportToFile に変更されます。

  3. 生成されたコード内の変数が外部コードで使われるインターフェイス名と一致するように、Outport のコード識別子を構成します。コード マッピング エディターで、Outport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを output に設定します。

個別のパラメーターに対するコード生成設定の構成

  1. コード マッピング エディターで、[パラメーター] タブをクリックします。[Model Parameter Arguments] を展開します。既定の設定では、各モデル パラメーター引数のストレージ クラスは Auto に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例では、ストレージ クラスを Auto に設定したままにします。

  2. [Model parameters] を展開します。既定の設定では、各モデル パラメーターのストレージ クラスは Auto に設定されます。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定 ConstVolatile を使用しようとしています。

  3. コード マッピング エディターの [Model parameters] で、パラメーター K1Table1Table2 を選択します。ストレージ クラスを Model default: ConstVolatile に設定します。

  4. 要件で指定されるように、モデル パラメーターのコード識別子を接頭辞 mp_ を含む名前で構成します。コード マッピング エディターで、モデル パラメーター K1 を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier]mp_K1 に設定します。パラメーター Table1 および Table2 について、[Identifier]mp_Table1 および mp_Table2 に設定します。

個別のデータストアに対するコード生成設定の構成

  1. コード マッピング エディターで [データ ストア] タブをクリックします。[Local Data Stores] を展開します。データストア モードのストレージ クラスは [Auto] に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定 Volatile を使用しようとしています。

  2. コード マッピング エディターで、ローカル データストア mode を選択します。ストレージ クラスを Model default: Volatile に設定します。

  3. データストアのコード識別子を接頭辞 ds_ を含む名前で構成します。コード マッピング エディターで、共有ローカル データストア mode を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier]ds_mode に設定します。

個別の状態に対するコード生成設定の構成

  1. コード マッピング エディターで、[信号/状態] タブをクリックします。[States] を展開します。状態のストレージ クラスは Auto に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定 FileScope を使用しようとしています。

  2. コード マッピング エディターで、状態 X を選択します。ストレージ クラスを Model default: FileScope に設定します。

  3. 要件で指定されるように、状態のコード識別子を接頭辞 dstate_ を含む名前で構成します。コード マッピング エディターで、状態 X を選択します。プロパティ インスペクターで、[コード] ノードを展開します。次に、ストレージ クラス プロパティ [Identifier]dstate_X に設定します。

個別の信号に対するコード生成設定の構成

モデルのコード マッピングに構成する信号を追加します。この例の場合、モデル コード マッピングに 2 つの Lookup Table ブロックに対する出力信号を追加します。次に、以下の信号を設定します。

  1. コード マッピング エディターで、[信号/状態] タブをクリックします。リストされた信号はありません。

  2. コード マッピングに信号を追加します。Lookup Table ブロック Table1 および Table2 の出力信号の場合、モデル内で信号を選択し、信号線の上または下に表示される省略記号で一時停止し、操作バーを開いて、[信号の追加] ボタンをクリックします。コード マッピング エディターで、[信号] ノードが展開され、追加した 2 つの信号の名前またはブロック識別子がリストされます。信号が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名または端子識別子の右側に表示されます。各信号のストレージ クラスは Auto に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定 FileScope を使用しようとしています。

  3. コード マッピング エディターで、Table1 ブロックと Table2 ブロックの出力信号を選択します。ストレージ クラスを Model default: FileScope に設定します。

  4. 2 つの Lookup Table ブロックの出力信号に対するコード識別子を接頭辞 dout を含む名前で構成します。コード マッピング エディターで、信号 Table1:1 を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier]dout_Table1 に設定します。信号 Table2:1 について、[Identifier]dout_Table2 に設定します。

  5. モデルを保存します。

コード生成用のデータのプログラムによる構成

別の方法としては、コード マッピング API を使用してモデル データ要素をプログラムで構成します。

1. coder.mapping.api.get を呼び出して、モデルのコード マッピングを表すオブジェクトを取得します。コード マッピング関数に対する後続の呼び出しで、返されるオブジェクトを最初の引数として指定します。

cm = coder.mapping.api.get(model);

2. データ要素のカテゴリに対する既定のコード生成設定を setDataDefaults への呼び出しで構成します。各呼び出しに、coder.mapping.api.get への呼び出しで返されるオブジェクト、データ要素のカテゴリの名前、およびストレージ クラスとストレージ クラスのプロパティを指定する名前と値のペアの引数を含めます。setDataDefaults を使用して、次の既定の設定を構成します。

  • ストレージ クラス ImportFromFile とヘッダー ファイル exInDataLut.h をもつ Inport ブロック

  • ストレージ クラス ExportToFile、ヘッダー ファイル exOutSys.h および定義ファイル exOutSys.c をもつ Outport ブロック

  • コード ジェネレーターの既定の構成をもつモデル パラメーター引数

  • ストレージ クラス ConstVolatile をもつモデル パラメーター

  • ストレージ クラス FileScope をもつ内部データ (信号、状態、ローカル データストア)

  • ストレージ クラス Volatile をもつ共有ローカル データストア

setDataDefault(cm,'Inports','StorageClass','ImportFromFile','HeaderFile','exInDataLut.h');
setDataDefault(cm,'Outports','StorageClass','ExportToFile','HeaderFile','exOutSys.h',...
'DefinitionFile','exOutSys.c');
setDataDefault(cm,'ModelParameterArguments','StorageClass','Default');
setDataDefault(cm,'ModelParameters','StorageClass','ConstVolatile');
setDataDefault(cm,'InternalData','StorageClass','FileScope');
setDataDefault(cm,'SharedLocalDataStore','StorageClass','Volatile');

モデル コンフィギュレーション パラメーター DefaultParameterBehaviorTunable に設定して、プログラムの実行中にモデル パラメーターにアクセスできるようにします。

set_param(model,'DefaultParameterBehavior','Tunable');

3. 個々の Inport ブロックを setInport への呼び出しで構成します。最適化を回避するには、Inport ブロックの既定の構成を In2In3、および In4 に適用します。In1 の場合、ストレージ クラスを ImportFromFile、ヘッダー ファイルを exInDataMem.h に設定し、既定の構成をオーバーライドします。また、生成されたコード内の Inport を表すグローバル変数が外部の定義ファイル内の変数名と一致するように、Inport のコード識別子を構成します。setInport への各呼び出しで、coder.mapping.api.get によって返されるオブジェクト、Inport ブロック名、およびストレージ クラスとプロパティ設定に対する名前と値のペアの引数を指定します。

setInport(cm,'In1','StorageClass','ImportFromFile','HeaderFile','exInDataMem.h',...
    'Identifier','Input1');
setInport(cm,'In2','StorageClass','Model default','Identifier','Input2');
setInport(cm,'In3','StorageClass','Model default','Identifier','Input3');
setInport(cm,'In4','StorageClass','Model default','Identifier','Input4');

4. Outport ブロック Out1 に対する個々のデータ要素設定を setOutport への呼び出しで構成します。最適化を回避するために、既定の構成を適用します。また、Outport のコード識別子を設定します。setOutport への各呼び出しで、coder.mapping.api.get によって返されるオブジェクト、Outport ブロック名、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。

setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');

5. 個別のモデル パラメーターを setModelParameter への呼び出しで構成します。最適化を回避するために、既定の構成を適用します。また、パラメーターのコード識別子を設定します。setModelParameter への各呼び出しで、coder.mapping.api.get によって返されるオブジェクト、パラメーター名、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。

setModelParameter(cm,'K1','StorageClass','Model default','Identifier','mp_K1');
setModelParameter(cm,'Table1','StorageClass','Model default','Identifier','mp_Table1');
setModelParameter(cm,'Table2','StorageClass','Model default','Identifier','mp_Table2');

6. ローカル データストア mode に対する個別のデータ要素設定を setDataStore への呼び出しで構成します。最適化を回避するために、既定の構成を適用します。また、データストアのコード識別子を設定します。setDataStore への呼び出しで、coder.mapping.api.get によって返されるオブジェクト、データストア名、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。

setDataStore(cm,'mode','StorageClass','Model default','Identifier','ds_mode');

7. 状態 X に対する個別のデータ要素設定を setState への呼び出しで構成します。最適化を回避するために、既定の構成を適用します。また、状態のコード識別子を設定します。setState への呼び出しで、coder.mapping.api.get によって返されるオブジェクト、状態を使用するブロックのパス、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。

setState(cm,'rtwdemo_configinterface/Delay','StorageClass','Model default',...
    'Identifier','dstate_X');

8. コード マッピングに信号を追加し、それらを setSignal への呼び出しで構成します。端子ハンドルを追加するには、信号データを get_param への呼び出しをもつモデルのコード マッピングに追加します。次に、addSignals への呼び出し内にブロック ハンドルを指定します。最適化を回避するために、信号に既定の構成を適用します。また、信号のコード識別子を設定します。setSignal への各呼び出しで、coder.mapping.api.get によって返されるオブジェクト、信号ソースのパスまたはブロック ハンドル、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。

lut1D_ports = get_param('rtwdemo_configinterface/Table1','PortHandles');
lut2D_ports = get_param('rtwdemo_configinterface/Table2','PortHandles');

lut1D_outPort = lut1D_ports.Outport;
lut2D_outPort = lut2D_ports.Outport;

addSignal(cm,[lut1D_outPort,lut2D_outPort]);

setSignal(cm,lut1D_outPort,'StorageClass','Model default','Identifier','dout_Table1');
setSignal(cm,lut2D_outPort,'StorageClass','Model default','Identifier','dout_Table2');

コードの生成と表示

1. コードを生成します。

slbuild(model)
### Starting build procedure for: rtwdemo_configinterface
### Successful completion of code generation for: rtwdemo_configinterface

Build Summary

Top model targets built:

Model                    Action          Rebuild Reason                                    
===========================================================================================
rtwdemo_configinterface  Code generated  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.533s

2. コードを表示します。たとえば、rtwdemo_configinterface.c で、input1input2input3input4outputmp_K1ds_modedstate_Xdout_Table1、および dout_Table2 の変数がステップ エントリポイント関数内で使用されている場所を検索します。

関連するトピック