11-19-2009 11:13 PM
計測ファイルへ書き込みについて質問があります。
現在、DAQを用いてデータ収録と信号処理を行い、
それをチャートに表示するプログラムを作っています。
表示部分までは問題ないのですが、
計測ファイルに書き込みVIをループの中に入れると
エラー200279が頻発してしまい、ファイル書き込みどころか
データ収録もまともにできない状態になってしまいます。
エラー200279はバッファにデータが溜まりすぎるときに
発生するらしく、技術サポートデータベースに記載されていた
解決策ではサンプリングレートを増やすか、バッファサイズを増やすか、
チャンネルあたりの読み込みサンプルを増やす、と書かれていました。
ですが、サンプル数を増やすと処理が追いつかなくなってしまい、
チャートの表示がスムーズに行われなくなってしまい、非常に困っています。
連続的にデータを保存したいのですが、このVI以外でそれを
行える方法がありましたら、ご教授願います。
11-24-2009 01:10 AM
Toyama-rdw 様
はじめまして。
お送りいただいた内容を拝見いたしましたが、投稿されていないサブVIがいくつかございましたので実行できる状態でVIを開くことが出来かね、詳細な設定レートなどがわかりかねましたため、一般的なご案内をさせていただきます。
LabVIEWでは今回お使いいただいている計測ファイルへ書き込むviのように上位ファイルI/Oをループ内に配置することをお勧めしていません。
ファイルの開閉操作を繰り返しの度におこないます。このためループ内でファイルに書き込みを行う場合は下位ファイルI/Oの関数をお勧めしています。
下位ファイルI/Oを使用した簡単なサンプルを画像にてご紹介いたします。
ここではヘッダファイルは含めず、テキスト形式に変換して保存する方法のご紹介で、
10000サンプルごとに書き込むファイルを変更するといった込み入った操作は含まれていません。
ご参考いただきましてご所望のファイル保存の動作に関しお問い合わせいただけます様お願いいたします。
E. Maeda
11-25-2009 12:03 AM
E. Maeda様
ご指導いただきありがとうございました。
サブVIの添付し忘れ、申し訳ありませんでした。
私のVIの中で使われているサブVIは、
DAQアシスタントExpressVIにて、コード生成を行った際に
作成されたものですので、特に値の設定などは行っていません。
私が必要としているファイル操作は
・随時ファイルに書き込みを行う
・サンプル数を設定し、その数に達したら新しいファイルを作成し、書き込みを行う
以上の二点です。
初心者でご迷惑をおかけしますが、よろしくお願いします。
11-29-2009 06:11 PM
Toyama-rdw 様
そのご検討いたしましたが、一旦すべてのデータを一つのファイルに書き込み、
その後1000個のデータ に切り分けて保存をしていく方法はいかがでしょうか。
ファイルパスで集録データを書き込んだファイルのパスを指定して、テキストファイルから読み取る.viで1000ラインごとに読み取り
新しいファイル(ここではデフォルトで0.txt, 1.txt, 2.txt, 3.txt...という名前を付けています)に書き込んで保存していきます。
データ集録の際にファイルI/Oでのオーバーヘッドを減らすことが出来ます。
データ集録が終わった後に実行するviの参考例をお付けいたします。ご参考下さい。
E.Maeda
12-01-2009 03:10 AM
E.Maeda様
教えていただいたプログラムで質問ですが、
図中のフラットシーケンスストラクチャ内にあるサイズ(バイト)は
数値表示器の表記法をI8(バイト)にする、ということなのでしょうか?
また、全ての計測データを一旦一つのファイルに書き込むという点について質問です。
現在、シフトレジスタとスプレッドシートに書き込むVIを用いて
「全てのデータを一旦ファイルに書き込む」部分を作成しています。
ループの終わりのシフトレジスタに書き込みVI、
始まりのシフトレジスタに配列を接続していますが、
最後の一個のデータしか書き込ません。
どのように改善すればいいか、または他にいい方法がありましたら
教えていただけるとありがたいです。
最初に投稿したファイルとあまり変わりませんが、
現在のVIを載せておきます。
サブVIも入れましたので開くことができると思います。
12-06-2009 08:07 PM
Toyama-rdw 様
お返事が遅くなりまして申し訳ございません。
>図中のフラットシーケンスストラクチャ内にあるサイズ(バイト)は
>数値表示器の表記法をI8(バイト)にする、ということなのでしょうか?
初めにあるサイズ(バイト)はローカル変数に0を入れて初期化をしています。
viを実行ボタンを何度も押して繰り返しますと、前の実行の最後の値がサイズ(バイト)の値として読み取られることを防ぐためにおいています。
今回お付けされているviを拝見いたしましたがWhileLoopで指標付けをしない限り
トンネルでもシフトレジスタでもループの外には最後の値しか渡されません。
シフトレジスタの使用の利点はループの中でひとつ前やそれ以前の値が使用できる点にあります。
>始まりのシフトレジスタに配列を接続しています
このDataはデータの初期化として用いられています。
シフトレジスタの詳細に関してはLabVIEW Helpをご参照ください。
全てのデータをループの外に渡すには、指標付けトンネルをご使用になられてはいかがでしょうか。
また、シンプルエラー処理に関してはDAQmxタスクを停止.viの後に並べることによって
停止がきちんとされたかどうかのエラー処理も行うことが出来ますので分岐をせずに並べていただくことをお勧めいたします。
よろしくお願いします。
E.Maeda
12-09-2009 01:35 AM
E.Maeda様
ご指摘していただいた指標付けを用いて、
一つのファイルに計測データを書き込むことができました。
ただ、この方法ですと1分ほどの計測でも、プログラム終了後に
データを書き込むのに時間がかかってしまい、
数時間での計測には不向きだと考えます。
逐一データを書き込み、一定数のサンプルを書き込んだら
新しいファイルに書き込む動作を実現できる
案がありましたらご教授してください。
また、現在1秒間に1万点データを取得する設定になっており、
これを千点に変更したいのですが、
連続データ収録の場合、読み取るサンプル数の値は
バッファサイズを指定するもので、
試しに変更してみましたが、1万点収録してしまいます。
これを変更するにはどこを設定しなおせばよろしいのでしょうか?
以上二点についてよろしくお願いします。