05-27-2015 03:07 AM
NI cDAQ-9188に接続したシャーシ NI9215をC#を用いて制御、データ取得を行っています。
データの取得方式は
SampleQuantityMode.FiniteSamples
を使用したいと考えています。
(サンプルデータ取得関数ReadWaveformを使用することで、タスクがスタートし、取得を終えるとデータを返しタスクが終了する動作を意図しています)
指定したサンプリングスピード、サンプリング回数のサンプルデータを取得したいと考えているのですが、
サンプリングスピードはどのパラメータに設定すれば良いのでしょうか?
TaskクラスにあるTiming.ConfigureSampleClock関数を用いてrateにサンプリングスピードの値を設定しているのですが、
この関数を使用するとReadWaveform関数を使用していない間もサンプルが継続し、バッファに読み出されていない古いデータが貯まっていくことが確認できました。
これはデータ取得方式のSampleQuantityMode.ContinuousSamplesの動作のように感じます。
SampleQuantityMode.FiniteSamplesのデータ取得方式で、上図のような形でデータを取得するために、サンプルスピード(サンプリング間隔)を指定するには
どのような関数、パラメータの設定を行えばよいのでしょうか?
回答よろしくお願いします。
05-27-2015 01:08 PM
ご質問はサンプリングレートの指定方法でしょうか、それともタスク開始の指定方法でしょうか?
サンプリングレートは使用されている関数で問題なく設定されているはずです。以下のサンプルが参考になると思います。
C:\Users\Public\Documents\National Instruments\NI-DAQ\Examples\DotNET4.5\Analog In\Measure Voltage\AcqVoltageSamples_IntClk\CS
問題は「タスクが勝手に始まっている」ということではないでしょうか?DAQmxであればRead関数が呼ばれたタイミングでタスクが開始するはずです。(きちんと書くならタスクスタートをCallすべきでしょうが、なぜかNI社のサンプルはそうなっていませんね)
どのようにして「ReadWaveform関数を使用していない間もサンプルが継続」していることを確認されていますか?上記サンプルを使用しても「サンプルが継続」していることが確認できますでしょうか?
仰っていることが事実ならMAXのテストパネルでも同じ現象が起きる気がしますがそちらは如何でしょうか?
質問ばかりで恐縮ですが教えていただけると幸いです。
05-27-2015 10:04 PM
ご質問はサンプリングレートの指定方法でしょうか、それともタスク開始の指定方法でしょうか?
問題は「タスクが勝手に始まっている」ということではないでしょうか?
仰るとおり、タスクが勝手に始まっている、継続していることが問題でした。
上記で説明を省いていましたが、上図のサンプリング処理を繰り返し実行します。
初回のデータ取得に問題はないの、初回以降のサンプリング処理の間にサンプリングが継続していること(勝手に開始していること)が問題でした。
どのようにして「ReadWaveform関数を使用していない間もサンプルが継続」していることを確認されていますか?上記サンプルを使用しても「サンプルが継続」していることが確認できますでしょうか?
これは、TaskクラスにあるStream.AvailableSamplesPerChannelの値によって現在バッファにたまっているデータの量を、
そして溜まっているデータのタイムスタンプを確認することでReadWaveForm関数を呼ぶ前にデータが取得されていることを確認していました。
自分のソースコードおよびサンプルコードを色々操作した結果、
Timing.ConfigureSampleClock関数によるサンプリング設定にてサンプル数を指定していなかったことが問題だったようです。
1)サンプル数を指定していた場合(1度に取得するサンプル数3個、サンプリングスピード100Hz、ReadWaveform関数呼び出し間隔1秒間)
<<Sampling start at 58:10 014>>
58:10 063 -0.299382009613184
58:10 073 8.21545738918135
58:10 083 -8.34882124055848
<<Sampling start at 58:11 093>>
58:11 123 0.193484397650111
58:11 133 8.2041657129778
58:11 143 -8.27374685282673
2)サンプル数を指定なかった場合(1度に取得するサンプル数3個、サンプリングスピード100Hz、ReadWaveform関数呼び出し間隔1秒間)
(stacked samplesはReadWaveform関数呼び出し間隔の間にたまったデータ数を示します)
<<Sampling start at 00:50 513>>
00:50 589 -0.299382009613184
00:50 599 -0.123292896925307
00:50 609 0.172732127870603
[[stacked samples: 106]]
<<Sampling start at 00:51 680>>
00:50 619 0.0927748531319142
00:50 629 0.437323567559319
00:50 639 0.108949416342412
Timing.ConfigureSampleClock関数でサンプリング回数を指定しなかった場合、連続的にサンプリングが継続されるという認識でよろしいのでしょうか?
05-28-2015 06:47 AM
ひとまずはご目的の集録は実現されたようでなによりです。
ヘルプによると連続集録においてサンプル数はバッファサイズを定義するようなので、バッファサイズが強制的に決まり直近のサンプルが集録されるようになっているのではないでしょうか。
http://zone.ni.com/reference/en-XX/help/370473H-01/mstudiowebhelp/html/72199dd8/
ちょっと不思議な気がするのですが、1秒間隔で3サンプル読み取るのはなぜでしょう?平均化でしょうか?そもそも100Hzで集録することに意味はあるのでしょうか。
最初の投稿ですと有限集録でリトリガブルでとられているのかと思いました。コードを見ないとやはりコメントは難しいですね。