- ベストアンサー
ADボードプログラムC++
ADボードでデータをCSVで取り出しているのですが、サンプリングレートとサンプリング件数が決まっているので、長い時間データをとり続けることができません。 どうしたら自分がプログラムを閉じるまで永遠にデータを出力し続けることができますか? 教えてください
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> どうしてもサンプリング件数を設定しないといけません それは、あなたがAdStartFileSampling()関数を使って、ファイルに落とそうとしている から、発生している制約です。 http://www.interface.co.jp/catalog/prdchelp/japanese/gpc3100/AdStartFileSampling.htm によると、この関数は、 >本関数は連続サンプリングが終了するまでアプリケーションに処理が戻りません ということなので、あらかじめサンプル数を指定してやらないと、 「いつ関数を終えれば良いのか」「いつファイルに書き込んだら良いのか」が、 わからず、やむなくサンプル数を必須指定する仕様になっているのでしょう。 あなたの要求にぴったりのヘルプが以下かと思います。 http://www.interface.co.jp/catalog/prdchelp/japanese/gpc3100/SamplingReference.htm#1 AdGetSamplingData()関数を使って、自前のバッファにデータを取得し、 第3引数に取得されたバイト数を元に、ファイルに書き込む。 >本関数ではサンプリングバッファからデータを取得したら、取得したデータはサンプリングバッファ内からクリアされます。 ADボードは、わずかなバッファを持っているはずですよ。 取得したデータはバッファからクリアされるので、取得したものをどんどん ファイルに書いていけば良いです。 プログラミングの難易度としてはそれほど高くないと思います。 ぜひトライしてみて下さい。
その他の回答 (1)
- hidebun
- ベストアンサー率50% (92/181)
今のプログラムは、受信データを即ファイルに書いているわけではないんですか? どういう構造で、サンプリングレートとサンプル数の制約ができてしまっているのでしょう。 リアルタイムにデータ処理をする必要がないのであれば、受信→ファイル書き込みを 延々と行なっていけば、長時間のデータ保存ができると思います。 ただし、32bit版のWindows等では、ファイルサイズ4Gの壁があるので、 ファイルサイズが一定サイズ以上になったら、別のファイルに続きを 書きこむようなスイッチ機構を考慮しなければなりませんが。 リアルタイムにデータ処理をする必要があるということであれば、技術的な敷居がかなり高くなります。 まずは、実現したい要求を明確に示して下さい。
補足
私の使用しているADボードはバッファ機能のないADボードです。雷の観測に使用するため、リアルタイムにどんどんデータを記録していくプログラムを作成しています。 int nRet; HANDLE hDeviceHandle; ADSMPLREQ SmplConfig; ADBOARDSPEC BoardSpec; hDeviceHandle = AdOpen ("FBIAD1"); if (hDeviceHandle == INVALID_HANDLE_VALUE){ AfxMessageBox("デバイスのオープンに失敗しました",MB_OK, 0); return; } else{ nRet = AdGetSamplingConfig(hDeviceHandle,&SmplConfig); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング設定情報の読み出しに失敗しました",MB_OK, 0); } nRet = AdGetDeviceInfo(hDeviceHandle, &BoardSpec ); if(nRet !=AD_ERROR_SUCCESS){ AfxMessageBox("デバイスの情報取得にに失敗しました", MB_OK, 0); } SmplConfig.SmplChReq[0]. ulChNo = 2; SmplConfig.ulSmplNum = 20000; SmplConfig.fSmplFreq = 20000; SmplConfig.SmplChReq[0]. ulRange = AD_5V; nRet = AdSetSamplingConfig(hDeviceHandle,&SmplConfig ); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング条件設定に失敗しました",MB_OK, 0); } nRet = AdStartFileSampling(hDeviceHandle, "DATA .csv",FLAG_CSV); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("CSVファイル作成に失敗しました", MB_OK, 0); } } } nRet = AdClose(hDeviceHandle); if (nRet != AD_ERROR_SUCCESS){ AfxMessageBox("デバイスのクローズに失敗しました"); } どうしてもサンプリング件数を設定しないといけません。設定しないとサンプリング件数が1024点になります。とりあえずサンプリングレートは2万のままでやりたいです。ADボードの使用でサンプリング件数は1.000.000点までしか入力できないので、1.000.000(件数)/20.000(サンプリングレート)で50秒しか記録できません。 常にリアルタイムで記録し続けるプログラムを教えてください。
お礼
わざわざ私のためにご丁寧にしてくださり、ありがとうございます。 とりあえずADGetsamplingData関数でやってみます