NI製品ディスカッション

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

物理メモリへのデータ記録方法

 私は、±1Vの正弦波を入力信号として、その入力信号が0.5Vのレベルを超えたら(立ち上がったら)カウンタ信号(デジタル出力信号)を出力するというプログラムを作っております。ちなみに、vi実行中も入力信号のデータは記録し続けます。
 
 現在の所、入力信号が1CHの場合はカウンタ信号を問題なく確認できるのですが、入力信号を4CHに増やしたり入力信号の周波数を挙げる(←これは1CHの場合も)と、カウンター出力信号に遅れが出ます。私が考える原因としましては、実行ループ内で、取得したデータをその都度ファイルに書き込んでいるため計算時間がかかり(重くなり)遅延が生じているのではないかということです。私としましては、応答の遅延を最小にし、リアルタイム性を追求したいと思っております。どのようにしたら計算時間を短縮し実現できますでしょうか。
 vi実行中は物理メモリに記録し、vi実行後にファイルに書き込むようなことはできるのでしょうか?またそれで解決できますでしょうか?何か解決方法をご教示下さい。簡単なサンプルを添付していただけると幸いです。
 
(私が作成したviを添付致します)
よろしくお願い致します。
0 件の賞賛
メッセージ1/10
5,457件の閲覧回数
408 様

平素より弊社製品をご使用いただき誠に有難うございます。
日本ナショナルインスツルメンツ技術部の櫻田と申します。


カウンター出力信号の遅れが、具体的にはどのような遅れなのか判りかねますので
詳しくお知らせ頂きますよう、お願い申し上げます。

408様が作成されましたviを拝見させて頂きました。
一回のループ内でファイル書き込みに1ms程度かかっているようです。
もちろん使用しているPCのスペックや、同時に起動しているアプリケーションにも依存しますので、あくまで参考値となります。
添付のvi(408様のプログラムに時間を計測する部分を追加しました。)をご参照ください。
現在、408様が問題とする遅延時間が、どの程度であるのかによって対処方法が異なってくると考えております。
1msだと問題になりますでしょうか。

物理メモリへの記録に関しましては
申し訳ありませんが、もう少しお時間を頂きたいと思います。

408様の問題につきましては
・遅延時間の定義
・ファイル数や周波数を増加した際の具体的な遅延時間
・遅延時間の許容範囲(デバイスによっては収録するチャンネル数を増加させると集録時間が必然的に増加します。)
・お使いのデバイス名
をお知らせ頂けますよう宜しくお願い申し上げます。


以上、ご不明な点等ございましたらご連絡下さい。
よろしくお願い申し上げます。

日本ナショナルインスツルメンツ技術部
櫻田
0 件の賞賛
メッセージ2/10
5,414件の閲覧回数
408 様

お世話になっております。
日本ナショナルインスツルメンツ技術部の櫻田です。


物理メモリへの記録に関してですが、シフトレジスタを使用する方法があります。
シフトレジスタへデータを保持しておき、ループ終了後にファイルに書き込むことが可能です。
シフトレジスタはデータの保持にメモリの領域を使用するために
シフトレジスタを多く使用すると処理速度が低下してしまう恐れがあります。
サンプルプログラムを添付いたしますのでご確認下さい。


408様の問題の解決には、先の返信にもあるとおり
実際に、どの部分で時間が掛かっているのかを確認する必要があります。
例えば、ファイル書き込みの部分、データ集録の部分等を個々に削除して
それぞれにプログラムを実行して頂き、違いをご確認頂ければと思います。


以上、ご不明な点等ございましたらご連絡下さい。
よろしくお願い申し上げます。

日本ナショナルインスツルメンツ技術部
櫻田
0 件の賞賛
メッセージ3/10
5,393件の閲覧回数
ご返信ありがとうございました。ご丁寧な文章で分かりやすい説明で大変助かりました。
物理メモリへの記録を試してみましたのでそのご報告と「遅れ」の定義等を記します。
 
私が実現したいプログラムは、電圧信号を入力しある値のところに閾値を設け、それを超えたら(立ち上がりを検知したら)パルス信号を出力すると言ったものです。試験的に、入力信号を±2Vのサイン波、閾値を1Vとしております。
添付いたしましたviを参照してください。そのviで以下のことを試しました。
 
①入力信号:±2Vサイン波 周波数20Hz 出力信号の遅れ20~30msec
②入力信号:±2Vサイン波 周波数1Hz 出力信号の遅れ200msec

・遅延時間の定義
ソフトウェア上で立ち上がりの検知を確認しておりましたら、1Vを超えたところで確かに検知しておりソフトウェアでの反応遅れは無いと思います。私が「遅れ」と申しておりますのは、検知してからパルス信号が出力されるまでの時間です。オシロスコープで確認しておりましたら上記のような数値の遅れが確認されました。
遅れの許容範囲は2msec以下としたいです。

・使用デバイス名
ボード:PCI-6245
端子台:SCB-68
です。
できる限りリアルタイム性を追求したいです。アドバイスお願い致します。
 
