NI製品ディスカッション

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

forループが無限に続きます。

解決済み
解決策を見る

forループを実行したいのですが、無限にループしてしまって困っています。

以下の図のどこに問題があるか教えていただけないでしょうか。

 

このようなプログラムです。

図のブール配列は(1,2,4,8)であります。i番目を選んで、ブール値に変換し、その0~4ビットをDAQアシスタント10,11,12に入力します。

図において、赤い矢印で示される配列は、DAQ Assistant5,6,7に入力する電圧値(300秒間、電圧を入力し続けるというサブVIです)を配列したものです。

 

forループにおいて、i=0のときには、DAQアシスタントに1000を、DAQ Assistantには一番上のサブVIを入力し、300秒間たってから

i=1にいき、そして、i=3の実行が終わたら、終了というプログラムにしたいと考えています。

 

簡単な質問かもしれませんが、よろしくお願いします。

 

17875iC0F207ABE86F6D41

 

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

nodge333 様

 

図を拝見したところForループの反復回数の指定は"3"ですので、forループは3回回って止まると思うのですが、おかしいですね。

繰返しの回数 " i " の端子からつながっている、"数値"の表示器に、0,1,2と表示されて止まると思います。

 

もう一度繰返し回数 " N " の端子に定数”4”をつなぎ直して見てください。もしかすると

 

あと、ちょっと作り方を変えて、添付の図のようにしてみると良いかもしれません。

 

Forループの外から配列を"自動指標トンネル"で入力すると、Forループは、配列の要素の個数と同じ回数しか回りません。

この場合それぞれの配列は、要素が4つなので、Forループは4回回ります。

 

"自動指標トンネルは"ループの枠をワイヤが通過するところにある中に [ ] 括弧が描かれたトンネルです。

この自動指標トンネルは、ループが回るたびに、配列のデータを1つづつ取り出してくれます。

 

 

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

 

添付されていたプログラムを実行してみたのですが、

待機コマンドがある場合、プログラム自体がとまってまいます。

待機コマンドをなくして実行してみると、0から3まで一瞬で行き、さらに無限にiが変化します(iはほとんど3ですが、変動しているのが肉眼で見える状態です。)

 

自分のプログラムのforループでは、i=0,1,2,3を実行するようにできてないみたいです。

そのため、一瞬でiが変化するのだと思います。

何か解決策がありましたら教えてください。

よろしくお願いします。

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

nodge333 様

 

「300秒間たってから i=1にいき、」と書かれていたので、待機時間を300000ミリ秒で設定しました。

ですから、i=0で5分間止まって、その後にi=1に進みます。合計で実行から20分かかります。

 

もっと早く動かしたいのでしたら、待機の設定時間を減らしてください。

 

> 自分のプログラムのforループでは、i=0,1,2,3を実行するようにできてないみたいです。

> そのため、一瞬でiが変化するのだと思います。

 

Forループは中に待機関数を入れない場合には、可能な限り早く回ろうとします。

ですので、nodge333 様のVIでも、Forループは一瞬のうちに処理が終わっているのだと思います。

 

中に待機関数を入れて設定を1000ミリ秒くらいで実行すればわかりやすいのでは無いでしょうか?

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

KONDOH

 

回答ありがとうございます。

 

待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが

全体のプログラムも待機してしまいます。

 

そのため、forループの待機中に、前の回答で述べた電圧値を入力するサブVIをDAQ Assistantに入力・実行できない状態になっています。

この場合どのようにしたらいいのでしょうか。

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

nodge333 様

 

> 待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが

> 全体のプログラムも待機してしまいます。

 

待機関数の機能は、「実行されてから設定した時間後に終了する」というものです。

forループは中の関数が全て終了しないと次の回へ進めませんので、結果的にループの回るスピードが制限されます。

全体のプログラムが待機する訳ではありません。

 

> そのため、forループの待機中に、前の回答で述べた電圧値を入力するサブVIをDAQ Assistantに入力・実行できない状態になっています。

> この場合どのようにしたらいいのでしょうか。

 

DAQ Assistant5,6,7についても、forループの中で1回は実行されます。

もし、300秒の間にDAQ Assistant5,6,7の電圧を変化させたい(何度も実行した)場合は、forループの中にループを加える事もできます。

添付ファイルのVIでは、1秒毎に値を更新しています。

 

また、forループと平行して別のループで処理する方法もあります。

 

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

KONDOH

 

早急の回答ありがとうございます。

 

プログラムを実行したところ、待機コマンドの問題でなく、サブVIが動作せず、プログラムが停止しているように見えたり、実行されずiが増えていることがわかりました。

 

サブVIは指摘されたとおり、時間ごとに変化させ、電圧値を徐々に上げているというものです。

 

今まで、一つのサブVIをDAQのデータに入力していた時は問題なく動作していたのですが

forループで一つずつ選ぶプログラムに変えるため、サブVIを結合していたのですが、うまく動作してくれません。

 

これは連結関数の使い方に問題があるのでしょうか?

よろしくお願いします。

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

nodge333 様

 

サブVI?上の図には無いですが、forループの左側にあるのでしょうか?

サブVIで12個の数値を作成して、その値をforループに入れてから連結しているのでしょうか?

電圧の値を設定する12個の値は間違っていませんでしょうか?

 

図の赤い矢印の「配列連結追加」は使い方は間違っていません。

forループが回るたびに、連結された配列の、一番上から順番にデータを取り出して電圧を設定するように書かれています。

 

 

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

nodge333 様

 

> 待機コマンドをなくして実行してみると、0から3まで一瞬で行き、さらに無限にiが変化します(iはほとんど3ですが、変動しているのが> 肉眼で見える状態です。)

 

> 待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが

> 全体のプログラムも待機してしまいます。

 

この2点のコメントから、forループが何度も呼び出されているのではないでしょうか?

iの値は一桁以上に変化するのでしょうか?

 

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