NI製品ディスカッション

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

メインVIとサブVIのデータの受け渡し

解決済み
解決策を見る

LabVIEW初心者のmanakaと申します。

 

現在、製作中のVIで困っている箇所があります。

下記、VIの説明です。


[メインVI]に不定期に数値が入力され続けています。

(この数値はどんどん増えていく数値です。)

 

指定のの時間になると、

[サブVI]のケースストラクチャを呼び出し、ケースに習ってcsvでその数値を保存するという仕組みにしたいです。


そこで、まずは初歩的なところなのですが

メインVIで不定期に更新される数値を、サブVIに表示、受取りをしたいのですが

その場合はどのようにすればよいのでしょうか?

 

ローカル変数で、同VI内での使用は経験済みなのですが、

グローバル変数やシェア変数を使用するのでしょうか?

その辺の知識が、ヘルプではいまいち理解できず

どなたか、初心者にも分かるようご指導頂けたらと思います。

 

よろしくお願いいたします。

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

こんにちは。

 

メインVIとサブVIの関係ですので、グローバル変数をわざわざ用いる必要はないと思います。

 

メインVIのデータをサブVIに受け渡したいのであれば、サブVIのコネクタペーンを設定し、メインVIからサブVIにワイヤで配線すれば良いだけだと思います。

 

◯コネクタペーンの作成 - National Instruments

http://digital.ni.com/public.nsf/allkb/9670123BA61D2A3686257706000D8820

 

サブVIを作成するということは、上記のようなコネクタペーンの設定を行うということと同じ意味なので、もしかすると上記以外の点で躓いていらっしゃるのかもしれません。

 

何かご不明な点がございましたら教えていただければと思います。

 

どうぞよろしくお願い致します。

 

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

dotriaconta様

 

いつもありがとうございます。

私の説明がつたないので、100%伝えることができず申し訳ありません。

 

私が製作している部分はほんの一部なのですが、

どうやらメインの構成としては、メッセージキューでやり取りがされていて、

サブVIのコネクタペーンの構成も「エラーとメッセージキュー」のみになっています。

 

ですので、[メインVI]からメッセージキューで[サブVI]の該当のケースストラクチャに入り、

そのケース内のプログラム(csv保存)を実行するという形にしたいです。

 

データをメッセージキューで送るタイミングですが、データは不定期に更新されるので、

以前投稿したように、指定の時間になったらイベントを発生させて、

その瞬間のデータを[サブVI]に送るイメージです。

 

サンプルがのせられれば話は早いのですが。。

こちらで伝わりましたでしょうか?

お手数おかけしますがよろしくお願いします。

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

より詳しい情報を教えていただきありがとうございございます。

ある程度のイメージは出来ました。

 

やはりお話を聞いても、サブVIのコネクタペーンを新たに設けて、数値データを配線すれば良いだけのように思えるのですが、どうでしょうか。

 

お話を伺う限り、現在、サブVIにはおそらく3つのコネクタペーンが設定されているのではないかと想像しています。

1つは、メッセージキューから文字列データを受ける端子。

もう2つは、それぞれエラーの入出力端子です。

 

4つ目として、保存したい数値データを受け渡す端子を新たに設定すればよいと思います。

 

コネクタペーンの設定方法がわからないや、上記の方法では何か問題があるようでしたら別の方法を考えますので、その旨教えて下さい。

 

どうぞよろしくお願い致します。

 

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

横槍恐縮です。

具体的なダイアグラムと、メインviとサブviの実行形態が良くわからない部分はありますが、伺う限り、メインからサブが並行動作で呼び出されると、メインとサブでパラレルで走ってるんですかね・・・(何度もメインから呼び出されるわけではない)

もしそうだとすると、サブの呼び出し時には、メイン側の数値をコネクタペーンで渡すのではなく、メイン側の数値制御器のリファレンスをコネクタペーンで渡し、サブvi側では数値制御器リファレンスとして受け取ることで、サブvi側ではいつでもそのリファレンスをつないだプロパティノードのValueプロパティで、メイン側の数値を逐一モニタリングできます。値が変わったら何かをする、という場合でも、サブvi側でValueプロパティの値が変化したかどうかを見れば、という感じです。リファレンスを一度渡す以外に、メイン側ですることは何もありません。

実行のさせ方が違うのであればすみません・・・。1つの例としてですが、リファレンスを一度渡しておくことでいつでも他のviの値を横取りしたり書き換えたりできるという意味で。

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

dotriaconta様  M.Shiraishi様

 

お二人共お時間割いていただきありがとうございます。

詳細について一例をあげてご説明しますと、

 

<メインVIで行われること>

フロントパネルで「画面保存ボタン」を押す

イベントストラクチャ

→その中にあるメッセージキューがメッセージを送信

→そのメッセージで今度は、メッセージキューのみを処理するケースストラクチャに入る

→そこで、サブVIにあるケース名と同一のメッセージキューを送信

 

<サブVIで行われること>

