データをバッファ処理する



LabVIEW 2018ヘルプ


発行年月: 2018年3月
製品番号: 371361R-0112
製品情報を参照

ダウンロード (Windowsのみ)


LabVIEW 2015ヘルプ
LabVIEW 2016ヘルプ
LabVIEW 2017ヘルプ
LabVIEW 2018ヘルプ
LabVIEW 2019ヘルプ

ネットワーク共有シェア変数、またはpspdstpURLを使用してデータをプログラム的に共有する場合は、LabVIEWはデフォルトですべての読み取りに対して最新値のみを書き込みます。あるクライアントがサーバに書き込む速度が、それらの値を別のクライアントが読み取る速度より速い場合、後者のクライアントが古い未処理の値を読み取る前に新しい値で上書きされます。読み取り側が、値を受け取る前に次の値が書き込まれると、古いデータは損失されます。この未処理データの損失は、サーバまたはクライアントで発生します。読み取り側がサーバに書き込まれた最新値のみを受け取る必要がある場合には、データの損失は問題になりません。ただし、サーバに書き込まれたすべての値を受け取りたい場合、または転送時の損失が許容できない場合には、クライアント上でデータをバッファ処理する必要があります。シェア変数プロパティダイアログボックスのネットワークページにあるバッファを使用チェックボックスをオンにして、シェア変数に対してバッファを有効にします。

クライアント側のバッファ

バッファ処理によって、読み取りと書き込みのタイミング差を減らすことが可能ですが、データ配布は保証されません。サーバまたはクライアントでバッファ中のデータがバッファサイズを超える場合、バッファは新しい値の代わりに古い値を破棄します。シェア変数プロパティダイアログボックスのネットワークページにあるシェア変数のバッファのサイズを設定して、シェア変数が古いデータを上書きする前に保持するデータパケットの数を設定することができます。

また、各項目のバッファが保持できる最大バイト数と値の最大数(パケット数)をプログラム的に指定することができます。データをバッファ処理する場合には、「バッファ最大バイト」と「バッファ最大パケット」の両方を指定することをお勧めします。入力データが最大バイト数または値の最大数を超えた場合、LabVIEWは新しいデータを保存するためにバッファから古いデータを削除します。

バッファ設定をプログラム的に構成する場合は、書き込まれたデータを「バリアント属性設定」関数に配線して、書き込みの各値を固有に認識し、読み取りで破棄されたシーケンスIDをチェックすることによって、データストリーム内で破棄された値を検出します。

8キロバイト未満のデータを含むシェア変数をパブリッシュする場合、LabVIEWがネットワークでデータを送信するのに最大10ミリ秒かかる場合があります。「シェア変数データを排出」VIを使用すると、バッファを即座にフラッシュし、この遅延を解消できます。

バッファが有効なクライアントがすべてのデータを受け取るようにするには、「DataSocket書き込み」関数を使用して、プログラム的にライブデータを書き込みます。フロントパネルからデータを書き込むとデータが失われる可能性があります。

メモ  また、クライアント側のバッファ処理は、opcおよびfileなどの他のプロトコルにも適用されます。ただし、場合によっては、これらのサーバがデータを失う可能性もあります。

DataSocketを開く」関数をBufferedReadまたはBufferedReadWriteモード入力に設定するか、プロパティノードを使用して、FIFO(First-In-First-Out)バッファサイズのDataSocketプロパティを設定します。そうすることで、値が変わるたびに上書きするのではなく、バッファ内でクライアントが受け取る値を格納することを確認できます。

メモ  DataSocketプロパティを使用してFIFOバッファのサイズに設定する場合、「DataSocketを開く」関数のモード入力をBufferedReadまたはBufferedReadWriteに設定する必要があります。それ以外の場合は、サーバにある項目は接続に対しバッファ処理されません。

以下のブロックダイアグラムはプログラム的にバッファ処理を使用しています。

文字列?maxbytes=1000&maxpackets=10をURLの末尾に追加することによって、DataSocket関数を使用してデータを共有する際にバッファを有効にすることができます。ここで、1000はバッファが含むことができる最大バイト数で、10はバッファが含むことができる最大パケット数です。

メモ  バッファ処理は、「DataSocket読み取り」関数を使用してサーバが書き込んだデータを読み取る場合のみに適用されます。フロントパネルのDataSocketのデータバインディングを使用してデータを読み取る場合、バッファリングは使用できません。シェア変数プロパティダイアログボックスのネットワークページでバッファ機能が有効な制御器をシェア変数にバインドする場合、シェア変数エンジンを介してフロントパネルのデータバインディングにバッファを使用できます。

DataSocketプロパティを使用して診断情報をレポートする

バッファ利用率(バイト)プロパティまたはバッファ利用率(パケット)プロパティを使用して、指定したバッファの診断情報を要求します。これらのプロパティを使用して、クライアント上の使用中バッファの割合(%)をチェックし、現在のバッファのサイズが十分であるかどうかを確認します。これらのプロパティのいずれかの値がバッファの最大値に近い値になっている場合、バッファサイズを増やして、サーバが書き込むすべての値を受け取るようにします。また、DataSocket関数を含むWhileループの実行速度を高めて、読み取りレートを増加することもできます。

サーバ側のバッファ

クライアント側のバッファを構成した場合、ネットワークが受信するよりも速くサーバがデータを送信すると、サーバのデータが損失する場合もあります。NI-PSP(NI Publish-Subscribe Protocol)またはdstpバッファにおいては、サーバ側のバッファを使用できます。NI-PSPバッファを使用するためには、バッファが有効になっている既存のシェア変数に接続する必要があります。dstpバッファリングを使用する場合は、DataSocketサーバマネージャを使用してサーバ側のバッファリングを構成する必要があります。DataSocketサーバのサーバ側のバッファ処理の詳細については、『DataSocket Server Help』を参照してください。その他のプロトコルにおけるサーバ側バッファの詳細については、サーバのドキュメントを参照してください。



この記事は役に立ちましたか。

役に立たなかった