09-16-2011 01:35 AM
日本ナショナルインスツルメンツ技術部 ワカス様
何度も申し訳ありません。今までのdisital change detectの件ですが、添付のように
DAQmx cahnnel property nodeのDI.DataXferMechをDMAからInterruptsに設定することで、
一回の変化ずつ検出することができました。
しかし、タイムスタンプを見ると実際は1秒間隔ほどで変化があるのですが、1msずつしか増えていません。
この原因はなんでしょうか?よろしくお願いします。
09-16-2011 03:09 AM
shinichiro 様
日本ナショナルインスツルメンツ技術部のワカスと申します。
ご連絡頂きましてありがとうございます。
貴重なリンクを頂きまして誠にありがとうございます。
確かに仰る通り、LabVIEWのデータ転送方式の問題です。
Interrupt 方式に変換して頂き、一ビットごとに検出されたことは何より嬉しいです。
添付頂きましたプログラムにて取得されているタイムスタンプについてこちらでお調べ致しますので、
折り返しご連絡致します。
09-20-2011 06:22 AM - 編集済み 09-20-2011 06:25 AM
shinichiro 様
日本ナショナルインスツルメンツ技術部のワカスと申します。
ご質問頂いた点についてお時間頂きまして申し訳ございません。
まず、タイムスタンプの値が1msごとに登録されていることについてです。
デジタルポート・ラインの変化検出は、ハードウェアタイミングで行われており、ボード上のタイミングクロックが150nsごとに
変化が生じた対象のデジタルポート・ラインをラッチするような仕組みになっております。
こちらについて下記の資料をご参考頂ければと思います。
http://digital.ni.com/public.nsf/websearch/4B9452520950566A86256F31006C9AEF?OpenDocument
そこで、毎回変化が検出されたデジタルポート・ラインのタイムスタンプ dt をアップデートする必要があります。しかし、変化検出タイミング
に応じて、タイムスタンプが更新されません。つまり、LabVIEWが参照するOSのクロックはタイムスタンプを更新できる時間に間に合わないことが考えられます。CPUの処理を遅らせるために、待機関数などを配置する手法が思われます。
回避策としまして変化検出ループが実行される度、タイムスタンプを取得するWhile ループ内に新規のチャンネルを構成して、DIを読み込む手法を考えました。こちらは100% 正常のタイムスタンプではありませんので、ご了承願います。
こちらのサンプルプログラムを添付致しますので、ご確認頂けますでしょうか。
以上、宜しくお願い致します。
09-25-2011 04:45 AM
日本ナショナルインスツルメンツ技術部 ワカス様
回答ありがとうございます。今までの様々な問題は解決いたしました。
後、添付viのCase StructureにおいてFalseの場合に何も行わないという処理はどのようにすればよいでしょうか?
目的としてはwhileの0回目のループでタイムスタンプを保存しないようにしたいと思っています。
よろしくお願いします。
09-25-2011 09:22 PM
shinichiro 様
日本ナショナルインスツルメンツ技術部のワカスと申します。
ご連絡頂きましてありがとうございます。
ケースストラクチャのFalseケースの処理についてですが、こちらのケースより、タイムスタンプに「0」の値を受け渡す
ことはいかがでしょうか。添付ファイルをご確認頂ければと思います。
以上、宜しくお願い致します。
09-30-2011 03:47 AM
日本ナショナルインスツルメンツ技術部 ワカス様
回答ありがとうございます。とても参考になりました。
後、以下の3点についてご教授お願いします。
1. タイムスタンプをnsのレベルで取得することは可能でしょうか?
2. 現在添付のviのようにanalog, digital input, digital changeで同じ信号(0->3.3V->0V->...)の変化が起きたタイムスタンプを取得しています。
その結果、添付のexcelファイルのようにdigital changeで記録したタイムスタンプは他の2つよりも早くなっています。これは、digital changeがハードウェアタイミングでデータを
取得している事によるものだと思います。digital changeでは150nsごとに変化を検出しにいっていると思うのですが、analog ,digital inputでのタイムスタンプの精度はどのぐらいでしょうか?
3. 最終的にはあるデジタル信号が変化した時間からのアナログデータを使いたいと思っています。そのために、デジタル変化が起きた時刻とアナログデータの時刻を比較する必要があるのですが、
この場合digital inputによる変化検出のタイムスタンプと、digital changeでのタイムスタンプではどちらを使うべきでしょうか?
添付ファイルが多いため、次のメッセージに添付いたします。よろしくお願いします。
09-30-2011 03:49 AM
残りの添付ファイルを送ります。
10-06-2011 07:01 AM
shinichiro 様
日本ナショナルインスツルメンツ技術部のワカスと申します。
ご連絡頂きましてありがとうございます。
また、お使いのプログラムやファイルを添付頂きましてありがとうございます。
ご質問頂きました点について、下記のようにご回答致します。
>タイムスタンプをnsのレベルで取得することは可能でしょうか?
お手数ですが、タイムスタンプはお使いのPCのクロックより算出されていますので、ns のレバルで取得できないと思います。
> 現在添付のviのようにanalog, digital input, digital changeで同じ信号(0->3.3V->0V->...)の変化が起きたタイムスタンプを取得しています。
その結果、添付のexcelファイルのようにdigital changeで記録したタイムスタンプは他の2つよりも早くなっています。これは、digital change がハードウェアタイミングでデータを取得している事によるものだと思います。digital changeでは150nsごとに変化を検出しにいっていると思う のですが、analog ,digital inputでのタイムスタンプの精度はどのぐらいでしょうか?
現在のプログラムの構成では、analog 及び digital 集録は同サンプリングレートで、同じWhile ループ中に行われていますが、両方は同じタイムスタンプを取得されるでしょうか。また、こちらのタイムスタンプはソフトウェアタイミングによるものなので、その精度は確実に指定できませんと思います。
3.最終的にはあるデジタル信号が変化した時間からのアナログデータを使いたいと思っています。そのために、デジタル変化が起きた時刻とアナログデータの時刻を比較する必要があるのですが、この場合digital inputによる変化検出のタイムスタンプと、digital changeでのタイムスタンプではどちらを使うべきでしょうか?
こちらのご質問についてですが、ディジタル変化検出でアナログ集録されるようであれば、ディジタル変化ポートをPFIに設定し、そのポートをトリガにして頂き、アナログデータを集録することはいかがでしょうか。
現在、お使いのプログラムでは、analog 及び digital 集録は同じWhile ループにあるため、データ集録タイミングが近いと思われます。
ディジタル変化検出が別ループにて行われるため、取得されるタイムスタンプがアナログ入力と多少ずれることが考えられます。
上記内容に関しまして、ご指示頂ければと思います。
以上、宜しくお願い致します。