サイトのタイトル

OSD

リングバッファの使い方 (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で終了

    10ms周期で収集したら

    1回あたりインデックスを付けた約200byteのデータを収集

    • バッファなし

      定周期のパルスでデータの読み込みとファイルへの書き込み完了のトレースを確認すると

      ×抜け のところはデータ取得するタイミングだがファイル書き込み処理中のため取得できずデータが歯抜けとなってしまった
      最初の書き込みでは2回分のデータの抜けがでていて、220msあたりでも抜けが出ている

      どーしてこーなった

      書込完了の間隔を見てみると定周期で書き込み開始してるのに書き込み時間の揺れが確認できる
      SDの書き込みや通信処理などはこのような揺れは発生するので連続して書き込み処理をする時には考慮する必要がある

    • バッファあり

      バッファがある場合は定周期のパルスと書き込み完了のタイミングが非同期となるためタイミングはズレます
      ここで重要なのはバッファリングしているデータ数がバッファのキャパ(配列数)を超えないようにすることが重要です

      ここではバッファリングしているデータ数が2つ程度に収まっているのでデータの抜けなくファイルに書き込めています
      作成したファイルのインデックスが抜けなく書き込めていることで確認できます


    6ms周期で収集したら

    • バッファなし

      10msで歯抜けになったのでテストせず

    • バッファあり

      書き込み速度より書き込むデータを追加するほうが早くてバッファリングデータ数がどんどん増えていっています
      およそ6500msで400個まで溜まりました

      定周期で永遠とバッファリングする場合は使えませんが、バッファリングするデータが不定期の場合にはデータ数を監視しながら適当なキャパを作れば緩衝することが可能になると思います

    結果

    バッファなしではSD書き込みの揺れによってデータの歯抜けが発生してしまいました
    この揺れは機種による違いやSDカードによる違いなどが影響するのでバッファを置くことで揺れを緩衝して取りこぼしをなくせます
    データ抜けが発生するときはバッファを置くことを考えてみてください

    ファイル操作に限らず通信やDBへのInsertなどはもっと揺れば大きくなるので頻繁にデータ追加などするときも有効です

    次のページからは

    リングバッファのRingbufPutとRingbufGetを使う手順を説明します


    ダウンロード

    ここで使用したテスト用のプロジェクトをダウンロードできます
    testRingbuf.csm2