シェア変数ノードを使用して IO 変数にアクセスするときに、アクセススピードが遅いのはなぜですか?



使用ソフトウェア:
使用ソフトウェア・バージョン: 2009 SP1
使用ソフトウェア・バージョンに特化: N/A
二次のソフトウェア: N/A

問題:
シェア変数ノードを使用して IO 変数にプログラム的にアクセスしています。シェア変数の関数を使用してプログラム的に IO 変数にアクセスする場合、IO 変数ノードを使用する場合に比べてアクセススピードが大幅に低下します。どの様にプログラムすれば IO 変数へのプログラム的なアクセスの効率を上昇できますか。

解決策:
IO 変数へのプログラム的な書き込み、および読み取りを行う際、IO 変数への接続の「開く」および「閉じる」回数を最小限に抑える様プログラムしてください。多くのアプリケーションでは、プログラムの開始時点でシェア変数への接続を一度だけ開き、一度開いた接続をループ内部の処理など、アプリケーションのメインのタスク実行時に維持し、書き込み/読み取りを行い、メインタスク終了時に一度だけ接続を閉じます。この方法で IO 変数へのアクセス頻度が大幅に減少します。下記のスクリーンショットは上記の内容を実装したブロックダイアグラムです。IO 変数への接続をプログラムの開始時と停止時に一度だけ、開き、そして閉じる一方で、メインタスク実行時にはユーザが必要な回数だけ書き込み、および読み取りを行います。

cRIO-9074 と NI-9221 モジュールを使用した簡単なベンチマーク結果では、モジュール上の全ての 8 チャンネルへの接続を開き、8 チャンネル全てからデータを読み取り、接続を閉じる動作を行った場合、約 125 ミリ秒がかかります。一方、プログラムの開始時と停止時に一度だけ、全てのチャンネルへの接続を開き、そして閉じ、読み取りだけを繰り返した場合、一回の全てのチャンネルデータの読み取りは約 340 マイクロ秒になります。この値は毎回の読み取り毎にシェア変数への接続を開き、閉じた場合に比べて 368 倍、読み取りのスピードが向上した事になります。IO 変数への接続において最も時間が必要になる処理は IO 変数への接続を開き、閉じる際ということになります。

上記、シェア変数の関数を使用した連続読み取りの VI はこの技術サポートデータベース記事の下記にある添付よりダウンロードできます。このサンプルは CompactRIO で使用可能なアナログ入力モジュールのほぼ全てで使用できます。


関連リンク:
技術サポートデータベース 4SFAPFLF: LabVIEW 8.6のシェア変数マネージャがどこにありますか?

添付:
ProperAnalogSharedVariableAPIRead.vi




報告日時: 08/15/2009
最終更新日: 06/07/2017
ドキュメントID: 50EKA6MO