タスクの分離とは、特定のタスクを並列ループで実行してマルチレートアプリケーションを作成することを意味します。タスクの分離は、2つの理由から多くのリアルタイムアプリケーションで重要な鍵となります。

  • 確定性―確定的ループでジッタを最小限に抑えるには、ループに非確定的コードが1つも含まれないようにします。多くの大規模アプリケーションには非確定的タスクが含まれるため、RTアプリケーションでは、これらのタスクを特定して分離することが不可欠です。
  • CPU効率―RTターゲットではCPUサイクルが重要視されるため、CPU効率はRTアプリケーションにおいて一般的な設計制約です。タスクを別々のループで特定のレートで実行すると各タスクが必要な回数だけ実行されるため、CPU効率を最大化することができます。

タスクを定義する

コーディングを始める前に、アプリケーションで実行する必要があるタスク、各タスクの必須レート (該当する場合)、およびタスク間のデータ転送の関係を定義して、アプリケーションの高レベルな設計を十分に検討します。たとえば、RTアプリケーション要件には、以下のタスクが含まれる場合があります。

  • 制御―タンク内の液体の温度とレベルを制御します。このタスクの最小レートは1 kHzです。
  • ログ―収集データの温度とレベルの履歴をログします。このタスクの要件は、制御タスクにより集録されたすべてのプロセス変数値をログすることです。このタスクには最小レート要件がありません。
  • ネットワーク―ネットワークを介してユーザインタフェースデータやユーザコマンドを転送したり、ユーザが監視できる連続データのグラフを表示します。このタスクの最小レートは10 Hzです。

アプリケーションを構成する高レベルなタスクを定義した後、それらのタスク間のデータ転送の関係を定義します。たとえば、以下の図は、上記のリストで定義された3つのタスク例の間のデータ転送の関係を示します。

設計をLabVIEWのブロックダイアグラムに変換する

アプリケーションの高レベルな設計を定義したら、設計をLabVIEWコードへ変換します。たとえば、以下のブロックダイアグラムは、上記のセクションで定義された継続的タスクを含むトップレベルVIを示します。

メモ アプリケーションの大部分を構成する継続的タスクに加えて、上記のブロックダイアグラムにある初期化タスクやシャットダウンタスクを作成することをナショナルインスツルメンツは推奨します。

以下のブロックダイアグラムは、Control.viサブVIに含まれる制御ループを示します。

以下のブロックダイアグラムは、Log.viサブVIに含まれるデータロギングループを示します。

以下のブロックダイアグラムは、User_Interface.viサブVIに含まれるネットワークループを示します。

初期化ルーチンを作成する

継続的タスクを開始する前に実行する必要がある事前タスクを処理するために、初期化ルーチンを作成します。アプリケーションの特性に応じて、初期化ルーチンには以下の動作が含まれる場合があります。

  • シェア変数を初期化する
  • ファイルリファレンスを開く
  • 配列を事前に割り当てる

以下のブロックダイアグラムは、Initialize.viサブVIに含まれる初期化ルーチンを示します。

シャットダウンルーチンを作成する

ナショナルインスツルメンツは、RTターゲットの電源をオフにする前に、シャットダウン状態に切り替えることをお勧めします。RTターゲットがシャットダウン状態であることを確実にするには、継続的アプリケーションタスクの実行を停止した後に実行するシャットダウンルーチンを作成します。アプリケーションの特性に応じて、シャットダウンルーチンには以下の動作が含まれる場合があります。

  • 出力を既知の値に設定する
  • ファイルリファレンスを閉じる
  • ネットワーク共有シェア変数または「RT LED」VIを使用して、RTターゲットの電源を切断できるかどうかをオペレータに通知する
メモ RTターゲットでRelianceファイルシステムが使用されている場合でも、ファイルが開いている時にターゲットの電源をオフにするとデータが破損する可能性があります。Relianceは、このような場合にファイルシステム自体は保護しますが、RTターゲットの電源が切られた時に開いていた各ファイルの保護は保証しません。

以下のブロックダイアグラムは、Shutdown.viサブVIに含まれるシャットダウンルーチンを示します。