この記事では、PythonからLabVIEWのコードにアクセスして使用する方法について紹介しています。
なお、おそらくより一般的な方法である、LabVIEWでDLLを作ってこれをPython内で呼び出して使用する方法については本記事では扱っておらず、urllibモジュールを使用してHTTP通信でLabVIEWにアクセスする方法の紹介となっています。
この逆で、PythonのコードをLabVIEW内で使用する方法については別記事で紹介しています。
他言語からLabVIEWへアクセス
LabVIEWはグラフィカルプログラミング言語という特徴によりプログラミング初心者の方でも習得に多くの時間をかけることなくそれなりにプログラムが書ける言語だと思います。
ただ、それぞれのプログラミング言語にはそれぞれの特徴があり、得意な操作や関連ライブラリの豊富さが異なるため、どれが総合的に優れているといったことはなく、LabVIEWよりも他の言語が使いやすい、といった場面も当然あると思います。
それぞれの言語でやりやすいことがあるのであれば、複数の言語にまたがり、いいとこどりをしてプログラムを作れればそれに越したことはないですよね。
LabVIEWの場合、他の言語をLabVIEWに取り込むのであれば、他の言語で作ったプログラムをDLL化して呼び出すという方法があります。また、Pythonについては専用のPythonノードを使用して関数を呼び出すこともできます。
逆に、他の言語からLabVIEWのプログラムを呼び出す場合にも事情は似ていて、基本的にはLabVIEWプログラムをDLL化し、これを呼び出すという方法がまずは一般的かなと思います。
ただしこの記事ではそのようなDLLを用いた手法ではなく、LabVIEWで作成できるWeb Serviceを用いて、Pythonでurllibモジュールを使用してLabVIEWと通信するという方法を扱います。
選択肢は多く持っておくことに越したことはないと思うので、必要な場面で使えるようにしておければいいかなと思います。
利点と弱点
DLLを使用しないで、urllibモジュールを使用して通信することの利点としては、基本的にデータの型を気にする必要がない点です。
DLLを取り込む場合、データの型(整数型、ブール型など)やポインタを使っているかなどの指定を正しく行わないと思ったようにDLLを扱えません。
一方で、この記事で紹介している方法は、書き方の作法こそあれ、データ型の部分でつまづいてしまう可能性が低いため、つまづきポイントが少ないようになっています。
逆に弱点については、DLLのような手軽さがない点が挙げられます。
データ型の指定の仕方をクリアしてしまえば、あとはそのDLLさえあればプログラムが動かせるのに対し、urllibを使う方法ではLabVIEW側でWeb Serviceを走らせておく必要があります。
まぁWeb Serviceを走らせることが出来さえすれば他に大きな弱点もない(と思う・・・)ので、今までDLLの呼び出しで苦労してきたという方は一度参考にしてみてください。
Web Serviceについて
では、上にも書いた通り、LabVIEWでWeb Serviceを用意する必要があるので早速これを準備します。
とはいっても本記事ではWeb Serviceの基本的な使い方については扱いません。
「え、Web Serviceなんて使ったことないよ」という方は、別記事で取り上げているのでこれを参考にしてみてください。
本記事ではWeb ServiceのHTTPメソッドVI設定として出力タイプをどれも「ストリーム」にしています。
端子にするという選択肢もあるのですが、端子にする場合にはコネクタペーンへの配置が必要であり、またPython側でJSON形式で扱うことになることを踏まえてLabVIEW側で明示的にJSON文字列へ変換する方法がわかりやすいと思うからです。
Pythonプログラムの基本形
LabVIEW側でWeb Service用のGETメソッドVIやPOSTメソッドVIなどを用意出来たら、Python側の準備を進めていきます。
(ここからはPythonスクリプトの話になります。私はPythonに精通しているわけではないので、後で実例を紹介する中で実際にこれから紹介するようなスクリプトで期待通りの動きをしていることは確認していますが、必ずしも適切な書き方ではないかもしれないのでそこはご容赦ください・・・。)
まずはGETメソッドVIに対するアクセスの方法です。GETメソッドなのでPython側から何かデータを渡すことはなく、LabVIEWから受け取るだけになります。
基本形としては、urllib.requestモジュールや必要に応じてjsonモジュールをインポートし、urlを指定して開いて読み取る、ただこれだけです。
この方法で読み取った値はバイト型になっています。もし読み取った値を複数の項目を持ったJSON文字列として扱いたい場合にはdecodeをします。
※ただしこの書き方はPython 3.X系での書き方になり、2.Xだとエラーが起こると思います。
次に、POSTメソッドVIに対してのアクセスです。POSTメソッドなのでPython側からデータを渡し、LabVIEWがこれを受け取って処理、その後LabVIEWからレスポンスを受け取ることになります。
基本形としてはurlib.request、jsonモジュールをインポートするのはGETの時と同じですが、urllib.request.Requestでデータを渡すためにPython側でJSON形式で値を用意しておきます。
なかなかざっくりした基本形の紹介だけになりますが、以下で実例を示すので、実際にどう使用するのか参考にしてみてください。
PythonからLabVIEWへアクセスする実例
ここではいくつかの実例をもとにどのようにリクエストをしてレスポンスを受け取るのかを確認してもらえればと思います。
なお、以下で示している例では、Web Service名がMyWebServiceとなっており、またIPはNI Webサーバ構成で表示されているIPを使用しています。
また、全てのメソッドVIの出力タイプは「ストリーム」としています。
GETリクエスト
まずはとても単純に、GETリクエストをして「Hello World」のレスポンスを受け取るだけの例です。
受け取ったデータと、そのタイプ(bytesになっている)、およびデータをdecodeした場合とそのタイプ(str)を表示しています。
次に、少しデータを増やし、GETリクエストをして数値とブールのデータをJSON文字列として受け取る場合の例です。JSON文字列への変換のためのjsonモジュールのインポートを忘れないようにします。
受け取ったのは数値とブールでそのまま表示してもつまらないので、数値は2倍して、ブール値は反転させて表示させています。
もちろん、もっと複雑な(大きな)クラスタも受け取ることができます。
受け取るデータはusernameや測定条件そしてデータの配列がクラスタにまとめられた構造を持っており、測定条件の一部を取り出したり、データの中身からしきい値(50)との大小で合格か不合格かを表示するようにしています。
POSTリクエスト
次にPOSTリクエストの例です。
LabVIEW側に行わせる処理の種類を指定する文字列と、数値の配列を渡して、処理された後の結果をレスポンスとして受け取る場合は以下のようになります。
LabVIEWコードはdecrementケースしか見えていませんが、incrementケースではLabVIEWが受け取った値に全て1を足しています。
例えばincrementと(1,2,3)という配列を渡せば、(2,3,4)と返ってくるはずのWeb Serviceであり、確かにそのように結果を得られています。
LabVIEWでいうところの、クラスタの中にクラスタが入っているような状態も、JSON文字列で表現できればあとは特に問題ないかと思います。
以下では、指定した波形に対して、周波数と振幅の組を指定して波形データを生成し、そのうちの指定した数だけのデータをPython側で受け取れるようにしています。
上で紹介した例は基本的に文字列か数値かブールおよびこれらの配列やクラスタしか扱っていませんが、大体の場合はこれらさえ扱えれば十分かと思います。
多分Pythonに慣れている人から見たら下手な書き方になっている部分もあると思いますが、そこは適宜修正してもらえればと思います・・・。
本記事ではPythonからLabVIEWにアクセスる方法としてurllib.requestモジュールを使用する方法を紹介しました。
Web ServiceはPythonに限らず、LabVIEWでデータを読み取ることやG Web Development Softwareで作成したWeb Application、そして他の言語で似たようなHTTP操作ができる関数があればそれらでも、アクセスすることができると思うのでPythonに限った話ではないですが、こんな方法で言語をまたいでデータのやりとりができるんだなと参考にしてもらえればうれしいです。
ここまで読んでいただきありがとうございました。
コメント