Real-Time Workshop User's Guide | ![]() ![]() |
ラピッドプロトタイピングモデル関数
ラピッドプロトタイピングコードは、ランタイムインタフェースとのインタフェースをとる以下の関数を定義します。
Model()
-- モデル登録関数。これは、モデルが要求する作業領域の初期化(例 様々なデータ構造体のポインタの割り当てと設定)のための関数です。モデル登録関数は、MdlInitializeSizes
および MdlInitializeSampleTimes
関数を呼び出します。これらの2つの関数は、S-function mdlInitializeSizes
および mdlInitializeSampleTimes
ルーチンに非常に似ています。MdlStart(void)
-- モデル登録関数の後で、MdlInitializeSizes
および MdlInitializeSampleTimes
を実行し、ランタイムインタフェースはMdlStart
を呼び出すことによって実行を開始します。このルーチンは、起動時に1回呼び出されます。関数MdlStart
は、4つの基本的なセクションをもちます。
MdlOutputs(int_T tid)
-- MdlOutputs
は、適切な時間にブロックの出力をアップデートします。 tid
(タスク識別子)パラメータは、それらのサンプル時間に基づき、いつブロックを実行するかを割り当てるタスクを識別します。このルーチンは、メジャーおよびマイナー時間ステップ中に、ランタイムインタフェースにより呼ばれます。メジャー時間ステップとは、ランタイムインタフェースが実際の時間ステップ(すなわち特定のタスクを実行する時間)であるときです。モデルが連続状態を含む場合は、マイナー時間ステップが発生します。マイナー時間ステップとは、ソルバがメジャー時間ステップの出力の間の点で積分の段階を出力する時です。これらの積分ステージは、連続状態に進める際に用いる微係数を計算するために用いられます。MdlUpdate(int_T tid)
-- MdlUpdate
は、作業ベクトルに保存されている離散状態と作業ベクトルの状態の情報(連続でも離散でもない状態)をアップデートします。tid
(タスク識別子)パラメータは、どのサンプル時間がアクティブブロックのみの状態を条件付きでアップデートすることが可能であるかを順番に示すタスクを識別します。このルーチンは、メジャー時間ステップでのMdlOutputs
が実行された後でランタイムインタフェースによって呼ばれます。MdlDerivatives(void)
-- MdlDerivatives
は、ブロック微係数を出力します。このルーチンは、積分段階でソルバによってマイナー時間ステップで呼び出されます。連続状態をもつすべてのブロックは、同数の微係数をもちます。これらのブロックは、ソルバが状態を積分できるように、微係数を計算するために必要です。MdlTerminate(void)
-- MdlTerminate
は、ブロックシャットダウンコードを含みます。MdlTerminate
は、リアルタイムプログラムの終了の一部として、ランタイムインタフェースによって呼び出されます上記の関数の内容は、モデル内のブロックに直接関連します。Simulinkブロックは、つぎの式に従って一般化されます。
出力yは、連続状態xc、離散状態xd,、入力u. の関数です。各ブロックは、MdlOutput
の適切な部分に固有の式を書き出します。
離散状態xd, は、カレント状態と入力の関数です。離散状態をもつブロックは、MdlUpdate
で状態をアップデートします。
微係数xは、カレント入力の関数です。連続状態をもつブロックは、微係数をMdlDerivatives
でソルバ(例., ode5
)に与えます。微係数は、連続状態を積分して、つぎの値を作成するためにソルバによって用いられます。
出力yは、一般的にブロックI/O構造体に書き出されます。ルートレベルのOutportブロックは、外部出力構造体に書き出します。連続および離散状態は、状態構造体に格納されます。入力uは、ブロックI/O構造体、外部入力(外部入力構造体にある)、状態にあるほかのブロックの出力から発生します。これらの構造体は、Real-Time Workshopが生成するmodel
.h
ファイルで定義されます。
図 6-3は、Cコードのラピッドプロトタイピングの一般的な内容を示します。
図 6-3: ラピッドプロトタイピングコードスタイルに対するmodel.cの内容
図 6-4は、ラピッドプロトタイピング生成コードの実行を説明するフローチャートです。
各ブロックは、実現しているアルゴリズムに従ってコードを固有のMdl
ルーチンに配置します。ブロックは、入力、出力、パラメータ、状態その他の一般的な項目を含みます。たとえば、 一般的に、ブロック入力と出力は、ブロックI/O構造体(rtB
)に書き出されます。ブロック入力は、外部入力構造体(rtU
)、または未接続またはgroundedの場合に、積分器(rtX
)またはground (rtGround
)の状態端子に接続されているときは、状態構造体から入力されます。ブロック出力は、外部出力構造体(rtY
)に接続することが可能です。つぎの図は、これらの項目の一般的な割り当てを示します。
rtB
) -- この構造体は、すべてのブロック出力信号で構成されます。ブロック出力信号の数は、モデル内のすべての非仮想ブロックのデータ出力ポートの幅の和です。ブロックI/O最適化をアクティブにすると、SimulinkおよびReal-Time Workshopは、以下により、rtB構造体のサイズを削減します。rtB
構造体のエントリを再利用するこれらの最適化に関する詳細は、「信号: ストレージ、最適化、インタフェース」を参照してください。
構造体のフィールド名は、ブロックの出力信号名(存在時)、あるいは出力信号にラベルがないときはブロック名とポート番号によって決定されます。
rtX
) -- 状態構造体は、状態をもつモデル内の任意のブロックに対する連続状態および離散状態の情報を含みます。状態構造体は、2つの部分をもちます。1つは連続状態用でもう1つは離散状態用です。rtP
) -- パラメータ構造体は、実行中に変更が可能なすべてのブロックパラメータを含みます(例 Gainブロックのパラメータ) rtU
) -- 外部入力構造体は、すべてのルートレベルのInportブロック信号を含みます。フィールド名は、ブロック出力信号名(存在時)、または出力信号にラベルがないときはInportブロック名によって決定されます。rtY
) -- 外部出力構造体は、すべてのルートレベルのOutportブロックで構成されます。フィールド名は、モデル内のルートレベルのOutportブロック名で決定されます。rtRWork
, rtIWork
, rtPWork
) -- ブロックは、実数、整数、ポインタ作業領域をもつ場合があります。たとえば、Memoryブロックは各信号に対して実数作業要素を使います。これらの領域は、内部状態または同様の情報を保存するために用いられます。![]() | ラピッドプロトタイピングと組み込みモデルの実行の違い | 組み込みモデル関数 | ![]() |