NI製品ディスカッション

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

NI PCI-6250のDI入力のビット変化の検出

 NI PCI-6250で、DAQmx 8.0を使用して、特定のDIビットが変化した時に
イベントを発生させて、そこで、ビットの変化を取得したいのですが、
正常に動作しません。このような事は可能でしょか?お手数ですが、教えて
下さい。
              記
1.変化を検出したいビット
  DI port0/line4:5
2.現象
  ビットに変化を与えたら、登録したイベントに飛ぶのですが、その中の
 ビット読込み処理で、更に、ビットに3回(合計4回)、変化が起きるまで、
 ビットの読込み処理を終了しません。実装したい事は、1回のビット変化を
 リアルタイムで、取得する事です。
  御社が提供しているサンプルプログラムでも同じ現象が起きます。
  (C:\Program Files\National Instruments\NI-DAQ\Examples\DAQmx ANSI C\Events\Signal\Change Detection
  \Read Dig Chan-Change Detection Event\ReadDigChan-ChangeDetectionEvent.c)
3.参考
  開発言語
   Delphi 5
  処理概要
   // タスク(DI)を作成する
   DAQmxCreateTask('', @FTaskHandle);
   // チャネル(DI)を作成する
   DAQmxCreateDIChan(FTaskHandle, 'Dev1/port0/line4:5', '', DAQmx_Val_ChanPerLine);
   // チャネル(DI)の変化検出タイミングを設定する
   DAQmxCfgChangeDetectionTiming(FTaskHandle, 'Dev1/port0/line4:5', 'Dev1/port0/line4:5',
              DAQmx_Val_AcquisitionType_ContSamps, 1);
   // チャネル(DI)をイベントに登録する
   DAQmxRegisterSignalEvent(FTaskHandle, DAQmx_Val_Signal_ChangeDetectionEvent, 0, Callback, nil);
   // タスク(DI)を開始する
   DAQmxStartTask(FTaskHandle);
   // Callback
   function Callback(TaskHandle : Longint; SignalID : Longint; CallbackData : Pointer) : Longint; stdcall;
   begin
    // (DI)を入力する
    DiReadLoopCnt := 1;
    DiReadBuffCnt := 2;
    DAQmxReadDigitalLines(TaskHandle, DiReadLoopCnt, 10.0,
                  DAQmx_Val_GroupByChannel, PByte(@DiData), DiReadBuffCnt, @DiReadLoopCnt, @DiReadLineCnt, nil);
   end;
0 件の賞賛
メッセージ1/9
4,944件の閲覧回数

DaqQ様

平素より、弊社製品をお使いいただきありがとうございます。
日本ナショナルインスツルメンツ株式会社 柿部と申します。

こちらでもVC_ReadDigChan_ChangeDetectionEvent.slnを実行いたしました。
すると、デジタルポートが2回変化して始めて4つ分のデータを集録することを確認しました。
同様のプログラムをLabVIEWで確認した際には、1つ分のデータのみを読み出すことができたので、設定の問題かと推察しています。
しかし、今、どこのパラメータが読み取りデータ数に相当しているのかが分かりませんので、お時間を頂きお調べしたいと思います。

以上、ご不明点ございましたら、弊社技術部までお問い合わせ願います。
今後とも、宜しくお願い致します。

0 件の賞賛
メッセージ2/9
4,908件の閲覧回数

DaqQ様

平素より、弊社製品をお使いいただきありがとうございます。
日本ナショナルインスツルメンツ株式会社 柿部と申します。

当該サンプルプログラムを検討しておりましたら、お客様がご所望の動作ができましたのでご連絡いたします。
今、int32 CVICALLBACK ChangeDetectionCallbackの中にございますDAQmxReadDigitalLines関数の第2引数を-1に致しますと、デジタルデータが1回変化するたびにデータを出力することができました。
こちらを一度ご検討頂きまして、ご不明点ございましたら再度ご投稿頂けますようお願い申し上げます。

今後とも、宜しくお願い致します。
失礼致します。

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

日本ナショナルインスツルメンツ株式会社 柿部様

 ご回答、有難う御座いました。ご指摘の通り、int32 CVICALLBACK
ChangeDetectionCallbackの中のDAQmxReadDigitalLines関数の
第2引数を-1にして確認しました。
確かに、検出したい2ビットの内、1つのビットが変化したら状態変化
を読み取れるようになりましたが、何回か変化を読み取ると、読み
取った状態が実際のビットの状態と対応が取れなくなります。
ビット変化をリアルタイムに検出するには、どのようにすればよいの
でしょか?
御社サンプルのVC_ReadDigChan_ChangeDetectionEventでも同じです。

 

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

DAQq様

平素より、弊社製品をお使いいただきありがとうございます。
日本ナショナルインスツルメンツ株式会社 柿部と申します。

