【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 ]。比較接点はそのまま実行条件として使える。CMP命令で結果を一度ビットに落とさなくても、接点1つで条件分岐できる。ラダー図:左母線から「D0 >= K100」という比較接点((s1)と(s2)を比べるa接点)を通り、Y0のコイル記号へつながって右母線に至る。D0の値がK100以上のときだけ導通する。例としてD0=150なら導通してY0はON、D0=100でも導通してY0はON、D0=99なら導通せずY0はOFF。比較データは符号付きBIN16/ANY16_S(-32768〜32767)で、符号なし版(_U)は0〜65535。= / <> / > / < / >= / <= の6種の比較をa接点として使え、条件成立で導通する。CMP命令なしで直接条件分岐できるのが利点。出典:MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226
図1:D0の値がK100以上のときだけ導通する比較接点[D0 >= K100]を、そのままY0の実行条件にしたラダー図です。CMP命令で結果を一度ビットに落としてからY0を駆動するのではなく、しきい値判定そのものを1行の接点として書けるのが比較接点の強みです。
比較接点は6種類で、記号は数式と同じ読み方。6本のラングが縦に並び、それぞれ比較接点からY0のコイルへつながる。上から順に、LD= は「D0 = K100」でD0とK100が等しいとき導通。LD<> は「D0 <> K100」でD0とK100が等しくないとき導通。LD> は「D0 > K100」でD0がK100より大きいとき導通。LD< は「D0 < K100」でD0がK100より小さいとき導通。LD>= は「D0 >= K100」でD0がK100以上のとき導通。LD<= は「D0 <= K100」でD0がK100以下のとき導通。注意:<> は「大なり小なり」ではなく「等しくない(ノットイコール)」。直列につなぐならAND=、並列につなぐならOR= のように先頭が変わる(LD / AND / OR)。符号なし版(_U)は0〜65535。32bit版は先頭にDを付けてLDD= / ANDD= / ORD=。出典:MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226
図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 ]。書くのはD0だけ、使うのはD0とD1。命令がD付きなので、D0・D1の2ワードがペアで1つの32bit値として扱われる。ラダー図:左母線から「LDD>= D0 K100000」の比較接点を通り、Y0のコイル記号へつながって右母線に至る。先頭にDが付くと32bitの比較接点になる。下の図では(s1)D0=符号付きBIN32として、D1が上位16bit・D0が下位16bitの2つの箱が並び「2ワードで1つの32bit値」と書かれ、≧の記号を挟んで(s2)K100000=100000の箱(32bitの定数)と比較される。オペランドにはD0と書くだけだが、実際にはD0・D1の2ワードが使われる。注意:隣のD1を別の用途で使っていると、比較の結果が意図しない値になる。比較データは符号付きBIN32/ANY32_S(-2147483648〜2147483647)、符号なし版(_U)は0〜4294967295。ロングカウンタ等の大きな値の条件分岐に使う。直列はANDD=、並列はORD=。出典:MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226
図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付き命令に統一しておくのが安全です。

関連命令

関連記事