シェア変数の読み取りおよび書き込みをプログラム的に行う
- 更新日2025-08-27
- 8分で読める
多数のシェア変数にアクセスするアプリケーションがある場合は、シェア変数関数を使用してそれらのシェア変数をプログラム的に読み書きできます。このプログラミング技法では1つのシェア変数関数が複数のシェア変数にアクセスできるため、1つのシェア変数ノードが1つのシェア変数にしかアクセスできないシェア変数ノードを使用した手法よりも簡潔かつ拡張可能です。
- PSP変数―NI Publish-Subscribe Protocol (NI-PSP) を使用するネットワーク上にパブリッシュされるデータ項目。PSP変数の一般的な例としては、ネットワーク共有シェア変数、ネットワーク共有が有効なI/O変数、およびNI-DAQmx I/Oサーバを介してパブリッシュされたDAQチャンネルが挙げられます。
- I/O変数―NIスキャンエンジンを使用してシングルポイントI/Oデータにアクセスするシェア変数。
下の図は、シェア変数をプログラム的に読み取った後、それらの値を事前に割り当てられた配列に配置して処理する例を示しています。
この図では、以下のイベントが発生します。
- 「変数コンテナを検索」関数が、My Libraryにある倍精度データタイプのシェア変数すべてを検出し、refnum配列出力がそれらのシェア変数へリファレンスの配列を返します。
- 「変数接続を開く」関数が、変数識別子URLの配列を使用して各シェア変数の接続を開きます。エラーが発生するとForループは停止します。
- 「配列サイズ」関数が、シェア変数リファレンスの配列を使用して「変数コンテナを検索」が検出したシェア変数の数を計算します。
- 「配列初期化」関数が、シェア変数の数を使用してシェア変数データの配列を作成します。このアプリケーションは、Whileループの外側でシェア変数データの配列を初期化することにより、CPU使用率を最適化します。
- 「変数を読み取る」関数が、「変数接続を開く」関数が開いたシェア変数を読み取ります。
- 「部分配列置換」関数が、「配列初期化」関数が作成した配列にシェア変数データを保存します。
- [データ処理」サブVIが、シェア変数データの配列を処理します。
- エラーが発生するか、ユーザが停止ボタンをクリックするまで、読み取りおよび処理の操作は連続的に実行されます。
- 「変数接続を閉じる」関数が、シェア変数の接続を閉じます。
このアプリケーションは、機能面ではシェア変数ノードを使用したアプリケーションと同様です。しかし、このアプリケーションではプログラム的シェア変数アクセスが使用されているため、ブロックダイアグラムを更新することなく何百何千もの変数を追加することができます。たとえば、My LibraryにVariable1~Variable10までの10個の変数が含まれているとします。まとめて変数を作成ダイアログボックスを使用して、Variable11~Variable500をMy Libraryに追加できます。My Libraryのデプロイ後、次回VIを実行したときに、Variable1~Variable500が読み取られます。Variable11~Variable500をブロックダイアグラムに追加する必要はありません。
次のセクションでは、上の例で使用されたプログラミング技法の詳細について説明します。
シェア変数を検出する
「変数コンテナを検索」関数を使用して、特定の条件を満たすシェア変数と変数コンテナを検索します。たとえば、以下のブロックダイアグラムで示すVIでは、この関数を使用して以下の条件を満たすコンテナに含まれるシェア変数がすべて検索されます。
- ローカルコンピュータのMy Libraryにある
- 倍精度データタイプ
- 変数識別子URLに文字列「foo」が含まれている
| メモ 変数オブジェクトを参照ダイアログボックスを使用して、ネットワーク上または現在のプロジェクト内にあるシェア変数および変数コンテナを編集時に参照できます。変数制御器または定数 (上の図のコンテナrefnum入力定数など) のドロップダウン矢印をクリックし、参照を選択して変数オブジェクトを参照ダイアログボックスを表示します。 |
| 注意 プログラム的に検索するシェア変数を読み取りおよび書き込みする場合、間違ったデータタイプのデータを読み取りまたは書き込みしてしまう可能性があります。誤ったデータタイプのシェア変数の読み取りや書き込みを防止するには、「変数コンテナを検索」関数のデータタイプ入力を使用します。 |
また、以下の変数コンテナプロパティおよびメソッドを使用して、シェア変数をプログラム的に検索できます。
次の図にあるVIでは、すべての変数プロパティによってローカルネットワークでホストされているすべてのPSP変数を検索しています。
この図では、以下のイベントが発生します。
- ローカル変数エンジンリファレンス定数は、ローカルPSP変数エンジンのリファレンスをリモートエンジンプロパティに渡します。
- リモートエンジンプロパティは、ネットワーク上の他のコンピュータでホストされるPSP変数エンジンの配列を返します。そして、VIはForループで各PSP変数エンジンを反復します。
- ルートプロパティは、各リモートコンピュータ上のルートPSP変数コンテナのリファレンスを取得します。
- すべての変数プロパティは、各リモートコンピュータ上でホストされているすべての変数のリファレンスの配列を取得します。
- VIは、ネットワーク上で検出されたすべての変数をすべてのPSP変数配列に追加します。
| ヒント 前図のブロックダイアグラムを作成する際の開始点として、変数オブジェクトクラスとあらかじめ構成される変数プロパティノードを使用できます。 |
シェア変数接続を開く/閉じる
次のブロックダイアグラムに示されているように、「変数接続を開く」関数を使用して、変数への接続をプログラム的に開くことができます。
アプリケーションがシェア変数にアクセスを完了した後に、Forループ内で「変数接続を閉じる」関数を使用してすべての変数リファレンスを閉じます。この関数により、それぞれの変数接続に割り当てられていたメモリリソースが開放されます。
シェア変数を読み取る/書き込む
「変数を読み取る」関数を使用して、ライブ変数値をプログラム的に読み取ります。編集時に特定のシェア変数にバインドする必要があるシェア変数ノードとは異なり、「変数を読み取る」関数には、実行時に読み取るためにシェア変数を指定するシェア変数refnum入力が含まれます。たとえば、以下のブロックダイアグラムに示されているように、Forループ内で「変数を読み取る」関数を使用して、refnumの配列によって指定された複数のシェア変数を読み取ることができます。
「変数を書き込む」関数を使用して、ライブ変数値をプログラム的に書き込みます。たとえば、Forループ内で「変数を書き込む」関数を使用して、refnumの配列によって指定された複数のシェア変数を書き込むことができます。
| ヒント パフォーマンスを最適化してブロックダイアグラムを簡潔化するには、I/O変数コンテナを配列として読み取りまたは書き込みます。 |
| メモ 8キロバイト未満のデータのシェア変数に書き込む場合、LabVIEWによるネットワークでのデータ送信時間が最長10ミリ秒かかることがあります。この遅延を解消するには、「シェア変数データを排出」VIを使用して、シェア変数データを即時に送信します。 |