NI-DAQmxによって返される波形タイムスタンプの確度

更新しました May 9, 2023

使用製品

ドライバ

  • NI-DAQmx

問題

  • タイムスタンプが正確かどうかを確認するにはどうすればよいですか?
  • 波形のタイムスタンプはどのように生成されますか?
  • タイムスタンプはハードウェアタイミングですか?それともソフトウェアタイミングですか?

解決策

開始時間 (t0) タイムスタンプ

DAQデバイスはコンピュータのシステムクロックと同期していないため、タイムスタンプデータを出力しません。 収集した波形のタイムスタンプは、システムクロックに基づいています。ただし、DAQmx読み取りVI(またはDAQmx Read関数)が呼び出されてサンプルが利用可能になった後、オペレーティングシステム(OS)がDAQデバイスのバッファからデータ値を収集するタイミング(Tos_retrieval)に基づいているため、ソフトウェア時間値となります。タイムスタンプは、収集が開始された時間を概算するために、時間間隔(dt)とバッファから取得されるサンプル数(#s)から計算した値です。
 

システムクロックは、データが最初にバッファから読み取られる際に1回だけ読み取られます。これは、収集されているデータがハードウェアタイミングであるためです。収集データのタイムスタンプはすべて、その最初のタイムスタンプに対して正確です。連続タスクの場合、バッファからの最初の読み取り(t0next)に続くタイムスタンプは、同様の方法で最初のタイムスタンプから計算されますが、読み取られたバッファ数(#b)も含まれます。
 

t0計算では、DAQmx読み取りVI(またはDAQmx Read関数)が呼び出されたときに収集がまだ実行中であると想定しています。最高の確度を得るには、DAQデバイスが最初のサンプルセットを収集している間にDAQmx読み取りVI(またはDAQmx Read関数)を呼び出す必要があります。 遅延があり、DAQデバイスが収集を完了した後にDAQmx読み取りVI(またはDAQmx Read関数)が呼び出された場合、タイムスタンプはまったく正確ではありません。これを防ぐ1つの方法は、トリガを使用して収集を開始することです。
 

前述のように、タイムスタンプデータの確度はOSに依存します。Windows OSの分解能はミリ秒台あり、Real-Time OSの分解能はマイクロ秒台です。しかし、これらの場合、タイムスタンプは依然としてソフトウェアのタイミングであり、潜在的な確度よりもはるかに低い場合があります。十分正確なタイムスタンプが得られない場合は、ハードウェアタイムスタンプを使用する高速デジタイザを検討することをお勧めします。詳細については、NI High-Speed Digitizers Help: Time Stampingを参照してください。

 

 

時間間隔 (dt)

時間間隔は、波形における各サンプル間の時間変化です。 サンプルクロックレートに基づいて計算されます。この値はハードウェアタイミングであり、使用されているDAQデバイスのクロックと同じくらい正確です。デバイスの確度を判断するには、そのデバイスの仕様を参照してください。
 

DAQmxタイミングVI(またはDAQmx Timing関数)でハンドシェイク指定なし波形を使用、または変化検出が指定されている場合、レート設定がないため、DAQmxはdtを0として返します。dtが0の波形は、多くの場合、波形解析関数では機能しません。ただし、タイミングソースのレートが想定できる場合は、プログラム的にdtの値を更新可能です。
 

波形データタイプは、サンプル間の等間隔タイミングのみをサポートします。タイミングが等間隔でない場合(たとえば、各サンプルに独自のタイムスタンプがある場合)、波形データタイプにタイミング情報を含めることはできません。ただし、アプリケーション開発環境の解析ライブラリを使用して、定数dtを設定することでデータをリサンプリングできます。その後、リサンプリングされたデータは、波形ベースの解析ライブラリで使用できます。

 

 

有限サンプルの場合

持続時間が10秒の有限収集をおこなっており、コードがDAQmxタスクを開始VI(またはDAQmxStartTask関数)の後、DAQmx読み取りVI(またはDAQmx Read関数)の前にユーザによる入力値を待機している場合、DAQmxタスクを開始VI(またはDAQmxStartTask関数)が呼び出されるとデータの収集が開始され、DAQmx読み取りVI(またはDAQmx Read関数)が呼び出されるまでバッファ上に置かれます。
 

ユーザが値を入力する前に2分間待機する場合、タイムスタンプは実際の収集時間から2分間ずれます。 DAQmxタスクを開始VI(またはDAQmxStartTask関数)が呼び出された後、ユーザが1秒以内に値を入力した場合、タイムスタンプはOSが許可する限り正確になります。

これを防ぐ方法は、ユーザ入力を待機するコードを削除するか、DAQmx読み取りVI(またはDAQmx Read関数)が呼び出された後に開始するトリガ収集を使用することです。

 

連続サンプルの場合

連続収集で波形のタイムスタンプデータを表示し、タイムスタンプが期待どおりに等間隔になっていない場合、タスクのコーディングに問題があります。これは、チャンネル入力ごとのサンプル数が正しく配線されていない場合に発生する可能性があります。