- KVKV-X
リングバッファ
リングバッファとは
リングバッファは、生産データ収集、シリアル通信、EtherNet/IP通信、ロギング機能などでデータの取りこぼしを防ぐために使用される代表的なFIFO(先入れ先出し)バッファです。
KEYENCE KVシリーズには汎用的なリングバッファ機能がないため、ユーザー定義FBとして実装すると便利です。
FIFO(先入れ先出し)との関係
リングバッファはFIFO(First In First Out)を効率よく実現するための代表的なデータ構造です。
概略
記憶装置(SDなど)や外部装置と通信する際に、装置との間で時間のズレを吸収・調整をするために一時的に情報を記憶する記憶領域のことをバッファといいます
リングバッファはバッファの中でも代表的なバッファのアルゴリズムです
リングバッファは下図のようなイメージで、12個のバッファにデータを格納しながら取り出しを行っている様子がわかります
Topの位置が書込みポインタで、Bottomが読出しポインタを示していて、オレンジ色はデータが格納されていることを表しています
1つのデータ領域は構造体を使用して構造体の配列でリングバッファを作ります

リングバッファの構造体は以下のようになっています
RingBuffer
|
+- Top
+- Bottom
+- Count
+- Data[] (任意のデータの配列)
Dataは構造体も可能です
バッファ満杯時の動作
リングバッファが満杯の状態で新しいデータを書き込むと、最も古いデータを上書きします。常に最新のデータを保持したい用途に適しています。
データが無い場合
バッファ内のデータ数(Count)が0の場合、RingBufGetは何も取得せず終了します。
シンボル
RingBufPut
データをリングバッファに格納するFB
- RingBuf
- リングバッファの構造体
- Data
- バッファするデータ
RingBufGet
データをリングバッファに格納するFB
- RingBuf
- リングバッファの構造体
- Data
- 取り出したデータ
RingBufPut
データをリングバッファに格納するFB
- RingBuf
- リングバッファの構造体
- Data
- バッファするデータ
RingBufGet
データをリングバッファに格納するFB
- RingBuf
- リングバッファの構造体
- Data
- 取り出したデータ
使用例
構造体
sData

sRingBuffer

ラダー

バッファリングするデータは構造体sDataの内容で、持続時間型(Time)とビットデータ10個(B)とDINT型データ10個(DI)をひとつのデータとしてバッファリングします
リングバッファのサイズはsRingBuffer.Dataで指定している1000個になります
PutTriggerの接点がONになると、PutDataの内容をRingBufferに格納します
GetTriggerの接点がONになると、RingBufferからデータを取り出してGetDataに入ります
構造体
sData

sRingBuffer

ラダー
バッファリングするデータは構造体sDataの内容で、持続時間型(Time)とビットデータ10個(B)とDINT型データ10個(DI)をひとつのデータとしてバッファリングします
リングバッファのサイズはsRingBuffer.Dataで指定している1000個になります
PutTriggerの接点がONになると、PutDataの内容をRingBufferに格納します
GetTriggerの接点がONになると、RingBufferからデータを取り出してGetDataに入ります
ソース
このファンクションの特徴
- 構造体をそのまま保存可能
- 配列サイズを変更するだけで容量変更可能
- FIFOとして利用可能
- KV / KV-X両対応
- ライブラリ単体でも利用可能

