MELSEC-Q 命令語 メモ

命令語の要注意なポイントを記載します。

演算結果反転
INV
演算結果が反転する範囲は限定されることに注意しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/c91a519b-c8f6-4cb7-a07a-c49ce2ac3459.png)

演算結果パルス化
MEP MEF
インデックス装飾したものやループ内で使用する場合はEGP EGFを使用しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/8c5b737c-97f4-4cee-bcea-b433e61393dd.png)

EGP EGFはエッジリレーと組み合わせて使用する
VOZ0の手前までの演算結果をエッジリレーは保持する
いわばパルスの記憶ができるリレー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/f355b394-2703-4849-95e9-acaf0c977d61.png)

カウンタ
設定値が0の場合は１と同じ処理

PLS PLF
PLS命令実行後にCPUをRUN→STOP→RUNとしてもPLS命令は実行されない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/1260055c-4897-4f5a-970b-3f6ebce4bc24.png)

FF ビットデバイス出力反転
ON OFFを切り替える場合に便利
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/3257c3cb-1a8b-4e35-8ef2-9aab393f89a6.png)

ビットデバイスシフト
例えばM14と指定した場合はM13の値をM14にシフトしてきて、Ｍ１３をＯＦＦする動作となる
なのでビットシフトを行う場合は必ず大きな割付のビットから処理を行うこと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/a5761409-586b-462b-afdc-6f10366a04f9.png)

マスターコントロール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/82f0de61-5cdb-4bbc-86cb-7bac8d5040b4.png)

ビット比較 BKCMP  ユニバーサルモデル Lのみ対応
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/22baab9f-6ed5-4a26-b767-f8456c56930f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/c531b44a-3b94-4e80-a963-092360647289.png)

CMP ユニバーサルモデル Lのみ対応
大小比較をまとめて行うことができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/6e8ea054-3165-41f7-b628-b437ce40e6fe.png)

＋ー
引数が２個と３個の違い
２個の場合だと毎スキャン実行されるとどんどん加算・減算されるが３個だと代入の形になり
毎スキャンでどんどん増えていくことがない

ダブルワードの加減乗除
加算 減算 ２ワード＋２ワード＝２ワード
乗算 除算 ２ワード＋２ワード＝４ワード

１６ビットデータ交換
ワードの値を入れ替えることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/f4b79cb3-7779-4f3e-9b82-cafc967ff4be.png)

上下バイト交換
XCHはワード単位での交換だったが、SWAPは１ワード内の上位下位を交換する
MCプロトコルや上位リンクなど通信において上位下位の反転が必要な場合に便利

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/d3748e36-ad4b-4346-a49c-7732146367b6.png)

IOリフレッシュ
ダイレクト入出力でいいきがするが、どんなときに使うのだろう。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/34f79386-2f3e-4d13-8e2b-613c94cf4aa6.png)

１相アップダウンカウンタ
第一引数にはXのみ指定可能
第一引数の指定デバイス＋１のデバイスが
ON＝アップカウント
OFF＝ダウンカウント となる
カウントデバイスはリングデバイスとなっている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/d3000dff-5a87-4603-abb8-87019e28da5e.png)

ティーチングタイマ
あるデバイスのONしている時間を計測するのに用いる
測定単位も指定可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/3fccc476-218a-4620-9b06-d14d6a70088d.png)

排他的論理和 XOR
比較対象でON OFFが異なっている箇所のビットがONする

否定排他的論理和 XNR
比較対象のON OFFが一致している箇所のビットがONする
一致さえしていればよく。OFF同士でもONする

右ローテーション
ROR RCR
キャリフラグをローテーション先に含めるか否かで分かれている
RORは含めない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/08da9189-fc7f-4746-8b6c-115fccbd1a97.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/daf5f7e9-54b9-489a-9565-4f51a5b1a1cf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/80d83c37-1502-4622-a9ad-f9971c3c65ef.png)

ビットテスト TEST
ワードデバイスの特定のビットのON OFF状態を指定のビットに反映できる
ワードの接点指定と同じなので、あまり覚える必要はないのかもしれない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/a767a6bc-feb2-4cfb-afab-49563288017d.png)

