C コード生成用のモデル データ インターフェイスの構成
生成されたコードを外部コードと統合するため、またはコーディング標準およびガイドラインに準拠するコードを生成するために、生成されたコードにブロック パラメーターや信号線などのモデル内のデータ要素が表示される方法を構成できます。データ要素のカテゴリに対する既定のコード生成設定を構成し、コード マッピング エディターまたはコード マッピング API を使用して個別の要素を構成できます。たとえば、次のような設定を構成できます。
生成ファイルおよび外部ファイル (エクスポート ファイルおよびインポート ファイル) 内での宣言と定義の配置の制御。
複数のデータ項目の構造体へのパッケージング。
ストレージ型修飾子
constおよびvolatileの適用。
この例では、モデル例 ConfigurationInterface のコード生成についてデータ要素を構成する方法を示します。
モデル例の確認
モデル例 ConfigurationInterface を開きます。
model = 'ConfigurationInterface';
open_system(model)
この例は、次のモデル データ要素をコード生成用に構成する方法を示します。
InportブロックIn1、In2、In3およびIn4Outport ブロック
Out1モデル パラメーター引数
LOWERおよびUPPERモデル パラメーター
K1、Table1、およびTable2ローカル データ ストア
modeLookup Table ブロック
Table1およびTable2をソースとする信号線状態
X(遅延)
Inport ブロックの既定の設定の構成
Embedded Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス]、[既定のコード マッピング] を選択します。
コード マッピング エディターの [Inports and Outports] でカテゴリ [Inports] を選択します。既定のストレージ クラスを
ImportFromFileに設定します。プロパティ インスペクターで、[Header File] を
exInDataLut.hに設定します。
Outport ブロックの既定の設定を構成する
[Data Defaults] タブの [Inports and Outports] で、カテゴリ [Outports] を選択します。既定のストレージ クラスを
ExportToFileに設定します。プロパティ インスペクターで、[Header File] を
exOutSys.hに、[Definition File] をexOutSys.cに設定します。
パラメーターの既定の設定の構成
[Data Defaults] タブの [Parameters] で、カテゴリ [Model parameter arguments] を選択します。ストレージ クラスを
Defaultに設定したままにします。この設定で、コード ジェネレーターは引数インスタンスごとに個別のメモリ領域を割り当てます。カテゴリ [Model parameters] を選択します。リンク テキスト
'Auto' will be inlinedは、コード ジェネレーターが既定の設定でモデル パラメーターをインライン化するように構成されていることを示します。この例の場合、モデル パラメーターが調整可能になるように構成します。'Auto' will be inlinedをクリックします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスが開きます。モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を
Tunableに設定します。変更を保存し、ダイアログ ボックスを閉じます。コード マッピング エディターで、リンク テキストが'Auto' will be tunableに変更されます。コード マッピング エディターで、[Model parameters] カテゴリが選択された状態で、ストレージ クラスを
ConstVolatileに設定します。
信号、状態、およびデータストアの既定の設定の構成
[Data Defaults] タブの [Signals] で、カテゴリ [Signals,states, and internal data] を選択します。既定のストレージ クラスを FileScope に設定します。
共有ローカル データ ストアの既定のコード マッピングを構成します。カテゴリ [Shared local data stores] を選択します。ストレージ クラスを
Volatileに設定します。モデルを保存します。
個々の Inport ブロックに対するコード生成設定を構成する
コード マッピング エディターで、[入力端子] タブをクリックします。エディターには、モデル内にあるルートレベルの
InportブロックとIn Bus Elementブロックの名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。各 Inport のストレージ クラスはAutoに設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラスImportedFromFileを指定します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスをModel defaultに設定します。既定のコンフィギュレーションをオーバーライドするには、その Inport のコード生成に関する要件を満たすストレージ クラスを指定します。コード ジェネレーターを構成し、既定のストレージ クラスが Inport
In2、In3、およびIn4に設定されるように適用します。これら 3 つの Inport の行を選択します。次に、選択したいずれかの Inport に対して、ストレージ クラスをModel default: ImportFromFileに設定します。選択した 3 つの Inport のストレージ クラスは [Model default: ImportFromFile] に変更されます。Inport
In1については、既定のストレージ クラス設定をオーバーライドします。ストレージ クラスをImportFromFileに設定します。プロパティ インスペクターで、[Header File] をexInDataMem.hに設定します。生成されたコード内の変数が外部ヘッダーおよび定義ファイル内のインターフェイス名と一致するように、Inport のコード識別子を構成します。コード マッピング エディターで、各 Inport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを
input1、input2、input3、input4の値に設定します。
個々の Outport ブロックに対するコード生成設定を構成する
コード マッピング エディターで、[出力端子] タブをクリックします。エディターには、モデル内にあるルートレベルの
OutportブロックとOut Bus Elementブロックの名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。モデル例の Outport のストレージ クラスはAutoに設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを
Model default: ExportToFileに設定します。選択した Outport のストレージ クラスはModel default: ExportToFileに変更されます。生成されたコード内の変数が外部コードで使われるインターフェイス名と一致するように、Outport のコード識別子を構成します。コード マッピング エディターで、Outport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを
outputに設定します。
個別のパラメーターに対するコード生成設定の構成
コード マッピング エディターで、[パラメーター] タブをクリックします。[Model Parameter Arguments] を展開します。既定の設定では、各モデル パラメーター引数のストレージ クラスは
Autoに設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例では、ストレージ クラスをAutoに設定したままにします。[Model parameters] を展開します。既定の設定では、各モデル パラメーターのストレージ クラスは
Autoに設定されます。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定 ConstVolatile を使用しようとしています。コード マッピング エディターの [Model parameters] で、パラメーター
K1、Table1、Table2を選択します。ストレージ クラスをModel default: ConstVolatileに設定します。要件で指定されるように、モデル パラメーターのコード識別子を接頭辞
mp_を含む名前で構成します。コード マッピング エディターで、モデル パラメーターK1を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier] をmp_K1に設定します。パラメーターTable1およびTable2について、[Identifier] をmp_Table1およびmp_Table2に設定します。
個別のデータ ストアに対するコード生成設定の構成
コード マッピング エディターで [データ ストア] タブをクリックします。[Local Data Stores] を展開します。データストア モードのストレージ クラスは [Auto] に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定
Volatileを使用しようとしています。コード マッピング エディターで、ローカル データ ストア
modeを選択します。ストレージ クラスをModel default: Volatileに設定します。データストアのコード識別子を接頭辞
ds_を含む名前で構成します。コード マッピング エディターで、共有ローカル データ ストアmodeを選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier] をds_modeに設定します。
個別の状態に対するコード生成設定の構成
コード マッピング エディターで、[信号/状態] タブをクリックします。[States] を展開します。状態のストレージ クラスは
Autoに設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定FileScopeを使用しようとしています。コード マッピング エディターで、状態
Xを選択します。ストレージ クラスをModel default: FileScopeに設定します。要件で指定されるように、状態のコード識別子を接頭辞
dstate_を含む名前で構成します。コード マッピング エディターで、状態Xを選択します。プロパティ インスペクターで、[コード] ノードを展開します。次に、ストレージ クラス プロパティ [Identifier] をdstate_Xに設定します。
個別の信号に対するコード生成設定の構成
モデルのコード マッピングに構成する信号を追加します。この例の場合、モデル コード マッピングに 2 つの Lookup Table ブロックに対する出力信号を追加します。次に、以下の信号を設定します。
コード マッピング エディターで、[信号/状態] タブをクリックします。リストされた信号はありません。
コード マッピングに信号を追加します。Lookup Table ブロック
Table1およびTable2の出力信号の場合、モデル内で信号を選択し、信号線の上または下に表示される省略記号で一時停止し、操作バーを開いて、[信号の追加] ボタンをクリックします。コード マッピング エディターで、[信号] ノードが展開され、追加した 2 つの信号の名前またはブロック識別子がリストされます。信号が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名または端子識別子の右側に表示されます。各信号のストレージ クラスはAutoに設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定FileScopeを使用しようとしています。コード マッピング エディターで、
Table1ブロックとTable2ブロックの出力信号を選択します。ストレージ クラスをModel default: FileScopeに設定します。2 つの Lookup Table ブロックの出力信号に対するコード識別子を接頭辞
doutを含む名前で構成します。コード マッピング エディターで、信号Table1:1を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier] をdout_Table1に設定します。信号Table2:1について、[識別子] をdout_Table2に設定します。モデルを保存します。
コード生成用のデータのプログラムによる構成
別の方法としては、コード マッピング API を使用してモデル データ要素をプログラムで構成します。
1. coder.mapping.api.get を呼び出して、モデルのコード マッピングを表すオブジェクトを取得します。コード マッピング関数に対する後続の呼び出しで、返されるオブジェクトを最初の引数として指定します。
cm = coder.mapping.api.get(model);
2. データ要素のカテゴリに対する既定のコード生成設定を setDataDefaults への呼び出しで構成します。各呼び出しに、coder.mapping.api.get への呼び出しで返されるオブジェクト、データ要素のカテゴリの名前、およびストレージ クラスとストレージ クラスのプロパティを指定する名前と値のペアの引数を含めます。setDataDefaults を使用して、次の既定の設定を構成します。
ストレージ クラス
ImportFromFileとヘッダー ファイルexInDataLut.hをもつInportブロックストレージ クラス ExportTo
File、ヘッダー ファイル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');
モデル コンフィギュレーション パラメーター DefaultParameterBehavior を Tunable に設定して、プログラムの実行中にモデル パラメーターにアクセスできるようにします。
set_param(model,'DefaultParameterBehavior','Tunable');
3. 個々の Inport ブロックを setInport への呼び出しで構成します。最適化を回避するには、Inport ブロックの既定の構成を In2、In3、および 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,'ConfigurationInterface/Delay','StorageClass','Model default',... 'Identifier','dstate_X');
8. コード マッピングに信号を追加し、それらを setSignal への呼び出しで構成します。端子ハンドルを追加するには、信号データを get_param への呼び出しをもつモデルのコード マッピングに追加します。次に、addSignals への呼び出し内にブロック ハンドルを指定します。最適化を回避するために、信号に既定の構成を適用します。また、信号のコード識別子を設定します。setSignal への各呼び出しで、coder.mapping.api.get によって返されるオブジェクト、信号ソースのパスまたはブロック ハンドル、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。
lut1D_ports = get_param('ConfigurationInterface/Table1','PortHandles'); lut2D_ports = get_param('ConfigurationInterface/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)
### Searching for referenced models in model 'ConfigurationInterface'. ### Total of 1 models to build. ### Starting build procedure for: ConfigurationInterface ### Successful completion of code generation for: ConfigurationInterface Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================ ConfigurationInterface Information cache folder or artifacts were missing. Code generated. 0h 0m 16.258s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 17.03s
2. コードを表示します。たとえば、ConfigurationInterface.c で、input1、input2、input3、input4、output、mp_K1、ds_mode、dstate_X、dout_Table1、および dout_Table2 の変数がステップ エントリポイント関数内で使用されている場所を検索します。