LabVIEWを触ったことがない方に向けて、それなりのプログラムが書けるようになるところまで基本的な事柄を解説していこうという試みです。
シリーズ28回目としてシェア変数の紹介です。
この記事は、以下のような方に向けて書いています。
- PC間でデータを転送したい
- シェア変数の使い方を知りたい
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
シェア変数とは
前回の記事で、他のデータタイプに化けられる、バリアントデータタイプを紹介しました。簡単なプログラムであれば使う場面が少ないと思いますが、ある程度規模の大きいプログラムだと使う場面が出てくる、変わった(?)データタイプです。
今回の記事ではシェア変数を紹介します。
「変数」と名の付くものはこれまでにも紹介してきました。ローカル変数、グローバル変数、これらとは毛色が少し違いますが機能的グローバル変数なんてのも「変数」に該当します。
シェア変数も変数と名がついているのでこれらと使い方が似ている部分があるのですが、決定的に違うのは、「異なるPC間でデータをやりとりする変数」になっていることです。
これまでのデータタイプは全て、一つのPC環境上の話であって、同じvi内や異なるviどうしでデータをやりとりするものでした。それが、PCの枠を飛び出して、PC間でデータをやりとりするというのが今回のシェア変数です。
(ただしシェア変数でも同一PC内の複数のviどうしでもデータのやりとりはできます)
シェア変数は結構奥が深いです。シェア変数自体の設定がいくつかあり、最初からそれらの設定を使いこなそうとすると難しかったりします。
そこで今回の記事では、個人的に比較的簡単、というか何をやっているのか直接的に分かりやすいと思われる方法でシェア変数を用いてPC間でデータのやり取りをする方法を紹介しようと思います。
シェア変数の作り方
シェア変数のオーソドックスな作り方は、プロジェクトエクスプローラから用意する方法です。
プロジェクトエクスプローラを用意したらマイコンピュータの項目で右クリック、新規から変数を選択して作ることができます。
シェア変数自身も数値や文字列などといったデータタイプを持ちますが、これは作成時に決めることができます。
シェア変数プロパティの画面の右側に並んでいるいろいろな項目、使いこなせると色々できると思いますが、「変数」の項目でデータタイプを決めるだけでPC間の通信はできるので、ただただデータを通信させたいということであればひとまずはデータタイプを決めるだけで十分だと思います。
試しに、Stringという文字列のシェア変数を作ってみます。
シェア変数を作ると、プロジェクトエクスプローラ上に名称未設定ライブラリというものができあがり、プロジェクトを保存しようとすると、このライブラリに名前を付けるように促されます。
これは大雑把に、シェア変数をまとめて管理しておくためのものと思ってください。後で実際に通信する際に選択することがあるため、わかりやすい名前にしておけばいいと思います。今回はとりあえず、testsharedvariablesという名前のライブラリにしました。
この後、ライブラリを右クリックして新規で変数を作ると、同じライブラリに別のシェア変数を追加することができます。というわけでTextというもう一つの文字列のシェア変数、そしてNumbersという倍精度数値の配列のシェア変数も作ってみます。
シェア変数の用意はこれで終わりです。
シェア変数の読み書きをプログラム的に行う
シェア変数の基となる部分はこれで用意できたので、次はこれをプログラム上でどう扱うかを紹介します。以下ではまず簡単な確認として、一つのPC環境内での操作になります。
いくつかの関数を使うものの明示的にどのシェア変数を相手にしているかわかりやすい方法がいいと思います。で、そんな方法がシェア変数関数を使用するやり方です。
シェア変数関数は関数パレットのうちデータ通信のパレットの中にあります。
シェア変数の相手が分かっている場合だともう少し使用する関数は少なくなるのですが、まずは準備の段階として以下のように関数をおいていきます。このviはmain.viと呼ぶことにします。
関数を配置しそのままワイヤ配線しただけではつながらない部分があるので、PSP変数という指定を変数コンテナを検索の関数のクラス入力に作成してやります。
次に、使用したいシェア変数のデータタイプを指定します。今回は試しに文字列データのシェア変数(先ほど作成したStringとText)を使用することを考えます。
変数コンテナを検索の関数のデータタイプ入力に文字列データの定数を配線します。
この時点で、試しに紫色のコンテナrefnum入力に対して定数を用意し、プルダウンメニューから、「参照」してみます。
すると、接続できる相手がリストされます。今はまだ一つのPCでしか操作をしていないので、localhostというものが表示される状態になっているはずです。(環境により、下の図の右側に示している変数オブジェクトを参照のウィンドウの中身は異なる見た目をしているかもしれませんが)
このmain.vi以外にもう一つ、次のようなVIを用意します。名前はsharedexample.viとしておきました。
プロジェクトエクスプローラからStringのシェア変数をsharedexample.viのブロックダイアグラムに配置します。
書き込みの状態にしてから適当な値を何度も書き込めるよう、Whileループと文字列制御器を用いてプログラムを書いたら、これを実行してみます。
すると、普段viを実行するときには見かけない、デプロイメント進行状況なるウィンドウが表れます。大雑把に、シェア変数を使用する準備をしていると思っておけば問題ないです。
デプロイは正常に完了しましたと表示されたら成功です。
ただ、場合によってはデプロイメントに失敗するケースがあります。
私がよく引っかかるのは、ネットワークセキュリティに関するソフトによってこの「デプロイ」がブロックされる状態です。例えばWindowsのFirewallがこれにあたります。シェア変数を扱うときにはFirewallを無効にしてしまうのが手っ取り早いです。
また、VPNなどに接続している場合にも引っかかることがあります。アクセスしようとしているPCへのアクセス方法にVPNが関係していない場合にはVPN接続を解除して試してみてください。
とりあえずはデプロイが正常に完了したとして次に進みます。
sharedexample.viを実行することでデプロイがされた状態で、main.viに戻り、先ほどのコンテナrefnum入力の定数を参照すると、localhost内にシェア変数ライブラリ(testsharedvariables)が表示されるのでこれを選択します。
要は、この時点で「localhost内でデプロイされたtestsharedvariablesのライブラリにあるシェア変数にアクセスする」準備ができたことになり、変数コンテナを検索の関数によってそのライブラリの中で指定されたデータタイプ(変数コンテナを検索の関数に渡している定数。今回で言えば文字列)のシェア変数が検索されます。
main.viを実行すると、シェア変数リストには、指定されたシェア変数ライブラリ中にある文字列データのシェア変数の名前が表示されます。
また、変数を読み取るの関数からは、sharedexample.viでStringの文字列制御器に対して入力された値が出力されることが分かります。
今のsharedexample.viはStringのシェア変数しか使用していないので、シェア変数ライブラリにはTextという別の文字列シェア変数があるものの、main.viには何のデータも渡っていない状態となっています。
さて、これでシェア変数により、まずは同一PC内の異なるvi間でデータをやり取りすることができました。
なお、上の方法でシェア変数リストに表示されるようになった値を指定すると、今度は変数コンテナを検索なんていれなくてもプログラムを作れるようになります。特定のシェア変数だけ調べたい場合にはこの方法が使えます。
複数のシェア変数にアクセスする場合にはそれぞれで変数接続を開きます。
ただし、上で作ったmain.viを編集する過程で、変数接続を開くおよび変数を読み取るの関数の並びをコピペしてもう一つの文字列のシェア変数(Text)用の変数接続を作るのは問題ないのですが、数値配列のシェア変数を作るには新規で変数接続を開くほうが無難です。
その後、変数接続を開くの関数に対して、その接続で扱うシェア変数のデータタイプを定数として入力することで、変数を読み取るの関数もそのデータタイプを出力できるようになります。
あるいは、コンテナrefnumの定数自体にデータタイプの情報を持たせることができます。
下記の要領で定数のプロパティを開いて「構成」からデータタイプを指定します。
さて、まず肩慣らしとして同一PC内でシェア変数を使用する手順としてはこんな感じです。
異なるPC間で通信する
ひとまずは同一PC内の二つのvi間でデータをやりとりすることができるのは確かめられたので、次は別々のPC間でデータを通信させてみます。
が、実はやることは上で説明したこととほとんど変わりません。
今回は簡単のために、シンプルに同じプロジェクトを別々のPCに用意します(片方のPCで作成したプロジェクトを丸々もう片方のPCに移します)。
どちらかのPCでmain.viを、もう片方でsharedexample.viを動かすことに決めたら、sharedexample.viを動かすPCでviを実行します。すると、上で紹介した同一PC内でsharedexample.viを実行したときと同じようにデプロイが始まります。
これが終わると、main.viを実行する方のPCでは、localhost以外の新たな接続先が選択できるようになっているのでこれを選択します。
新たな接続先は、固有のPC名です(今まであったlocalhostは自分自身のことですね)。
もしlocalhost以外の項目が出てこない場合には、以下のトラブルシュートを試してみます。
- シェア変数を一度デプロイ解除してもう一度デプロイしてみる
- 同じネットワーク下にあるか確認するために、片方のPCからもう片方のPCへ、コマンドラインからPingを送り応答があるか確認する
- WindowsのFirewallやその他セキュリティソフトの設定を変更する(無効など)
main.viから、他のPC上で実行されているsharedexample.viのシェア変数ライブラリを指定できるようになったらもうあとは同一PC内でシェア変数を使っているのと同じノリでデータのやりとりを行うことができます。
シェア変数のトラブルシュート
上記の内容でうまくいけたらいいのですが、例えば以下のようなプログラムだとうまくシェア変数の読み書きができなかったりします。
詳しい理由はわからないのですが、どうやらシェア変数への値の書き込みが早すぎるとダメみたいです。繰り返し処理で使っている場合には、例えば100ミリ秒などに設定した待機時間の関数を設けて使用することで安定的に通信できるようになります。
また、そもそもシェア変数がちゃんとデプロイされているかどうかをLabVIEWのプログラム以外で、確認することができるソフトがあります。それが、分散システムマネージャです。
LabVIEWをインストールしているとこれも入っていると思うので、このソフトを起動してみます。
すると、以下の図のように、接続できうるシェア変数の一覧を確認することができます。
プログラムでアクセスできないシェア変数がある場合には、この分散システムマネージャを使って、ちゃんとデプロイがされているかどうかを確かめてみてもいいかもしれません。
この記事では、「変数」の中でも特殊な使い方をする、シェア変数について紹介しました。この方法が分かれば、一つのPCという狭い(?)領域を飛び出し、別のPCとも通信ができるようになります。例えば、なにか測定を行っているPCがあって、それを別のPCでモニターする、みたいなことですね。
PC間でデータをやり取りする方法自体は他にもあるので、そのうちそれらも紹介しようと思います。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント