NI製品ディスカッション

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

ni-can ncClose実行後に無限にデータが送信される

ni-can ncClose実行後に無限にデータが送信される現象が起きています。
 
環境:
NI PCI-CAN/SW 1-PORT,SINGLE WIRE CAN
NI-CAN Software for Windows Version2.4
 
WindowsXP Professional sp2
VB6.0 sp6
 
動作環境として、該当ボードを搭載したPCともう1台のデバイスの計2台で構成されています。
なお、もう1台のデバイスからの送信データはありません(仕様として受信のみです)。
 
定期的(500ms周期)に、あるID(仮にID:xxxとします)のデータフレームをncWriteにて送信してます。
ID:xxxのデータ長を変更する為に、   
(ncConfigにおいてNC_ATTR_CAN_DATA_LENGTHを変更する為)
定期送信を終了させ、ncCloseを実行します。
(実際はこの後ncConfig→ncOpenとして、定期送信を再開します。)
なお、これはncWriteのDataSize変更ではデータ長変更ができない為の処理となっています。
また、ncConfigのNC_ATTR_WRITE_Q_LENは0としています。
 
動作確認時、CAN のBusラインをオシロスコープにてモニタしているのですが、
ncClose後に無限的なデータの連続送信が発生していることが分かりました。
NI-SPY上ではncWriteがコールされた形跡はありません。
また、ncClose前にncActionをNC_OP_STOP指定で実行しても改善されませんでした。
 
なお、定期送信を終了し、しばらく(10秒程度)待機したのちにnccloseを実行すると
上記現象は発生しません。
 
 
定期送信処理を中断できるのは1000msecが限界です。
よって、待機時間を持たせることを避けたいと考えております。
 
 
ncCloseによって送信処理が即刻終了する方法があれば、御助力頂きたいと存じます。
 
 
よろしくお願いします。
0 件の賞賛
メッセージ1/4
3,459件の閲覧回数

平素よりNI製品をご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ技術部の幾田と申します。

CANについてはプログラミングの概要はDAQmxのタスクの概念に非常に良く似ており、通信の設定をconfigで行い、それらの情報をopenから”オブジェクトハンドル”として渡し、最後にクローズします。

もしプログラム中でopenからcloseに引数のobjectを渡していない場合、通信が止まらず継続してしまう可能性があります。


次に、上記の通りオブジェクトハンドルをopenするかcloseするかの設定になるので、連続的な通信を行う際ループの設定位置なのですがwriteのみを囲い、open、closeはそのループ前後一回ずつ設定して下さい。


この概念や関数の詳細につきましては"NI-CAN Hardware and Software Manual"のChapter9をご参照いただければと思います。

 


 


最後に、上記内容を踏まえたCANのIn/Outのサンプルが以下ディレクトリにありますので、一度こちらをご参照いただきプログラムのご参考にしていただければと思います。

C:\Program Files\National Instruments\NI-CAN\MS Visual Basic\Frame API examples\Obj2Obj

宜しくお願いいたします。

このメッセージは 02-19-2007 01:22 AMに N.Ikuta が編集しています。

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

日本ナショナルインスツルメンツ技術部 幾田様

 

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

closeの件ですが、オブジェクトハンドルは渡しております。

定期送信はタイマーを使用しており、Openしてからタイマーを起動させ、

Closeする前にタイマー停止させております。(Closeする前にタイマー処理が実行されていないことを確認しております。)

現状確認として報告致します。

 

以上、宜しくお願い致します。

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

平素よりNI製品をご利用頂きまして誠に有難うございます。
日本ナショナルインスツルメンツ技術部の幾田と申します。

表記の内容にて、プログラム内の関数では問題ないということで、サンプルなどではどういった挙動になりますでしょうか。

また、今回使用されているサンプルでは具体的にどのような信号をフレームAPIで送受信していますでしょうか。

例えば、送信するデータ自体が大きなサイズの配列であり、その送受信に対してCANの転送が間に合わずデータがコミットしてしまっているということはありませんでしょうか。


一度受信側のデータでキャプチャしながら結果を確認いただければと思います。


また、はやり問題が改善されなかった場合、一度サンプルを現在ご利用のプログラミングに合わせてカスタマイズしていただき、経過をご欄いただけますでしょうか。

お手数かと思われますが、宜しくお願いいたします。

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