【GX Works3】PLS/PLF命令の使い方|LDP/ANDP/ORPとの違い・1スキャンONの使いどころ

概要

「ボタンを1回押したら、1回だけ動いてほしい」——カウントアップも、工程の切替えも、根っこはこのワンショットの要求です。ところがラダーの世界は基本的に「条件がONの間ずっと実行され続ける」ので、この「1回だけ」を作るには専用の仕掛けが要ります。それを担うのがPLS/PLFとLDP/ANDP/ORPをはじめとするパルス系接点命令です。

PLS/PLFは、立上り・立下りの瞬間にM(内部リレー)などのデバイスへ1スキャンだけONを出力する「出力方式」。LDP/ANDP/ORPは、接点そのものを立上り・立下りの瞬間だけ導通する「パルス接点」に変えてしまう「接点方式」です。同じ「1回だけ捉える」を、デバイスに残すか、接点として使い切るかで実現方法が違う、この2系統の見取り図をまず押さえておきましょう。

PLS/PLF(1スキャンだけONを出力する)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/01_sequence.md より転記。

命令記号実行条件主なオペランド/データ型動作
PLS立上り検出(d) パルス化するデバイス(ビット/ANY_BOOL)実行指令のOFF→ON時に指定デバイスを1スキャンだけON
PLF立下り検出(d) パルス化するデバイス(ビット/ANY_BOOL)実行指令のON→OFF時に指定デバイスを1スキャンだけON

演算エラーなし。CJでジャンプ/CALLで未呼出しの場合、指定デバイスが1スキャン以上ONになることがある。

動作

X0 → PLS M0 のラダー図
図1:X0を実行指令にPLS M0を組んだラダー図で、X0がOFF→ONになった瞬間だけM0を1スキャンONさせる回路です。
X0・M0のタイムチャート(M0が1スキャンだけONになる)
図2:X0がONし続けている間もM0はずっとONにはならず、立上りの瞬間だけ1スキャン分だけONして自動的にOFFへ戻る様子がタイムチャートで確認できます。
X0 → PLF M1 のラダー図
図3:X0を実行指令にPLF M1を組んだラダー図で、X0がON→OFFになった瞬間だけM1を1スキャンONさせる回路です。
X0・M1のタイムチャート(X0の立下りで1スキャンON)
図4:X0がOFFに戻った瞬間にM1が1スキャンだけONし、次のスキャン以降は自動的にOFFへ戻る様子がタイムチャートで確認できます。

動作を整理すると、PLSは実行指令のOFF→ON(立上り)で(d)を1スキャンだけON、PLFはON→OFF(立下り)で(d)を1スキャンだけONにする命令です。ポイントは「1スキャンだけ」の意味で、ONにした次の命令実行タイミング(次のENDを過ぎたあと)で自動的にOFF処理されるので、SET命令のようにRSTで明示的に消す必要はありません。押した・離した「その瞬間」だけを1回分切り出すための命令、と考えると理解しやすいはずです。ただし注意点もあり、PLS/PLFをCJ命令でジャンプさせたり、呼び出し先のサブルーチンをCALL(P)命令でコールしなかったりすると、指定デバイスが1スキャン以上ONし続けてしまうことがあります。常時スキャンされる回路に置くのが基本です。

サンプルコード

①ボタンの長押しでも1回しかカウントしない

[X0  PLS  M0 ]
[M0  INC  D0 ]

X0(カウントボタン)の立上りでM0を1スキャンONし、そのM0でD0をインクリメントします。INC命令は実行条件がONの間、毎スキャン加算され続けるため、もしX0で直接INCを駆動すると、押している時間の長さに応じてD0がどんどん増えてしまいます。M0という「押した瞬間だけの1パルス」を間に挟むことで、長押ししてもD0は1しか増えない、狙いどおりのワンショット動作になります。

②ワークがセンサーを通過し終えた瞬間に次工程を起動する

[X1  PLF  M1 ]
[M1  OUT  Y10]

X1(ワーク検出センサー)がONからOFFに戻った瞬間、つまり「ワークがセンサーの前を通過し終えた瞬間」だけM1が1スキャンONし、Y10(次工程の起動信号)を出力します。センサーがONしている間は起動をかけたくない、通過完了のタイミングだけを拾いたい、という搬送ラインの起動条件でよく使うパターンです。

LDP/ANDP/ORP(パルス接点)

書式

出典: MELSEC iQ-R プログラミングマニュアル(CPUユニット用命令/汎用FUN/汎用FB編)SH-081226 / ops/refs/instructions/01_sequence.md より転記。

命令記号実行条件主なオペランド/データ型動作
LDP / LDF常時実行(s) 接点デバイス(ビット/ANY_BOOL)立上り(LDP)・立下り(LDF)パルスで演算を開始(1スキャン導通)
ANDP / ANDF常時実行(s) 接点デバイス(ビット/ANY_BOOL)立上り/立下りパルスの直列接続
ORP / ORF常時実行(s) 接点デバイス(ビット/ANY_BOOL)立上り/立下りパルスの並列接続

演算エラーなし。LDP単独はON中実行命令のパルス化(P)と同一動作。

動作