私の方でも、実行してしばらく時間が経過しますと、表示されますデータが現在の入力データではなく、過去のデータになります。
原因は、デジタル信号のイベントデータをバッファしていているためだと推察しております。
そこで、最新のデータを読み出すようDAQmxSetReadRelativeTo関数などを使用して、回避を試みましたがうまく行っておりません。

引き続き調査させていただきますので、お待ち頂けますと幸いです。
以上、ご不明点ございましたら、ご投稿願います。
今後とも、宜しくお願い致します。

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

DAQq様

平素より、弊社製品をお使いいただきありがとうございます。
日本ナショナルインスツルメンツ株式会社 柿部と申します。

当該問題は、データ転送方法をIRQにしていただけますと、解決するようです。
設定方法は、
DAQmxErrChk (DAQmxRegisterSignalEvent(taskHandle,DAQmx_Val_ChangeDetectionEvent,0,ChangeDetectionCallback,NULL));
DAQmxErrChk (DAQmxGetTaskAttribute(taskHandle,DAQmx_Task_NumChans,&numLines));
DAQmxErrChk (DAQmxSetDIDataXferMech(taskHandle, "", DAQmx_Val_Interrupts));
とプログラムに付け加えてください。

これでも表示されるデータが入力信号に遅れがでる場合には、入力信号の周期が短いために、データがバッファにたまってしまうものと推察されます。
こちらでお試し頂きまして、うまく行かないようでございましたら、入力信号の情報を合わせてご投稿頂けます様お願い申し上げます。
今後とも、宜しくお願い致します。

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

日本ナショナルインスツルメンツ株式会社 柿部様

 ご回答、有難う御座いました。ご指摘の通りに変更すれば、希望通りの動作が出来ました。
 だた、このれらの関数(DAQmxGetTaskAttribute、DAQmxSetDIDataXferMech)の記述が、
NI DAQ-8.0に付属のヘルプ(NI-DAQmx C Reference Help September 2005 Edition)にあり
ません。最新のヘルプはないのでしょか?(できれば日本語版があるとありがたいです)
 それから、DIの信号変化を監視しながら、ADサンプリング(外部クロック:1kHz)に同期
してDIも同時にサンプリング(トリガー:Dev1/ai/SampleClock)しています。DIのデータ
転送方式をDMAからIRQに変更したままで、データの取りこぼし等の不具合が起きる事は
ないでしょか?

 

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

日本ナショナルインスツルメンツ株式会社 柿部様

先ほど投稿したメッセージの一部が化けてしまいました。再度、投稿します。

 ご回答、有難う御座いました。ご指摘の通りに変更すれば、希望通りの動作が出来ました。
 だた、このれらの関数(DAQmxGetTaskAttribute、DAQmxSetDIDataXferMech)の記述が、
NI DAQ-8.0に付属のヘルプ(NI-DAQmx C Reference Help September 2005 Edition)にあり
ません。最新のヘルプはないのでしょか?(できれば日本語版があるとありがたいです)
 それから、DIの信号変化を監視しながら、ADサンプリング(外部クロック:1kHz)に同期
してDIも同時にサンプリング(トリガー:Dev1/ai/SampleClock)しています。DIのデータ
転送方式をDMAからIRQに変更したままで、データの取りこぼし等の不具合が起きる事は
ないでしょか?

0 件の賞賛
メッセージ8/9
4,859件の閲覧回数

aqQ様

平素より、弊社製品をお使いいただきありがとうございます。
日本ナショナルインスツルメンツ株式会社 柿部と申します。

DAQmxSetDIDataXferMechは、NI-DAQmx C reference Helpの「検索」タブで検索頂けますと、「Get/Set/Reset DI_DataXferMech」という項目でヒ

ットします。
DAQmxGetTaskAttributeは見付けることができておりませんが、恐らく「Get/Set/Reset Task_NumChans」と同義かと推察します。
当該ヘルプは検索がし難いかと存じますので、改善しますよう本社に申し付けますので、ご了承頂けます様お願い申し上げます。
また、こちらの日本語ヘルプはございませんので、こちらもご了承頂けますようお願い申し上げます。

IRQ転送を使用した際、データの取りこぼしがでる可能性は十分にございます。
今、DIとAIを共通外部クロックを使用してデータ集録を行うということのようでございますので、DAQmxCfgChangeDetectionTimingは使用せず、データ処理で回避する(DIとAIは行ってしまい、DIチャンネルに変化がないのであれば、データを間引く)というのはいかがでしょうか?
また、いまご所望の動作をお教え頂けますと、別の方法も提案できるかもしれませんので、ご連絡頂けますと幸いです。

以上、ご不明点ございましたら、ご投稿願います。
今後とも、宜しくお願い致します。

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