RTターゲットでデータをローカル共有する(Real-Timeモジュール)



アプリケーションに複数あるタスクをブロックダイアグラムのタイミングループ優先度の異なるVIによって分割した場合、ブロックダイアグラムのループ間やRTターゲットのVI間でデータの共有が必要な場合があります。1つのVI内、またはRTターゲットで実行される複数のVI間でデータを共有するには、シェア変数とReal-Time FIFO VIを使用してください。

メモ  グローバル変数機能的グローバル変数を使用してデータをローカルで共有することもできます。ただし、これらの方法ではデータを損失したり、確定性が損なわれるおそれがあります。

単一プロセスシェア変数

1つのブロックダイアグラム内の2点間、またはRTターゲットで実行されるVI間でデータを共有するには、単一プロセスシェア変数を使用します。プロジェクトエクスプローラウィンドウでRTターゲットを右クリックし、ショートカットメニューから新規→変数を選択して、シェア変数プロパティダイアログボックスを開きます。このダイアログボックスで単一プロセスシェア変数を作成します。

Real-Timeモジュールをインストールすると、シェア変数にReal-Time FIFO(First-In-First-Out)バッファリング機能が追加されます。シェア変数のReal-Time FIFOを有効にすることにより、RTターゲットで実行するVIの確定性を損なうことなくデータを共有できます。シェア変数のReal-Time FIFOを有効にするには、シェア変数プロパティダイアログボックスのRT FIFOページでRT FIFOを有効チェックボックスをオンにします。

単一プロセスシェア変数のReal-Time FIFOを有効にすると、データを簡単かつ確定的に受け渡しできます。

メモ  波形データタイプのシェア変数でReal-Time FIFOを有効にすると、波形のバリアント要素はサイズが可変でありReal-Time FIFOと互換性がないため、転送されません。

RT FIFO関数

RT FIFO関数を使用して、RTターゲット上で実行するVI間のデータ共有を行います。RT FIFOはサイズが固定されたキューのような役目を果たします。FIFOに最初に書き込まれた値は、FIFOから最初に読み取られる値となります。RT FIFO関数は、共有データにサイズ制限を課し、データ用にメモリをあらかじめ割り当てることで確定性を保証します。RT FIFOでは、要素の数とサイズを指定し、サイズが異なるデータの読み書きが行われないようにする必要があります。

新しいFIFOを作成したり、既存のFIFOへのリファレンスを作成するには、「RT FIFO作成」関数を使用します。FIFOのデータの読み取りまたは書き込みには、「RT FIFO読み取り」関数と「RT FIFO書き込み」関数を使用します。RT FIFOへのリファレンスを削除したり、RTターゲットでFIFOに割り当てられたメモリを解放するには、「RT FIFO削除」関数を使用します。

メモ  Real-Time FIFOを使用して波形データを転送すると、波形のバリアント要素は転送されません。これは、バリアントはサイズが可変であり、Real-Time FIFOと互換性がないためです。

Real-Time FIFOの読み取り/書き込みモードを定義する

RT FIFOは、書き込み操作で書き込む領域が空くまで、または読み取り操作で値が読み取り可能になるまで待機します。RT FIFO関数では、読み取り/書き込みモードの指定が可能です。これにより、FIFOが空の場合の値の読み取りや、空き領域がない場合のFIFOへの値の書き込みの方法を決定することができます。読み取り/書き込みモードには以下のいずれかを指定できます。

ポーリング―読み取り/書き込み処理のパフォーマンスを最適化するには、このモードを使用します。ポーリングモードでは、FIFOの新しいデータや空き領域を確認するために継続的にポーリングが実行されます。ポーリングモードは、ブロックモードよりも早く新しいデータや空きスロットに反応しますが、より多くのCPUオーバーヘッドが発生します。「RT FIFO読み取り」関数や「RT FIFO書き込み」関数のタイムアウト(ms)入力を使用して、書き込み操作で空き領域をポーリングする制限時間、または読み取り操作で新しいデータをポーリングする制限時間を指定します。「RT FIFO書き込み」VIのタイムアウト時に上書き入力を使用して、タイムアウト(ms)入力で指定した時間が経過した場合に、一番古い値を上書きするかどうかを指定することもできます。

ブロック―読み取り/書き込み処理中にCPU使用率を最適化するには、このモードを使用します。ブロックモードでは、待機中にVIのスレッドがスリープ状態となり、システム内の他のタスクの実行を許可します。「RT FIFO読み取り」関数や「RT FIFO書き込み」関数のタイムアウト(ms)入力を使用して、読み取り操作で新しい値を待機する時間、または書き込み操作で空き領域を待機する時間を指定します。「RT FIFO書き込み」VIのタイムアウト時に上書き入力を使用して、タイムアウト(ms)入力で指定した時間が経過した場合に、一番古い値を上書きするかどうかを指定することもできます。

