このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
時間ベースのスケジューリングとコード生成
サンプル時間と、状態を計算するブロック
Simulink® モデル内のブロックのサンプル時間は、ブロックがいつ出力を生成するかを指定し、必要に応じて、シミュレーション中または生成されたコードの実行中に内部状態を更新します。ブロックの内部状態には、Simulink で計算およびログ記録された連続状態と離散状態が含まれますが、これらに限定されません。離散状態を定義するブロックの場合、Simulink は各タイム ステップにおける状態の値を計算します。連続状態を定義するブロックは、内部状態値の計算に数値積分を利用します。モデルには、連続ブロック、離散ブロック、または連続ブロックと離散ブロックを含めることができます。両方のタイプのブロックを含むモデルはハイブリッド システムです。
通常、連続ブロックは、可変ステップを使用して積分形式で方程式をモデル化し、シミュレーションの精度を制御できるようにする場合に使用します。MathWorks® では、セーフティ クリティカルなアプリケーションの場合は特に、量産コードを生成するモデルで連続ブロックを使用することはお勧めしません。連続ブロックは数値積分を利用して連続状態を計算します。これは、ソフトウェア実行の確定性および生成されたコードの実行レートの数値精度に影響を及ぼす可能性があります。必要な結果が得られたら、連続ブロックを離散ブロックに変換できます (離散化を参照)。離散ブロックは、固定ステップ サイズがわかっているため、ステップ数が予測可能です。
Embedded Coder® は、連続ブロックの使用を既定でサポートしていません。また、サービス コード インターフェイスを使用するように構成されたモデルでもサポートしていません。
[システム ターゲット ファイル] が ert.tlc
に設定されている場合など、Embedded Coder を使用して連続ブロックを含むモデルからコードを生成する場合は、モデル コンフィギュレーション パラメーター [サポート] の [連続時間] (Embedded Coder) を選択します。
コードを生成するモデルでの Continuous ブロックと Discrete ブロックの使用の詳細については、次のページを参照してください。
Continuous および Discrete ブロック ライブラリのブロックのリストについては、ContinuousおよびDiscreteを参照してください。
コード生成向けにサポートされているブロックでは、コード生成を目的としたモデルで使用できる Simulink 組み込みブロックおよび製品固有のブロックセット ブロックに関する情報を取得する方法について説明しています。
モデルから行優先のコードを生成する場合は、行優先のコード生成でサポートされていないブロックを参照してください。
連続ブロックを含む起動バリアント ブロックのバリアント選択のコードを生成する場合は、Run Executables for Variant Blocks Without Recompiling Code for Changing Active Choices Using Startup Activation Time (Embedded Coder)を参照してください。
カスタム システム ターゲット ファイルで連続時間をサポートするには、システム ターゲット ファイルのカスタマイズの説明に従ってシステム ターゲット ファイルを変更する必要があります。
マルチレート システムとレート変換
ブロックの計算と実行のレートを制御するブロック サンプル時間を設定することにより、シングルレートおよびマルチレートの離散システム、およびハイブリッドの連続/離散システムをモデル化できます。Simulink では、マルチレート システムをかなり柔軟に設計できます。マルチレート モデルがリアルタイムで期待どおりに動作するようにするには、モデルは、異なるサンプル時間を使用するように構成されたブロック間のレート変換を処理する必要があります。
既定では、モデルに保護されていないレート変換が含まれている場合、Simulink エンジンはシミュレーション中にエラーを返します。診断モデル コンフィギュレーション パラメーター [マルチタスク データ転送] を使用して、無効な変換を検出した後に Simulink エンジンが警告を表示してエラーを返すかどうかを指定します。
レート変換エラーが発生しないようにするには、異なるサンプル時間を使用するように構成されたブロック間に Rate Transition ブロックを挿入します。Rate Transition ブロックを明示的に挿入することもできますし、Simulink エンジンがブロック線図の更新中に不一致のレート変換を検出し、非表示の Rate Transition ブロックを挿入するようにモデルを構成することもできます。Simulink エンジンにブロックを挿入するように指示するには、モデル コンフィギュレーション パラメーター [データ転送に対するレート変換を自動的に取り扱う] を選択します。
レート変換の検出と処理の重要性を理解するには、Simulink シミュレーションがリアルタイムのプログラム実行とどのように異なるかを考えてください。
モデル シミュレーション中のレート変換
モデルをシミュレートする前に、Simulink エンジンは、位相的依存関係に基づいてモデル内のブロックの順序を決めます。このとき、バーチャル サブシステムは、これらがもつ個々のブロックに展開され、モデルが 1 つのリストにフラット化されます。この手順が完了すると、各ブロックは指定された順序に従って実行されます。
このプロセスでは、ブロックの順序が重要です。ブロック入力に直接依存している出力を生成するブロック (すなわち、直達のあるブロック) は、入力を駆動するブロックが実行されるまで実行できません。
リアルタイム プログラム実行中のレート変換
リアルタイム プログラムは、このプログラムがモデル コードをリアル タイムで同期して実行しなければならないという点において、Simulink シミュレーションと異なります。すべての計算で、若干の計算遅延が発生します。すなわち、実行が非効率になるため、サンプル間隔を短縮または延長できません (Simulink シミュレーションでは可能)。レート変換は、複数のタスクが同じデータに同時にアクセスする可能性がある場合に重要です。
次のタイミング図について考えます。
図で、t0
、t1
、および t2
とラベル付けされた垂直線は、サンプル時間のヒットを示しています。青色の領域は、Simulink エンジンによる実行を表しています。空白は、プロセッサがアイドル状態である時間を示しています。
時間 t1
から t2
までのサンプル間隔で処理の非効率が発生しています。定義上、サンプル時間がリアル タイムで指定されるため、この間隔を圧縮して、実行速度を上げることはできません。
モデルのコード生成をマルチタスク モードで構成することで、この非効率性を解消できます。マルチタスク モードで定義されるタスクは、サンプル レートが異なるモデル コードの一部を実行するための優先順位が異なります。タスク モードを参照してください。
離散化
離散化は、連続ブロックを同等の離散ブロックに置き換えるプロセスです。モデルに連続ブロックが含まれていて、量産コードを生成するか、ハードウェアインザループ (HIL) シミュレーションを実行する準備ができている場合は、モデルを離散化するための次のオプションを検討してください
Version 5.2 以降の Control System Toolbox™ ライセンスをお持ちの場合は、Simulink モデルの離散化アプリを使用して以下を行います。
モデル内の連続ブロックを特定する。
ブロック パラメーターを連続から離散に変更する。
離散化設定を連続ブロックに適用する。
複数の離散化候補と元の連続ブロックを含むバリアント サブシステムを作成する。
離散化候補を切り替えて、モデルのシミュレーション結果を評価する。
例については、モデルの離散化ツールでのモデルの離散化を参照してください。
Control System Toolbox または System Identification Toolbox™ のライセンスをお持ちの場合は、
c2d
関数を使用して状態を離散化してから、その離散状態をモデルに配置します。
タスク モード
固定ステップ ソルバーを使用するように構成されたモデルの場合、コード ジェネレーターは、周期的なサンプル時間に対してシングルタスクとマルチタスクという 2 つのタスク モード (実行モード) をサポートしています。シミュレーション中、モデルはシングルタスク モードでのみ実行されます。2 つのモードを切り替える方法については、Configure Tasking Modeを参照してください。
シングルタスク モード
シングルタスク モードでモデルを設定すると、以下のようになる場合があります。
モデルを単純化する。
実行速度に悪影響を及ぼす。
シングルタスク モードでは、モデルの基本サンプル レートは、時間間隔内でモデルの 1 つのステップ (つまり、モデル内のすべてのブロック) を実行するのに十分な長さの時間間隔を定義する必要があります。
次のタイミング図は、シングルタスク モードを使用している場合に固有の非効率性を示しています。
図で、t0
から t4
とラベル付けされた垂直線は、サンプル時間のヒットを示しています。青色の領域は、Simulink エンジンによる実行を表しています。空白は、プロセッサがアイドル状態である時間を示しています。
シングルタスクの実行の詳細と例については、Tasking Modes and Execution Orderを参照してください。
マルチタスク モードと疑似マルチタスク モード
マルチタスク モードで周期的タスクを実行すると、既定では、サンプル レートが最も速いブロックが最も高い優先順位をもつタスクとして実行され、次に速いブロックが次に高い優先順位をもつタスクとして実行され、以降同様に繰り返されます。優先順位が低いタスクは、優先順位が高い複数のタスクの処理の間に処理されます。このように、より効率的にプログラムが実行されます。
タスクが周期的ではなく非同期の場合、サンプル レートとタスクの優先順位に関係性がないことがあり、優先順位が最も高いタスクのサンプル レートが最も速いとは限りません。非同期タスクの優先順位の数値を指定するには、Async Interrupt ブロックと Task Sync ブロックを使用します。優先順位の数値の意味 (つまり、優先順位が高いタスクに対応するのが、優先順位の数値が大きい方なのか小さい方なのか) を切り替えるには、モデル コンフィギュレーション パラメーター [優先順位の値が高いほどタスクの優先順位が高いことを示す] を選択または選択解除します。
リアルタイム オペレーティング システムを含むマルチタスク環境では、個々のタスクを定義して、優先順位を割り当てることができます。リアルタイム オペレーティング システム以外のシステムを使用しているベアメタル ターゲット ハードウェアでは、個別のタスクを作成することはできません。ただし、生成されたアプリケーション モジュールでは、割り込みのオーバーラップとプログラムによるコンテキスト スイッチを使用して実質的にマルチタスクの実行スキームを実装します。
すなわち、ある割り込みの処理中に別の割り込みが発生する場合があるということです。この場合、現在の割り込みがプリエンプトされ、浮動小数点演算装置 (FPU) のコンテキストが保存されます。優先度の高い割り込みが、優先度の高い (つまり、より高速のサンプル レートの) コードを実行します。完了すると、制御権はプリエンプトされた割り込みサービス ルーチン (ISR) に戻ります。
次の 2 つのタイミング図は以下のとおりです。
t0
からt4
とラベル付けされた垂直の実線は、サンプル時間のヒットを示しています。青色の領域は、Simulink エンジンによる実行を表しています。
空白は、プロセッサがアイドル状態である時間を示しています。
斜線の入った領域は、優先順位の高いタスクによるタスクのプリエンプションを示しています。
垂直の点線と下向きの矢印は、CPU の制御権が優先順位の低いタスクに渡されることを示しています。
垂直の点線と上向きの矢印は、優先順位の高いタスクによるプリエンプションを示しています。
次の図は、マルチレート システムのタスクのタイミングがマルチタスク環境でどのように処理されるのかを示しています。
次の図は、割り込みのオーバーラップによる疑似マルチタスクの実装を示したものです。この場合、割り込み 0 は、割り込み 1、2、および 3 の実行が完了するまで返されません。太い線は割り込みの実行パスを示しています。
メモ
マルチレートでマルチタスクを使用しているモデルは、シングルタスクを使用しているマルチレート モデルを参照できません。
マルチタスクの実行と例については、Tasking Modes and Execution Orderを参照してください。
タスクに関する考慮事項
シングルタスク プログラムでは、すべての計算が各クロック期間内に実行されなければならないため、より長いサンプル間隔を必要とします。このため、有効な CPU 時間が効率的に使用されない場合があります。
モデルが大規模で、さまざまなレートで実行されるブロックが多数ある場合、マルチタスク モードによりプログラムの効率が向上します。
モデルが単一レートで指定され、より遅いレートで実行されるブロックが非常に少ない場合は、マルチタスク モードを指定すると、パフォーマンスが低下することがあります。タスクの切り替えによるオーバーヘッドが、より遅いレートのブロックを実行するときに必要な時間より大きくなる場合があります。このような場合、すべてのブロックを主要なレートで実行すると効率が改善します。
モデルでマルチタスク実行の恩恵を受けることができる場合は、Rate Transition ブロックを追加して (または、同様の処理が行われるように Simulink エンジンに指示して)、期待した結果を得ます。