はじめに
MELSEC-Qのデバイスの話です。あのX0/Y0/M0/D0とかいうやつです。
デバイスって実はめちゃくちゃたくさん種類があり、用途がよくわからずになんとなく使っている人もいるかもしれませんね。ということで勉強も兼ねて調べてみました。
注意: 詳しい説明はマニュアルの[SH-080802 QnUCPUユーザーズマニュアル(機能解説・プログラム基礎編)]を読んでください。よく読むとめちゃくちゃ詳しく書いてあります。マニュアルは大事です。
(以下の解説はデバイスによって書くネタがないときは中身のない説明です)
デバイス一覧表
進数について
表の進数はアドレスを指定するときに10進で指定するか16進で指定するかの違いです。下記はWとDを一覧でモニタしたときの画面です。9の次が10になるか0Aになるかが違いますね。
10進の方がわかりやすいと思えばDのデバイスを積極的に使ってもいいと思います。
デバイス一覧
記号 | 進数 | デバイス名 | 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)の機能と動作例
歴史的背景:
MELSEC-QだとUSER LEDが点灯するだけで何が便利なのかわかりませんが、その昔に存在したQ3A、Q4A(大型ビルディングタイプってやつですね)などはCPUユニットに16文字表示できるLED表示器が標準装備されており、アナンシェータの番号を見ることができました。
GOTがない昔は便利だったのかもしれませんね。
実用的な使い方:
誰が広めたのかはよくわからないテクニックですが、ラダーの変更箇所のしおり代わりにFの接点を使うことはよくあると思います。こんなのたまに見ます。ダミー接点代わりですね。
V(10進,エッジリレー,Edge relay)
FOR-NEXTのループの中でも立ち上がりパルス立ち下がりパルスを使いたい、そんな方に便利なエッジリレー。
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に相当するデータが何なのかは見れます
T(10進,タイマ,Timer)
タイマーに使うデバイスです。
使用方法:
[H T10 K5]のように指定すると高速タイマになります。低速タイマ:100ms単位、高速タイマ:10ms単位がデフォルトです。
デバイス構成:
タイマーは複数のデータは一つのデバイスになっています。デバイスモニタやGOTではこのような扱いになります。
- TN:現在値(WORD)
- TT:接点(BIT)
- TC:コイル(BIT)
基準設定の変更:
タイマの基準設定は変えることができます。例えば1000msタイマにすれば最大32767秒(約9時間)まで使用できます。
*MELSEC iQ-RだとLT(ロングタイマー)が使えるので長時間使えます。
100msだと3276.7秒が最大なのでこういう使い方もありなのかもしれません。しかし1000ms基準にしてしまうと若干タイムアップが早くなります。
下記のような回路で高速(100ms)と低速(1000ms)を同時にスタートしてサンプリングトレースでどれだけ差があるか見たら、1000ms設定だと0.7秒早くタイムアップします。
計時のロジックの仕様なのでしょうか。ということは逆にタイマーの値に精度を要求する場合は高速タイマの方が良いのかもしれません。(たぶん)
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 構造化プログラミングマニュアル(共通命令編)]
Z その2(10進,汎用演算レジスタ,standard device register)
汎用演算レジスタとも書いてあり演算の一時的なデータ置き場としても使えますが、あまりこのような使い方はおすすめしません。
制約事項:
普通のデバイスに比べて制約事項があるからです。思いつくのはまずこれくらい:
- コメントがつけれない
- ビット指定[Z0.0]ができない
R / ZR(10進,ファイルレジスタ,File register)
みんな大好きファイルレジスタです。標準RAMという場所にファイルを作成し使います。
指定方法:
ファイルレジスタはRで指定する方法とZRで指定する方法があります。
- Rを使うとR0-R32767までしかアクセスできません
- ZRを使うと全領域通し番号ですべて使えます
じゃあZRを使った方が便利だよねと言うとまあその通りです。古いCPUだとZR指定はスキャンタイムが伸びる要因だったのでRを使う意味もあったのですが、ユニバーサルモデル以降は改良されています。
バンク切り換え:
ファイルレジスタは32768点で1ブロックの塊になっており、どこの塊を使うかをRSET命令で切り替えます。
ではZR98303にRを使ってアクセスするにはですが[RSET K2]を実行し[R32767]にアクセスすると操作できます。
つまりバンク切り換えみたいなイメージですね
Wikipedia バンク切り換え
注意点:
PCパラメータで[プログラムと同一ファイル名を使用]を使うとR0-R32767をローカルデバイスとして使えます。わかりにくいのでこれは使わない方が良いです。ファイルレジスタのファイルをシステムが自動生成してくれないし。
ちなみにZR65535を超えるとステップ数が1増えます。
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のデバイスについて詳しく解説しました。各デバイスの特徴と使用方法を理解することで、より効率的なPLCプログラミングができるようになります。
感想:
MELSEC-Q飽きたのでそろそろMELSEC iQ-R使いたいです。