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