2025/05/01

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
ringbufputファンクション
入出力
RingBuf
リングバッファの構造体
入力
Data
バッファするデータ

RingBufGet

データをリングバッファに格納するFB
ringbufgetファンクション
入出力
RingBuf
リングバッファの構造体
出力
Data
取り出したデータ

RingBufPut

データをリングバッファに格納するFB
ringbufputファンクション
入出力
RingBuf
リングバッファの構造体
入力
Data
バッファするデータ

RingBufGet

データをリングバッファに格納するFB
ringbufgetファンクション
入出力
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に入ります

ソース

RingBufPut
RingBufGet

このファンクションの特徴

  • 構造体をそのまま保存可能
  • 配列サイズを変更するだけで容量変更可能
  • FIFOとして利用可能
  • KV / KV-X両対応
  • ライブラリ単体でも利用可能

ダウンロード

RingBufferKVLib.kufb (ライブラリのみ)
RingBufferKVXLib.kufb (ライブラリのみ)

※ KV-Xの動作確認はシミュレータで行いました

この記事へのコメント