はじめに
INV、MEP、MEF、EGP、EGFって言われてもわからないかもしれませんが、これらはMELSEC-Qの重要な演算命令です。
各命令の概要
- INV: 演算結果反転
- MEP, MEF: 演算結果パルス化
- EGP, EGF: エッジリレー演算結果パルス化
マニュアルを見ていて「ほぇ~」と思ったので、ちょっと調べてみました。
問題
下のSample1とSample2の動作は同じでしょうか?(Yはアドレスを変えてあります)
答えは「同じではない」です。
- Sample2: 見た目通りの動きになります
- Sample1: 見た目とは違う挙動になります
マニュアル参照:[SH-080804 MELSEC-Q/L プログラミングマニュアル(共通命令編)/演算結果反転 INV]
Sample1の実際の動作
ではSample1はどのような動きになるのでしょうか?
答えは下の回路と同じ動きになります。
要するに、分岐手前のM0は反転対象から除外されるということですね。
なぜこのような動作になるのか?
下はSample1のリスト表示です。
INVはLD*命令からINVまでの演算結果を反転する動作のようで、LD M0は反転対象に含まれず、LD M1からINVまで、LD M10からINVの演算結果が反転されるようです。
LD*が実行されるたびにそれまでの演算結果はどこかに退避され、ORB/ANBで退避した演算結果とAND/ORされるようです。
(たぶん…あんまりマニュアルには詳しく書いてなかった)
()は命令ではなく説明です
;Sample1
LD M0
(→演算結果退避A)
LD M1
AND M2
INV
(→演算結果退避B)
LD M10
AND M20
INV
ORB (←退避BとOR)
ANB (←退避AとAND)
OUT Y10
同じ挙動の回路との比較
Sample1とSample1と同じ挙動の回路は見た目は違いますが、リストで見比べるとほぼ同じような処理をしています。
;Sample1と同じ挙動
LD M1
AND M2
INV
(→演算結果退避A)
LD M10
AND M20
INV
ORB(←退避AとOR)
AND M0
OUT Y10
MEP, MEF, EGP, EGFではどうか?
下の回路は[SH-080804 MELSEC-Q/L プログラミングマニュアル(共通命令編)/エッジリレー演算結果パルス化 EGP,EGF]のPointに書いてある回路です。
**EGP、EGF命令は、下記の回路ブロックの位置で使用できません。**と…
実際の動作
実際は使えないのではなく、これもINV命令と同じでパルスの適用範囲が見た目と違うということです。
動かしてみると、Sample3と同じ動きの回路と同じ動作になります。
;Sample3
LD X0
LD X1
EGP V0
OR X2
ANB
INC W0
;Sample3と同じ動き
LD X1
EGP V1
OR X2
AND X0
INC W1
まとめ
回路を整理しようとして大きな回路ブロックを作ると、こういう罠にはまるような気がします。
回路の途中での反転やパルス化は便利なので、気をつけましょう😀
重要なポイント
- INV命令: 分岐手前の演算結果は反転対象から除外される
- EGP/EGF命令: パルスの適用範囲が見た目と異なる場合がある
- 大きな回路ブロック: 整理の際は動作確認が重要
このような注意点を理解しておくことで、より確実なPLCプログラミングが可能になります。