LabVIEWはプログラミング言語の一つであり、図を書くように(グラフィカルに)プログラムを構築することができる点が他のいわゆるテキスト形式でプログラムを記述する言語と大きく異なります。
ただ、それらの言語と独立しているかというとそうではなく、LabVIEWの中に他の言語のプログラムを「取り入れる」ことができます。
特にPythonについてはPythonノードという専用の関数を使用することで、.pyファイルに記述した処理(関数)をLabVIEWプログラムの中で使用することができます。
そのため、既にあるPythonのプログラムを有効活用することや、LabVIEWでは難しい(メンドクサイ)プログラムをPythonプログラムとして用意する、といった使い方ができます。
この記事では、そんなPythonノードの基本的な使い方についてまとめてみました。
なお、Pythonそのものは知っている前提としている(Pythonプログラムの書き方については触れていません)のでご注意ください。
基本的なPythonノードの使い方
Pythonノードは関数パレットの中の接続パレットの中にそろっています。覚えなければいけない関数も3つしかなく、また使い方もとてもシンプルです。

使うのは、セッションを開く、これとペアになる閉じる関数、そしてPythonプログラムで定義した関数を呼び出すための関数です。

このうち、Pythonノードと書いてある真ん中の関数には、どのパスにあるPythonファイルを使用するかとそのファイルの中のどの関数を使用するかを指定する以外に、その関数に渡すパラメタと戻り値のデータタイプを指定できます。
後で紹介しますが、対応しているデータタイプであればなんでもワイヤでつなげることができ、また下に引き伸ばせば入力は複数渡すことができます。
なお、呼び出す処理は関数(Python内でdef)となっている必要があります。その関数名をPythonノードの関数名入力で指定する、ということですね。例えば
def myPythonfunc(inputparameter) :
という形で定義された関数を使用する場合、関数名の文字列入力は「myPythonfunc」とします。

Pythonノードは、LabVIEWがPythonの代わりに動作するわけではなくPython(.exe)を呼び出して処理させるイメージなので、使用するPCにPythonがインストールされている必要があります。
またインストールされているPythonのビット数はLabVIEWのビット数と同じである必要があります。日本語のLabVIEWは32bitのみなので、日本語LabVIEWを使用する場合には必然的に32bitのPythonをインストールする必要があります。
残念ながらどのバージョンのPythonでもいいかというとそうではなく、特定のバージョンを用意する必要がありますが、その対応バージョンというのもLabVIEW自体のバージョンによって異なります。
対応バージョンはPythonセッションを開く関数のヘルプに記載があります。

LabVIEWのバージョンによってここは違うので注意が必要です。上の図はLabVIEW 2020の場合ですが、LabVIEW 2021なら3.6と3.9のようです。
扱えるデータタイプには制限があり、
- 数値
- (多次元)配列
- 文字列
- クラスタ
- ブール
となっています。そのため、例えば辞書型は直接受け渡しすることができません(が後述するように代替手段のようなものはあります)。
Pythonノードへのデータの渡し方
基本的な使い方がわかったところで、Pythonノードへデータを入力する方法について紹介していきます。Pythonノードが扱えるデータタイプは上で紹介した通りですが、それぞれどのようにデータを受け渡していくことになるかを実際のPythonコードのVisual Studio Code上の表示と共にお見せします。
数値、文字列、ブール
これらのデータタイプの扱いはとてもシンプルです。単にそれぞれのデータタイプを配線し、Pythonプログラムの中で使用することができます。
なお、以下の図のように、同じファイル内の複数の関数を呼び出す際にはそれぞれにPythonノード関数を使用する必要があります。

(多次元)配列
LabVIEWでは配列と呼びますが、Pythonではリストという呼び方になりますね。こちらもそのまま値を渡してやれば使用できます。

2次元以降の配列も同様です。

ただし、NumPy配列として使用したい場合には設定をする必要があります。こちらについては後述します。
クラスタ
クラスタデータも受け渡しすることができます。扱いとしてはリストみたいな感じで、インデックスを指定することでクラスタ内部のデータにアクセスできます。
例えば「testcluster」という名前のクラスタの中の一番最初の要素を取り出す際にはtestcluster[0]とする、といった要領ですね。
戻り値でもクラスタを使用したい場合には、タプル(丸括弧で囲む)とします。

