NI製品ディスカッション

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

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

解決済み
解決策を見る

お世話になります。

以前、表題の件で投稿させていただき、たくさんのアドバイス頂きました。

 

実際に、やりたいことが具体的になってきたので取りかかったところ、

実力不足のため、躓いてしまいました。

 

概要は、メインVIのWhileループ内で一定のタイミングで数値が入力されている表示器があります。

その表示器をリアルタイムで監視し、1秒毎にプロットしてグラフ化したいというのが希望の動作です。

表示器は全部で4点で、3点は数値(0~1000くらい)、1点は(0 or 1)が入力されます。

メインにいれられれば苦労しないのですが、リアルに入ってくる値のループと、1秒ごとにまわしたいグラフループが

競合してしまい?うまく動作しません。

そのため、グラフループはサブVIで処理しようと思っています。

 

そこで、以前教えて頂いた制御器リファレンスで、値をサブVIに渡そうとしたのですがうまくいきません。

初歩的なところなのですが、メインの1点をブール出力にして、サブ内のケースセレクタ端子につなぐにはどうしたらよいのでしょうか。

 

説明に分かりづらいところがあると思いますが、

どうぞお力お貸しくださいませ。よろしくお願いいたします。

0 件の賞賛
メッセージ1/9
4,562件の閲覧回数

 

>>メインにいれられれば苦労しないのですが、リアルに入ってくる値のループと、

>>1秒ごとにまわしたいグラフループが競合してしまい?うまく動作しません。

 

メインの方の一定のタイミングが、1秒より長いのか短いのかは分かりませんが、いずれにせよ、メインのあるviだけで出来なくはないので、添付のviのようなのは希望の動作になりますか?

 

メインのWhileで、例えば0.25秒置きに何かデータが来て「計測結果」というところに値が入るとします。

メインのWhileとパラレルで、サブのWhileが走るようになっています(メイン・サブ、と言っていますが、同一のviの中の主・副ということで)。2個のWhileには依存性が無いので、それぞれ独立に回ります。

サブのWhileは、メインのWhileと関係なく、1秒ごとに「計測結果」表示器のその時点での値をポーリングしてチャートに追加していきます。

メインのWhileは「停止」ボタンを押した時にWhileを抜けるようになっていますが、予め準備してある「オカーレンス」というものをメイン側のWhileがセットすることで、サブ側のWhile側も即座に終わるようになっています(サブ側のWhileの1秒間隔はオカーレンス待ちのタイムアウトに設定しているので、オカーレンスがセットされた時点で抜けてWhileが終わります)。

 

あと、「メインの1点をブール出力にして」というのは、メインの1点の「0か1」の数値を「FalseかTrue」に変換したい、という意味でしょうか、であれば「≠0」を通すことでブールになります。

170330-sample2.png

0 件の賞賛
メッセージ2/9
4,530件の閲覧回数

M.Shiraishi様

 

ありがとうございます。

オカーレンス。存じ上げませんでした。このようなものがあるのですね!

勉強になります。

まさに希望しているものです!

 

また、「メインの1点をブール出力にして」に関してですが、やりたいことは、メインの表示器からの0 or 1出力をサブのケースストラクチャで読み取りたいということです。

制御器リファレンスの活用法が分からず・・・いろいろやっているうちに変な方向に行っている状態だと思います。。

よろしければ、制御器リファレンスの簡単な使い方を教えて頂けないでしょうか。

 

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

0 件の賞賛
メッセージ3/9
4,500件の閲覧回数
解決策
トピック作成者manakaが受理

なるほど、そういうことですね。

 

添付に、メインVIからサブVIを呼び出し、サブVIにリファレンスを渡す場合の方法を示します。

今回もオカーレンスは使っているので(メインの停止時にサブも同期して止まってもらうため)、オカーレンスとリファレンスをサブVIに渡しています。メインから多くの制御器・表示器のリファレンスを渡す場合を想定して「複数の制御器のリファレンスのクラスタ」で渡すようにしてみました。

メインだけロードして実行すると、サブVIが呼び出され、サブVIが開きます。メインで停止を押すと、オカーレンスが効いてサブVIの実行が終わり、サブVIは閉じます。

サブVI側で「複数の制御器のリファレンス」を受け取るための制御器を作るには、メイン側でまずリファレンスをクラスタ化(Bundle)してから、Bundleの出力で「作成→制御器」とすれば、型付リファレンスのクラスタが元の順序で並んだものが出来上がりますので、それをサブVIのフロントパネルにコピーして下さい。

 

サブVIの中では、各リファレンスは既に型付(メインで作った通りの型)になっていますので、プロパティノード(Value)を使うことで、所望の型の値が取り出せます。


もう1つ、メインからサブを呼び出すやり方ではなく、完全に独立したVIから所望のVIの制御器の値をかすめ取る方法もあるので、次に示します。

すべてをダウンロード
メッセージ4/9
4,491件の閲覧回数

