【GX Works3】シフト命令とビット処理の使い方|SFR/SFL・BSFR/BSFL・BSET/BRST・BKRSTまで総まとめ
概要
コンベアやインデックステーブルでワークを1ピッチずつ送る設備では、ワークの位置そのものだけでなく、「そのワークが良品か不良品か」「投入されているかどうか」といった情報も、位置と一緒に次の工程へ送りたい場面がよくあります。この「情報ごと工程を送る」動きをビット単位・ワード単位でそのまま表現できるのが、シフト命令の役割です。今回はシフト命令(SFR/SFL・BSFR/BSFL・DSFR/DSFL)と、ワード内の特定ビットだけを操作するビット処理命令(BSET/BRST・BKRST)をまとめて扱います。
| やりたいこと | 使う命令 |
|---|---|
| 工程送り(ビットの列を1つずつ送る) | BSFLP / BSFRP(シフトレジスタの本丸) |
| 1ワードの中身をnビットずらす | SFRP / SFLP |
| ワードの列を1ワードずつ送る(履歴・トレンド) | DSFLP / DSFRP |
| ワード内の特定ビットだけON/OFFする | BSETP / BRSTP |
| ビットデバイスをまとめてリセット | BKRSTP(タイマ・カウンタは現在値も0に) |
BSFR / BSFL(ビット群の1ビットシフト=工程送り)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 6.5 データシフト命令(PDF pp.354-357)/ ops/refs/instructions/13_data-shift.md(2026-07-15是正済みセクション)より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
BSFR / BSFRP | 常時実行/立上り | (d) 先頭ビットデバイス/(n) 点数 0〜65535 | (d)からn点分を右へ1ビットシフト。最上位は0埋め |
BSFL / BSFLP | 常時実行/立上り | (d) 先頭ビットデバイス/(n) 点数 0〜65535 | (d)からn点分を左へ1ビットシフト。最下位は0埋め |
押し出された1ビットはSM700(キャリフラグ)に格納。(n)=0は無処理。(d)にT・C・STは使用不可。演算エラーなし。
動作
M0〜M7の8点を、コンベアの工程1〜8にそのまま見立てると分かりやすくなります。機械が1ピッチ進むたびにBSFLPを1回実行すると、その瞬間のM0〜M7の状態がまとめて隣のビットへ移り、ワークの「居場所」がビット位置としてそのまま追いかけられます。左シフトなら空いた投入側(M0)は自動的に0埋めされるので、実際にワークが入ってきたタイミングだけ別途SETでM0を立ててやれば、そのワークがどこまで進んだかはM0〜M7を見るだけで判断できます。
サンプルコード
①工程送りの基本形
[X0 BSFLP M0 K8 ]
[X1 SET M0 ]
X0(1ピッチ送り完了)の立上りでBSFLP M0 K8を実行し、M0〜M7を1ビット左へ送ります。続けてX1(投入検知)の立上りでSET M0を実行すると、新しく入ってきたワークの分だけM0がONします。ポイントは実行順で、先にシフトしてから投入をSETする形にしないと、シフト前のM0がそのまま流されてしまい、投入したはずのワークが1工程分ずれて記録されます。M7がONしていれば最終工程にワークがある状態なので、払い出し処理を許可する条件としてそのままM7を使えます。
SFR / SFL(1ワード内のnビットシフト)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 6.5 データシフト命令(PDF pp.350-353)/ ops/refs/instructions/13_data-shift.md より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
SFR / SFRP | 常時実行/立上り | (d) 対象(ANY16)/(n) シフト数 0〜15 | BIN16データをnビット右シフト(空きは0埋め) |
SFL / SFLP | 常時実行/立上り | (d) 対象(ANY16)/(n) シフト数 0〜15 | BIN16データをnビット左シフト(空きは0埋め) |
SM700にはシフト範囲から一つ外側の1ビットが格納される。(n)に16以上を指定した場合は(n)÷16の余りでシフト。演算エラーなし。
動作
SFR/SFLが動かすのは、BSFR/BSFLのようなビットデバイスの列ではなく、1ワードの中身そのものです。D0という1つのワードの中でビット列を右や左へずらし、シフトの範囲から押し出された分は消えて、空いた側には0が入るという動きは、BSFR/BSFLと共通しています。違いは対象の広さで、BSFR/BSFLは「M0〜M7のようなビットデバイスの列」を送るのに対し、SFR/SFLは「D0という1つのワードの中身」を送る命令です。工程ごとに複数のビットデバイスで状態を持たせたいならBSFR/BSFL、1ワードに詰め込んだビットパターンをそのままずらしたいならSFR/SFLと使い分けます。
DSFR / DSFL(ワード群の1ワードシフト)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 6.5 データシフト命令(PDF pp.358-361)/ ops/refs/instructions/13_data-shift.md(2026-07-15是正済みセクション)より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
DSFR / DSFRP | 常時実行/立上り | (d) 先頭ワードデバイス/(n) 点数 0〜65535 | (d)からn点分を右へ1ワードシフト。最上位は0埋め |
DSFL / DSFLP | 常時実行/立上り | (d) 先頭ワードデバイス/(n) 点数 0〜65535 | (d)からn点分を左へ1ワードシフト。最下位は0埋め |
(n)=0は無処理。演算エラーなし。ワークと一緒に「数値データ」を工程間で送るときはこちら。
動作
DSFR/DSFLは、BSFR/BSFLのワード版にあたる命令です。BSFR/BSFLが送るのはワークが「存在するかどうか」というビット情報でしたが、品種コードや測定値のような「数値」を工程と一緒に送りたい場合は、こちらのワード単位シフトを使います。D0に新しく入ってきたワークのデータを書き込んでおき、1ピッチ進むたびにDSFLPを実行すれば、そのデータがD1、D2…と工程を追って流れていき、最後のD3を見れば最終工程のワークがどんなデータを持っているかが分かります。
BSET / BRST / BKRST(ビット処理)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 6.4 ビット処理命令(PDF pp.340-349)/ ops/refs/instructions/06_logical-bit.md(2026-07-15是正済みセクション)より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
BSET / BSETP | 常時実行/立上り | (d) ワードデバイス/(n) ビット位置 0〜15 | (d)の(n)ビット目をセット(1) |
BRST / BRSTP | 常時実行/立上り | (d) ワードデバイス/(n) ビット位置 0〜15 | (d)の(n)ビット目をリセット(0) |
BKRST / BKRSTP | 常時実行/立上り | (d) 先頭ビットデバイス/(n) 点数 0〜65535 | (d)からn点分のビットデバイスを一括リセット |
BSET/BRSTの(n)が15を超えた場合は下位4ビットのデータで実行。BKRSTはタイマ(T)・積算タイマ(ST)・カウンタ(C)・ロング系(LT/LST/LC)を指定すると現在値を0にしてコイル接点をOFFする。いずれも演算エラーなし。
動作
BSET/BRSTが向いているのは、複数の状態フラグを1つのワードにまとめて持たせているときに、特定のビットだけをON/OFFしたい場面です。WAND/WORでマスク値を用意して演算するより、「D0のbit3をセットする」とそのまま書けるぶん、何をしたいのか意図が読み取りやすくなることがあります。一方のBKRSTは、ここまで見てきた工程送りシフトレジスタ(M0〜M7)のような、まとまったビットデバイスの範囲を一括で初期状態に戻したいときに相性が良い命令です。段取り替えでラインを止めたタイミングでBKRST M0 K8を実行すれば、工程送りの情報をまとめてクリアしてから次の生産を始められます。
よくある誤解
①P無しのシフトは毎スキャン動く
P無しのBSFLやSFLを常時ON条件のまま使うと、実行条件が成立している間ずっと毎スキャンシフトが実行され、工程送りが一瞬で最後まで流れきってしまいます。シフト命令は原則としてBSFLPやSFLPのようにP付きで使い、1ピッチ送り完了信号のような「そのタイミングで1回だけ送りたい」信号の立上りに合わせて実行するのが基本です。
②押し出されたビットは戻らない
シフトによって範囲の外へ押し出されたビットは、その時点で失われます。BSFR/BSFLやSFR/SFLを実行するとSM700に押し出された1ビットが格納されますが、そこに残るのはあくまで最後に押し出された1ビットだけで、それより前に押し出された分は戻ってきません。払い出し側(M7など)の情報を使いたい場合は、シフトを実行する前に読み取っておく必要があります。
③BKRSTはタイマ・カウンタの「現在値」も0になる
BKRSTは接点をOFFにするだけの命令ではありません。出典の表のとおり、対象にタイマ(T)・積算タイマ(ST)・カウンタ(C)・ロングタイマ系(LT/LST/LC)を含めると、現在値そのものを0にしたうえでコイル接点をOFFします。計測の途中経過を残しておきたいデバイスをうっかりBKRSTの範囲に含めると、コイルが切れるだけでなく計測値ごと消えてしまうので、リセット範囲にどのデバイス種別が含まれるかは事前に確認しておく必要があります。
④ビット位置は0起点
BSETP D0 K3が立てるのは「3番目」のビットではなく、0から数えて4番目にあたるbit3です。ビット位置は0起点で数えるため、1起点の感覚のままK3を指定すると、狙ったビットより1つ手前のビットを操作してしまいます。
