12-25-2017 08:43 AM
いつもお世話になっております。
早速ですが、Whileループ内である条件を満たしたときに、制御値の一部を自動更新し、ループを続けることが可能であるか、また可能であればその方法について教えていただければ幸いです。
具体的に設定状況について述べさせていただきます。ある制御値Xが何らかのシステムにインプットされているとします。さらに、X=x_0の時、ある時間t_0が経過するとそのシステムは制御値Xを変更するまでTrueという返り値を出し続けるとします。つまり1ループにつき1度Trueを出し続けるということです。
上記の状況の下で、以下のことをループ内だけで完結するような処理は可能でしょうか。
1)システムがt_0においてTrueを出し続けるようになってから、任意の時間待ち、制御値XをX=x_0+1に変更
2)新たな制御値X=x_0+1を受け取り、システムがFalseを出すようになる(※ただし、変更した直後は数回のTrueを出す可能性がある。遅れ時間が少しだけあるシステム。)
3)変更後、ある時間t_1が経過すると、システムはTrueを出し続ける
4) 1)にもどり、Xの値を変更する
5)1)~4)を任意の回数繰り返したあと、X=x'-1としてさらに1)~4)を繰り返すことで制御値を最初の状態X=x_0に戻す
おそらく、whileループを、制御値を変更したい数だけコピーし、スタックシーケンスの中に入れることで上記の用件を満たせるかもしれませんが、whileループの中で上手く処理する方法がないでしょうか。
分かりにくい場所があればご指摘いただければ追記いたします。
どうぞよろしくお願いいたします。
12-26-2017 01:08 AM
伊藤徹様、こんにちは。
「経過時間」Express VIを使用すると、ターゲット時間が経過した時点で、ブール値を得られます。また、「プロパーティノード(値)」を使用すると、数値制御器の値をプログラムが実行中でも更新できます。上記2つの方法を使用すると、時間と制御器の値を制御できると思います。
参考までに上の動作を確認できるVIを添付いたします。このVIでは、0~5秒までTrueになり、制御器の値も更新されます。指定されたターゲット時間に達すると(5秒)Falseになり、制御器の値が元の0に更新されます。プログラムはStopを押すまで実行し続きます。
恐らく、伊藤様の作成されたいプラグラムと異なるとは思いますが、VIのスクリーンショットを添付いたしますのでご確認ください。ご不明な点がございましたらお気軽にご返信下さい。
01-14-2018 02:32 AM
Z.Dzukarnain 様
まず、返信が遅くなり大変申し訳ありません。
添付いただいたVIを拝見させていただきました。
私が作製したいプログラムでは、決まった時間ではなく、ある状態が平衡状態になったということをシステムが判断し、その瞬間から1ループ毎に1回Trueを出すことを想定しています。(平衡状態になるまではFalseを1ループ毎に1回出します。)その後、たとえば1分待ってから、入力の値を任意に変更し、またシステムがTrueを出すまでその値を用いるという仕様にしたいと考えております。
プロパティノードについて理解が足りておらず恐縮ですが、ある条件に基づいて制御値の値を動的に変更できるという認識であっているでしょうか。
ご回答、どうかよろしくお願いいたします。
01-14-2018 10:46 PM
こんにちは。
いろいろなやり方あると思いますが、私ならステートマシンという手法でやると思います。ステート(状態)が変遷するのに合わせて動作仕様を変える時によく使います。
ステートの変遷はステートマシン番号(ケースの番号)を適当な場所で変えます。
いかがでしょうか?
サンプルをLV2017で作っちゃったので、ダイアグラムをPDFにしちゃいました。
ごめんなさい。お手数ですがご自分の開発環境で作ってみてください。