LDP X0(立上り接点・接点記号に↑)でY0出力するラダー図
図5:接点記号に↑を付けたLDP X0からそのままY0を出力する回路で、接点自体を「立上りの瞬間だけ通る接点」として使っています。
X0・Y0のタイムチャート(Y0が1スキャンON)
図6:X0がONし続けていてもY0は立上りの瞬間に1スキャンだけONし、以降は自動的にOFFへ戻る様子がタイムチャートで確認できます。
X0 AND LDP X1(直列にパルス接点)でY0出力するラダー図
図7:X0の接点にANDP X1を直列接続した回路で、X0がONしている状態のままX1が立ち上がった瞬間だけ導通してY0を出力します。

動作を整理すると、LDP/LDFは指定デバイスの立上り・立下りの瞬間だけ1スキャン導通する「接点」です。LD/AND/ORのパルス版と考えればよく、回路の先頭ならLDP、直列接続ならANDP、並列接続ならORPというように、回路上のどの位置でもそのまま置き換えて使えます。PLS/PLFと違ってMなどの中継デバイスを消費しないぶん、回路が1行で完結するのが特徴です。なお、LDP命令を単独で使う場合は、ON中実行命令にパルス化オプション(P)を付けたとき(MOVP等)とまったく同じ動作になります。パルス化したい命令にP付きの命令があるなら、わざわざLDPで接点を作らなくても済む場面がある、ということも覚えておくとよいでしょう。

サンプルコード

①品種切替ボタンの立上りで直接処理を起動する

LDP  X0
MOV  D10  D0

X0(品種切替ボタン)の立上りをLDPで直接取り、その1スキャンだけ導通する接点でMOV D10 D0を実行します。命令自体はP付きのMOVPではなく通常のMOVですが、LDPの接点が立上りの瞬間しか導通しないので、結果的にMOVPを使ったのと同じ「1回だけ転送」になります。中継のMを用意せず、この1か所でしか使わない処理ならLDPだけで完結させられます。

②運転中フラグとボタンの立上りをANDPで組み合わせる

LD    M100
ANDP  X1
OUT   Y11

M100(運転中フラグ)がONの状態で、かつX1(切替ボタン)が立ち上がった瞬間だけY11をONにします。「運転中でなければ受け付けない」「運転中に押された瞬間だけ反応する」という、状態とタイミングを両方条件にしたい場面でANDPが活躍します。

PLSとLDP、どっちを使う?

結果だけ見れば、PLSとLDPはどちらも「立上りの1スキャン」を作る点で同じです。図1のPLS M0も、図5のLDP X0も、X0が立ち上がった瞬間に1スキャンだけ何かをONする、という動作は変わりません。違うのは「その1スキャンをどう持ち回すか」です。

PLSはM0のようなデバイスにパルスを残す方式なので、同じワンショットを複数の回路で使い回したいときに有利です。M0を参照する回路をいくつ書いても、元の立上りは1か所(PLS M0)で作ったままで済みます。一方LDPは接点そのものに立上り検出を内蔵しているので、その回路だけでしか使わないなら中継のMが要らず、回路が1行で完結して短く書けます。ただし同じ立上りを別の場所でも使いたくなった場合、LDPはX0の接点をもう一度LDP X0として書き直す必要があり、使い回しには向きません。

また、MOVPやINCPのようにP付きの命令が用意されている処理なら、そもそもPLSもLDPも要らないケースがあります。パルス化したいのが単発の命令1つだけなら、命令自体にPを付けるだけで済みます。目安としては、「複数の回路で使い回すならPLS」「その場限りで完結するならLDP」「単発の命令1つだけならP付き命令」という順番で考えるとよいでしょう。どれも間違いではないので、最終的にはチームや既存プログラムの書き方に合わせて選ぶのも実務では大事な判断です。

よくある誤解

①PLSのM0が「ずっとON」のつもりで使ってしまう

PLSでONにしたM0は1スキャンで自動的にOFFへ戻る、というのを忘れて、そのM0をタイマのコイルやSET命令の実行条件に直接使ってしまうと「動かない」「一瞬しか反応しない」と悩むことになります。タイマは実行条件がONし続けている間カウントする命令なので、1スキャンしかONしないM0を直接タイマの入力にしても、タイマはほぼカウントできません。パルスで作った1スキャンのM0を「継続させたい」なら、そのM0でSETした別のMを使うなど、パルスと保持を別のデバイスで役割分担する必要があります。

②ボタンのチャタリングでワンショットが複数回飛ぶ

機械式の押しボタンやリミットスイッチは、接点が閉じる瞬間に微小なバタつき(チャタリング)が起きることがあります。このバタつきをPLSやLDPがそのまま拾ってしまうと、1回押したつもりが立上りを複数回検出して、ワンショットが2回・3回と飛んでしまうことがあります。対策としては、入力をタイマで少し待ってから取り込む、上位のセンサー・スイッチ自体にチャタリング対策済みの製品を使う、といった方法が定番です。待ち時間の目安はスイッチの機種や使用環境によって変わるので、実機で波形を確認しながら決めるのが確実です。

③同じデバイスへPLSを複数箇所に書く・OUTと混在させる

同じM0に対して、別々の場所でPLS M0を何度も実行してしまう、あるいはPLS M0とOUT M0を混在させてしまうと、どちらの結果が反映されるのか回路を目で追わないと分からなくなります。マニュアルにも「同一デバイスに対してPLS/PLF命令を1スキャンに複数回実行した場合の動作」を説明する専用の注意ページが用意されているほどで、known issueとして扱われている内容です。1つのデバイスは1つの命令だけで管理する、という原則はPLS/PLFでも変わりません。

関連命令

関連記事