メモ  「RT FIFO作成」関数を使用して既存のRT FIFOのリファレンスを返す場合、そのリファレンスは既存のFIFOの読み取り/書き込みモードを継承し、r/wモード入力によるモードの指定は無視されます。

RT FIFO関数を使用して、大型アプリケーション用に拡張性のあるブロックダイアグラムを作成する

大型アプリケーション用に拡張性のあるタスク間の通信アーキテクチャが必要な場合、「RT FIFO作成」関数を使用してRT FIFOをプログラムで作成します。たとえば、Forループ内で「RT FIFO作成」関数を使用して、必要な数のRT FIFOを作成することができます。次に、「RT FIFO読み取り」および「RT FIFO書き込み」関数を使用すれば、すべてのRT FIFOからの読み取りとRT FIFOへの書き込みを連続して行うことができます。この方法を使用すると、ブロックダイアグラムを管理しやすいサイズに維持しながら、必要な数のRT FIFOを使用できるようにアプリケーションを拡張することが可能です。

ヒント  読み取り/書き込み処理のスループットパフォーマンスを最適化するには、「RT FIFO作成」関数のポーリングモードを使用します。CPUオーバーヘッドを最小化するために、ブロックモードを使用します。ポーリングモードでは、FIFOの新しいデータや空き領域を確認するために継続的にポーリングが実行されます。ポーリングモードは、ブロックモードよりも早く新しいデータや空きスロットに反応しますが、より多くのCPUオーバーヘッドが発生します。マルチCPUシステムでは、ポーリングモードを使用し、ポーリングRT FIFO関数を専用CPUに割り当てることをお勧めします。

グローバル変数

グローバル変数を指定して、VI間で少量のデータを受け渡しすることができます(例: タイムクリティカルVIと優先度が低いVIの間など)。グローバル変数は、スカラデータなど32ビット以下のデータを確定的に共有するために使用します。ただし、サイズが大きなデータタイプのグローバル変数は、タイムクリティカルVIで慎重に取り扱う必要がある共有リソースです。32ビットを超えるデータタイプのグローバル変数を使用してデータをタイムクリティカルVIの外へ渡す場合、タイムクリティカルVIがグローバル変数に次のデータを書き込む前に、優先度が低いVIが確実に値を読み取るようにする必要があります。

グローバル変数は、データが読み取られる前に次のデータで上書きされる可能性があるため、損失が多いデータ通信方法といえます。優先度が低いVIのタスクは、別のVIのタスクによってデータが上書きされる前にデータを読み取るためのプロセッサ時間を確保できない可能性があります。

機能的グローバル変数

VI間でデータをやり取りするには、機能的グローバル変数を使用します。機能的グローバル変数は、優先度がサブルーチンに設定されたサブVIです。このサブVIには、読み取り/書き込み処理のケースストラクチャがネストされたWhileループが含まれています。以下のブロックダイアグラムは、機能的グローバル変数のケースストラクチャの読み取り/書き込みケースを示しています。

Whileループには、データ保存用の初期化されないシフトレジスタがあります。機能的グローバル変数の使用時は、上記のブロックダイアグラムで示すように、モード入力パラメータによってVIが実行するタスクを指定します。以降、機能的グローバル変数を呼び出すと最新のデータにアクセスできます。機能的グローバル変数は、キューのような働きをし、シフトレジスタを追加することで1つ以上の履歴データを保存することができます。複数のシフトレジスタを追加して、複数のデータセットを渡すことができます。

機能的グローバル変数は、グローバル変数とは異なり、共有リソースとならないように実装することができます。優先度がサブルーチンに設定されているサブVIを右クリックして、ショートカットメニューからビジー状態時はサブルーチンの呼び出しをスキップを選択すると、そのサブVIが別のスレッドで実行中の場合は実行システムによってスキップされます。タイムクリティカルVIでサブVIをスキップすると、サブVIを待機せずに済むため有益です。スキップされたサブVIは、表示器のデフォルトの値を返します。機能的グローバル変数の実行を検出するには、機能的グローバル変数のブロックダイアグラムでブール出力にTRUE定数を配線し、表示器のデフォルト値をFALSEに設定します。ブール出力からTRUEが返されると、機能的グローバル変数が実行されたことになります。ブール出力からデフォルト値であるFALSEが返されると、機能的グローバル変数は実行されていないことになります。機能的グローバル変数はタイムクリティカルVIではスキップし、優先度が低いVIではスキップしないでください。優先度が低いVIでは、デフォルト値以外を受け取るまで待機して問題ありません。

シフトレジスタの値が読み取られる前に上書きされる可能性がある機能的グローバル変数は、データ損失が発生する可能性があります。

「データ通信方法」ホーム



この記事は役に立ちましたか。

役に立たなかった