それと、添付しましたviの右下のようなチャート図はどのようにして作成できましでしょうか(一つのブロック内に複数のチャート図の配置)。
 
以上よろしくお願い致します。
0 件の賞賛
メッセージ4/10
5,349件の閲覧回数
追加です。
 
一つ前の私からの投稿文に添付しましたviは4ch計測のものでした。計測チャンネルを2chしたものでも試験を行ってみました。やはり、ソフトウェア上では遅れはなく、ハード(パルスの出力)で遅れがあるように思います。入力信号にて1Hz、20Hz、50Hzと変化させたら2msecの遅れが見られました。計測チャンネルを減らすと遅れが少なくなったのですが、何とか計測チャンネルは4ch確保したいです・・・
0 件の賞賛
メッセージ5/10
5,337件の閲覧回数
408 様

お世話になっております。
日本ナショナルインスツルメンツ技術部の櫻田です。


408様のVIを簡素化し入力信号の周波数に対するデジタル出力の遅れを確認いたしました。
こちらでは、顕著な遅延時間の入力信号周波数依存は確認できませんでしたが
現在の方法では、遅延時間は最小でも2ms程度はあることが確認できました。
また、他の処理が並列で行われることにより、さらに遅れが大きくなることも予測されます。

プログラムや現在の配線の変更が必要になりますが
リアルタイム性を追求した方法を提案させていただきたいと思います。

アナログトリガを受け取ったときにボード内で発生する信号を、出力に接続する方法で
この方法ですと、アナログトリガ検知からTTL出力がHighレベルになるまで0.02ms程度になります。

詳細は下記リンクをご参照頂きたいと思います。
http://digital.ni.com/public.nsf/websearchj/5F6B666EEB25BB0B86256DA300093B4B?OpenDocument

具体的なプログラムの方法は添付のsample.jpgをご参照下さい。
上側の四角で囲まれた部分が重要な部分になります。
ターミナルの接続を行うだけでは、信号を取り出すことは出来ないため、実際にアナログトリガを使用するタスクが必要になります。
また、最後にターミナルの切断を行わないと、ターミナルを接続した状態が保持されてしまいますのでご注意下さい。



また、一つのブロック内に複数のチャート図を配置する方法ですが
こちらは、一つのチャート図に、バンドルした複数のデータをスタックプロットという方法で表示することにより実現可能です。
添付のsample2.jpgをご参照下さい。


以上、ご不明な点等ございましたらご連絡下さい。
よろしくお願い申し上げます。

日本ナショナルインスツルメンツ技術部
櫻田
すべてをダウンロード
0 件の賞賛
メッセージ6/10
5,309件の閲覧回数
ご返信ありがとうございました。櫻田様のご提案を参考にプログラムを作成してtestしてみましたが、私自身よく分かってないので質問させてください。
まず、添付したviをご覧下さい。
私は、閾値を超えたと同時に(できるだけリアルタイムに)カウンター信号を出力するということをしたいのですが、AnalogComparisonEventというものは、そうではないのでしょうか?櫻田様がご紹介くださいましたURLを見て、私は次のように理解しました。
『入力信号に対して設定した閾値を超えたら(トリガを検知したら)、指定したピンから出力信号(TTLレベルの信号)を得られる』
違いますでしょうか?
それと、プログラム上で指定したピンと出力ピンの対応関係も良く分かりません。取説を見ながらやったのですが、TTLの信号が得られませんでした。PFI0とは何番ピンに対応しているのでしょうか(端子台SCB-68)?
 
別の質問なのですが、従来型のDAQにあった、遅れやパルス幅を指定して1パルスを出力する「Delay Pulse」はDAQmx(ボード:PCI-6254)では使用できないのでしょうか?
 
それから、一つのブロックで複数のチャートを表示することはできました。ありがとうございました。これは、グラフでもできますでしょうか?現在は取得したdatデータを変換して1つ1つグラフ表示しているのですが、できればチャートと同じように一つのブロックで複数同時表示したいです。
 
1度にたくさんお聞きして申し訳ありません。よろしくお願い致します。
 
0 件の賞賛
メッセージ7/10
5,275件の閲覧回数
408 様

お世話になっております。
日本ナショナルインスツルメンツ技術部の櫻田です。


1点目のアナログトリガによるTTL出力について説明いたします。
408様の仰る通りに、AnalogComparisonEventは、APFI0に入力されているアナログ信号をトリガとして検知した時に、ボード内部に発生するTTLレベルの信号です。
この信号は、そのままでは出力端子に接続されておらず、デバイス内部のみで使用されているのですが
「DAQ端子接続.vi」を使用して、外部出力できる端子に内部的に接続することにより、外部に取り出すことが可能になります。
この方法により、トリガ検知に対して、リアルタイムでのTTL出力が可能になります。

出力端子として指定する端子は、任意に選択していただいて構いません。
指定した端子からTTL信号を得ることが出来ます。
出力されるピン番号はマニュアルをご参照下さい。マニュアルは下記リンクよりダウンロードできます。
http://digital.ni.com/manuals.nsf/websearch/9F6B44D406AE5C6E86257221006EE8A5
マニュアルのA-59ページにピン番号が記載されており、こちらのピン番号と端子台の番号が対応しております。
マニュアルによるとPFI0は11番に対応しております。グラウンド側はDGNDに接続して下さい。


