- 締切済み
ADボードのデータの遅れについて
ADボードからデータを取得し、ファイルに書き出す下記のようなプログラムを作成中です。 データがNUMを境に遅れているという現象が発生しております。 #define NUM 20000 void CAdDrawGraphDlg::OnFileout() { // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください int nRet; int i = 0, j = 0; HANDLE hDeviceHandle; ADSMPLREQ SmplConfig; ADBOARDSPEC BoardSpec; WORD wSmplData[NUM]; FILE *fp = NULL; ULONG ulSmplNum = NUM; if((fp = fopen("DATA.csv", "w")) == NULL){ /* error */ return; } //setbuf(fp, NULL); /* デバイスのオープン */ if((hDeviceHandle = AdOpen("FBIAD1")) == INVALID_HANDLE_VALUE){ AfxMessageBox("デバイスのオープンに失敗しました",MB_OK, 0); return; } 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); } /* config初期化 */ SmplConfig.SmplChReq[0].ulChNo = 2; SmplConfig.ulSmplNum = NUM; //SmplConfig.ulTrigMode = AD_ETERNITY; SmplConfig.fSmplFreq = 20000; SmplConfig.SmplChReq[0].ulRange = AD_5V; nRet = AdSetSamplingConfig(hDeviceHandle, &SmplConfig); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("サンプリング条件設定に失敗しました",MB_OK, 0); } nRet = AdStartSampling(hDeviceHandle, FLAG_SYNC); //for(;;i++){ /* 無限ループ */ for(i = 0; i < 4; i++){ /* NUM回データを取得 */ for(j = 0; j < NUM; j++){ double val; AdGetSamplingData(hDeviceHandle, &wSmplData[j], &ulSmplNum); val = wSmplData[j]; val = ((val * 10) / 4096) - 5; fprintf(fp, "%d, %f\n", i * NUM + j, val); } if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("CSVファイル作成に失敗しました", MB_OK, 0); } } /* デバイスのクローズ */ nRet = AdClose(hDeviceHandle); if(nRet != AD_ERROR_SUCCESS){ AfxMessageBox("デバイスのクローズに失敗しました"); } fclose(fp); } このロジックで出力されたcsvをグラフ化すると添付画像のようなグラフになってしまいます。 データの遅れは何が原因でしょうか? ご教授よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
AdGetSamplingDataの使い方を間違っていて、2回目の実行以降はまともに読めてないのではないか、と。 2回目以降が遅れているのではなく、1回目の値を繰り返し表示しているだけではないか、と。 まずは、ulSmplNumの値を「毎回」確認してみてください。
お礼
ありがとうございました。 おかげで解決できました。 丁寧な回答ありがとうございました。