もう1つは、元々でき上がっているメインがあったとして、それを独立な別のVIから値を取るものです。メインのダイヤグラムをいじることなく他のVIから値を横取りできます。

 

今回は2つのVIは独立なので、それぞれ開いて実行してください。

 

メイン(A)は、内部では自分だけのループで実行・表示しており、特にどこかへ値を送ったりはしません。

 

もう1つのVI(B)は、メインの名前を持つVIのリファレンスを開き、そのVIリファレンスから、所定の名前を持つ制御器・表示器の現在値を横取りします。その制御器・表示器の型は分かっているものとします。なお、VIリファレンスでは、そのVIの実行状態も分かるので、おまけでそんなのも付けてみました。

(先にBの方を実行しておいて、後からAを実行したり停止したりすると挙動が分かります。そこを付けるために少々余計なブロックが書かれていますが・・)

 

この例では、AとBは独立なので、実行も停止もそれぞれ行って下さい。

 

こちらのケースはたぶん、manakaさんのご使用用途には無いと思いますが、「独立型横取り」もできなくはない・・ということで。

すべてをダウンロード
0 件の賞賛
メッセージ5/9
4,490件の閲覧回数

補足ですが、1つめのリファレンスを渡す方法で、サブVIの中のプロパティノードが独特な感じになってると思います。versionにもよるかも知れませんが、「DigNum (strict)」とか書いてあるかも知れません。

しかし、ダイアグラムに関数パレットからプロパティノードを置いたときは、「App」とかしか書いていないかも知れません。

このまま、プロパティノードのリファレンス入力に、リファレンスの線をつなげば、そのリファレンスが持っているクラス(型のようなもの)に合わせてプロパティノードは勝手に変わりますので、何もしないで大丈夫です。あとは、下半分のプロパティのところをクリックして、所定のプロパティをどれか選べばOKです。

0 件の賞賛
メッセージ6/9
4,489件の閲覧回数

M.Shiraishi様

 

ありがとうございます。希望がすべてかないました!!

いつもつたない分から推測していただき、分かりやすく教えて頂きありがとうございます。

 

今回はサブ/メインを使わせていただきましたが、 独立VIでもそのようなことが出来ること、初めて知りました。

今後その方法が必要な時に使わせていただきます。

 

1点オカーレンスについて質問があります。

頂いたサンプルのメインVIで、「TRUE/FALSEのケーススタディ」「オカーレンス設定」に

オカーレンスがつながっていますが、この役割というのは

メインを止めたらサブも止まるということでしょうか?

 

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

0 件の賞賛
メッセージ7/9
4,473件の閲覧回数

>>1点オカーレンスについて質問があります。

>>頂いたサンプルのメインVIで、「TRUE/FALSEのケーススタディ」「オカーレンス設定」に

>>オカーレンスがつながっていますが、この役割というのは

>>メインを止めたらサブも止まるということでしょうか?

 

今回は全体的な動作上の役割は、そういうことになりますが、メインを止めたらサブも止まる、というより、もうちょっと正確に言うと、

 ・「停止」ボタンを押したら

 ・オカーレンスがセットされる

というだけで、その順序ならどういう書き方でも良いです。

今回はループ内で「停止」ボタンのTRUEを使ってその時だけオカーレンスをセットするcaseを書きましたが、「停止」ボタンでループを抜けてからオカーレンスをセットする、でも順序的にはOKです。ループを抜けているのはあくまで「停止」ボタンのTRUEです。

 

(下記の絵はどちらも同等。厳密には上はループを抜ける前にオカーレンスがセットされ、下はループを抜けた後にオカーレンスがセットされる)

170404-sample1-main-1.png

それで、「オカーレンスのセット」はあくまでオカーレンスをセットするだけで、メインやサブを停止させる効力は無いです。オカーレンスがセットされた時点で、他にそのオカーレンスを首を長くして待機している部分があれば、そこに一斉に直ちに通知され、待機していた部分は各々実行を再開します。

(犬のエサやりの躾の「待て」と「よし」みたいなものですね)

 

今回の場合、メインもサブも、オカーレンスをセットしたら、あとはやることが無いので、メインもサブも終了するのですが、オカーレンスが終わらせたのではなく、どちらもオカーレンスの後に処理が何も無いから終わった、ということです。

(なので、よく見ると先にサブの方が終わると思います。メインのループ内でオカーレンスがセットされ、サブはその瞬間ループを抜けてしまうため)

 

結果的にメインもサブもどちらも止まるのですが、オカーレンスをセットする側も、オカーレンスを待っている側も、後ろに処理が続行していて構いません。あくまで、「オカーレンスを待機している箇所に、セットを通知する」という動作をしているだけになります。

0 件の賞賛
メッセージ8/9
4,470件の閲覧回数

M.Shiraishi様

大変わかりやすい説明ありがとうございます。

なるほど、そうゆうことですか!

オカーレンスも今回初めて知りましたが、今後使えるように

自分でもいろいろ試してみたいと思います。

 

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

0 件の賞賛
メッセージ9/9
4,463件の閲覧回数