MELSEC-Qのデバイス解説

MELSEC-Qのデバイスの話です。
あのX0/Y0/M0/D0とかいうやつです。
デバイスって実はめちゃくちゃたくさん種類があり用途がよくわからずになんとなく使ってる人もいるかもですね。
ということで勉強も兼ねて調べてみました。

詳しい説明はマニュアルの[SH-080802 QnUCPUユーザーズマニュアル（機能解説・プログラム基礎編）]を読んでください。
よく読むとめちゃくちゃ詳しく書いてあります。マニュアルは大事です。
(以下の解説はデバイスによって書くネタがないときは中身のない説明だし)

表の進数はアドレスを指定するときに10進で指定するか16進で指定するかの違いです。
下記はWとDを一覧でモニタしたときの画面です。9の次が10になるか0Aになるかが違いますね。
10進の方がわかりやすいと思えばDのデバイスを積極的に使ってもいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/56f0a695-c6ef-a1f5-83d1-25ae2d4715a7.png)

|記号|進数|デバイス名|Device Name|
|:----:|:-----|:-----|:-----|
|X|16進|入力|Input|
|Y|16進|出力|Output|
|M|10進|内部リレー|Internal relay|
|L|10進|ラッチリレー|Latch relay|
|F|10進|アナンシェータ|Annunciator|
|V|10進|エッジリレー|Edge relay|
|S|10進|ステップリレー|Step relay|
|B|16進|リンクリレー|Link relay|
|SB|16進|リンク特殊リレー|Link special relay|
|T|10進|タイマ|Timer|
|ST|10進|積算タイマ|Retentive timer|
|C|10進|カウンタ|Counter|
|D|10進|データレジスタ|Data register|
|W|16進|リンクレジスタ|Link register|
|SW|16進|リンク特殊レジスタ|Link special register|
|FX|16進|ファンクション入力|Function input|
|FY|16進|ファンクション出力|Function output|
|SM|10進|特殊リレー|Special relay|
|FD|10進|ファンクションレジスタ|Function register|
|SD|10進|特殊レジスタ|Special register|
|Z|10進|インデックスレジスタ / 汎用演算レジスタ|Index register or standard device register|
|R / ZR|10進|ファイルレジスタ|File register|
|N|10進|ネスティング|Nesting|
|P|10進|ポインタ|Pointer|
|I|10進|割込みポインタ|Interrupt pointer|
|BL|10進|SFCブロックデバイス|SFC block device|
|VD|10進|マクロ命令引数デバイス|Macro instruction argument device|


# X(16進,入力,Input)
PLCに接続したスイッチ等の入力機器を割り当てたデバイスです。

入力ユニットがどこのXに割り当てられるかはPCパラメータの先頭XYにて決定します。
またインテリジェント機能ユニットが占有するXYもPCパラメータで設定します。
つまりPLCのベースに装着したユニットの入力信号はX以外には割り付けができません。
(リンクのI/OなどはXY以外も使えます。)

DX0のように指定するとリフレッシュ処理が来る前に入力信号が取り込めるダイレクト処理ができます。
たとえばスキャンタイムよりもDIが早く変化する場合(パルス入力等)に取りこぼしをたくない、
という場合はスキャンタイムより早くした定周期割り込みの中でDXを使い変化を検出できるようなプログラムを書けばうまく拾える場合もあります。
しかしパルスが早すぎると取りこぼすのでその場合はパルス入力ユニットを使いましょう。（それはそう）

# Y(16進,出力,Output)
PLCに接続したランプやリレー等の出力機器を割り当てたデバイスです。
割り当てる先頭アドレスの定義はXと同じでPCパラメータで設定します。
PLCのベースに装着したユニットの出力信号はY以外には割り付けができません。
DY0のように指定するとリフレッシュ処理が来る前に出力が出せるダイレクト処理ができます。

# M(10進,内部リレー,Internal relay)
ビットデータを格納できるメモリです。
とくに書くネタはない。


# L(10進,ラッチリレー,Latch relay)
Mの停電保持が出来るやつと思ってください。

たまにLをアラーム回路の自己保持に使う人がいますが個人的にはあまりおすすめしません。
理由は停電保持するので電源OFF/ONしてもアラームが消えないからです。
電源OFF/ONでアラームが消えた方が都合が良いケースがたぶん多いと思うので。
なんかわからんけど電源OFF/ONで直ったからヨシ(現場猫のイラスト)みたいなことあるよね。

