こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ADボードプログラムC++

ADボードでデータをCSVで取り出しているのですが、サンプリングレートとサンプリング件数が決まっているので、長い時間データをとり続けることができません。

どうしたら自分がプログラムを閉じるまで永遠にデータを出力し続けることができますか?
教えてください

投稿日時 - 2011-09-22 17:13:52

QNo.7027567

すぐに回答ほしいです

質問者が選んだベストアンサー

> どうしてもサンプリング件数を設定しないといけません

それは、あなたが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ボードは、わずかなバッファを持っているはずですよ。
取得したデータはバッファからクリアされるので、取得したものをどんどん
ファイルに書いていけば良いです。

プログラミングの難易度としてはそれほど高くないと思います。
ぜひトライしてみて下さい。

投稿日時 - 2011-09-26 10:59:52

お礼

わざわざ私のためにご丁寧にしてくださり、ありがとうございます。
とりあえずADGetsamplingData関数でやってみます

投稿日時 - 2011-09-26 14:17:23

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

今のプログラムは、受信データを即ファイルに書いているわけではないんですか?
どういう構造で、サンプリングレートとサンプル数の制約ができてしまっているのでしょう。

リアルタイムにデータ処理をする必要がないのであれば、受信→ファイル書き込みを
延々と行なっていけば、長時間のデータ保存ができると思います。
ただし、32bit版のWindows等では、ファイルサイズ4Gの壁があるので、
ファイルサイズが一定サイズ以上になったら、別のファイルに続きを
書きこむようなスイッチ機構を考慮しなければなりませんが。

リアルタイムにデータ処理をする必要があるということであれば、技術的な敷居がかなり高くなります。
まずは、実現したい要求を明確に示して下さい。

投稿日時 - 2011-09-24 22:58:36

補足

私の使用している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秒しか記録できません。
常にリアルタイムで記録し続けるプログラムを教えてください。

投稿日時 - 2011-09-26 10:34:26

あなたにオススメの質問