データサーチ SER
第一引数で指定された値をキーとして
第二引数からn点分のワードデータの中から検索します。
第三引数に最初に一致したデバイス番号の相対値（第二引数からの位置）
第三引数＋１に一致した個数を格納する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/f528ce1c-50ed-413a-88f2-ca79c8528b55.png)

ビットチェック SUM
指定したワード内でONしているビットの個数を数える
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/1749a997-5d1c-45e8-bc29-1ada2a0a07b8.png)


デコード DECO
バイナリ値→ビット位置ON
バイナリで６であれば、指定したワードの６ビット目をONする
第三引数のnは第一引数のバイナリ値の有効桁数を示す（３なら３ビットのバイナリ値 最大値７）
第三引数は０～８が指定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/a1afa614-1676-4755-bc31-ce53da7183a7.png)


エンコード ENCO
ビット位置ON → バイナリ値
指定したワードに４ビット目がONしていれば、バイナリ値で４と出力する
第三引数は第一引数の有効ビット数を示す（３なら2^3＝８ビットが対象となる）
第三引数は０～８が指定できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/a0017a2b-24fa-4c6e-b46a-b963635e353d.png)

１６ビットの４ビットずつ分離させる命令
ＤＩＳ
第三引数は0~4の範囲しか指定できない
n=1とした場合は、ワードの下位４ビットのみが取り出される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/956bca33-e974-4336-8124-9ae1f39f6f04.png)

４ビットずつ結合命令
ＵＮＩ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/76541d84-5121-4cff-b8b6-804fd2c7a276.png)

バイト単位の分離 結合
WTOB BTOW
通信の伝文組み立てに非常に便利
BTOWのとき上位バイトは無視されることに注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/71f80c6a-4f32-4afb-9f0a-9c15e7aa425c.png)

最大値検索
MAX MIN
第一引数で指定されたデバイスから第三引数分最大値・最小値を検索して結果を第二引数に格納
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/0a9a5a77-21ba-44cc-919c-b037308e9bf9.png)

並び替え
SORT
１スキャンでは完了しないことに注意
第一引数がソートする先頭デバイス
第二引数が先頭からデータの個数
第三引数が一度の実行で比較するデータ個数 
実行完了までの回数は右の式で求まる    実行完了までの最大実行回数=(n)*(n-1)/2
    例えばn=10ならば、45回かかる計算となる
    そこで第三引数を２にすると45/2 = 22.5 → ２３スキャンでよくなる
第四引数は並び替えが完了した時にONするビットである。
このビットは自動でOFFしないためユーザー側でOFFの面倒を見る必要がある
第五引数から２点分はシステムが占有する領域となる。使用していない領域を割り当てよう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/7d6bfb9c-e440-4e14-8f8a-70b231bd8fb4.png)

ワードデータ合計値
WSUM
第一引数で指定したデバイスから第三引数分のデバイスの合計値を第二引数に格納します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/937473ef-7d76-48e1-b224-553aa3dc2dfe.png)


BREAK 
第一引数にはくりかえり処理回数の残り数を格納する
ただしＮＥＸＴに到達して初めて回数が減るためＢＲＥＡＫしたときのループも残りとしてカウントされている
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/e0436ed7-5f29-489f-8dcf-620a1b65668e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/6fc54732-8aaa-4560-9335-653d9fe883b8.png)

サブルーチンコール
CALL
ファンクションデバイスを用いることで引数や戻り値を受け取ることができる
その際にデバイスの占有範囲に注意が必要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/bf7ea3dc-08d4-461e-8955-f331ba8a13a4.png)

ファンクションデバイスで予約されている領域をサブルーチン内で直で変更してしまうと
戻り値が反映されないため直で値の変更をおこなってはいけない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/3e538864-5f6b-416c-8e40-0ed66024e4e8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/64b059e9-8a2a-4113-a1ca-2e5ee735c0c2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333756/58ef3fdf-0b47-4281-887a-0f0b60d1a324.png)