INV,MEP,MEF,EGP,EGFって言われてもわからんけど、こいつらです。
INV 演算結果反転
MEP,MEF 演算結果パルス化
EGP,EGF エッジリレー演算結果パルス化
マニュアル見ててほぇ~って思ったのでちょっと調べてみた。
問題
下のSample1とSample2の動作は同じか?(Yはアドレス変えてあります)
答えは「同じではない」です。
Sample2は見た目通りの動きにはなります。
Sample1は見た目とは違う挙動になります。
マニュアル参照[SH-080804 MELSEC-Q/L プログラミングマニュアル(共通命令編)/演算結果反転 INV]
では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
まとめ
回路を整理しようとして大きな回路ブロックを作るとこういう罠にはまるような気がします。
回路の途中での反転やパルス化は便利なので。
気をつけよう😀