06-09-2021 12:44 AM
LabVIEWで数値の制御器を用いて任意の数だけサブviを呼び出して並列処理を行わせたいと考えています。
現状では、ブロックダイアグラム上にある程度の個数を配置した上で、任意の個数だけ動かすという方法しか実現できておらず、最初に設置した個数以上は処理できないため、行き詰っています。
解決済! 解決策の投稿を見る。
06-09-2021 02:47 AM
まず、呼び出すサブVIは同じもの(.vitまたは再入実行VI)と考えてよいですね?
基本的にはVIリファレンスを開いて非同期呼び出しを使います。条件によってコードが多少違います。
1) サブVIはフロントパネルを表示しますか?
2) サブVIからの出力データを受け取る必要はありますか?
06-09-2021 06:49 PM
すみません、補足いたします。
whileループを行う同一のサブviを指定した数だけメインviで呼び出し並列処理を行いたいと考えています。
1)フロントパネルは表示する必要はないです。制御や表示はメインのフロントパネルで行う予定です。
2)考えているのは、動いているwhile文の中にローカル変数もしくはキューを用いてデータを入出力させたいということです。
06-10-2021 01:25 AM
追加
J.H.Watsonさんが示されたVIリファレンスの非同期呼び出しを自分でも調べてプログラムを作ってみたのですが、個々のVIは値を途中で書き込むことが出来ない、終了させないと値を取り出せない、のでしょうか?
06-10-2021 05:10 AM
通常のサブVI(関数)と同じように使うなら、引数を渡して実行完了後に結果をもらうように作ります。
呼び出し側VIと並列に複数起動し、それらとの間でデータをやり取りするには、そのように作ります。
整理します。
・サブVIはメインVIから実行中に起動され、ある程度の時間継続して動作し続け、何かの仕事をしてくれる。
・メインVIは自身の仕事をしながら必要に応じてサブVIたちとメッセージ(コマンド・レスポンスやデータ値)をやり取りする。
・サブVIのフロントパネルは表示せず、メインVIからの指令で終了する。
で、合ってますか?
06-10-2021 06:57 PM
はい、その要件で合っています。
06-10-2021 08:42 PM
メインとサブ間の通信にはいろいろな方法があります。グローバル領域系、イベント通知系、通信プロトコル系・・・
ちょうどよい資料が見つからなかったので、キューを使ったサンプルVIを添付します。
メインVIとメモリ監視VIを開いて、両方実行してみてください。(LabVIEW2014のVI)
06-12-2021 08:07 AM
上のサンプルだと、返事が返ってくるまでの時間がまちまちの場合に使いづらいことに気がつきました。
こっちのほうが用途に合っているかもしれません。
06-13-2021 06:14 PM
返信遅くなりましてすみません。
早速試したところ、私が行いたいことが全部含まれていて大変感激しました。
わざわざ、調べていただいたとのことでありがとうございました。
06-13-2021 07:36 PM
お役に立ててよかったです(^^)