【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命令なしで直接条件分岐できる。

動作

[D0 >= K100] 比較接点 → Y0出力 のラダー図(D0が100以上のときY0がON)
図1:D0の値がK100以上のときだけ導通する比較接点[D0 >= K100]を、そのままY0の実行条件にしたラダー図です。CMP命令で結果を一度ビットに落としてからY0を駆動するのではなく、しきい値判定そのものを1行の接点として書けるのが比較接点の強みです。
= / <> / > / < / >= / <= の6種類の比較接点を使ったラダー図を一覧(各行にコメント付き)
図2:LD=/LD<>/LD>/LD</LD>=/LD<=の6種類を1本ずつ並べたラダー図です。記号自体は数式と同じ読み方ですが、<>だけは「大なり小なり」ではなく「等しくない(≠)」という意味なので、見慣れるまでは各行にコメントを付けておくと読み違いを防げます。

動作としては、(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。ロングカウンタ等の大きな値の条件分岐に使用。

動作

[LDD>= D0 K100000] 32bit比較接点 → Y0出力 のラダー図。D0がD0・D1の2ワードペアとして扱われることをコメントで明記
図3:32bit比較接点[LDD>= D0 K100000]をY0の条件にしたラダー図です。オペランドにはD0と書くだけですが、命令がD付きなのでD0・D1の2ワードがペアで1つの32bit値として比較されます。回路の組み方自体は16bitのときと同じです。

命令記号の先頭に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付き命令に統一しておくのが安全です。

関連命令

関連記事