PLCには繰返し処理が可能なFOR文があります。
このFOR文内でパルス命令を使用しても思うように動作しなかったご経験ありませんか?
インデックス修飾を使用した場合のパルス活用には少しテクニックが必要になるので、
解説と検証した結果をまとめました。
プログラムはKEYENCE KV Nanoシリーズで記述しています。
FOR命令の概要
FOR命令は繰り返し処理をする命令になります。
FOR~NEXT内に囲まれた命令を1スキャンで指定回数実行します。
下記の回路では「INC DM0」の命令を1スキャンで3回実行します。

パルスの概要
パルスについて簡単におさらいします。
パルスとは立上りともいい、前回値OFFの状態から今回値がONの状態に変化した状態のことを指します。
通常、前回値とは前スキャンの状態で今回値は現スキャンの状態です。
パルス命令
指定したビットの立上りで1スキャンだけONする命令

nスキャン目 | R000の状態 | 命令の状態 |
1 | OFF | OFF |
2 | ON | ON |
3 | ON | OFF |
4 | OFF | OFF |
パルス実行型命令
実行条件の立上りで1スキャンだけ実行される命令

nスキャン目 | R000の状態 | 命令の状態 |
1 | OFF | 非実行 |
2 | ON | 実行 |
3 | ON | 非実行 |
4 | OFF | 非実行 |
FOR文の中のパルス命令
前述の通り、パルスとは前回値と今回値の比較で判断します。
通常、前回値とは前スキャンの状態で今回値は現スキャンの状態なので、スキャン数が進むごとに更新されます。
FOR文内については更新のルールが違い、ループ数が進むごとに更新されます。
FOR文内ではアドレスを間接指定できるインデックス修飾を使うことが多いと思います。
今回、インデックス修飾を使用しない場合と使用する場合の動作を確認していきます。
インデックス修飾を使用しない場合
R000が立ち上がると、DM0の値が1づつ加算される回路です。
これをFOR文内に入れてみました。
意図した通り動作します。FOR文の回数分加算されるということはありません。
DM0のINC命令をパルス化しても結果は同じです。

nスキャン目 | FOR文ループ数 | R000の状態 | 命令の状態 |
1 | 1 | OFF | 非実行 |
1 | 2 | OFF | 非実行 |
1 | 3 | OFF | 非実行 |
2 | 1 | ON | 実行 |
2 | 2 | ON | 非実行 |
2 | 4 | ON | 非実行 |
インデックス修飾を使用する場合
NG例
意図しない動作になりますが、素直にR0をZ1でインデックス修飾します。
R000~が立ち上がると、DM0の値が1づつ加算される回路のつもりですが、
R000をON状態で維持しても、DM0の値が増え続けていきます。
シミュレータで1ステップ実行を繰り返すと、毎スキャン値が加算されることが分かります。

NG原因の仮説
以下、マニュアル等に記載の確認はできませんでしたので想像になります。
メーカーに問い合わせれば回答頂けるかもしれません。
インデックス修飾で間接指定されたR000の立上りが監視されていれば正常に動作するはずなので、
R000の直接的な監視はされていないと思われます。
仮説1
インデックス修飾で指定したアドレスは前回値を保持できないので、ON=立上りと見なしている。
仮説2
R000を間接指定している「R000:Z1」というデバイスを生成している
この場合、毎スキャン値が加算されていることからZ1の値が変わるたびに再生成されている可能性がある。
仮説の検証
下記の回路を準備します。
Z1の値はループ数に応じて変化し、Z2の値は変化せず初期値の0のままです。

R000をONしたままにします。
「R000:Z1」のパルス条件で加算されるDM0の値は前回と同じく増え続けます。
「R000:Z2」のパルス条件で加算されるDM1の値は1になった後増えません。
R000を一旦OFFにし、再度ONにすると値が2に変わることから立上りを監視できていることが分かります。
仮説1は間違っているようです。
R000をONしたまま、Z2の値を1にし再度0に戻します。
0に戻した時、DM1の値が一つ加算されます。
仮説2に近い状態ではないでしょうか。
ちなみにFOR文の外で検証をしても同じ結果となりました。
OK例
以上のことを踏まえ、どうすればいいか考えます。
パルス命令の説明で述べた内容を実装してしまえば解決します。
パルスとは立上りともいい、前回値OFFの状態から今回値がONの状態に変化した状態のことを指します。
次の回路は現在値であるR000の値を前回値としてMR000に保存します。
前回値のMR000と今回値のR000を比較することによって、立ち上がりを判断します。
また、条件により立下りを判断することも可能です。
「R000」がON、「MR000」がOFFの条件で立上りを示します。
「R000」がOFF、「MR000」がONの条件で立下がりを示します。

まとめ
FOR文の中でのパルス命令について情報をまとめました。
インデックス修飾を使用した場合、安易にパルス命令を使用すると意図しない動作になるので注意が必要です。
インデックス修飾を使用した前回値の保持は自作回路で行いましたが、
三菱製PLCであれば、「エッジリレー」というデバイスを利用して行うことが可能なはずです。
KEYENCEには「エッジリレー」に相当するものが見つけれませんでしたので、
今回の回路のように自身で保持するなどの工夫が必要になってきます。
コメント