NI製品ディスカッション

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

ループ時のデータの扱い方

LabVIEW8.20、NI PCI-6221を使っています。

「外部トリガ1回で1サンプル取り込み、Express表作成に入力する」というのを一定時間ループさせた後、表データをExcelにDDE通信で書き込んでいるのですが、長時間取り込んでいるとExpress表作成の動作に時間が掛かるのか、外部トリガの入力間隔にループの処理が間に合わず、停止してしまいます。
対処法としてExpress表作成をループの外に配置する方法を考えたのですが、ループ1回分のデータしか表形式にできませんでした。

ループの速度を一定に保ちながら、全てのループで取り込んだデータを扱うことは出来るのでしょうか?
よろしくお願いします。
0 件の賞賛
メッセージ1/6
5,229件の閲覧回数
日本ナショナルインスツルメンツ技術部の宮本と申します。

お問い合わせの件に関しまして以下の通り回答いたします。

外部トリガ1回で1サンプル読み取り、Express表にてデータを表示していると存じております。また、この動作をループ内で行い一定時間集録されたデータをExcel形式で保存されたいと存じております。

この集録を長時間行うとデータの取りこぼしが起き、ループが停止してしまうとのことですが、ループが停止する際にエラー等は発生するのでしょうか。また、ご使用中の外部トリガですが、どれ位の周波数の信号なのでしょうか。例えば外部信号の周波数を下げた際にも問題は発生するのでしょうか。これらの質問よりループの停止する原因を特定できると考えております。お手数ではありますが、ご確認お願いいたします。

ループ内で「外部トリガ1回で1サンプル読み取り」を行い、1データ毎にデータをExpress表に表示しているのですが、連続的にこれを行う場合、1サンプル読み取りではなく連続集録を行うことをお奨め致します。外部信号がPFI0に接続されている場合、クロックソースをPFI0に設定することでこの信号をデータ集録時のクロックとして使用できます(image1参照)。また、連続集録を行うことでバッファにデータを溜め込むことが出来るので、データの取りこぼしを回避出来ると考えております。これによりデータを表示する際の処理もループ内で可能になるかと思います(image2参照)。

一部異なる点としましては、連続集録を行っているのでExpress表に表示されるデータは1サンプル毎ではなく、設定したサンプル数毎になります。

上記内容をご確認頂き、今一度結果をご返信願えますでしょうか。
よろしくお願い致します。
すべてをダウンロード
0 件の賞賛
メッセージ2/6
5,203件の閲覧回数
御回答ありがとうございます。

ご提案のように、連続集録ならトリガに遅れることはありません。
しかし1サンプル取り込む毎に、ステージの現在位置を”VISA読み出し”で取得しているので、「1トリガ1サンプル」の条件は変更できません。

外部トリガは、ステッピングモータ駆動ステージが一定間隔で移動した時に出力されるパルスを、D-FF回路を使用して別のパルスと同期させてトリガとしています。
ステージの移動速度は必ずしも一定ではないのと別のパルスと同期させているので、パルスの周波数は約100~150Hzです。
トリガの動作限界は1トリガで1サンプル取り込むとき、トリガ周波数約250Hzまでパルスを入力できました。

シミュレーションとして、トリガを内部トリガ(200Hz)に変更して「1トリガ1サンプル」の条件で実行してExpress表で表示したところ、4分ほど経過した辺りで、クロックにプログラムが追いついていないとのエラーメッセージが出ました。
内部トリガの周波数を下げても、停止する時間が延びるだけでした。
ループ1回にかかった所要時間もチェックしたのですが、ループ回数が増えると所要時間も増えていきました。
Express表を、「各コールでデータクリア」に設定するか、ループの外に配置することでエラーは出なくなり、所要時間もほぼ一定でしたが、この場合はもちろん最後のループのデータしか残りません。

長くなってしまいましたが、最終的に測定データをエクセルで閲覧できればよいので、Express表を使用しなくても全ループのデータを保存できないでしょうか?
0 件の賞賛
メッセージ3/6
5,185件の閲覧回数
日本ナショナルインスツルメンツ技術部の宮本と申します。

ご返信ありがとうございます。

「1トリガ1サンプル」条件を変更できない旨、理解いたしました。この際の対応策として、キューを使用する方法をご紹介いたします。LabVIEWでは、プログラム内でのデータのやり取りにキューというバッファを使用することが出来ます。キューを使用することにより、データ集録とデータ処理を切り分けることが出来ます。データ集録を行っているループでは、データを読み取り、キューに送るという動作を行います。別途作成されたループでは、データをキューから抜き出し、表示する動作を行います。キューを使用することにより、データ集録ループ内の処理を減らすことが出来きます。結果的にデータ集録時のパフォーマンスを向上させることが出来ると考えております。キューを使用するサンプルを作成したのでご参照下さい。

上記内容をご確認頂き、今一度結果をご返信願えますでしょうか。
よろしくお願い致します。
メッセージ4/6
5,140件の閲覧回数
サンプルを基にキューを使用して実行してみたところ、パフォーマンスの低下が抑えられたので、長時間取り込むことができるようになりました。

質問が変わるのですが、最初にご提案いただいた連続集録で読み取る場合は、各ポイント毎のdtの値を保存することは可能でしょうか?
0 件の賞賛
メッセージ5/6
5,101件の閲覧回数
日本ナショナルインスツルメンツ技術部の宮本と申します。

ご返信ありがとうございます。

連続集録を行う際の時間値ですが、「DAQmx読み取り」関数を使用する際にデータを波形として読み取っていただくことで時間値を保存することが可能となります(image3参照)。

以上、よろしくお願い致します。
0 件の賞賛
メッセージ6/6
5,056件の閲覧回数