この記事で扱っていること
- PythonからLabVIEWで作成したdllを呼び出す方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
本ブログで扱っているLabVIEWのみならず、プログラミング言語は数多くの種類が存在し、「どの言語でも同じようなことができる」というものもあれば、「この言語の方がやりやすい」といった、言語ごとの得意不得意というものがあるのも事実です。
そのため、他の言語を習得することで、(より簡単に)実装できることの選択肢を増やすというのも大切なことです。
一方で、一つの言語で全てを記述するのがいいかというとそういうわけではないと思います。
時には色々な言語を組み合わせての実装の方が都合がよかったりします(複数人で何かを開発する場合にも当てはまることがあるかもしれないですね)。
今回はそんな例として、PythonとLabVIEWの連携です。
本ブログでは過去にも以下のような似た例を取り上げていました。
今回はLabVIEWで作成したdllをPythonで読み込む場合の例の紹介です。
なお、逆方向で「LabVIEWからPythonを呼び出す」場合の例としては以下の記事が参考になると思います。
環境準備
LabVIEWで作成したdllをPython側で呼び出すために、ctypesライブラリを使用します。
ctypesライブラリの使い方については例えば以下のような別資料を参考にしてみてください。
![](https://marblerule.com/wp-content/uploads/cocoon-resources/blog-card-cache/7e4cc0908f936cfb2b872eb74d609699.png)
LabVIEW側では強いて挙げるなら、dllを作成するにはApplication Builderが必要となります。EXEを作成するのに使うことができるアドオンですが、dllの作成もできるようになります。
また、呼び出す側のPythonと呼び出される側のLabVIEWは同じビット数とします。
Pythonは64 bitを使用することが多いと思いますが、その場合LabVIEWも64 bitを使用します。
LabVIEW 64 bitは英語版しかないのでご注意ください(同じPCに32 bit版と64 bit版のLabVIEWは共存してインストール可能なので、プログラムの中身は32 bit版で作って、dll化する時だけそのプログラムを64 bit版で開いてdllにビルドする、という手が使えます)
この記事でもLabVIEWは64 bit版を使用していきます。
いくつかの例
それでは実装の例をいくつか紹介していきます。
単純な入出力
まず最も簡単な例から。Python側からdllに数値を二つ渡して、足し算をさせた結果をPython側で受けとることをします。
LabVIEW側のviは以下のようになります。
![](https://marblerule.com/wp-content/uploads/2023/10/adddllexplain-1024x577.png)
コネクタペーン(フロントパネルの右上に出ているアイコンの左にある、どこにどの入力、出力をつなげるかを指定する部分)はしっかり用意する必要があります(これがないとdllを作成するときに入出力を作成できない)。
LabVIEWプロジェクトからビルドする際に、dllを指定した場合の設定は以下のようにします。
![](https://marblerule.com/wp-content/uploads/2023/10/adddllexplain2-1024x577.png)
プロトタイプを決める際には、xとyが入力、x+yが出力であるという設定がされていることを確認します(この例の通りのviであればデフォルトでそうなっていると思います)。
![](https://marblerule.com/wp-content/uploads/2023/10/adddllexplain3-1024x577.png)
dllのビルドが終わったら、Python側のスクリプトを書きます。
下記がその一例で、これを実行することで計算結果が得られます。
なお、lvdllの変数に入れているWinDLL(“XXX”)のXXXには、LabVIEWで生成したdllのパスを入力します。
もしこのPythonスクリプトとdllが同じディレクトリに存在している場合には、「./MySimpleAdd.dll」などといった表記で実行できます。
![](https://marblerule.com/wp-content/uploads/2023/10/adddllexplain4-1024x577.jpg)
列挙体を使用する場合
続いて、LabVIEWの中で場合分けを伴う状況を考えます。
ここでは、特定の条件を指定するとして列挙体を使用していることを考えます。
LabVIEWで扱う列挙体は実体としては数値なので、数値の指定を行うことで場合分けに対応したコードが書けます。
![](https://marblerule.com/wp-content/uploads/2023/10/enumdllexplain-1024x577.png)
ブロックダイアグラムとしては以下のようなコードとしています。
![](https://marblerule.com/wp-content/uploads/2023/10/enumdllexplain2-1024x577.png)
dllにビルドする際の指定は以下の通りです。
![](https://marblerule.com/wp-content/uploads/2023/10/enumdllexplain3-1024x577.png)
Pythonコードは以下のようにします。
この例の場合、myprocessの第一引数によって条件分岐をさせていることになります。
![](https://marblerule.com/wp-content/uploads/2023/10/enumdllexplain4-1024x577.jpg)
そのため、第一引数を変更することで異なる計算をさせることになります。
この辺りは、Pythonの辞書型データを使用するなどして、LabVIEW側の列挙体の項目名と対応させるようにすることで、実際にどのケースを選択しているかをPython側でもわかりやすくするといった工夫もできると思います。
![](https://marblerule.com/wp-content/uploads/2023/10/enumdllexplain5-1024x577.jpg)
クラスタを使用する場合
最後の例として、LabVIEWの中でクラスタを使用している場合の例です。
数値データのみのクラスタなので別にクラスタにしなくてもいいのでは?というツッコミがあるかもしれませんが、関連するデータをひとまとめにするという意味では、含まれるデータタイプがすべて数値であってもクラスタを使うことに意味があります。
LabVIEWの方は以下のようにしています。
![](https://marblerule.com/wp-content/uploads/2023/10/clusterdllexplain-1024x577.jpg)
dllにするときの設定は次の図のようにします。
![](https://marblerule.com/wp-content/uploads/2023/10/clusterdllexplain2-1024x577.png)
Pythonスクリプトは以下のようにしています。
MyParamというクラスを用意し、ここにクラスタに対する入力を指定しています。
myprocessの第二引数としている「4」はThresholdとなっていて、
(1 × 2) + 3 > 4
はTrueなのでPythonスクリプトを実行したらTrueが返ってきています。
![](https://marblerule.com/wp-content/uploads/2023/10/clusterdllexplain3-1024x577.png)
もちろん値を変えることで異なる結果を得られます。
![](https://marblerule.com/wp-content/uploads/2023/10/clusterdllexplain4-1024x577.png)
本記事では、PythonからLabVIEWで作成したdllを呼び出す例を紹介しました。
過去にLabVIEWで作成したアルゴリズムをPython側で活用したい、といった場合など参考にしてもらえるとうれしいです。
ここまで読んでいただきありがとうございました。
コメント