バッファにはいろいろな種類がありますがここでは代表的なリングバッファについて
この2つについて説明します
リングバッファの説明はサンプルを見てください
PLCの制御で使うバッファにはロギングのように一方的にデータをDBやSDカードに書き続けるような時に相手の都合により待たされることを想定した出力バッファや、接続している機器から受け取ったデータを順次処理するような時に一度にたくさんのデータが来ることを想定した入力バッファがなどがあります
SDカードにCSV形式でテキストファイルを一定周期で書き込む処理でバッファの効果を見てみます
データをバッファに書き込む処理とバッファから読み出してファイルに書く処理が平行に進行します
1回あたりインデックスを付けた約200byteのデータを収集して収集結果を見てみます
×抜け のところはデータ取得するタイミングだがファイル書き込み処理中のため取得できずデータが歯抜けとなってしまった
最初の書き込みでは2回分のデータの抜けがでていて、220msあたりでも抜けが出ている
書込完了の間隔を見てみると定周期で書き込み開始してるのに書き込み時間の揺れが確認できる
SDの書き込みや通信処理などはこのような揺れは発生するので連続して書き込み処理をする時には考慮する必要がある
バッファがある場合は定周期のパルスと書き込み完了のタイミングが非同期となるためタイミングはズレます
ここで重要なのはバッファリングしているデータ数がバッファのキャパ(配列数)を超えないようにすることが重要です
ここではバッファリングしているデータ数が2つ程度に収まっているのでデータの抜けなくファイルに書き込めています
作成したファイルのインデックスが抜けなく書き込めていることで確認できます
バッファなしは10msで歯抜けになったのでテストせず
書き込み速度より書き込むデータを追加するほうが早くてバッファリングデータ数がどんどん増えていっています
およそ6500msで400個まで溜まりました
定周期で永遠とバッファリングする場合は使えませんが、バッファリングするデータが不定期の場合にはデータ数を監視しながら適当なキャパを作れば緩衝することが可能になると思います
バッファなしではSD書き込みの揺れによってデータの歯抜けが発生してしまいました
この揺れは機種による違いやSDカードによる違いなどが影響するのでバッファを置くことで揺れを緩衝して取りこぼしをなくせます
データ抜けが発生するときはバッファを置くことを考えてみてください
ファイル操作に限らず通信やDBへのInsertなどはもっと揺れば大きくなるので頻繁にデータ追加などするときも有効です
リングバッファのRingbufPutとRingbufGetを使う手順を説明します