03-17-2015 10:29 PM
USB6212 BNC を使って計測をしています.
制御は LabVIEW ではなく,Matlab の DAQ toolbox を利用しています.
アナログ入力3チャンネル,アナログ出力を2チャンネルを設定して
数kHz, 数秒のデータを ループを回して繰り返し取得しています.
今,5 kHz で 2秒間記録する場合は,問題なく動作しているのですが
記録時間を 2 秒以上 に設定すると,ループ内の待機関数(matlab では,wait)
に関するエラーが出てしまいます.
サンプリングレートを 例えば 1 kHz に下げると動作しました.
USB6212 自体は 最大 400 kHz でサンプリングできるということなので
3 チャンネル使ったとしても, 5 kHz 程度は余裕かと思います.
1度に取得できるサンプル数の問題なのかと思っているのですが
5000 S/s* 2 s * 3 (channels) = 30000 サンプル以上はこの機器では
厳しいのでしょうか?
または,実際の上限は,仕様のどの項目を見れば良いでしょうか.
笠井
03-18-2015 08:33 AM
こんにちは。
エラーの詳細がわからないため、推測で返答します。(エラーの情報なども記載してもらえるとアドバイスがより的確になります)
読み取るサンプル数についての記述がなかったので、バッファオーバーフロー関連のエラーが発生しているのではないかと。
下記の投稿とリンクされている資料を見てみてください。
03-18-2015 09:48 AM - 編集済み 03-18-2015 09:49 AM
私もdoradorachanさんのおっしゃるとおり、バッファオーバーフローだと推測します。
30,000 サンプルをオーバーフローしないようにするには、少なくともそれまたはそれ以上のバッファをホスト側割り当てる必要があるかと思います。
DAQmxがどのくらいのバッファをデフォルトで割り当てているかはわかりませんが、それを増やす対策はできるかもしれません。
私はこの関数を使ったことがないので確信はないのですが、DAQmx Configure Input Buffer という関数またはバッファのプロパティでInput Buffer Sizeのようなものがあると思います。これをタスクを開始する前に使用して、数字を増やしてみてください。
別の対策としては、読み取りを複数回にわけて、Matlab上でそれらを連結すれば希望の実装ができるかと思います。
03-18-2015 07:46 PM
レスポンス有難うございます。
Matlab 情でのエラーは、以下のようなものです。
------------ここから---------------
警告: コールバックの実行中にエラーが発生しました:
添字による代入の次元が一致しません。
エラー: RecPlotData2 (line 😎
recobj.dataall(:,1) = event.Data(:,1)*100; %(mV), Axoclamp2B からの出力は 10*Vm なので
*1000(mV)/10(gain)
エラー: daq.internal.BaseClass/notify (line 83)
obj.notify@handle(varargin{:});
エラー: daq.Session/fireDataAvailableIfNeeded (line 4082)
notify(obj,'DataAvailable',dataAvailableInfo)
エラー: daq.Session/handleProcessAcquiredData (line 3147)
obj.fireDataAvailableIfNeeded(false);
エラー: daq.internal.StateHardwareRunning/processAcquiredData (line 116)
obj.Session.handleProcessAcquiredData(triggerTime,timestamps,dataAcquired);
エラー: daq.Session/processAcquiredData (line 3693)
obj.InternalState.processAcquiredData(triggerTime,timestamps,dataAcquired);
エラー: daq.ni.Session/handleDataAvailable (line 234)
obj.processAcquiredData(obj.TriggerTime,timestamps,dataBlock);
エラー: daq.ni.AsyncIOInputChannel/handleDataAvailable (line 136)
obj.Session.handleDataAvailable(dataInCells{iData}, channels, ...
エラー: daq.ni.AsyncIOInputChannel>@(varargin)obj.handleDataAvailable(varargin{:}) (line 58)
@obj.handleDataAvailable);
エラー: asyncio.Channel/onDataReceived (line 398)
notify(obj.InputStream, 'DataWritten', ...
エラー: asyncio.Channel>@(source,data)obj.onDataReceived() (line 315)
@(source, data) obj.onDataReceived());
エラー: daq.Session/doWait (line 2827)
pause(0.1);
エラー: daq.internal.StateWaitingForHardwareTrigger/wait (line 76)
obj.Session.doWait(timeout);
エラー: daq.Session/wait (line 1073)
obj.InternalState.wait(timeout);
エラー: main_loopingtest (line 64)
s.wait(recobj.rect/1000 +1);
> In BaseClass>BaseClass.notify at 83
In Session>Session.fireDataAvailableIfNeeded at 4082
In Session>Session.handleProcessAcquiredData at 3147
In StateHardwareRunning>StateHardwareRunning.processAcquiredData at 116
In Session>Session.processAcquiredData at 3693
In Session>Session.handleDataAvailable at 234
In AsyncIOInputChannel>AsyncIOInputChannel.handleDataAvailable at 136
In AsyncIOInputChannel>@(varargin)obj.handleDataAvailable(varargin{:}) at 58
In Channel>Channel.onDataReceived at 398
In Channel>@(source,data)obj.onDataReceived() at 315
In Session>Session.doWait at 2827
In StateWaitingForHardwareTrigger>StateWaitingForHardwareTrigger.wait at 76
In Session>Session.wait at 1073
In main_loopingtest at 64
警告: コールバックの実行中にエラーが発生しました:
添字による代入の次元が一致しません。
------------ここまで---------------
よみにくいですが、えらーログの
最初
エラー: RecPlotData2 (line 😎
recobj.dataall(:,1) = event.Data(:,1)*100; %(mV), Axoclamp2B からの出力は 10*Vm なので
*1000(mV)/10(gain)
と最後
エラー: main_loopingtest (line 64)
s.wait(recobj.rect/1000 +1);
が自分で書いたものになっています。
データが取得出来ていれば、event.Data に取り込まれているはずなので、それを自分で設定した
recobj.dataall にいれているのですが、データが取得できていないような振る舞いな感じです。
最後の wait は、USB6212 が、設定したデータをすべてサンプル取得し終るか、( ) 内で設定した
時間をこえるまで、 matlab のほかの動作を待つものですが、ここでのエラーも、データがうまく
取得できていないような感じかもしれません。
読みとるサンプル数を意識していませんでしたが、5 kHz * 2 sec * 3Ch が event.Data に
入れられているので、30000 サンプルを一度によみだしているということかとおもいます。
バッファオーバーフローと、その対策にかんしてしらべてみます。ありがとうございます。
笠井
03-18-2015 08:04 PM
doradorachan さんも指摘されていた通り、バッファオーバーフローに関してしらべてみます。
大分古いですが、
http://digital.ni.com/public.nsf/allkb/A52342629C4F641686256E62003A0157
Samples per Channel | バッファー サイズ |
---|---|
0 - 100 S/s | 1 kS |
100 - 10,000 S/s | 10 kS |
10,000 - 1,000,000 S/s | 100 kS |
> 1,000,000 S/s | 1 MS |
これだと、 5 kHz だと バッファサイズは 10 kS に割り振られるということで、30 kS は
大きすぎるということかもしれません。
手動で バッファサイズを大きくできるか、しらべてみて、無理そうなら
分割してよみだす方法を考えてみます。
(main のループの中に、分割取得用の サブループを設定する?)
笠井
03-18-2015 10:03 PM
doradorachan さん、TailOfGon さん ありがとうございました。
Matlab の Daq toolbox で session based inteface を利用する場合
セッションプロパティの NotifyWhenDataAvailableExceeds というものが
(おそらく)読みとるデータのサイズをきめているのだとおもいます。
http://jp.mathworks.com/help/daq/ref/notifywhendataavailableexceeds.html
アナログ入力とアナログ出力を同時にせっていした場合、que にいれる出力データ
のポイント数が、入力のサンプリング数等を決めるので、無視していました。
なので、記録時間を伸ばす場合は、明示的に
s.NotifyWhenDataAvailableExceeds = 出力データのポイント数;
を指定してやれば良いようです。
このプロパティを偏光する場合は、セッションに出力データが que されている必要が
あるので、
queueOutputData(セッション、出力データ);
s.NotifyWhenDataAvailableExceeds = 出力データのポイント数;
の順で指定する必要があるようです。
結局ハードゥエア自体のバッファサイズの上限は不明なままですが、とりあえずは
これでやってみようとおもいます。
ありがとうございました。
笠井
03-19-2015 03:51 AM
仕様のほうを見てみるとオンボードメモリは書かれています。
http://sine.ni.com/nips/cds/view/p/lang/ja/nid/207096
オンボードメモリは4095 サンプルのようです。
また、同時サンプルができないとも書かれていて、マルチプレクサを使っているようです。
オンボードメモリが差動1chあたりであれば、4095*8で約30000サンプルで
動作しなくなるというエラーになるのではないかと思います。
03-19-2015 06:18 AM
sMaSaTo さん
複数チャネルからの記録に関しては、おっしゃる通り、厳密には、同時サンプリンは出来ないようですね。
オンボードメモリ 4095 サンプルが、上記のバッファにあたるところでしょうか。
メモリの定義がわからないのですが、Single End でつかえば、4095 * 16 になるのでしょうか?
ちょっとわからなくなってきました。。。
NI のフォーラムなので、LabVIEW で記録しろよ、ということもあるかも知れませんが
Matlabの Daq toolbox (2014b @ Windows 8.1 で動作確認) で Session Based interface
を使用して NI-DAQ から記録して記録して波形表示をアップデートするスクリプト
(実際のものから抜き出した簡略版)を貼付してみます。
Matlab にも Example の寄せ集めみたいなものですが。
Main.m を 実行すると 波形表示 GUI が開いて Loop-Out ボタンを押すと 記録、ストップの切り替えです。
これだと、差動入力で 3チャネル分設定していて、100 kHz で 5秒 サンプル、(1チャネルあたり 500 K サンプル)
という設定にしてもエラーはでないのですが、これがうまく記録できているとするなら、上記のメモリの話が
良くわからなくなります。もしくは、間違った?データが取り込まれている。。。?
笠井
03-21-2015 11:40 PM
オンボードメモリはその名の通りハードウェアに搭載されているメモリになりますが、
私が指摘した内容や以前掲載されていた資料のバッファはDAQmxのドライバが作成しているソフトウェアのメモリの話です。
資料で記載されていたバッファがオーバーフローしてエラーが発生しているのではないかと。
オンボードメモリが重要になるのは、ドライバがハードからデータをきちんと取りにいけない時となります。
PCI やPXI といったバスではあまり問題になりませんが、USB 型のDAQでは転送が間に合わずオンボードメモリがオーバーフローするときもあります。
MATLAB のエラーがあまり理解できていないので、問題がオンボードメモリかソフトウェアのバッファで発生しているかわかりませんが、
とりえあず1度に読み取るサンプル数を少なくして、より高い速度でデータを取りに行けば大抵のオーバーフローのエラーは回避できるかと。