ソフトウェア制御のUSRPでマイクロ秒単位の送受信制御を行う

LabVIEWからPythonスクリプトを呼ぶ (2 of 3)

こんにちはドルフィンシステム福島です。

前回の投稿でLabVIEWからPythonスクリプトを呼ぶために必要な環境構築の解説をしました。今回はLabVIEWからPythonを呼ぶ方法などを解説します。

第1回 LabVIEWからPythonスクリプトを呼ぶために必要な4つのステップ (1 of 2)
第2回 LabVIEWからPythonスクリプトを呼ぶ "int32と複素数を渡す" (2 of 3)
第3回 LabVIEWからPythonスクリプトを呼ぶ "クラスタと2次元配列を渡す" (3 of 3)

サンプルコード
https://github.com/mikiofuku/FS-call-a-python-function-from-LabVIEW

LabVIEWでPython実行時にコンソール出力を見られるようにコンソールを開く方法

LabVIEWからPythonコードを使用する際はPythonノードに.pyファイルを指定し、その中で定義した関数を呼び出す形で実行し、戻り値が返ってきます。実行自体はこれでできるのですが、出力結果だけ得ることになるので、途中経過はわかりません。

コンソールを開いて途中経過を知りたい場合は、隠しコマンドでPythonノード実行時にコンソールを表示させる機能があります。

LabVIEW.iniファイルに、
ShowConsoleForPythonNode=TRUE
という項目を追加することでコンソールを表示させることができるようになります。

LabVIEW.iniファイルは、
C:\Program Files (x86)\National Instruments\LabVIEW 2022
にあります。

アプリケーションビルダでexeにした場合は、そのexeと同じ名前のiniファイルに上記キーを書き込めばコンソールが開きます。

サンプルコードを開く

上記のgitからサンプルコードをcloneして、プロジェクトをLabVIEWで開いて下さい。プロジェクトエクスプローラーのinterlop\interlop.viを開きます。

Pythonのセットアップをしていない場合は、第1回を参照してセットアップを行って下さい。

まずインストールしてあるPython.exeとバージョンを指定します。またinterlop.viと同じフォルダにinterlop.pyがあるのでmodule pathで指定します。module pathに2バイトコードを含めるとLabVIEW側でエラーになるので含めないようにして下さい。



Pythonの関数を呼ぶ(int32を渡して返り値でint32をもらう)

LabVIEWのPythonノードは、Python Pathで指定したpython.exeを実行し、module pathに指定したPythonスクリプトファイル内部で定義されているPython関数を呼びます。呼ぶ関数名はPythonノードに渡します。(以下ではmultiply関数を呼んでいます)。

例えばinterop.pyに以下の関数があった場合は、以下の様に呼びます。

def multiply(val_int, val_int2):
    return val_int * val_int2


戻り値の型を指定する

Pythonノードの戻り値を指定するには、Pythonノード一番上の端子(灰色)に戻り値の型を接続します。

下図ではint32を接続しています。multiplyの計算結果はint32で受けるので、Pythonノードのreturn typeにint32を接続しています。


引数を接続する

multiply関数には2つの引数が必要なので、2つのval_int, val_int2を接続します。渡したい型の値を接続します。int32を渡したい場合はint32を接続、doubleの場合ならdoubleを接続します。ただし複素数はサポートされていませんので注意が必要です。

呼び出し時間

Pythonノードの直前直後の実行時間を計測すると、呼び出し時間は約1.4ms程度でした。

複素数を渡す

LabVIEWのComplex(CDBやCSG)を直接Pythonノードに渡すことはできません。

下図のようにreal, imgを分割して2つのdouble配列として渡します。

Python側では、このようにcomplexにキャストして利用すれば良いでしょう。

c = np.array(np.vectorize(complex)(h_re, h_im))


参考情報

Pythonノードを使用してLabVIEWとの間でPythonデータ構造を渡す


次回は、クラスタなどの複雑な要素を渡してみます。

以上、ドルフィンシステム福島でした。


コメント