Real-Time Workshop User's Guide | ![]() ![]() |
ラピッドプロトタイピングシステム独立成分
これらの成分は、すべての環境で同じアプリケーションモジュールを利用してこれらの操作を実現するため、まとめてシステム依存と呼ばれます。この節では、モデルコードから開始します(また、モデルが連続状態をもつ場合は、数値積分ルーチンを呼び出します)。この節では、Simulinkデータ構造体(SimStruct
)を定義、作成、破棄するコードも含みます。プログラムに含まれるモデルコードとすべてのS-ファンクションは、それら自身のSimStruct
を定義します。
モデルコードの実行ドライバは、モデルコード内で関数を呼び出して、モデル出力を計算し、離散状態をアップデートし、状態を積分(可能な場合)、時間をアップデートします。これらの関数は、その後計算結果をSimStruct
に書き出します。
モデルの実行
各サンプリング間隔で、メインプログラムは、コントロールをモデル実行関数に渡します。これは、モデルの1ステップを実行します。このステップは、外部ハードウェアから入力を読み込み、モデル出力を計算し、出力を外部ハードウェアに書き出し、状態をアップデートします。
この仕組みでは、状態がアップデートされる前にシステム出力をハードウェアに書き出します。状態のアップデートを出力計算と分離することにより、入力と出力操作間の時間が最小化されます。
連続状態の積分
リアルタイムプログラムは、入力および状態ベクトルのカレント値に対して、微係数ベクトルdx/dtに基づき連続状態のつぎの値を計算します。
これらの微係数は、その後状態方程式を使って状態のつぎの値を計算するために用いられます。以下に示すのは、1次Euler法(ode1
)に対する状態方程式です。
ここで、hはシミュレーションのステップサイズで、xは状態ベクトルを表わし、
dx/dtは微係数ベクトルです。その他のアルゴリズムは、出力および微分ルーチンを複数回呼び出すことによって、より正確な推定を出力する場合があります。
しかし、リアルタイムプログラムは、与えられた時間内ですべてのタスクを完了することを保証する必要があるので、固定ステップサイズを用います。これは、モデルに対して高次の積分法を大きく変化するダイナミクスで利用するとき、高次の方法は余分な計算時間を必要とすることを意味します。代わりに、余計な計算時間によって、最初に高次の積分法から求められる精度の増加をさせない、大きいステップサイズの利用を余儀なくさせる場合があります。
一般的に方程式がスティッフである(すなわち、広範囲を変化する時間定数をもつシステム内のダイナミクスが大きいほど)と、利用しなければならない方法の次数は高くなります。
実際には、非常にスティッフな方程式のシミュレーションは、非常に低いサンプルレートを除いて、リアルタイムの目的用には現実的ではありません。リアルタイムプログラムで用いるモデルを実現する前に、Simulinkで固定ステップサイズの積分をテストして、安定性と精度をチェックすべきです。
線形システムに対して、シミュレート中のモデルを離散時間バージョンに、たとえばControl System Toolboxのc2d
関数を使って変換することは、より現実的です。
システム独立成分に対するアプリケーションモジュール
ode1.c
, ode2.c
, ode3.c
, ode4.c
, ode5.c
-- これらのモジュールは、リアルタイムアプリケーションに対してサポートされる積分アルゴリズムを実現します。これらの固定ステップソルバに関する情報は、Simulinkのドキュメントを参照してください。rt_sim.c
-- モデルの1時間ステップに対して必要なアクティビティを行います。モデル関数を呼び出して、システム出力を計算し、それから離散状態および連続状態をアップデートします。simstruc.h
-- Simulinkデータ構造体の実際の定義と、SimStruct
アクセスマクロの定義を含みます。simstruc_types.h
-- サブシステムのenable/disable、ゼロクロッシングのような様々なイベントの定義を含みます。データロギング変数も定義します。システム独立成分は、Simulinkデータ構造体(SimStruct
)を定義、作成、破棄するコードも含みます。プログラムに含まれるモデルコードとすべてのS-ファンクションは、それら自身のSimStruct
を定義します。
SimStruct
データ構造体は、ブロックパラメータや出力を含む、モデルまたはS-ファンクションに関連するすべてのデータをカプセル化しています。SimStruct
に関する情報は、Writing S-Functionsを参照してください。
![]() | ラピッドプロトタイピングシステム依存部分 | ラピッドプロトタイピングアプリケーション成分 | ![]() |