GigE Visionカメラの帯域制限の計算方法
GigE Visionカメラでみなさんが恐れているのは画像取り込み失敗だと思います。
画像取り込み失敗が起こる原因は「画像データのパケットの喪失」です。
では、パケットはどこでなくなってしまうのでしょう?
一般的なネットワークの構成でパケットをロストする可能性があるのは唯一スイッチングハブです。
つまり、ハブを使わずにカメラとPCを直結していればパケットの喪失は起こらず、すなわち画像取り込みの失敗も起こりません。
では、なぜスイッチングハブでパケットはなくなってしまうのでしょう?そう簡単にパケットを無くされては安心してインターネットも楽しめません。普通はそう簡単にはパケットは無くなりません。GigE Visionのように大量のデータが流れ込むことでパケットのロストが起こります。
この図のように4台のカメラをハブに接続した場合、カメラの性能にもよりますが、最大で1Gbps x 4台で合計4Gbpsのデータがハブに流れ込みます。しかしハブとPCとの間は1Gbpsのイーサネット一本でつながっているだけです。そのため、PCに送りきれないパケットはロストしてしまいます。
たとえばトリガ間隔が十分に長い場合でも、平均的な転送量は下がりますが、ピークの転送量を減らすことはできず、パケットロストによる画像取り込みの失敗は回避できません。
そうならないようにハブを使って複数のカメラを接続する場合は、カメラから送り出すパケットとパケットの間隔を調整して、カメラからのデータ送信の帯域を制限することができます。パケットの遅延させて間隔を調整する方法と遅延時間の計算方法を紹介します。
実際に計算してみましょう
理屈を書いてもわかりにくいので、例を使って実際の計算をしてみます。
上の図のようにPCにスイッチングハブが接続されていて、その先にカメラが4台接続されています。
ギガビットイーサネットの帯域は?
1Gbps(ギガビット/秒)は、イーサネットを構成するパケットのヘッダやCRCなどのオーバーヘッドを考慮して、1バイト=10ビットで計算します。
ギガビットイーサネットの最大転送レートは以下のように計算します。
最大転送レート=1Gbps = 100MBytes/sec = 100 * 1024 * 1024 Bytes/sec となります。
カメラの1パケットを送信するのに必要な時間
カメラに問い合わせると1パケットのサイズを教えてくれます。
プロパティ GevSCPSPacketSize がパケットサイズです。私が使っているBasler acA1300-30gcでは、8120 Bytesでした。
ギガビットイーサネットの帯域をすべて使って転送する場合の最短転送時間は以下のように計算します。
最短転送時間=1パケットサイズ÷最大転送レート=8120 Bytes÷(100*1024*1024)Bytes/sec=0.0000774 sec
4カメラに割り振ると
カメラ4台なので、1台のカメラが使っていいのは、最大転送レートの25%までです。
割当帯域=25%
帯域が少なくなるので、1パケットの転送に必要な時間は長くなります。
最大帯域の25%割り当てた場合の期待する転送時間の計算は下記のようになります。
期待転送時間=最短転送時間÷割当帯域=0.0000774sec ÷ 25%=0.0003096sec となります。
パケットとパケットの遅延時間は?
帯域の100%を使う最短転送時間と帯域の25%を使う期待転送時間の差が遅延させる時間となります。計算方法は下記の通りです。
遅延時間=期待転送時間 - 最短転送時間=0.0003096 sec - 0.0000774 sec=0.0002322sec です。
カメラに設定する方法
プロパティGevSCPDに設定します。値の単位はTickです。Tickはカメラのタイマーがカウントしているもので、プロパティGevTimestampTickFrequencyで取得できます。
Basler acA1300-30gcのTickは、125,000,000 Tick/secです。
遅延Tick数=0.0002322sec * 125,000,000 Tick/sec = 29,025 Tick となります。
4台すべてのカメラのプロパティGevSCPDに29,025 Tickを設定することで、各カメラは25%の帯域だけ使ってデータを送信するようになります。
豆知識
GevSCPDのSCPDは、Stream Channel Packet Delayの意味です。
まとめ
ネットワーク帯域幅を超過した場合、パケットはハブによって廃棄されます。カメラが自動的に現在利用可能な帯域幅に合わせて転送速度を調整することはできません。手動で各カメラのカスタムプロパティを設定してパケットの遅延機能(GevSCPD)を使用してデータレートを調整することでハブによるパケットロスを防ぐことができます。
プログラムによる設定方法は
public static void SetBandwidth(ICogGigEAccess gigEAccess, double percentageOfBandwidth) { // 100 MBytes / sec overall throughput Double maxRate = 100 * 1024 * 1024; uint packetSize = gigEAccess.GetIntegerFeature("GevSCPSPacketSize"); Double packetTime = packetSize / maxRate; // Use the bandwidth setting to calculate the time it should require to // transmit each packet to achieve the desired bandwidth. For example, a // bandwidth setting of 0.25 means we want each packet to take 4 times // longer than it would at full speed. Double desiredTime = packetTime / percentageOfBandwidth; // The difference between the desired and actual times is the delay we want // between each packet. Note that until the delay becomes larger than the // intrinsic delay between each packet sent by the camera, changes in // bandwidth won't have any effect on the data rate. Double delaySec = desiredTime - packetTime; ulong timeStampFreq = gigEAccess.TimeStampFrequency; uint delay = (uint)(delaySec * timeStampFreq); gigEAccess.SetIntegerFeature("GevSCPD", delay); }