2点目のDAQmxドライバのみ対応のデバイスで、従来型DAQのプログラムを実行する方法に関しましては
こちらをご参照頂ければと思います。
http://digital.ni.com/public.nsf/websearchj/0F49AAD4FD438FE98625701C00233A37?OpenDocument



3点目のスタックプロットのグラフでの利用ですが
スタックプロット機能はチャートのみの機能ですので
グラフでは、ご自身でレイアウトを作成していただくようになります。


以上、ご不明な点等ございましたらご連絡下さい。
よろしくお願い申し上げます。

日本ナショナルインスツルメンツ技術部
櫻田
0 件の賞賛
メッセージ8/10
5,246件の閲覧回数

ご返信ありがとうございました。もしかしたら、櫻田様に誤解を与えてしまったかもしれません。以前私が述べた『トリガ』というのは、“APFI0”に入力するアナログ信号のトリガではなく、ai0から入力する信号(私の場合sin波状の電圧信号)に対してある閾値を越えたときに検出するトリガのことです。その場合桜田様がご紹介くださった『Analog Comparison Event』というのは関係ないですよね?

もう一度、私が実現したいことを述べさせていただきます。(添付しますviをご覧下さい)

【まず、ai0~ai4の5チャンネルから電圧信号を入力します。私の場合±2Vのサイン波状の電圧信号を用いてます。そして、その電圧データを取り込みながらai0からの入力データに対して、閾値0.5Vを超えたら「立ち上がりを検出した」というトリガを検出し、そのトリガ(合図)をもとにデジタル信号を(port0から)出力する】  です。つまりは、入力信号に対して、設定した値を超えたらデジタル信号を出力するといったことです。

立ち上がりを検出するブロックとしては、「基本レベルトリガ検出」を使用しております。設定する閾値はフロントパネルの「フィードバック閾値」で設定します。

そして、わたしの方で作成したviでテストしまして、次のような結果となりました。

入力信号±2V(周波数100Hz) サンプル数:1 閾値:0.5V において

サンプリングレート:2000Hzのとき、立ち上がり検知からデジタル信号が出力されるまでの遅れ時間:10~20msec

サンプリングレート:1500Hzのとき、立ち上がり検知からデジタル信号が出力されるまでの遅れ時間:6~10msec

サンプリングレート:1000Hzのとき、立ち上がり検知からデジタル信号が出力されるまでの遅れ時間:3~4msec

サンプリングレート:500Hzのとき、立ち上がり検知からデジタル信号が出力されるまでの遅れ時間:4msec

当然、サンプリングレートを少なくすれば遅れは少なくなったのですが、それに伴い取得するデータが不正確なものになってしまいます。サイン波を入力信号としているのに、取得したデータはのこぎり波状のものになってしまいました。2000Hzで取り込めばサイン波を正確に取得できますが遅れが生じます。

現在、私はこの遅れをできるだけ少なくしたいと考えておりますが、どうもうまく行きません。トレードオフの関係でしょうが、プログラムを工夫することで改善できるのではないかと思い、アドバイスをいただけたらと思います。遅れを0msecにするのは無理でしょうがせめて2msec以下には抑えられたら幸いです。そもそも、この遅れは何が原因でしょうか?ソフトウェアでの遅れはありませんでした(確認しました)ので、立ち上がりを検知したあとのハードウェアでの遅れではないかと思っております。改善策をご教授下さいませ。よろしくお願い致します。

0 件の賞賛
メッセージ9/10
5,224件の閲覧回数
408 様

お世話になっております。
日本ナショナルインスツルメンツ技術部の櫻田です。
返事が遅くなり申し訳ありません。


私の方でも408様のプログラムを簡易的に変更し、プログラムを動作させました。(添付している画像です。)
ループが繰り返される時間がサンプリングレートに依存しており、余分な処理を省いたループですと、およそサンプリングレートの逆数で繰り返されます。
(トリガ検出の部分は含んでおります。)
そのため、408様にご提示頂いた遅れ時間である数msよりも、早い間隔でループが回っていることになります。
また、オシロで遅延時間を計測したところ、0.5~1.5ms程度の不安定な遅延が確認できました。
しかし、ループ内の処理を省いたためか、遅延時間のサンプリングレートへの依存はありませんでした。
ループ内の処理を増やしていくことにより、遅延が多くなるかもしれません。

この遅延は、ソフトウエアタイミングでデジタル出力を変更しているため
システムに負荷がかかると、遅延が発生するのだと思います。



現在、トリガとして使用しているAPFIのラインにはどのような信号が入っておりますでしょうか。
もし、このトリガをデジタルトリガラインへ移行可能であれば、APFIとAIラインを接続して共用することも可能です。



以上、ご不明な点等ございましたらご連絡下さい。
よろしくお願い申し上げます。

日本ナショナルインスツルメンツ技術部
櫻田
0 件の賞賛
メッセージ10/10
5,156件の閲覧回数