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