なお、クラスタの中の要素それぞれのインデックスはLabVIEW上で以下のように調べることができます。縦に整列させて並べている場合、基本的に上から番号順に並んでいます。

辞書型
Pythonに存在している辞書型では、キーと値のペアを複数持つ際に値のデータタイプは統一されている必要はないと思います。
LabVIEWにも最近辞書型データタイプと対応したマップ型が追加されたのですが、すべての値は同じデータタイプである必要があります。そのため使い勝手が同じではありません。
近い使い方としてはJSON文字列にしてしまう方法があります。LabVIEW上ではクラスタを用意しこれをJSON文字列に平坦化してPythonノードに入力します。

もしPython中で辞書型としてデータを処理したい場合にLabVIEW側でどのようにデータを渡すか、方法としては上と同様にJSON文字列としてやりとりする方法が挙げられます。

名前付きタプル
LabVIEW 2021からだと思いますが、名前付きタプルをLabVIEWから渡せるようになりました。

こちらについては入力パラメタを右クリックして名前付きタプルとして入力されるように設定が必要です。

モジュールをインポートしたプログラムの実行例
既に上の項目でいくつかでてきましたが、NumPyやjsonモジュールなどのモジュールをインポートしたPythonプログラムも使用することができます。
いくつかの例を紹介します。
NumPy
まずはNumPyです。こちらは標準ライブラリとしてPythonインストール時に入っているわけではないので別途インストールが必要ですが、インストールされていてしまえばimportで呼び出して使用することができます(もしインストールされていない場合にはLabVIEW側でエラー1671が発生します)。
入力時にはPythonノードの入力パラメタ部分を右クリックして「NumPy配列にマーシャリング」を選択します(名前付きタプルと同様)。
また、戻り値のデータ形式も正しく指定しないといけないものがあります(NumPyに限りませんが)。例えば、NumPyで扱えるnp.whereの結果はリストを含んだタプルになっているため、戻り値のデータタイプは配列ではなく、配列のクラスタにする必要があります。

datetimeモジュール
標準ライブラリでいくと、例えばdatetimeモジュールであれば以下のように記述できますが、タイムスタンプのデータはそのまま受け渡せないので変換する必要があります。

turtleモジュール
変わり種(?)でいえば、turtleモジュールを使用して図を表示させることなどもできます。
ただしそのままだと表示してすぐにウィンドウが閉じることになるため、例えばtimeモジュールのsleepを使用してPythonコードが終了するまでの時間を遅らせる必要があります。

注意点
Pythonノードを使用する上での注意点を二つ紹介します。
引数の与え方について
関数を指定して引数を与えるとき、引数が2つ以上ある場合には上から順に与えることになります。
例えば以下のようなプログラムで確かめることができます。Python中での引数としてaとbと書いていたとして、LabVIEW側の入力(定数や制御器)のラベルをaやbとしていたとしても上に入力した値がaとしてPython中では扱われます。

デバッグについて
Pythonコードでエラーが発生した場合には、LabVIEW上にそのエラーが出るようです。ただポップアップをいちいち表示させるのも面倒だし、エラー表示器だと肝心のメッセージ部分が小さかったりする(まぁ広げるだけっちゃ広げるだけですが)ので、例えば以下のようにシンプルエラー処理関数のメッセージ出力に文字列表示器を付けておくことでエラーの内容を確認することができます。
例えば以下はNumPyがインストールされていない環境でNumPyの処理を行おうとした場合のエラー表示です。

ここに表示されるエラーは(ものにもよりますが)LabVIEWとしてではなくPythonが出すエラーとしてネットで検索してデバッグすることができます。
本記事ではLabVIEWプログラムの中でPythonプログラムを使用する方法を紹介しました。LabVIEWはハードウェアの操作がしやすい言語だと思うので、ハードウェアの操作はLabVIEWが行い、何か得られた結果を解析するのにPythonで用意しておいたプログラムを使用するといったことも考えられると思います。こういったアプリケーションを考えている方の参考になればうれしいです。
ここまで読んでいただきありがとうございました。

コメント