【GX Works3】比較命令の使い方|LD=/AND=/OR=の6種・32bit比較・範囲判定まで総まとめ
概要
「温度が100℃以上になったらファンを回す」「カウントが目標値に達したら次工程へ進める」——こうした数値のしきい値で分岐する回路は、現場のシーケンス制御で毎日のように出てきます。ひと昔前は、CMP命令で比較結果を大・一致・小の3ビットに一度出力し、そのビットを条件に使う書き方が定番でした。ですが実際にラダーで欲しいのは「条件が成立しているかどうか」の1ビットだけということがほとんどです。比較そのものを1個の接点として直接書けるのが比較接点=この記事の主役で、CMPを経由せずに済む分だけ回路がすっきりします。
LD=/AND=/OR=(16bit比較接点)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/04_comparison.md より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
LD= / AND= / OR= | 常時実行 | (s1)(s2) 比較データ(符号付きBIN16/ANY16_S、-32768〜32767) | =,<>,>,<,>=,<= の6種の比較をa接点として使用。条件成立で導通 |
符号なし版(_U)は0〜65535。CMP命令なしで直接条件分岐できる。
動作
動作としては、(s1)と(s2)のBIN16データを比較し、条件が成立している間だけa接点として導通します。6種類の読み方はそのまま数式どおりで、=は一致・>は超過・<は未満・>=は以上・<=は以下ですが、<>だけは「等しくない(≠)」という意味なので初見では読み違えやすいところです。回路への置き方も普通の接点と変わらず、LD=は回路の先頭に置いて起点にし、AND=は直列につないでAND条件を、OR=は並列に足してOR条件を作ります。比較対象の(s1)(s2)はD0とD10のようなデバイス同士でも、図1のようにD0とK100(デバイスと定数)の組み合わせでも指定でき、しきい値監視のように片方を固定値にするケースが実務では大半です。
サンプルコード
①しきい値監視(LD=単体)
[D0 >= K100] OUT Y0
[D0 >= K100]は「D0が100以上ならON」という比較接点そのものが条件で、CMP命令の出力ビットを経由せずに1行でY0を駆動できます。センサー値をA/D変換してDレジスタに取り込んでいるような設備で、温度や圧力が閾値を超えたらファン・アラームを動かす、といったしきい値監視にそのまま使えるパターンです。
②AND=で複合条件を作る
[M100] [D10 = D20] OUT M10
比較接点はAND=で他の接点と直列に並べられるので、複合条件も素直に書けます。[M100]で「運転中」を示す内部リレーの状態を確認しつつ、AND=の[D10 = D20]で「現在カウント(D10)が目標カウント(D20)に一致している」ことを重ね、両方成立したときだけM10(処理実行)をONにしています。CMP命令で一度ビット化してから複数の接点を組み合わせるより、条件がそのまま1行で読めるぶん見通しが良くなります。
32bit比較(LDD=/ANDD=/ORD=)
書式
出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/04_comparison.md より転記。
| 命令記号 | 実行条件 | 主なオペランド/データ型 | 動作 |
|---|---|---|---|
LDD= / ANDD= / ORD= | 常時実行 | (s1)(s2) 比較データ(符号付きBIN32/ANY32_S、-2147483648〜2147483647) | BIN32ビットデータの接点形式比較(先頭にDを付ける) |
符号なし版(_U)は0〜4294967295。ロングカウンタ等の大きな値の条件分岐に使用。
動作
命令記号の先頭にDを付けるだけで、比較対象が32bitデータになります(LDD=/ANDD=/ORD=)。オペランドの書き方は16bitと同じくD0のままですが、D付き命令ではD0・D1の2ワードがペアで1つの値として扱われます。DMOVで作った32bit値やロングカウンタLCのカウント値など、比較データそのものが32bit幅のときは必ずこちらを使ってください。32bitデータを16bit版のLD=で比較すると下位16bitしか見ておらず、上位16bitの違いが判定に反映されません。32bitデバイスを扱っているのに、うっかり16bit接点を書いてしまう取り違えは実務でも起きやすい事故です。
範囲判定の作り方(◯〜◯の間だけ動かす)
「下限以上・上限以下のときだけ動かす」という範囲判定は、比較接点を2つ直列に並べれば作れます。[D0 >= K100][D0 <= K200]→Y0のように書くだけで済み、読みやすさも十分なので大半はこれで足ります。もう一つ、専用のZCP命令もあります。下限(s1)・上限(s2)に対し比較データ(s3)がどこにあるかを判定し、下・帯域内・上の3状態を(d)/(d)+1/(d)+2にまとめて出力する命令です(下限(s1)は上限(s2)より小さく設定してください。逆にすると上限(s2)は下限(s1)と同じ値として扱われます)。判定が「成立/不成立」の2択で足りるなら比較接点の直列、「下・帯域内・上」を全部使い分けたいならZCP、が選び方の目安です。
よくある誤解
①「比較にはCMP命令が必要」と思い込む
CMP命令は(s1)と(s2)を比較し、大・一致・小の判定結果を(d)・(d)+1・(d)+2の3ビットにON出力する命令です。単純な条件分岐だけなら比較接点1個で完結するのに、CMPで一度ビット化してから、そのビットを条件に使う書き方をよく見かけます。古い教材や他社PLCでの経験があると比較=出力形式という感覚が抜けにくく、CMP経由で書いて回路が無駄に長くなりがちです。大・一致・小の3状態を全部使い分けたい場面だけCMPを検討し、それ以外は比較接点1個で十分です。
②符号付き/符号なしを取り違える
LD=やAND=などの標準命令は符号付き(-32768〜32767)で比較します。センサー値やカウント値のように0〜65535の範囲(符号なし)として扱いたいデータは、_U付きの命令(LD>=_Uなど)を使わないと、32768以上の値が負数と解釈され、大小判定が意図と逆転します。K32768以上の値を扱うときは、標準命令のままにしていないか要注意です。
③32bitデータを16bit比較で済ませてしまう
DMOVで作った32bit値やロングカウンタLCの値をLD=(16bit版)で比較すると、下位16bitしか見ておらず、上位16bitの違いが判定に反映されません。32bitデータの比較は必ずLDD=系(LDD=/ANDD=/ORD=)を使う必要があり、D付き命令に統一しておくのが安全です。
