このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
C コード生成用のモデル データ インターフェイスの構成
生成されたコードを外部コードと統合するため、またはコーディング標準およびガイドラインに準拠するコードを生成するために、生成されたコードにブロック パラメーターや信号線などのモデル内のデータ要素が表示される方法を構成できます。データ要素のカテゴリに対する既定のコード生成設定を構成し、コード マッピング エディターまたはコード マッピング API を使用して個別の要素を構成できます。たとえば、生成されたコードおよび外部 (エクスポートおよびインポートされた) ファイルでの宣言と定義の配置、および、生成されたコードでデータ要素を表す変数の命名を制御する設定を構成できます。
この例では、モデル例 ConfigurationRapidPrototypingInterface のコード生成についてデータ要素を構成する方法を示します。
モデル例の確認
モデル例 ConfigurationRapidPrototypingInterface を開きます。
model = 'ConfigurationRapidPrototypingInterface';
open_system(model)
この例は、次のモデル データ要素をコード生成用に構成する方法を示します。
Inport
ブロックIn1
、In2
、In3
およびIn4
Outport
ブロックOut1
モデル パラメーター
K1
、Table1
、およびTable2
ローカル データ ストア
mode
Lookup Table ブロック
Table1
およびTable2
をソースとする信号線状態
X
(遅延)
Inport
ブロックの既定の設定の構成
Simulink Coder アプリを開きます。
[C コード] タブで、[コード インターフェイス]、[既定のコード マッピング] を選択します。
コード マッピング エディターの [Inports and Outports] でカテゴリ [Inports] を選択します。既定のストレージ クラスを
ImportedExternPointer
に設定します。
Outport
ブロックの既定の設定の構成
[Data Defaults] タブの [Inports and Outports] で、カテゴリ [Outports] を選択します。既定のストレージ クラスを ExportedGlobal
に設定します。
パラメーターの既定の設定の構成
[Data Defaults] タブの [パラメーター] で、カテゴリ [Model parameters] を選択します。リンク テキスト
'Auto' will be inlined
は、コード ジェネレーターが既定の設定でモデル パラメーターをインライン化するように構成されていることを示します。この例の場合、モデル パラメーターが調整可能になるように構成します。'Auto' will be inlined
をクリックします。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスが開きます。モデル コンフィギュレーション パラメーター [既定のパラメーター動作] を
Tunable
に設定します。変更を保存し、ダイアログ ボックスを閉じます。コード マッピング エディターで、リンク テキストが'Auto' will be tunable
に変更されます。コード マッピング エディターで、[Model parameters] カテゴリが選択された状態で、ストレージ クラスを
ExportedGlobal
に設定します。
信号、状態、およびデータストアの既定の設定の構成
[データの既定の設定] タブで、[信号] の下にあるカテゴリ [Signals, states, and internal data] を選択します。既定のストレージ クラスを
ExportedGlobal
に設定します。共有ローカル データ ストアの既定のコード マッピングを構成します。カテゴリ [Shared local data stores] を選択します。ストレージ クラスを
ExportedGlobal
に設定します。モデルを保存します。
個別の Inport
ブロックのコード生成設定の構成
コード マッピング エディターで、[入力端子] タブをクリックします。エディターには、モデル内にあるルートレベルの
Inport
ブロックとIn Bus Element
ブロックの名前がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。各 Inport のストレージ クラスはAuto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例の場合、モデルの既定の構成はストレージ クラスImportedExternPointer
を指定します。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスをModel default
に設定します。既定のコンフィギュレーションをオーバーライドするには、その Inport のコード生成に関する要件を満たすストレージ クラスを指定します。コード ジェネレーターを構成し、既定のストレージ クラスが Inport
In2
、In3
、およびIn4
に設定されるように適用します。これら 3 つの Inport の行を選択します。次に、選択したいずれかの Inport に対して、ストレージ クラスをModel default: ImportedExternPointer
に設定します。選択した 3 つの Inport のストレージ クラスがModel default: ImportedExternPointer
に変更されます。Inport
In1
については、既定のストレージ クラス設定をオーバーライドします。ストレージ クラスを ImportedExtern に設定します。生成されたコード内の変数が外部ヘッダーおよび定義ファイル内のインターフェイス名と一致するように、Inport のコード識別子を構成します。コード マッピング エディターで、各 Inport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを
input1
、input2
、input3
、input4
の値に設定します。
個別の Outport に対するコード生成設定の構成
コード マッピング エディターで、[出力端子] タブをクリックします。エディターに、ルートレベルの
Outport
ブロックとOut Bus Element
ブロックおよびモデル内のバス要素がリストされます。端子が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名の右側に表示されます。モデル例の Outport のストレージ クラスはAuto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化を回避し、コード ジェネレーターで既定の構成が強制的に使われるようにするには、ストレージ クラスを
ExportedGlobal
に設定します。選択した Outport のストレージ クラスはModel default: ExportedGlobal
に変更されます。生成されたコード内の変数が外部コードで使われるインターフェイス名と一致するように、Outport のコード識別子を構成します。コード マッピング エディターで、Outport の行を選択します。プロパティ インスペクターで、[Identifier] プロパティを
output
に設定します。
個別のパラメーターに対するコード生成設定の構成
コード マッピング エディターで、[パラメーター] タブをクリックします。[Model Parameter Arguments] を展開します。既定の設定では、各モデル パラメーター引数のストレージ クラスは
Auto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。最適化が不可能な場合、コード ジェネレーターはモデルの既定の構成を適用します。この例では、ストレージ クラスをAuto
に設定したままにします。[Model parameters] を展開します。既定の設定では、各モデル パラメーターのストレージ クラスは
Auto
に設定されます。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定ExportedGlobal
を使用しようとしています。コード マッピング エディターの [Model parameters] で、パラメーター
K1
、Table1
、Table2
を選択します。ストレージ クラスをModel default: ExportedGlobal
に設定します。要件で指定されるように、モデル パラメーターのコード識別子を接頭辞
mp_
を含む名前で構成します。コード マッピング エディターで、モデル パラメーターK1
を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier] をmp_K1
に設定します。パラメーターTable1
およびTable2
について、[Identifier] をmp_Table1
およびmp_Table2
に設定します。
個別のデータストアに対するコード生成設定の構成
コード マッピング エディターで [データ ストア] タブをクリックします。[Local Data Stores] を展開します。データストア モードのストレージ クラスは [Auto] に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定
ExportedGlobal
を使用しようとしています。コード マッピング エディターで、ローカル データ ストア
mode
を選択します。ストレージ クラスをModel default: ExportedGlobal
に設定します。データストアのコード識別子を接頭辞
ds_
を含む名前で構成します。コード マッピング エディターで、共有ローカル データ ストアmode
を選択します。プロパティ インスペクターで、[コード] ノードを展開します。ストレージ クラス プロパティ [Identifier] をds_mode
に設定します。
個別の状態に対するコード生成設定の構成
コード マッピング エディターで、[信号/状態] タブをクリックします。[States] を展開します。状態のストレージ クラスは
Auto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定ExportedGlobal
を使用しようとしています。コード マッピング エディターで、状態
X
を選択します。ストレージ クラスをModel default: ExportedGlobal
に設定します。要件で指定されるように、状態のコード識別子を接頭辞
dstate_
を含む名前で構成します。コード マッピング エディターで、状態X
を選択します。プロパティ インスペクターで、[コード] ノードを展開します。次に、ストレージ クラス プロパティ [Identifier] をdstate_X
に設定します。
個別の信号に対するコード生成設定の構成
モデルのコード マッピングに構成する信号を追加します。この例の場合、モデル コード マッピングに 2 つの Lookup Table ブロックに対する出力信号を追加します。次に、以下の信号を設定します。
コード マッピング エディターで、[信号/状態] タブをクリックします。リストされた信号はありません。
コード マッピングに信号を追加します。Lookup Table ブロック
Table1
およびTable2
の出力信号の場合、モデル内で信号を選択し、信号線の上または下に表示される省略記号で一時停止し、操作バーを開いて、[信号の追加] ボタンをクリックします。コード マッピング エディターで、[信号] ノードが展開され、追加した 2 つの信号の名前またはブロック識別子がリストされます。信号が信号オブジェクトに関連付けられる場合、信号オブジェクトへの関連付けアイコンが要素名または端子識別子の右側に表示されます。各信号のストレージ クラスはAuto
に設定されます。つまり、コード ジェネレーターは最適化目的で関連するコードを削除する可能性があります。この例の場合、最適化を回避し、コード ジェネレーターで既定のストレージ クラス設定ExportedGlobal
を使用しようとしています。コード マッピング エディターで、
Table1
ブロックとTable2
ブロックの出力信号を選択します。ストレージ クラスをModel default: ExportedGlobal
に設定します。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
を使用して、次の既定の設定を構成します。
ストレージ クラス
ImportedExternPointer
をもつInport
ブロックストレージ クラス
ExportedGlobal
をもつOutport
ブロックストレージ クラス
ExportedGlobal
をもつモデル パラメーターストレージ クラス
ExportedGlobal
をもつ内部データ (信号、状態、ローカル データ ストア)ストレージ クラス
ExportedGlobal
をもつ共有ローカル データ ストア
setDataDefault(cm,'Inports','StorageClass','ImportedExternPointer'); setDataDefault(cm,'Outports','StorageClass','ExportedGlobal'); setDataDefault(cm,'ModelParameters','StorageClass','ExportedGlobal'); setDataDefault(cm,'InternalData','StorageClass','ExportedGlobal'); setDataDefault(cm,'SharedLocalDataStore','StorageClass','ExportedGlobal');
モデル コンフィギュレーション パラメーター DefaultParameterBehavior
を Tunable
に設定して、プログラムの実行中にモデル パラメーターにアクセスできるようにします。
set_param(model,'DefaultParameterBehavior','Tunable');
3. 個別の inport を setInport
への呼び出しを使用して構成します。最適化を回避するため、inport の既定の構成を In2
、In3
、および In4
に適用します。In1
について、ストレージ クラスを ImportedExtern
に設定して、既定のコンフィギュレーションをオーバーライドします。また、生成されたコード内の Inport を表すグローバル変数が外部の定義ファイル内の変数名と一致するように、Inport のコード識別子を構成します。setInport
への各呼び出しで、coder.mapping.api.get
によって返されるオブジェクト、Inport
ブロック名、およびストレージ クラスとプロパティ設定に対する名前と値のペアの引数を指定します。
setInport(cm,'In1','StorageClass','ImportedExtern','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,'ConfigurationRapidPrototypingInterface/Delay','StorageClass','Model default',... 'Identifier','dstate_X');
8. コード マッピングに信号を追加し、それらを setSignal
への呼び出しで構成します。端子ハンドルを追加するには、信号データを get_param
への呼び出しをもつモデルのコード マッピングに追加します。次に、addSignals
への呼び出し内にブロック ハンドルを指定します。最適化を回避するために、信号に既定の構成を適用します。また、信号のコード識別子を設定します。setSignal
への各呼び出しで、coder.mapping.api.get
によって返されるオブジェクト、信号ソースのパスまたはブロック ハンドル、およびストレージ クラスとコード識別子のプロパティ設定に対する名前と値のペアの引数を指定します。
lut1D_ports = get_param('ConfigurationRapidPrototypingInterface/Table1','PortHandles'); lut2D_ports = get_param('ConfigurationRapidPrototypingInterface/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: ConfigurationRapidPrototypingInterface ### Successful completion of code generation for: ConfigurationRapidPrototypingInterface Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================================== ConfigurationRapidPrototypingInterface Code generated. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 20.197s
2. コードを表示します。たとえば、ConfigurationRapidPrototypingInterface.c で、input1
、input2
、input3
、input4
、output
、mp_K1
、ds_mode
、dstate_X
、dout_Table1
、および dout_Table2
の変数がステップ エントリポイント関数内で使用されている場所を見つけます。