From Friday, April 19th (11:00 PM CDT) through Saturday, April 20th (2:00 PM CDT), 2024, ni.com will undergo system upgrades that may result in temporary service interruption.

We appreciate your patience as we improve our online experience.

NI製品ディスカッション

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

DAQmxをC#で使用してサンプリングデータを取得する際、一定時間待ってからサンプリングを開始する方法

DAQmxの.NET Framework 4.0用の機能を使用し、NIのデバイスを制御しています。

 

特定の外部トリガー(NIデバイスは関与しない・できないもの)を受けて、一定時間待った後にサンプリング開始してデータを取得したいと考えています。

 

この場合、この「一定時の待ち」をプログラム側で(Thread.Sleep(x)などで)待つ以外の方法はないのでしょうか?

タスクにスタートを指示してから一定時間経過した後にサンプリングが開始される、といったプロパティ、設定項目はないのでしょうか?

 

Task niAnalogInTask = new Task("My Analog In Task");

niAnalogInTask.AIChannels.CreateVoltageChannel("cDAQ1Mod3/ai0", "", AITerminalConfiguration.Differential, -10, 10, AIVoltageUnits.Volts);

niAnalogInTask.Timing.ConfigureSampleClock(string.Empty, 100, SampleClockActiveEdge.Falling, SampleQuantityMode.FiniteSamples);

niAnalogInTask.Control(TaskAction.Verify);

AnalogMultiChannelReader niAnalogReader = new AnalogMultiChannelReader(niAnalogInTask.Stream);

//...

//  このような形でPC, .NETの機能依存で待つのではなくて・・・
System.Threading.Thread.Sleep(100); // ReadWaveformを呼んで結果が返ってくる際に、待ち時間+サンプリング時間(待ち、サンプリングの順)が含まれるようにしたい // (待ち処理の時間管理をNIのデバイス側で正確に行って欲しい) AnalogWaveform<double>[] readData = niAnalogReader.ReadWaveform(10);

それとも、「一定時間の待ち」の時間も含めてサンプリングし、必要なデータのみ抽出して使用する方法が適しているのでしょうか?

(その場合、待ちが長くなった場合バッファが足りるかどうかが心配です)

 

使用している環境は下記のとおりです。

  • NI 9205, 9215(BNC)
  • Visual Studio 2013 (C#)
  • .NET Framework 4.0
  • DAQmx

 

回答よろしくお願いします。

 

0 件の賞賛
メッセージ1/7
4,479件の閲覧回数

DAQmxタスクステートは下記リンクを参照してください。

Task State Model - NI-DAQ™mx Help - National Instruments

http://zone.ni.com/reference/en-XX/help/370466V-01/mxcncpts/taskstatemodel/

例えばreserveしといてから集録ってこともできますが、やっぱしソフトウェアタイミングになってしまいます。

 

一つ方法としては、

外部トリガをカウンタ出力の開始トリガとする >> カウンタからはサンプルクロックまたはトリガ用のパルスを生成

>> パルス生成時に「初期遅延」の端子に遅延時間を指定

 

という流れではいかがでしょう?

 

Creating a Delayed, Retriggerable, and Finite Pulse Generator - National Instruments

http://digital.ni.com/public.nsf/allkb/204538A044431C9B86257377004EB952

Certified LabVIEW Developer
There are only two ways to tell somebody thanks: Kudos and Marked Solutions

GCentral
0 件の賞賛
メッセージ2/7
4,460件の閲覧回数

回答ありがとうございます。

 

外部トリガをカウンタ出力の開始トリガとする >> カウンタからはサンプルクロックまたはトリガ用のパルスを生成

>> パルス生成時に「初期遅延」の端子に遅延時間を指定

 

紹介していただいた方法ですが、この「カウンタからトリガ用のパルスを生成」の点について質問があります。

 

私が使用しているのはCompactDAQ CシリーズのNI cDAQ-9188なのですが、このシャーシで内部的なパルス生成が可能なのでしょうか?

(仕様書を見る限りでは、汎用カウンタ/タイマが4個あると記述されているのですが・・・)

 

http://sine.ni.com/nips/cds/view/p/lang/ja/nid/208990

 

それとも、別途カウンタ/タイマの役割を果たすCシリーズのユニットをシャーシに追加する必要があるのでしょうか?

 

回答よろしくお願いします。

 

0 件の賞賛
メッセージ3/7
4,437件の閲覧回数

こんにちは。

 

cDAQ 9188 を使用していることなので、PFI 0 にトリガ信号を入力そしてトリガ信号直後にサンプリングを始めて、

一定時間で指定された期間分のデータを除去するのが一番正確そして楽なのではないかと。(PFI 0 のトリガ信号はTTL信号である必要があります)

 

cDAQ 9188 の内部にはカウンタが搭載されているので、カウンタでパルスを生成してPFI 0 で出力、そして出力したものをPFI 1 で受け取るという方法もあります。

(カウンタのタスクでPFI 0 に出力、アナログ入力のタスクのトリガ設定もPFI 0 にできるかも。。しれません)

 

ちなみに外部からのトリガというのはどの様に扱う予定だったんですか。

0 件の賞賛
メッセージ4/7
4,429件の閲覧回数

回答ありがとうございます。

 

>>ちなみに外部からのトリガというのはどの様に扱う予定だったんですか。

 

これは質問を簡略化するために用いた表現で、実際はすべてPCから操作、指示する予定です。

特定のタスクを厳密に待ってからスタートするのに加え、

特定のタスクを周期的に(できるだけ厳密に)動作させたいという意図がありました。

 

cDAQ-9188の内部クロックctr0~3を使用して周期的なパルスを作成し、このパルスをトリガーとして待ち処理、

周期処理を実装してみようと思いますが、これは可能なことなのでしょうか?

0 件の賞賛
メッセージ5/7
4,420件の閲覧回数

予めカウンタで周期的な信号を出力し続けていれば、その信号をトリガとして使用して待ち時間の実装、もしくは不要なサンプルの除去といった処理がある程度実装できます。

 

ただカウンタからの信号の周期が短すぎるとアナログサンプリングのタスクの開始が間に合わなかったり(タスクの開始などはソフトウェア処理なので数十ms かかります)、

長すぎたりするとアナログサンプリングタスクでタイムアウトのエラーが発生します。なので後々の処理が少し面倒になる可能性があります。

 

いまいちまだご希望されている動作が把握できていないので、回答もあいまいなものになってしまいます。

特定のタスクというのはDAQ デバイスの処理とどの様な関係なのでしょうか。

厳密に行いたいというのは、具体的にどの様な精度のことなのでしょうか。

0 件の賞賛
メッセージ6/7
4,371件の閲覧回数

カウンタで周期処理が可能なことについて、回答ありがとうございます。

ただ、トリガーを受けてもタスク開始までに時間がかかることは知りませんでした。

 

回答を聞いている感じでは予想していた処理は実装できそうにありませんが、より具体的に説明すると下図のような要求を実現しようとしていました。

 

質問用画像.PNG

 

電圧出力のタスクスタートと電圧サンプリングのタスクスタートの周期処理をNIのデバイス、ライブラリ側に移譲してPCでは保証されない10msec以下の動作を実現できないか、と考えていたのですが・・・。

 

0 件の賞賛
メッセージ7/7
4,358件の閲覧回数