C コード生成用のモデル データ インターフェイスの構成
生成されたコードを外部コードと統合するため、またはコーディング標準およびガイドラインに準拠するコードを生成するために、生成されたコードにブロック パラメーターや信号線などのモデル内のデータ要素が表示される方法を構成できます。データ要素のカテゴリに対する既定のコード生成設定を構成し、コード マッピング エディターまたはコード マッピング API を使用して個別の要素を構成できます。たとえば、次のような設定を構成できます。
生成ファイルおよび外部ファイル (エクスポート ファイルおよびインポート ファイル) 内での宣言と定義の配置の制御。
複数のデータ項目の構造体へのパッケージング。
ストレージ型修飾子
const
およびvolatile
の適用。
この例では、モデル例 ConfigurationInterface のコード生成についてデータ要素を構成する方法を示します。
モデル例の確認
モデル例 ConfigurationInterface を開きます。
model = 'ConfigurationInterface';
open_system(model)
この例は、次のモデル データ要素をコード生成用に構成する方法を示します。
Inport
ブロックIn1
、In2
、In3
およびIn4
Outport ブロック
Out1
モデル パラメーター引数
LOWER
およびUPPER
モデル パラメーター
K1
、Table1
、およびTable2
ローカル データ ストア
mode
Lookup 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
について、[Identifier] を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)
### Starting build procedure for: ConfigurationInterface ### Successful completion of code generation for: ConfigurationInterface Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================== ConfigurationInterface Code generated. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.64s
2. コードを表示します。たとえば、ConfigurationInterface.c で、input1
、input2
、input3
、input4
、output
、mp_K1
、ds_mode
、dstate_X
、dout_Table1
、および dout_Table2
の変数がステップ エントリポイント関数内で使用されている場所を検索します。