生成コードの関数の分割
この例では、モデル内のサブシステムを関数名とファイルに関連付ける方法を示します。
以下の方法について説明します。
生成したコード内での関数名とファイル名の指定方法。
生成したコードの統合に必要な部分の特定方法。
Atomic サブシステムのコードの生成方法。
生成した関数の実行に必要なデータの特定方法。
モデル例とこのシリーズの他の例の詳細については、C コード生成のためのコントロール アルゴリズム モデルの準備を参照してください。
Atomic サブシステムとバーチャル サブシステム
C コード生成のためのコントロール アルゴリズム モデルの準備と生成コードのデータ インターフェイスの構成のモデル例では "バーチャル サブシステム" を使用します。バーチャル サブシステムは視覚的にブロックを整理しますが、モデルの機能には影響しません。"Atomic サブシステム" はモデルに含まれるブロックを 1 つの単位として評価します。Atomic サブシステムを使用して、付加的な関数分割情報を指定することができます。モデル内で、Atomic サブシステムは境界が太線で描かれます。
モデル アーキテクチャの変更内容の参照
モデル例 rtwdemo_PCG_Eval_P3 を開きます。
書き込み可能なフォルダーにモデルのコピーを保存します。
この例は、バーチャル サブシステムを Function-Call Subsystem に置き換える方法を示します。Function-Call Subsystem については次の通りです。
Atomic サブシステムである
サブシステムの実行順を制御できる
"関数呼び出し信号" がトリガーされたときに実行される
サブシステムの実行順の制御によって、特定の実行順をもつ既存のシステムにモデルを一致させることができます。
次の図は、関数呼び出しサブシステム (1) が PI_ctrl_1
、PI_ctrl_2
および Pos_Command_Arbitration
であることを示します。
モデルのこのバージョンには新しいサブシステム Execution_Order_Control
(2) があり、スケジューラの呼び出し機能をモデル化する Stateflow® チャートが含まれています。サブシステムは関数呼び出し信号 (3) を介して関数呼び出しサブシステムの実行順を制御します。この例の後半では、実行順の変更によってシミュレーション結果がどのように変化するかを調査します。
モデルのこのバージョンには新しい Signal Conversion ブロック (4) が PI コントローラーの出力に含まれています。これらの追加のブロックを配置することにより、コード ジェネレーターは PI コントローラーに 1 つの再呼び出し可能な関数を生成できます。
生成コード内の関数の場所とファイルの配置の制御
C コード生成のためのコントロール アルゴリズム モデルの準備と生成コードのデータ インターフェイスの構成では、コード ジェネレーターにより制御アルゴリズム コードが含まれる 1 つの関数 model
_step
が作成されます。しかし多くのアプリケーションでは、関数のファイル配置をより大きなレベルで制御することが必要になります。Atomic サブシステムのパラメーターを変更することにより、複数の関数を単一のモデル内で指定できます。
次の図は、PI_ctrl_1
のサブシステム パラメーターを示しています。
Atomic サブシステムとして扱う
その他のサブメニューを有効にします。Atomic サブシステムではこのパラメーターは自動的に選択および無効にされます。
サンプル時間
実行するサンプル時間を指定します。Function-Call Subsystem では使用できません。
[関数のパッケージ化] オプション
Auto
-- サブシステムが生成コードに表示される方法を決定します。これが既定値です。Inline
-- サブシステム コードを残りのモデル コードとインラインで配置します。Function
-- サブシステムのコードを関数として生成します。Reusable function
-- 再利用可能な (再呼び出し可能な) 関数をサブシステムから生成します。この関数は、すべての入力データおよび出力データを仮パラメーターを通じて渡します。この関数は、グローバル変数に直接アクセスしません。
関数名オプション
[関数のパッケージ化] に
Function
またはReusable function
を選択することで、関数名オプションが有効になります。Auto
-- 関数を決定します。Use subsystem name
-- サブシステム名に基づいて関数名を決定します。User specified
-- 指定されたファイル名を適用します。
ファイル名オプション
[関数のパッケージ化] に
Function
またはReusable function
を選択することで、ファイル名オプションが有効になります。Auto
-- 親システム用に生成されたモジュールに関数定義を配置します。あるいは、モデル ルートが親である場合は、model.c
に配置します。Use subsystem name
-- 個別のファイルを生成します。ファイルの名前は、サブシステムまたはライブラリ ブロックの名前です。Use function name
-- 個別のファイルを生成します。ファイルの名前は、[関数名オプション] で指定した名前です。User specified
-- 指定された一意のファイル名を適用します。
別々のデータをもつ関数
[関数のパッケージ化] を
Function
に設定すると有効になります。オンにすると、コード ジェネレーターはサブシステムの内部データ (信号など) を親モデルのデータから分離します。サブシステムはこの分離データを所有します。
再呼び出し可能なコードの生成
Embedded Coder® は "再呼び出し可能なコード" をサポートしています。再呼び出し可能なコードは複数のプログラムで同時に使用できる再利用可能なプログラミング ルーチンです。再呼び出し可能なコードは、オペレーティング システムや同時発生イベントを処理するマルチスレッドを使うその他のシステム ソフトウェアで使用されています。再呼び出し可能なコードは状態のデータを維持しません。つまり、関数内に永続変数はありません。呼び出し側のプログラムが状態変数を維持し、状態データを関数に渡さなければなりません。再呼び出し可能関数の 1 つのコピーを複数のユーザーやプロセスで共有できます。
再呼び出し可能なコードを生成するには、パラメーター [関数のパッケージ化] を設定し、最初にサブシステムを再利用可能として指定しなければなりません。
モデルのコンフィギュレーションにより再利用可能コードを利用できない場合もあります。次の表に、一般的な問題を示します。
Cause Solution
Subsystem output feeds global signal Add a Signal Conversion block between the data subsystem and the global signal.
Generated function receives data Select Configuration Parameters > (formal parameters) through pointers Model Referencing > Pass fixed-size scalar root inputs by value for code generation.
Subsystem uses global signal data Use a port to pass the global data in and out in internal algorithm of the subsystem.
マスクを使用してパラメーター値をライブラリ サブシステムに渡す
再利用可能なライブラリ ブロックまたはサブシステムのスコープ外でアルゴリズムを制御するパラメーター データ (ゲインや係数など) を定義するために、ブロックまたはサブシステムに "マスク" を適用し、マスク パラメーターを作成することができます。その後、ブロックまたはサブシステムの各インスタンスに対して異なるパラメーター値を指定できます。各マスク パラメーターは生成されたコード内で再呼び出し可能な関数の仮パラメーターとして表示されます。
モデルのこのバージョンで、サブシステム PI_ctrl_1
と PI_ctrl_2
はマスクされています。各マスクで P
および I
ゲインの値は I_Gain_2
や P_Gain_2
などのデータ オブジェクトで設定されます。
Atomic サブシステムのコード生成
C コード生成のためのコントロール アルゴリズム モデルの準備と生成コードのデータ インターフェイスの構成では、モデルのルート レベルでコードを生成します。あるいは、特定のサブシステムをビルドすることもできます。
サブシステムのビルドを開始するには、コンテキスト メニューを使用します。以下のオプションから選択できます。
このサブシステムをビルド: サブシステムは別のモードとして扱われ、ソース C ファイルとヘッダー ファイルのフル セットが作成されます。このオプションで Function-Call Subsystem はサポートされていません。
S-Function を生成: サブシステム用に C コードを生成し、S-Function ラッパーを作成します。そして元のモデル内でコードのシミュレーションを実行できます。このオプションで Function-Call Subsystem はサポートされていません。
関数のエクスポート: [このサブシステムをビルド] オプションと関連付けられているスケジューリング コードを使用せずに C コードを作成します。このオプションは、Function-Call Subsystem などトリガーを使用してサブシステムをビルドする場合に使用します。
あるいは、Embedded Coder アプリを開いてサブシステムを選択し、[C コード] タブで [ビルド] をクリックします。
生成されたコードの検証
次の例は、フル システム ビルド用に生成したファイルとエクスポート関数用に生成したファイルとを比較します。また、マスクされたデータのコード内での表示方法も確認します。
これらの 3 つのオプションについてビルド スクリプトを実行します。次に、ハイパーリンクをクリックして生成されたファイルを検証します。
rtwdemo_PCG_Eval_P3.c
フル ビルド: はい、ステップ関数
PI_ctrl_1: いいえ
Pos_Command_Arbitration: いいえ
PI_ctrl_1.c
フル ビルド: いいえ
PI_ctrl_1: はい、トリガー関数
Pos_Command_Arbitration: いいえ
Pos_Command_Arbitration.c
フル ビルド: いいえ
PI_ctrl_1: いいえ
Pos_Command_Arbitration: はい、Init および関数
PI_Ctrl_Reusable.c
ert_main.c
eval_data.c
(1) eval_data.c
のコンテンツは完全なビルドとエクスポート関数のビルドでは異なります。完全なビルドにはモデルで使用されるすべてのパラメーターが含まれます。エクスポート関数にはサブシステムで使用される変数だけが含まれます。
生成したコードのマスクされたデータ
ファイル rtwdemo_PCG_Eval_P3.c
で、再呼び出し可能な関数の呼び出しサイトは、データ オブジェクト P_Gain
、I_Gain
、P_Gain_2
、I_Gain_2
を引数として使用します。
シミュレーション結果への実行順の影響
既定では、Simulink® は次の順序でサブシステムを実行します。
PI_ctrl_1
PI_ctrl_2
Pos_Command_Arbitration
この例では、2 つの代替順序のいずれかを指定することができます。その後、テスト ハーネスを使用してシミュレーション結果に対する実行順の影響を確認できます。サブシステム Execution_Order_Control
は実行順を制御する 2 つの設定値をもっています。設定値を選択するには、サブシステムのコンテキスト メニューを使用します。
実行順を変更し、結果を確認します。
シミュレーション結果 (時間経過に対するスロットル位置) は実行順に応じてわずかに変化します。スロットルの要求が変化するときに差異が最も顕著になることがわかります。
このシリーズの次の例については、モデルおよび生成コードからの外部 C コードの呼び出しを参照してください。