FANUC PMCプログラミング入門(第1回)

# FANUC PMCプログラミング入門

## プロローグ

PLC/シーケンサといえば三菱やキーエンス、オムロンが有名ですが、工作機械制御に用いるファナック社製CNCに内蔵されるPLCとして「PMC」があります。Programable Machine Controllerの略でCNC機能と連動した機械制御に特化しています。

PMCはFANUC LADDER-IIIというプログラミングツールでラダー編集やコンパイルを行います。

汎用PLCと異なり書店に入門書もなくWEBの情報は少ないので、本記事で少しずつ紹介していきたいと思います。

## ラダープログラムの基本

ラダープログラムは下の図のような構成になります。
両端にある「母線」を「ネット」という線で結ぶため梯子（ラダー）に似ていることからラダープログラムと呼ばれます。

![LADDER.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/feecdec9-516d-dfb3-cff4-5dd841288c95.png)

ラダープログラムは基本的に左から右に、上から下に処理が流れます。
ネットの左側に配置する「接点」はスイッチのようなものでON/OFFの2状態を取る入力になります。ネットの右側には出力対象の「コイル」を配置します。
上の図の例では1ネット目でR0010.0がONのときY0007.1をONにするという意味になります。
2ネット目のように接点は並列(OR)や直列(AND)に並べることができます。

ラダープログラムは周期実行されます。上から下に実行して、最後まで実行されたら次の実行周期でふたたび先頭から実行されます。

## 信号について

接点やコイルの上にF0010.2やY0007.1という文字列がついていますが、これは「信号」になります。
一般的なプログラム言語の「変数」のようなものですがPMCでは信号ごとのアドレスで管理します。

例えばY0007.1のコイルは「Y信号の7バイト目のビット1をON/OFFする」ことを意味します。YはIO機器への出力信号を意味しており、例えばY0007.1にブザーデバイスを接続していれば、Y0007.1がONの間ブザーが鳴音するといった制御ができます。

このように入出力が直感的に理解しやすいため最近では農業IoTにてraspberry piでラダー制御なんて話も聞きます。
しかし工作機械制御のような巨大なラダープログラムでは、すべての信号をアドレス管理する事は困難でバグの要因となります。そのためPMCでは信号アドレスにシンボル名をつけて名前で管理する事も可能です。

### 信号種別

上のラダープログラムのサンプルではRやFといった信号を使っています。PMC信号の種類は以下のようなものがあります。

|信号種別 | 説明                      |
|:--------|---------------------------|
|F        | CNC→PMC信号
|G        | PMC→CNC信号
|X        | I/O機器 入力信号 
|Y        | I/O機器 出力信号
|R        | 内部リレー信号
|E        | 拡張リレー信号
|M        | PMC間入力信号
|N        | PMC間出力信号 
|K        | 保持型リレー (Non Volatile)
|D        | データテーブル
|T        | タイマー
|C        | カウンタ
|L        | ラベル
|Z R9000  | システムリレー
|P        | サブプログラム番号
|A        | メッセージ表示

#### FG

F信号/G信号は主軸/制御軸を管理するCNCシステムとの入出力信号が割り当てられます。軸制御と連動するPMCラダー制御にとって重要な信号です。

#### XY

X信号/Y信号はI/O機器の入出力信号です。PMCではI/O Link(I/O Link i)で接続されるファナック製I/Oユニットの信号アドレスを割り当てることができます。操作盤や手動パルス発生器などが接続されます。

#### R

R信号は内部リレー信号です。
PMCラダープログラム内で使用する変数を割り当てることが出来ます。
なお、一部の機種（メモリタイプ）ではシステム状態を表すシステムリレー信号がR9000番台に割り当てられます。
内部リレーが9000点以上存在するメモリタイプが選択されている場合はシステムリレーはZ信号に割り当てられます。

#### L

Lは特殊な信号でラベルアドレスに使用します。
ラダープログラムは通常上から下に順次処理しますが、ラベルを任意のネットに配置しておき、その場所への「ジャンプ命令」を使うことでその場所へ飛ばすことができます。ラベルと「ジャンプ命令」を組み合わせることで構造化プログラムのように条件判断やループ処理を実現することが可能になります。

「ジャンプ命令」については「機能命令」で詳しく解説したいと思います。

#### P

Pも特殊な信号でプログラム番号が割り当てられます。

ラダーはリレー回路制御を模しているため単純な制御であれば把握しやすいものですが、複雑な制御を馬鹿正直にメインラダーに実装すると長大な巻物になってしまいます。
C言語であれば数万行のmain関数で機械を制御することはせず、当然関数を作って機能ごとに分割するでしょう。
PMCラダープログラミングでも処理を分割する手段がいくつか提供されれおり、その1つにサブプログラム呼び出しがあります。
小さなラダープログラムを作成しPアドレスを割り当てます。呼び出し側ではPアドレスを指定して「コール命令」を実行することでサブプログラムを呼び出すことができます。

#### Z

Zアドレスはシステム状態などを参照するためのシステムリレーです。R信号の説明にも記載しましたが、特定の機種（メモリタイプ）ではR9000番台がシステムリレーになります。
作成するラダーの種別に応じてどちらがシステムリレーに使用されるか確認しましょう。

常時ON状態の信号を作るサンプルとしてシーケンス制御の教科書によく以下のような例がよく出ます。

![常時ON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/17e7d861-7139-2ba3-e00e-b95ced107e1a.png)