# F(10進,アナンシェータ,Annunciator)
アナンシェータ。僕は使ったことがないデバイスです。
こちらのブログの説明がわかりやすいです。
[【三菱Qシリーズ】アナンシェータ(F)の機能と動作例](https://denkisekkeijin.com/ladder/mitsubishi_q/q-annunciator-f/)


MELSEC-QだとUSER LEDが点灯するだけで何が便利なのかわからいですが、
その昔に存在したQ3A,Q4A(大型ビルディングタイプってやつですね)などは
CPUユニットに16文字表示できるLED表示器が標準装備されておりアナンシェータの番号を見ることが出来ます。
GOTがない昔は便利だったのかもしれませんね。
<iframe width="560" height="315" src="https://www.youtube.com/embed/6abuQtYgGJE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

誰が広めたのかはよくわからないテクニックですが、ラダーの変更箇所のしおり代わりにFの接点を使うことはよくあると思います。
こんなのたまに見ます。ダミー接点代わりですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c941f67f-e58a-1414-5d4d-4f6acf62fe1f.png)

# V(10進,エッジリレー,Edge relay)
FOR-NEXTのループの中でも立ち上がりパルス立ち下がりパルスを使いたい、そんな方に便利なエッジリレー。

https://qiita.com/fa_yoshinobu/private/e932304d3cc818ff5195

# S(10進,ステップリレー,Step relay)
SFCプログラム用のデバイスです。僕は使ったことがないのでよくわからないです。

# B(16進,リンクリレー,Link relay)
使い方はMやLと同じように好きに使えますが、MELSECNET/HやCC-Link IEなどの通信で流れてきたデータのリフレッシュ先に使うことをメーカーが推奨してるデバイスです。


# SB(16進,リンク特殊リレー,Link special relay)
MELSECNET/HやCC-Link IEのユニットなどの通信機能があるインテリジェント機能ユニットの
システム情報を書き込むのに指定するデバイスです。
PCパラメータでリフレッシュする場合はSB/SWしか指定できません。
ユニットのバッファメモリにSB/SWの元データはあります。
つまりリフレッシュ設定をして無くてもバッファメモリを覗けばSB/SWに相当するデータが何なのかは見れます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/b4e939d7-97e9-7ed0-5396-74850b185a4b.png)


# T(10進,タイマ,Timer)
タイマーに使うデバイスです。
[H T10 K5]のように指定すると高速タイマになります。
低速タイマ:100ms単位,高速タイマ:10ms単位がデフォルトです。

タイマーは複数のデータは一つのデバイスになってます。
デバイスモニタやGOTではこのような扱いになります。
TN:現在値(WORD) , TT:接点(BIT) , TC:コイル(BIT)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/e8e1f868-b99f-ec6c-314e-9e5de0ee71b7.png)

タイマの基準設定は変えることが出来ます。例えば1000msタイマにすれば
最大32767秒(約9時間)まで使用できます。
*MELSEC iQ-RだとLT(ロングタイマー)が使えるので長時間使えます。
100msだと3276.7秒が最大なのでこういう使い方もありなのかもしれません。
しかし1000ms基準にしてしまうと若干タイムアップが早くなります。

下記のような回路で高速(100ms)と低速(1000ms)を同時にスタートしてサンプリングトレース
でどれだけ差があるか見たら、1000ms設定だと0.7秒早くタイムアップします。
計時のロジックの仕様なのでしょうか。ということは逆にタイマーの値に精度を要求する場合は高速タイマの方が良いのかもしれません。（たぶん）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/66bf8cf8-9bf4-c3e5-bf89-2bd1217ea445.png)


# ST(10進,積算タイマ,Retentive timer)
積算タイマです。Tとの違いは計測を一時停止してまた再開が可能です。
計測値をリセットするには[RST ST0]のようにリセットを使います。

タイマーは複数のデータは一つのデバイスになってます。
GOTではこのような扱いになります。
SN:現在値(WORD) , SS:接点(BIT) , SC:コイル(BIT)

# C(10進,カウンタ,Counter)
カウントに使えるデバイスです。書き方はタイマーに似ていますね。

カウンタは複数のデータは一つのデバイスになってます。
GOTではこのような扱いになります。
CN:現在値(WORD) , CT:接点(BIT) , CC:コイル(BIT)

# D(10進,データレジスタ,Data register)
数値データを格納できるメモリです。
とくに書くネタはない。

# W(16進,リンクレジスタ,Link register)
使い方はDやZRと同じように好きに使えますが、MELSECNET/HやCC-Link IEなどの通信で流れてきたデータのリフレッシュ先に使うことをメーカーが推奨してるデバイスです。

# SW(16進,リンク特殊レジスタ,Link special register)
SBと同じような使い方です。SWなのでワードデータです

# FX(16進,ファンクション入力,Function input)
CALL命令は引数をつけて実行が可能です。
引数はCALL先でFX,FY,FDに展開されます。格納もFX,FY,FDです。
なんだか便利そうですが、よく理解しないとデータの入力/出力がどのデバイスになるのかわかりずらいです。また引数も点数に制約があるのでなんにでも使えるわけではない。
FBを使ったほうがよいですね。

# FY(16進,ファンクション出力,Function output)
ファンクション入力(FX)参照

# SM(10進,特殊リレー,Special relay)
CPUユニットの状態が格納されるデバイスです。

# FD(10進,ファンクションレジスタ,Function register)
ファンクション入力(FX)参照

