リングバッファの使い方 (2/2)
CSVファイルへ出力
-
ここでは以下のデータをCSVファイルへ書き出すときにリングバッファを使って書き出す手順を説明します
書き出すタイミングは実行フラグがONしている間で、10ms周期で1行のデータを書き出します
変数名 データ型 内容 index UDINT 連番 Data STRING[256] 書込み文字列 出力するCSVファイルは以下のようになります
手順1:リングバッファの作成
-
1-1. リングバッファ用構造体の作成
画像クリックで大きくなります
-
ファイル出力したいデータはsData構造体に入れるのでデータ型を合わせて作成します
そのData構造体をリングバッファ用の構造体に入れるのですが、その時にバッファリングに必要なサイズだけ配列を設定します
この配列の数がバッファサイズになります
名称 データ型 内容 sRingBuffer Top
UINT 追加位置 Bottom
UINT 読出し位置 Count
UINT 格納数 Data
sData[1000] バッファ Index
DINT Data
STRING[256]
-
1-2. サンプルからファンクションをコピー
-
ファンクションにRingBufPutファンクションとRingbufGetファンクションをリングバッファのサンプルからコピーしておきます
手順2:リングバッファへ格納
手順3:リングバッファからファイルへ
-
2行目:
リングバッファのCountをチェックしてデータがあればデータあり(DataExists)をONします3~4行目:
データ書込み中(Write)フラグをONしてファイルをオープンします5行目:
リングバッファからデータを1件読み出してGetData(sData構造体)に格納し
GetData.Indexを文字列にしてGetData.Dataの文字列と繋げて書き込み文字列(WriteString)にセットします6行目:
FilePut命令で書込み文字列(WriteString)をSDに書き込みます7行目:
書き込み完了したらリングバッファのCountをチェックしてデータがあれば次のデータを5行目からもう一度実行するためにNextLineフラグをONにします
データがなければ一旦クローズするためにCloseフラグをONにします8~9行目:
ファイルをクローズします
FilePutで異常が起きた時もCloseすることを忘れずに10行目:
正常終了OKフラグまたは、異常終了NGフラグをONします
手順4. 動作確認
- 正常動作
-
Ringbuffer.Countの数値をモニタして値が増え続けずに低い数値で安定していればバッファ処理は間に合っているので正常の動作してます
- オーバーフロー
-
Countの値が配列の要素数まで増えてしまうとバッファオーバーフローとなり歯抜けができてしまいます
そのときは保存対象のデータ数を変えたり5行目の処理内容を工夫すること
プログラムが完成したので動作確認します
RunフラグをONしている間はデータを10ms周期でバッファリングしながらSDの'testRing.csv'ファイルに追加書込みしていきます
これでリングバッファの手順は終わりです
ここでは簡単なバッファリングを紹介しました
ファイルに書き出したいデータは数値型やREAL型や日付時刻型など色々なデータの組合せになると思います
取りたいデータに合わせてsData構造体の内容を変更してください
もっと高速にファイル書き込みする方法も紹介しています