→メインVIからきたメッセージ名のケースをケースストラクチャ(画面を保存する内容)で実行する

 

このようなケースが、下記の中に多数存在するような構成になっています。

・ メインVIのイベントストラクチャ

・ メインVIのメッセージキューのみを処理するケースストラクチャ

・ サブVIのケースストラクチャ

 

このように多くのケースがある為、コネクタペーンでは今後その読み取らせたい数値が増えた場合、ごちゃごちゃになってしまうのではないかと懸念しております。

そうなると、M.Shiraishi様のリファレンス案になるのでしょうか?

 

何度も申し訳ありません、お返事お待ちしております。

0 件の賞賛
メッセージ6/10
5,962件の閲覧回数
解決策
トピック作成者manakaが受理

突然失礼致します。

 

VIとしましてはテンプレートプロジェクトの「連続測定とログ」という形に近いのでしょうか。このテンプレートでは、キューメッセージハンドラを使用して、イベント処理ループ、UIメッセージループ、Acquisition Message Loop、Logging Message Loopの4つのループが並列に存在し、キューメッセージハンドラを用いながら、フロントパネルからの応答に応じて、データの集録や、ロギングを行っています。お話を聞く限りでは同じような仕組みなのでは、と考えております。

 

またデータが不定期に更新される、ということなのですが、少々わかりにくい部分がございます。データの更新、とは更新される度に最新値に上書きされるのでしょうか。もしくは古いデータにプラスして要素が増えていくのでしょうか。またデータを保存する時は、そのデータの更新はストップして行うのでしょうか、もしくは更新も行いながら保存するのでしょうか。

(イメージとしては、集録をストップさせてログするのか、もしくは集録しながら自分のタイミングでロギングも並行してさせたい、という事です)

もし前者であればテンプレートプロジェクトで既にそのようなことを行っています。もし更新を止めずに行いたいということであれば、保存ボタンを作成して、イベントにそのボタンを登録し、ログのキューメッセジハンドラにメッセージをとばし、ログするサブVIの処理が実行されるようにすれば良いかと思います。

 

また保存するデータがスカラ値の場合(過去のデータを上書きしている)、皆様が仰られています通り、リファレンスをわたしてプロパティノードで渡せばいいかと思います。

もし複数データをログする必要がある場合、キュー関数でデータをエンキューし、ログのサブVIにてデキューすればいいかと思います。よってサブVIに渡す情報はキューのリファレンスになります。もちろん配列の制御器をメインVIに配置して、そこにデータを貯めていき、そのリファレンスを渡してデータを取ってくる、という事も可能かと思いますが、上手くVIを組まないと、毎回過去のデータを全て保存されるようになります。もし前に保存した以降のデータのみ保存したい場合には、一度読み取られたらデータが削除されるキューを使用したほうが便利かと思います。

 

また逸れますが、不定期の更新、という部分も分かりかねております。一般的にはループで「定期的」にデータを取得し、更新されていくイメージなのですが…何か外部トリガのタイミングで更新されていくイメージでしょうか?(それであれば納得がいきます。)

 

 

0 件の賞賛
メッセージ7/10
5,953件の閲覧回数

失礼します。

 

ちょっと話を戻させてもらって
(元々、メインVI受け取った値をサブVI(だけ)でどう保持して処理するかって質問だと思ってます)

 

>[メインVI]に不定期に数値が入力され続けています。
>(この数値はどんどん増えていく数値です。)
・その指示があったら、1D配列に追加して保持する(変数だったら何でもよい)

 

>指定のの時間になると、
>[サブVI]のケースストラクチャを呼び出し、ケースに習ってcsvでその数値を保存するという仕組みにしたいです。
・その指示があったら、保持した値をCSVファイルに保存する
・保持した値はクリアする。

 

ローカル変数と機能的グローバル変数を使ったサンプルを作ってみました。

外してたらすいません。

0 件の賞賛
メッセージ8/10
5,950件の閲覧回数

T.Yasukawa様   

 

ご返信が遅れて申し訳ありません。

テンプレートプロジェクトの「連続測定とログ」があること、存じ上げませんでした。そして拝見いたしました。

おっしゃる通り、まさにこの形です。

 

データについて

データの更新 → 更新される度に最新値に上書きされます。

データの保存タイミング → データは更新されつつ、保存という形です。   

不定期更新とは → こちらもおっしゃる通り、外部トリガのタイミングになります。

 

あらゆるパターンのご回答を頂けて、大変助かりました。

方向性が見えましたので、もう少し自分で進めてみます。

その上でまた不明点が出てきた場合、こちらで質問させていただきたいと思います。

 

ありがとうございました。         

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

su-sann5073様

 

ご返信が遅れて申し訳ありません。

そして、サンプルありがとうございます。

 

この仕組みですと、上書きされる更新データも記録でき、保存するタイミングでクリアもできるのですね。

勉強になります。

csvへどのようなタイミングで、どれだけデータを保存するかがまだ確定していないので、

このような方法もあるのかと大変参考になりました。

 

ありがとうございます。                     

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