# SD(10進,特殊レジスタ,Special register)
CPUユニットの状態が格納されるデバイスです。

# Z その1(10進,インデックスレジスタ,Index register)
へんてこプラグラムの最初の入り口、インデックス修飾ですね。
回路のベタ書きで限界が見えてくるとZを使うことになります。
マニュアルではインデックス修飾と書いてあります。
詳しくは説明書を見てください。
Zで指定しているデバイスを基準に+32767～-32768で指定します。
ユニバーサルモデル以降は32ビットインデックス修飾も可能です。

BITデバイス/WORDデバイス共にZが使えます。
WORDデバイスをBITデバイスとみなしてZでアクセスは出来ません。
そういう場合はBSET/BRSTと組み合わせて作ります。

ちなみに間接アドレスの機能もありこれはZではなくADRSET命令と@を使います。
ただしワードデバイスのみが使用可能です。
下記が使用例でD100のアドレスを求めてそのアドレスに+10をするつまりD110のこと
D110に123を書き込むという例です。C言語のポインタみたいな使い方です。
参照[SH-080736 MELSEC-Q/L 構造化プログラミングマニュアル（共通命令編）]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/c0d7d2ab-fc40-89df-9337-56366f2e5cb7.png)


# Z その2(10進,汎用演算レジスタ,standard device register)
汎用演算レジスタとも書いてあり演算の一時的なデータ置き場としても使えますが、
あまりこのような使い方はおすすめしません。
普通のデバイスに比べて制約事項があるからです。思いつくのはまずこれくらい
・コメントがつけれない
・ビット指定[Z0.0]ができない。


# R / ZR(10進,ファイルレジスタ,File register)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/4dd48bcf-6520-c8b8-e0d0-21116f73bcc9.png)
みんな大好きファイルレジスタです。標準RAMという場所にファイルを作成し使います。
ファイルレジスタはRで指定する方法とZRで指定する方法があります。
Rを使うとR0-R32767までしかアクセスできません。ZRを使うと全領域通し番号ですべて使えます。
じゃあZRを使った方が便利だよねと言うとまあその通りです。
古いCPUだとZR指定はスキャンタイムが伸びる要因だったのでRを使う意味もあったのですがユニバーサルモデル以降は改良されています。

ファイルレジスタは32768点で1ブロックの塊になっており、どこの塊を使うかをRSET命令で切り替えます。
ではZR98303にRを使ってアクセスするにはですが[RSET K2]を実行し[R32767]にアクセスすると操作できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/420f3291-615d-114c-043e-e177f4647a83.png)

つまりバンク切り換えみたいなイメージですね
[Wikipedia バンク切り換え](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%B3%E3%82%AF%E5%88%87%E3%82%8A%E6%8F%9B%E3%81%88)

PCパラメータで[プログラムと同一ファイル名を使用]を使うとR0-R32767をローカルデバイスとして使えます。わかりにくのでこれは使わない方が良いです。
ファイルレジスタのファイルをシステムが自動生成してくれないし。

ちなみにZR65535を超えるとステップ数が1増えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2146151/b7dae13f-7324-0990-7920-ffdefb281a20.png)

# N(10進,ネスティング,Nesting)
マスタコントロール命令で回路を入れ子構造にしたいときに使います。
そもそもマスタコントロールはどこからどこまでがマスタコントロールの適用範囲かがぱっと見でわかりにくいので僕はほぼ使ってません。

# P(10進,ポインタ,Pointer)
なんでポインタというのかはよくわからないですがC言語のようにアドレスが入ってる箱とは意味が違います。
C言語だとGOTO文で飛ばすときにラベルを書きますが、そのラベルがMELSECでいうポインタだと思ってください。
またポインタは無限にあるわけではないので注意してください。
ポインタも共通ポインタとローカルポインタがあります。
ローカルポインタを使うと便利な事例が思い浮かばないのでPCパラメータのPCシステム設定で共通ポインタの先頭番号を0にしておいた方が
共通ポインタを最大まで使えます。
またPをCALL命令で使う場合はRET命令でRETURNします。


# I(10進,割込みポインタ,Interrupt pointer)
割込みで使用するポインタです。RETURNはIRETを使います。
また割り込みを使うにはEIで割り込み許可にしておく必要があります。
割り込みとかが使えるとなんだかマイコンっぽいですね。

# BL(10進,SFCブロックデバイス,SFC block device)
SFC プログラムの指定ブロックが活性しているかのチェックに使用するデバイスです。
僕は使ったことがないのでよくわからないです。

# VD(10進,マクロ命令引数デバイス,Macro instruction argument device)
マクロ登録回路で使用するデバイスとの事？　なるほどわからん？
ちなみにGX Works2ではマクロ機能は使えません。ファンクションブロックを使用してください。
と記載があります参照[SH-080730 GX Works2 Version 1 オペレーティングマニュアル（共通編）]

# 感想
MELSEC-Q飽きたのでそろそろMELSEC iQ-R使いたいです