07-01-2010 01:29 AM
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の実行が終わたら、終了というプログラムにしたいと考えています。
簡単な質問かもしれませんが、よろしくお願いします。
解決済! 解決策の投稿を見る。
07-01-2010 02:35 AM
nodge333 様
図を拝見したところForループの反復回数の指定は"3"ですので、forループは3回回って止まると思うのですが、おかしいですね。
繰返しの回数 " i " の端子からつながっている、"数値"の表示器に、0,1,2と表示されて止まると思います。
もう一度繰返し回数 " N " の端子に定数”4”をつなぎ直して見てください。もしかすると
あと、ちょっと作り方を変えて、添付の図のようにしてみると良いかもしれません。
Forループの外から配列を"自動指標トンネル"で入力すると、Forループは、配列の要素の個数と同じ回数しか回りません。
この場合それぞれの配列は、要素が4つなので、Forループは4回回ります。
"自動指標トンネルは"ループの枠をワイヤが通過するところにある中に [ ] 括弧が描かれたトンネルです。
この自動指標トンネルは、ループが回るたびに、配列のデータを1つづつ取り出してくれます。
07-01-2010 03:31 AM
添付されていたプログラムを実行してみたのですが、
待機コマンドがある場合、プログラム自体がとまってまいます。
待機コマンドをなくして実行してみると、0から3まで一瞬で行き、さらに無限にiが変化します(iはほとんど3ですが、変動しているのが肉眼で見える状態です。)
自分のプログラムのforループでは、i=0,1,2,3を実行するようにできてないみたいです。
そのため、一瞬でiが変化するのだと思います。
何か解決策がありましたら教えてください。
よろしくお願いします。
07-01-2010 03:50 AM
nodge333 様
「300秒間たってから i=1にいき、」と書かれていたので、待機時間を300000ミリ秒で設定しました。
ですから、i=0で5分間止まって、その後にi=1に進みます。合計で実行から20分かかります。
もっと早く動かしたいのでしたら、待機の設定時間を減らしてください。
> 自分のプログラムのforループでは、i=0,1,2,3を実行するようにできてないみたいです。
> そのため、一瞬でiが変化するのだと思います。
Forループは中に待機関数を入れない場合には、可能な限り早く回ろうとします。
ですので、nodge333 様のVIでも、Forループは一瞬のうちに処理が終わっているのだと思います。
中に待機関数を入れて設定を1000ミリ秒くらいで実行すればわかりやすいのでは無いでしょうか?
07-01-2010 08:39 PM
回答ありがとうございます。
待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが
全体のプログラムも待機してしまいます。
そのため、forループの待機中に、前の回答で述べた電圧値を入力するサブVIをDAQ Assistantに入力・実行できない状態になっています。
この場合どのようにしたらいいのでしょうか。
07-01-2010 09:11 PM
nodge333 様
> 待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが
> 全体のプログラムも待機してしまいます。
待機関数の機能は、「実行されてから設定した時間後に終了する」というものです。
forループは中の関数が全て終了しないと次の回へ進めませんので、結果的にループの回るスピードが制限されます。
全体のプログラムが待機する訳ではありません。
> そのため、forループの待機中に、前の回答で述べた電圧値を入力するサブVIをDAQ Assistantに入力・実行できない状態になっています。
> この場合どのようにしたらいいのでしょうか。
DAQ Assistant5,6,7についても、forループの中で1回は実行されます。
もし、300秒の間にDAQ Assistant5,6,7の電圧を変化させたい(何度も実行した)場合は、forループの中にループを加える事もできます。
添付ファイルのVIでは、1秒毎に値を更新しています。
また、forループと平行して別のループで処理する方法もあります。
07-02-2010 01:22 AM
早急の回答ありがとうございます。
プログラムを実行したところ、待機コマンドの問題でなく、サブVIが動作せず、プログラムが停止しているように見えたり、実行されずiが増えていることがわかりました。
サブVIは指摘されたとおり、時間ごとに変化させ、電圧値を徐々に上げているというものです。
今まで、一つのサブVIをDAQのデータに入力していた時は問題なく動作していたのですが
forループで一つずつ選ぶプログラムに変えるため、サブVIを結合していたのですが、うまく動作してくれません。
これは連結関数の使い方に問題があるのでしょうか?
よろしくお願いします。
07-02-2010 01:37 AM
nodge333 様
サブVI?上の図には無いですが、forループの左側にあるのでしょうか?
サブVIで12個の数値を作成して、その値をforループに入れてから連結しているのでしょうか?
電圧の値を設定する12個の値は間違っていませんでしょうか?
図の赤い矢印の「配列連結追加」は使い方は間違っていません。
forループが回るたびに、連結された配列の、一番上から順番にデータを取り出して電圧を設定するように書かれています。
07-08-2010 12:57 AM
nodge333 様
> 待機コマンドをなくして実行してみると、0から3まで一瞬で行き、さらに無限にiが変化します(iはほとんど3ですが、変動しているのが> 肉眼で見える状態です。)
> 待機関数をforループの中に入れると、forループの中だけ待機して欲しいのですが
> 全体のプログラムも待機してしまいます。
この2点のコメントから、forループが何度も呼び出されているのではないでしょうか?
iの値は一桁以上に変化するのでしょうか?