内容 値
が循環するカウンタ(リングカウンタ)値をポインタとしてインデックス修飾し、リングバッファを作り、データの書込と読出を行います。 こ
こでは例として、以下のパラメータでデータを蓄積し、最新データからN個分の移動平均を算出します。 |
●PDFを表示 |
◆ シーケンスルーチン![]() ・トリガを発行します。このトリガで乱数を発生させ、平均をもとめます。 ・手動スイッチ[MANUAL]が偽の時は、200ms毎にトリガ[TRG]を発行します。 ・手動の時は起動スイッチ[RUN]をセットすると、トリガを発行します。 ![]() ・トリガ[TRG]が真ならば13行目以降を実行します。 ・リングバッファを4系統実現できる様、インデックスレジスタ[INDEX]を準備しています。今回は使いません。[INDEX] = 0 です。 ・[Z2]は1ワード分、[Z3]は2ワード分のインデックスレジスタです。(今回は両方0) ・変数[RANDOM]を種に乱数を発生させ、結果を[RANDOM]に書戻します。 ![]() ・移動平均の有効サンプル数をカウントします。 ・初期状態では、データが全て0なので、既定のサンプル数[@EM4](設定:34)に達するまでは、存在するデータ数を、サンプル数[@DM20]とし ます。 ・サンプル数が既定値になればゲート[Qover]を閉じて、このルーチンの実行を禁止します。 ![]() ・サブルーチン1は、ポインタの計算ルーチンです。 ・ポインタ[@DM16]が999を越えれば0に戻します。引数はレジスタを使いました。同時に、インデックスレジスタ(ポインタ)[Z1]にも代入され ます。 ・乱数[RANDOM]をポインタが示すバッファ位置に代入します。 ・その乱数を合計に加えます。 ![]() ・サンプル数が規定値(34)に達したら([Qover]が真)、以降を実行します。 ・現在ポイントからサンプル数を引いたポイント[@FM0:Z1]を計算します。( 負数が適切に処理されていれば、バッファの最初より前になると最後に進みます) ・そのポイントには一番古いデータが入っていますので、合計から引きます。これで合計は更新されました。 ![]() ・合計[@DM0]をサンプル数[@DM20]で割って、平均[@DM8]をもとめます。 ![]() ・ポインタをインクリメントします。 |
◆ サブルーチン □ ポイント計算 (サブルーチン1) ![]() ・ポインタが負数になった場合でも、バッファ数を加える事で正しいポインタ計算をします。 (バッファ数以上の負数になった場合は、ポインタが正数になるまで加算を繰返す工夫が必要です。応用編『コメント読出』を参照してください。) ・負数が適切に処理されていれば、バッファの最初より前になると最後に進みます。 ・レジスタを引数としています。[Z1]にも結果を代入します。 |
◆ テスト操作![]() ・手動スイッチ[MANUAL]が偽なら、PLCが起動するとトリガ[TRG]を発行して動作を開始します。 ・手動スイッチ[MANUAL]が真の時、[RUN]セットすれば、トリガが発行されます。 |
●PDFを表示 |