【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は使用不可。演算エラーなし。

動作

X0 → BSFLP M0 K8 のラダー図(M0〜M7の8点を1ビット左シフト。M0が投入側、M7が払い出し側)。コンベア上のワーク位置追跡のイメージをコメントで示す
図1:X0の立上りでBSFLP M0 K8を実行し、M0〜M7の8点を1ビット左へシフトするラダー図です。M0が投入側、M7が払い出し側になり、コンベアが1ピッチ進むたびにこの命令を実行すると、ワークの位置がビットの並びのまま隣の工程へ送られていきます。

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〜15BIN16データをnビット右シフト(空きは0埋め)
SFL / SFLP常時実行/立上り(d) 対象(ANY16)/(n) シフト数 0〜15BIN16データをnビット左シフト(空きは0埋め)

SM700にはシフト範囲から一つ外側の1ビットが格納される。(n)に16以上を指定した場合は(n)÷16の余りでシフト。演算エラーなし。

動作

X0 → SFRP D0 K2 のラダー図(D0を2ビット右シフト)。シフト前後のビットパターンをコメントで示す(例: 0000000000001100 → 0000000000000011)
図2:X0の立上りでSFRP D0 K2を実行し、D0のビット列を2ビット右へシフトするラダー図です。押し出された下位2ビット分は消え、空いた上位2ビットには0が入ります。
X0 → SFLP D0 K2 のラダー図(D0を2ビット左シフト)。同様にビットパターンをコメントで示す
図3:X0の立上りでSFLP D0 K2を実行し、D0のビット列を2ビット左へシフトするラダー図です。動きは図2の左右反転版で、押し出された上位2ビットが消え、下位2ビットが0埋めされます。

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は無処理。演算エラーなし。ワークと一緒に「数値データ」を工程間で送るときはこちら。

動作

X0 → DSFLP D0 K4 のラダー図(D0〜D3の4ワードを1ワード左シフト。D0が投入側、D3が出力端)
図4:X0の立上りでDSFLP D0 K4を実行し、D0〜D3の4ワードを1ワード左へシフトするラダー図です。D0が新しいデータの投入側、D3が最終工程のデータになり、ビット群を送るBSFLPのワード版にあたります。

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する。いずれも演算エラーなし。

動作

X0 → BSETP D0 K3 のラダー図(D0のbit3をセット)。ビット番号の数え方(0〜15)をコメントで明記
図5:X0の立上りでBSETP D0 K3を実行し、D0のbit3をセット(1)するラダー図です。ビット位置は0から数えるため、K3が指すのは4番目のビットになります。
X1 → BRSTP D0 K3 のラダー図(D0のbit3をリセット)
図6:X1の立上りでBRSTP D0 K3を実行し、図5でセットしたD0のbit3をリセット(0)するラダー図です。ビット位置の数え方はBSETPと同じです。
X0 → BKRSTP M0 K10 のラダー図(M0〜M9の10点を一括OFFリセット)。リセット範囲をコメントで明記
図7:X0の立上りでBKRSTP M0 K10を実行し、M0〜M9の10点を一括で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つ手前のビットを操作してしまいます。

関連命令

関連記事