確かにこのネットを記述しておけばR0001.0は常時ONとなるのでY信号(ランプ等)を常時点灯させるといったことが出来ます。
とはいえまどろっこしいので常時ONや常時OFF、1秒ごとにトグルする信号など頻出するであろう信号はシステムリレーとして予め準備されているのでそちらを使った方がいいでしょう。

Y信号を常時点灯させたければ以下のようにZ0091.1(もしくはR9091.1)を使用します。

![システムリレー常時ON.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/1e854ff3-f73a-73bf-eac1-b30bfe612d84.png)

シンボル定義で「常時ON」などと名前を付けておくとわかりやすくなるのでおススメです。

> ※なぜシステムリレーはZとR9000の2種類あるのか？
R9000かZ0000かの違いはありますが下3桁は共通です。ではなぜメモリタイプによって2種類あるのでしょうか？
Rは前述したとおり内部リレーとして使用します。C言語で言えばオート変数もグローバル変数もすべてR信号に割り当てられます。昔はR信号は数百から数千バイトあれば十分だったので使われていない9000番台にシステムリレーが割り当てられていました。しかし機械制御が複雑化しラダープログラムも巨大化していくにつれ内部リレーがそれでは足りなくなってきました。
そのためR9000番台以降も内部リレーに使用可能なメモリタイプが追加され、その際システムリレーはZに引っ越したという背景があるようです。

#### MN

MN信号は他PMC装置との入出力信号です。
M信号は他PMCからの入力信号、N信号は他PMCへの出力信号に使用します。

工作機械にローダーを組み合わせるといった場合、2つの疎結合なモジュール構成でラダーを作りたいと思います。この時使用するのが**PMCの多系統**です。
(CNC軸制御の多軸多系統とは混同しないように注意してください)

例えばPMC1で機械制御を行い、PMC2でローダー制御を行うというように、大きな機能単位で制御を分割することでPMC内で独立した2つのプログラムを実行できるようになります。

![MN-signal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/a738e9c1-b9d0-4d56-49c4-354b3751a2d4.png)

この際PMC間の通信を行うのに用いるのがMN信号になります。
N信号に他PMCへの出力を書き込むと、相手側PMCのM信号の入力になります。

#### K

Kアドレスはキープリレーと呼ばれる信号が割り当てられます。キープリレーは電源オフでも保持されるメモリになります。不揮発性RAMとして使用することが可能です。

なお一部アドレス(K900～K999)は**システムキープリレー**として予約されています。PMCセッティングパラメータとしてPMCシステム制御に用いられます。PMC機能設定画面の情報が保持されるほか、ラダーで変更することも可能です。

## 接点

接点は1bitの入力リレーになります。PMCでは4種類が使用可能です。

![接点.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/3a4fdf74-425f-b2e7-d4dd-c934c0dff5c3.png)

| 種別 | 説明                   |
|------|------------------------|
|A接点 | 入力信号がONになるとONを出力します |
|B接点 | 入力信号がOFFになるとONを出力します |
|立上り接点 | 入力信号がOFFからONに変化した1パルスだけONを出力します |
|立下り接点 | 入力信号がONからOFFに変化した1パルスだけONを出力します |

![接点シグナル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/7a35bd81-1474-920a-1967-0be2a37a47da.png)

各接点を横に並べるとAND(論理積)回路、縦に並べるとOR(論理和)回路となります。

![AND_OR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/1bab5cf8-ba39-ca78-6113-1a0b27c0887d.png)

## コイル

コイルは1bitの出力リレーになります。PMCでは4種類が使用可能です。

![コイル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390544/c33d517c-498b-5522-5499-7381e4d1c5a2.png)

| 種別 | 説明                   |
|------|------------------------|
|コイル | 入力がONのときにONを信号出力、OFFのときにOFFを信号出力します。|
|否定コイル | 入力がONのときにOFFを信号出力、OFFのときにONを信号出力します。 |
|セットコイル | セットコイルへの入力がONするとONがセットされます。入力がOFFになってもON信号出力が保持されます。 |
|リセットコイル | セットコイルへの入力がONするとOFFにリセットされます。入力がOFFになってもリセット状態が保持されます。 |

## まとめ

### PMCラダーの基礎・基本命令について

ここまで信号を1bitずつ論理演算するラダープログラムについて紹介してきました。
このようなリード・ライト・AND・OR・NOTの論理演算の簡単な処理を**「基本命令」**と呼びます。「基本命令」だけでも小さな機械制御シーケンスプログラムを作成することも可能です。
しかし近年の工作機械は高性能・高機能化が進み、そんなに単純なものではなくなりました。「算術演算」「浮動小数」「比較演算」「条件分岐」「遅延制御」といった処理が必要となります。
高級プログラミング言語(Java/Python/C#/C++等)であれば簡単ですがラダーの基本命令(論理演算)だけで実現するのは大変です。
PMCではこのような処理を**「機能命令」**として提供しています。「基本命令」に加え、「機能命令」を理解することで効率的にシーケンス制御をプログラム出来ます。
[第2回目](https://qiita.com/oshino_maru/items/5cf3663cb06703bf11c3)以降は「機能命令」についても紹介していきたいと思います。

[目次へ](https://qiita.com/oshino_maru/items/0ae69da0c668efd5061c)

※読んでいただきありがとうございました。質問・修正点等ありましたらお気軽にご連絡ください。