NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

LabVIEWで任意の数のサブviを呼び出して並列処理を行う方法を教えてください。

解決済み
解決策を見る

LabVIEWで数値の制御器を用いて任意の数だけサブviを呼び出して並列処理を行わせたいと考えています。

現状では、ブロックダイアグラム上にある程度の個数を配置した上で、任意の個数だけ動かすという方法しか実現できておらず、最初に設置した個数以上は処理できないため、行き詰っています。

0 件の賞賛
メッセージ1/10
3,413件の閲覧回数

まず、呼び出すサブVIは同じもの(.vitまたは再入実行VI)と考えてよいですね?

基本的にはVIリファレンスを開いて非同期呼び出しを使います。条件によってコードが多少違います。

1) サブVIはフロントパネルを表示しますか?

2) サブVIからの出力データを受け取る必要はありますか?

 

メッセージ2/10
3,379件の閲覧回数

すみません、補足いたします。


whileループを行う同一のサブviを指定した数だけメインviで呼び出し並列処理を行いたいと考えています。

1)フロントパネルは表示する必要はないです。制御や表示はメインのフロントパネルで行う予定です。
2)考えているのは、動いているwhile文の中にローカル変数もしくはキューを用いてデータを入出力させたいということです。

0 件の賞賛
メッセージ3/10
3,350件の閲覧回数

追加

J.H.Watsonさんが示されたVIリファレンスの非同期呼び出しを自分でも調べてプログラムを作ってみたのですが、個々のVIは値を途中で書き込むことが出来ない、終了させないと値を取り出せない、のでしょうか?

0 件の賞賛
メッセージ4/10
3,344件の閲覧回数

通常のサブVI(関数)と同じように使うなら、引数を渡して実行完了後に結果をもらうように作ります。

呼び出し側VIと並列に複数起動し、それらとの間でデータをやり取りするには、そのように作ります。

 

整理します。

・サブVIはメインVIから実行中に起動され、ある程度の時間継続して動作し続け、何かの仕事をしてくれる。

・メインVIは自身の仕事をしながら必要に応じてサブVIたちとメッセージ(コマンド・レスポンスやデータ値)をやり取りする。

・サブVIのフロントパネルは表示せず、メインVIからの指令で終了する。

で、合ってますか?

メッセージ5/10
3,337件の閲覧回数

はい、その要件で合っています。

0 件の賞賛
メッセージ6/10
3,325件の閲覧回数

メインとサブ間の通信にはいろいろな方法があります。グローバル領域系、イベント通知系、通信プロトコル系・・・

ちょうどよい資料が見つからなかったので、キューを使ったサンプルVIを添付します。

メインVIとメモリ監視VIを開いて、両方実行してみてください。(LabVIEW2014のVI)

0 件の賞賛
メッセージ7/10
3,321件の閲覧回数
解決策
受理者 yiw9030

上のサンプルだと、返事が返ってくるまでの時間がまちまちの場合に使いづらいことに気がつきました。

こっちのほうが用途に合っているかもしれません。

 

メッセージ8/10
3,296件の閲覧回数

返信遅くなりましてすみません。

早速試したところ、私が行いたいことが全部含まれていて大変感激しました。

わざわざ、調べていただいたとのことでありがとうございました。

0 件の賞賛
メッセージ9/10
3,282件の閲覧回数

お役に立ててよかったです(^^)

0 件の賞賛
メッセージ10/10
3,275件の閲覧回数