【GX Works3】FMOV/BMOV命令の使い方|一括転送とブロック転送の使い分け
概要
GX Works3のデータ転送命令の中でも、FMOVとBMOVは似ているようで役割がまったく違います。FMOVは1つの値を指定した範囲すべてに敷き詰める命令で、複数のデバイスを同じ値でまとめて初期化したいときに使います。対してBMOVは、連続したエリアの中身をそのまま別のエリアへコピーする命令で、値がバラバラのブロックをそっくり移動させたいときに使います。データテーブルの一括クリア、レシピデータの切替、測定値の履歴退避など、現場で「まとめて」扱いたい場面ではまずこの2つが候補に挙がります。
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/08_data-transfer.md より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
FMOV / FMOVP | 常時実行/立上り | (s) 転送データ / (d) 先頭 / (n) 点数 0〜65535 | 同一データをn点の連続デバイスへ一括転送 |
BMOV / BMOVP | 常時実行/立上り | (s) 先頭 / (d) 先頭 / (n) 点数 0〜65535 | 連続n点のブロックを別エリアへ一括転送 |
FMOV=同一値の敷き詰め(初期化に便利)、BMOV=ブロックコピー。
動作
FMOVの機能はシンプルで、(s)で指定した1点のBIN16ビットデータと同じ値を、(d)を先頭にn点分すべてに書き込みます。図1のようにK100を(s)にすれば、D0からD4までの5点全部が100で埋まります。値は1つ、書き込み先だけがn点に広がるイメージです。
一方BMOVは、(s)を先頭にn点分のデータをそのまま(d)を先頭にn点分へコピーします。図2のようにD0〜D4の5点それぞれの値が、そのままD10〜D14へ移されます。転送元と転送先が重なっていても転送は可能で、マニュアルの規定では、デバイス番号の小さい方へ転送する場合は(s)から順に、大きい方へ転送する場合は(s)+(n)-1から順に処理されるため、上書きによるデータ破壊を避けられる設計になっています。
またFMOV・BMOVともに、(s)や(d)にビットデバイスを桁指定(K1X0など)で組み合わせた場合は、その桁指定分のビット数だけが転送対象になります。演算エラーは発生しません。
サンプルコード
①ロギングエリアをまとめてゼロクリアする
[X10 FMOVP K0 D100 K20 ]
D100を先頭とする20点(D100〜D119)を測定値のロギングエリアとして使っている場合、X10(クリアボタン)が押された瞬間に全点へ定数0を書き込みます。1点ずつRSTやMOVで消していくと回路が長くなりますが、FMOVPなら1行でエリア全体を初期化できます。運転開始前のイニシャライズ処理でもよく使う形です。
②レシピデータを実行エリアへ展開する
[X20 BMOVP D200 D300 K10 ]
D200を先頭とする10ワード(D200〜D209)に品種ごとのレシピ(温度・速度・時間などの設定値セット)を格納しておき、X20(品種切替ボタン)が押された瞬間にD300以降の実際に使う実行エリア(D300〜D309)へ丸ごとコピーします。切り替えたいレシピの先頭番地を(s)に指定するだけで展開できるため、多品種切替の定番パターンです。
③測定値の履歴を1つ後ろへシフトして退避する
[X30 BMOVP D0 D1 K9 ]
D0〜D9の10点を「今回値+直近9回分の履歴」として使っている場合、X30(サンプリングタイミング)が立ち上がるたびに、D0を先頭とする9点(D0〜D8)をD1を先頭とする9点(D1〜D9)へ転送すると、既存の履歴が1つずつ後ろへシフトします。常時ON条件のBMOVにすると毎スキャンずれてしまうため、必ずトリガ条件+BMOVPで組みます。転送元(D0〜D8)と転送先(D1〜D9)が重なっていますが、BMOVはデバイス番号の大きい方への転送なので(s)+(n)-1すなわちD8から順に処理され、データが上書きで潰れることなく正しくシフトされます。このあとD0へ新しい測定値をMOVで書き込めば、履歴バッファの完成です。
よくある誤解
①FMOVとBMOVを混同する
名前が似ているFMOVとBMOVですが、動作は正反対です。FMOVは(s)で指定した1つの値をn点全部に敷き詰める命令、BMOVは(s)から始まるn点分のデータをそのままn点分コピーする命令です。「同じ値で埋めたいのか、違う値のまとまりをそのまま移したいのか」を先に決めてから命令を選ばないと、初期化のつもりでBMOVを使ってしまい元データがそのまま流用されて意図しない値が入る、といったミスにつながります。
②「転送元と転送先が重なるとBMOVは使えない」という誤解
「転送元と転送先のデバイス範囲が重なっていると、正しく転送できないのでは」と心配する人もいますが、マニュアルには「転送元と転送先のデバイスが重複している場合も転送を行うことができます」と明記されています。デバイス番号の小さい方へ転送する場合は(s)から順に、大きい方へ転送する場合は(s)+(n)-1から順に処理する、という方向の規定があるため、重なっていても正しい結果が得られる設計になっています。先ほどの履歴シフトの例のように、あえて範囲を重ねて使うテクニックもあるので、「重なる=NG」と決めつけないようにしましょう。
③(s)(d)が両方ビットデバイスの場合は桁数をそろえる
(s)、(d)の両方にビットデバイスを指定する場合、マニュアルには「(s),(d)が両方ともビットデバイスの場合は,必ず(s),(d)の桁数を同一にしてください」という注意書きがあります。たとえばK2X0(8ビット分)を(s)にしたのに(d)をK4Y0(16ビット分)にする、といった桁数の食い違いは避ける必要があります。片方がワードデバイスであれば桁指定側のビット数が転送対象になりますが、両方ビットデバイスのときだけはこのルールに従って桁数をそろえてください。
