■ リングバッファ (File: plc_public_codex_xxx | Module:RingBuffer)

⇒ TO Home Page
内容

値 が循環するカウンタ(リングカウンタ)値をポインタとしてインデックス修飾し、リングバッファを作り、データの書込と読出を行います。
データシフト命令を使う手もありますが、データ数が大きくなると処理に時間がかかります。(KV3000の場合、1000個の1ワードデータで 81.75μ秒)
ポインタを使うとデータ数に関係なく、一定時間で処理できます。
リングカウンタの実現方法は、基本編 『時分割』 を参照してください。

こ こでは例として、以下のパラメータでデータを蓄積し、最新データからN個分の移動平均を算出します。

リングバッファ
・バッファ数1000            :@FM0〜@FM999

定数
・データ蓄積用バッファ数        :@EM0 (1000)
・平均算出用サンプル数          :@EM4 (34)

変数
・データ書込ポインタ            :@DM16
・平均算出用サンプル数カウン タ  :@DM20
・サンプルの総計                :@DM0
・平均値                        :@DM8

●PDFを表示 
◆ シーケンスルーチン

00007
・トリガを発行します。このトリガで乱数を発生させ、平均をもとめます。
・手動スイッチ[MANUAL]が偽の時は、200ms毎にトリガ[TRG]を発行します。
・手動の時は起動スイッチ[RUN]をセットすると、トリガを発行します。


00012
・トリガ[TRG]が真ならば13行目以降を実行します。
・リングバッファを4系統実現できる様、インデックスレジスタ[INDEX]を準備しています。今回は使いません。[INDEX] = 0 です。
・[Z2]は1ワード分、[Z3]は2ワード分のインデックスレジスタです。(今回は両方0)
・変数[RANDOM]を種に乱数を発生させ、結果を[RANDOM]に書戻します。


00016
・移動平均の有効サンプル数をカウントします。
・初期状態では、データが全て0なので、既定のサンプル数[@EM4](設定:34)に達するまでは、存在するデータ数を、サンプル数[@DM20]とし ます。
・サンプル数が既定値になればゲート[Qover]を閉じて、このルーチンの実行を禁止します。


00018
・サブルーチン1は、ポインタの計算ルーチンです。
・ポインタ[@DM16]が999を越えれば0に戻します。引数はレジスタを使いました。同時に、インデックスレジスタ(ポインタ)[Z1]にも代入され ます。
・乱数[RANDOM]をポインタが示すバッファ位置に代入します。
・その乱数を合計に加えます。


00020
・サンプル数が規定値(34)に達したら([Qover]が真)、以降を実行します。
・現在ポイントからサンプル数を引いたポイント[@FM0:Z1]を計算します。( 負数が適切に処理されていれば、バッファの最初より前になると最後に進みます)
・そのポイントには一番古いデータが入っていますので、合計から引きます。これで合計は更新されました。


00022
・合計[@DM0]をサンプル数[@DM20]で割って、平均[@DM8]をもとめます。


00024
・ポインタをインクリメントします。

◆ サブルーチン

□ ポイント計算 (サブルーチン1)
00033
・ポインタが負数になった場合でも、バッファ数を加える事で正しいポインタ計算をします。
(バッファ数以上の負数になった場合は、ポインタが正数になるまで加算を繰返す工夫が必要です。応用編『コメント読出』を参照してください。)
・負数が適切に処理されていれば、バッファの最初より前になると最後に進みます。
・レジスタを引数としています。[Z1]にも結果を代入します。
◆ テスト操作

00007
・手動スイッチ[MANUAL]が偽なら、PLCが起動するとトリガ[TRG]を発行して動作を開始します。
・手動スイッチ[MANUAL]が真の時、[RUN]セットすれば、トリガが発行されます。
●PDFを表示