Real-Time Workshop User's Guide    

リアルタイムでの遅いブロックから速いブロックへの遷移

遅いブロックが速いブロックを駆動するモデルでは、生成コードは、速いブロックに遅いブロックよりも高い優先度を割り当てます。これは、速いブロックが遅いブロックより前に実行されることを意味します。間違った結果を防ぐためには注意が必要です。

図 7-9: 遅いブロックから速いブロックへの遷移の時間のオーバラップ

タイミングを表わす図は、つぎの2つの問題点を説明しています。

  1. 遅いブロックの実行は、2つ以上の速いブロックの実行間隔に分割されます。この場合、速いタスクは、遅いタスクの実行が終了する前に2回実行します。これは、遅いタスクへの入力が変化し、予期せぬ結果になることを意味します。
  2. 速いブロックは遅いブロックよりも先に実行します(Simulinkの実行方法と反対です)。この場合、1秒のブロックが最初に実行します。しかし、速いタスクへの入力は計算されていません。これは、予期せぬ結果になる場合があります。

これらの問題を回避するためには、遅いブロックと速いブロックの間にUnit Delayブロックを挿入しなければなりません。Unit Delayブロックのサンプルレートは、それを駆動するブロック(遅いブロック)のサンプルレートに設定しなければなりません。

つぎの図は、Unit Delayブロックを加えたときのタイミングを示したものです。

この図について重要な3つのポイントがあります。

  1. Unit delayの出力は、1秒のタスクで実行しますが、そのレート(2秒)のみ実行します。unit delayブロックの出力は、1秒のタスクブロックをフィードします。
  2. unit delayの更新は、内部状態の更新において2秒のタスクの出力を利用します。
  3. unit delayの更新は、1秒のタスクのunit delayの状態を利用します。

Unit Delayブロックの出力部分は、遅いブロックのサンプルレートで実行されますが、速いブロックの優先度をもちます。Unit Delayブロックは速いブロックを駆動し、同じ優先度をもつので、速いブロックよりも前に実行されます。これにより、最初の問題が解決します。

Unit Delayブロックが遅いレートで実行し、速いブロックの計算の実行中に出力が変化しないので、2番目の問題は改善されます。


 Simulinkでの遅いブロックから速いブロックへの遷移 コード生成に対するモデルの最適化