NI-CANの読み取りと書き込みのキューはどれぐらい大きくできるのですか。
ハードウェア: Industrial Communications>>CAN
問題: 読み取りと書き込みのキューを大きくしたいが、どれぐらい大きくできるのか分からない。
解決策: NI-CAN バージョン1.5ではキューのサイズの限度の問題に関して改善されました。この文章はNI-CAN 1.5以降の使用を前提としてあります。
NI-CANのオブジェクトは読み取りキュー(FIFO)でアプリケーションがフレームを取り込み、書き込みキューでフレームを送り出します。これらのキューの長さはncConfig関数で指定します。この長さはバイト数ではなく、フレーム数で指定します。
よく使われているNI-CANのアプリケーションに十分な長さは以下の通りです。
ネットワークインターフェース読み取りキューの長さ: 100
ネットワークインターフェース書き込みキューの長さ: 10
データを送信するCAN Objectの読み取りキューの長さ: 0
データを送信するCAN Objectの書き込みキューの長さ: 10
データを受信するCAN Objectの読み取りキューの長さ: 10
データを受信するCAN Objectの書き込みキューの長さ: 0
問題がない限りキューの長さを上記の通りに設定することを薦めます。キューの長さを最大限に引き上げるにはキューがNI-CANでどのように設定されているか理解する必要があります。この設定方法をこの文章で簡単に説明します。
最大のスピードでデータ送受信を行う場合、読み取りと書き込みキューはWindows NI-CANドライバーとCANカードに共有されているメモリーを使用します。このメモリーはCANカードの全ポートで使われておりますので、2ポートカードの場合は両方のポート(CAN0とCAN1)が同じメモリーを使っています。
CANカード(1または2ポート)は合計6600バイト読み取りと書き込みキューに割り当てられております。キューに使われているメモリーの量は下記の数式で求められます。
Memory_used = ((Queue_length + 1) * Entry_size) + 30;
30バイト分はヘッダーとして使われます。Queue_lengthはncConfigで指定したフレーム数です。Entry_sizeは読み取り/書き込みのデータタイプによって以下のように決まります。
ネットワークインターフェース読み取りキュー: 22バイト
ネットワークインターフェース書き込みキュー: 14バイト
CAN Objectの読み取りキュー: 16バイト
CAN Objectの書き込みキュー: 8バイト
メモリー量の数式からもわかるように、キューの長さ(Queue_length)を0にしてもキューが割り当てられないということではありません。NI-CANのマニュアルに書いてあるように空のキュー(zero-length queue)は最新のデータを提供しますので、メモリーを使うことになります。これはヘッダーの30バイトとEntry_sizeの合計となります。
下記の例は、特定のアプリケーションに対して、キューの最大の長さの計算方法を示しましす。
例 1: 単一ネットワークインターフェースネットワークインターフェース一つのみを使用して読み取りと書き込みを行う場合、書き込みのキューの長さを10に設定し、読み取りキューの長さを最大にしたいと思います。
書き込みキューの長さが10の場合:
Memory_used = ((10 + 1) * 14) + 30 = 184バイト
この場合、読み取りキューが(6600 - 184) = 6416バイトになります。ヘッダーの30バイトを差し引きEntry_sizeで割りますと、(6386 / 22) = 290フレームになります。これで読み取りキューの最大の長さが1フレーム少ない289となります。
例 2: 二つのネットワークインターフェース一つ一つのネットワークインターフェースがそれぞれのCANカード上にある場合、読み取りキューの長さは上の例 1と同じになります。ところが、2ポートCANカード上の両方のポートを開くと、一つのネットワークインターフェースの読み込みキューの長さは半分(144)になります。これは6600バイトのメモリーを二つのポートで共有しているからです。
例 3: CAN オブジェクト3つのCANオブジェクトを設定する時、2つをPeriodic Transmit(データ送信)と1つをRecieve Periodic Remote(受信)にします。データフレームに使用するキュー(書き込みキューと読み取りキュー)を最大にしたいと思います。
このアプリケーションではネットワークインターフェースは開きませんが、読み取りキューと書き込みキューを含めたネットワークインターフェースが設定されていなければなりません。ネットワークインターフェースに割り当てられているメモリーを最小限に押さえるためにキューの長さを0にします。
以下は使用されていないキューのメモリーの量(Memory_used)です。
Network Interface
Read Q length = 0
Memory_used = ((0 + 1) * 22) + 30 = 52
Network Interface
Write Q length = 0
Memory_used = ((0 + 1) * 14) + 30 = 44
CAN Obj, Periodic Transmit
Read Q length = 0
Memory_used = ((0 + 1) * 16) + 30 = 46
CAN Obj, Periodic Transmit
Read Q length = 0
Memory_used = ((0 + 1) * 16) + 30 = 46
CAN Obj, Receive Periodic
Write Q length = 0
Memory_used = ((0 + 1) * 8) + 30 = 38
このキューのメモリー量(Memory_used)の合計は226バイトですので、残りのキューは(6600 - 226) = 6374バイトになります。
この残りのメモリーを3つのCANオブジェクトに分けますと、それぞれのキューには(6374 / 3) = 2124バイトのメモリーがあるということになります。
まず読み込みキューをReceive Periodic CAN Objectに割り当てます。読み取りキューのヘッダーに30バイト使用されるので、残りは(2124 - 30) = 2094バイトになります。これをEntry_sizeで割りますと、(2094 / 16) = 130フレームになりますので、読み取りキューの長さは129になります。
次に書き込みキューを二つのPeriodic Transmit CAN Objectsに割り当てます。読み取りキューのヘッダーに30バイト使用されるので、残りは(2124 - 30) = 2094バイトになります。これをEntry_sizeで割りますと、(2094 / 8) = 261フレームになりますので、書き込みキューの長さは260になります。
もしCANオブジェクトが2つに分けられている場合は(例えばCAN0は送信、CAN1は受信)、空の(zero_length)読み取りと書き込みのキューを残りのネットワークインターフェースに割り当てなければいけません。
これからも分かるようにCANオブジェクトの最適なキューの長さを定めるのは複雑な作業です。ほとんどのアプリケーションにおいて送信に使われるCANオブジェクトの書き込みのキューの長さは10にすることをお薦めします。書き込みキューが埋まるまでフレームを入れて、待機し、また書き込むことによって大きなデータをCANバスに送信することができます。また、特に受信するフレームが定期的に入ってくる場合、受信に使われるCANオブジェクトの読み取りキューの長さは10にすることをお薦めします。 基本的にCANを使用する上で特別な状況またはキューのオーバーフローがない限り、この説明にあるキューの長さを使用することをお薦めします。
関連リンク: ドライバとアップデート: 現行のソフトウェアバージョン 製品マニュアル: NI-CAN User Manual KnowledgeBase 1YL9E1RM: What Causes Queue Overflow with NI-CAN?
添付:
報告日時: 06/14/2000
最終更新日: 01/05/2005
ドキュメントID: 1YD93QRM