07-31-2019 05:45 AM
30秒周期での制御を繰り返し行うプログラムにおいて、
30秒周期のうちの29秒間は信号Aを出力、
残りの1秒間は信号Bを出力したいと考えております。
具体的には、
”出力信号を切り替えるタイミングで1度すべての信号をOFFにして、回路上での短絡を防ぐため”
です。
どのようにすればよいでしょうか?
初心者ですがご教示お願い致します。
07-31-2019 06:44 AM
平素よりNI製品をご愛顧頂きありがとうございます。
日本ナショナルインスツルメンツ技術部の上野です。
出力を制御されたいとのことですが、下記の情報をいただけますか?
07-31-2019 07:00 AM
・信号を出力するデバイス
→NI9476
・アナログ出力もしくはデジタル出力
→デジタル出力
・信号Aと信号Bの電圧レベル
→10 V
・出力するチャンネル数
→26ch程度
・プログラムを作成する言語
→LabVIEW
です。
補足として、
入力デバイスはNI9228を、
LabVIEWのバージョンはversion18 of 1 (64-bit)を用いています。
よろしくお願い致します。
07-31-2019 12:32 PM
NI 9476でしたら、DAQmxデバイスドライバで動作しますので、プログラミングもDAQmx VIを使用します。
信号はデジタル出力とのことですので、信号Aと信号BがOn/Off(High/Low)を指すのではないかと思います。
出力を制御する前にデジタル出力を行う方法をご紹介します。まだ始めたばかりでしたら、もっともシンプルな方法はDAQアシスタントを使用する方法です。
まずは、プログラムを実行した際に設定した状態を出力する作成手順は以下のとおりです。
この段階で任意のラインからデジタル出力をおこなえることが確認できましたら、出力制御のプログラミングに移ります。
作成方法は、大まかに言うと、DAQアシスタントに構成したチャンネル分のTrue配列を渡してHighとなるデジタル出力を生成し、29秒待機します。その後2つ目のDAQアシスタントにFalse配列を渡してLowとなるデジタル出力を生成し、1秒待機します。これを繰り返すようにForループかWhileループで回すことで一定時間間隔でのデジタル出力となります。
作成方法は色々かんがえられますが、その一例を添付致します。この例では、
ステートマシンというデザインパターンを用いてイベントストラクチャのタイムアウト設定で制御時間を設定しています。
ステートマシン自体のサンプルは、ヘルプメニュー>サンプルを検索を選択し、検索タブで「ステートマシン」と検索すると見つかります。
待機関数を使用しない理由は、任意のタイミングで停止できないからです。例えば29秒待機するように待機関数を使用すると、途中で停止したくてもその時間は待機してから停止されることになるためです。
最後に注意点として、添付のVIで使用されているDAQアシスタントは、こちらの環境で構成されているため、お使い環境とは異なります。そのため、試す場合は上記の手順で作成したDAQアシスタントに入れ替える必要がございます。
07-31-2019 03:49 PM
丁寧なご返答ありがとうございます。
実際に添付していただいたサンプルプログラムを参考に動作させてみました。
まだまだ初心者なので初歩的な質問ばかりになってしまいますが、いくつか質問させていただきます。
Runでは30秒の1周期で動作が終了してしまった。
Run continuouslyで動作をさせた場合、出力の時間間隔での制御ができていない。
・DO test viでは30秒を1周期とした動作を繰り返し可能か?
・初期値に1000が戻された場合、イベントストラクチャ内では瞬時にsignal Aが出力されるため、瞬間的にしか出力を0にできないのではないか?
また、シフトレジスタもEnum constantも使い慣れていないためシフトレジスタでの制御の流れが理解できていません。
・Enum constantではSignal A, Signal B, wait, Exitを列挙しているが、この4つを同時にシフトレジスタに格納しているのか?
・このWhileループは29秒+1秒の合計30秒周期で繰り返し行われるのか?
初歩的な質問ばかりになってしまい大変申し訳ないのですが、
よろしくお願い致します。
07-31-2019 05:35 PM
Runで自動的に終了してしまうようでしたら、エラーが発生して終了していると思います。おそらくDAQアシスタントの入れ替えがうまくできていないのではと推測しております。今回添付したバージョン2でエラー表示器を付けましたので、ご確認ください。
Run continuouslyを使わないようにWhileループを使用しておりますので、連続実行は試す必要はございません。
>DO test viでは30秒を1周期とした動作を繰り返し可能か?
エラーがなければ、停止ボタンが押されるまで30秒周期を繰り返します。
>初期値に1000が戻された場合、イベントストラクチャ内では瞬時にsignal Aが出力されるため、瞬間的にしか出力を0にできないのではないか?
ケースストラクチャの実行順は、Signal A > Wait > Signal B > Wait >Signal A・・・と繰り返します。Signal Bの後のWaitケースで1000ミリ秒待機しています。
>Enum constantではSignal A, Signal B, wait, Exitを列挙しているが、この4つを同時にシフトレジスタに格納しているのか?
列挙体は細い青色ワイヤで配線しており、ここにはスカラ値(1つの値)しかながれていません。4つを同時に格納しているのではなく、Signal A = 0, Signal B = 1, wait =2, Exit =3 と割り当てた整数値のいずれかが流れています。
Enum Constant(列挙体定数)の配線を右クリックして、プローブを選択し、どのような値が流れているかを確認することができます。
>このWhileループは29秒+1秒の合計30秒周期で繰り返し行われるのか?
はい、そのように作成しております。
LabVIEW自体の理解については、下記のページを参照してみると良いかもしれません。
08-01-2019 08:12 AM
色々な説明書を参考にさせて頂き、制御のフロー等を理解、また実際に動作の確認も取れました。
ありがとうございます。
加えて、今後は29秒間出力する26chの信号に制御を加えていく予定です。
その場合は、ケースストラクチャのsignal Aの中に判別プログラムや入力用のDAQアシスタントを加える
という方法で間違いないでしょうか?
よろしくお願い致します。
08-01-2019 05:20 PM
はい、間違いないと思います。
エラーの配線を行うことでエラー時には停止&表示されますので、デバッグしやすくなります。プローブ等デバッグツールと併用して開発していただけると幸いです。
08-01-2019 06:08 PM
最後にもう一つ質問させて頂きます。
現在、1000 msの間隔を短くするため1000 msのNumeric constantを100 msに書き換えております。
しかし、フロントパネル上のBoolean propertiesでは1000 msのときと変わってないように見えます。
出力信号も実際に計測してみましたが100 ms程度に低減されていないように感じられます。
・ソフトウェアタイミングでは1000 ms程度までが制御の限界なのでしょうか?
・数十~数百 ms程度で制御させる場合はハードウェアタイミングで動作させなければならないでしょうか?
08-01-2019 06:36 PM
1000ミリ秒の定数は、2箇所変更する必要がありますが、両方変更しても変化はありませんか?
数十~数百ミリ秒でしたらソフトウェアタイミングでも動作可能です。