コモン変数の#100番台は、電源を切ると中身が消えます。
ファナックのCNCにおけるカスタムマクロ変数とは、NCプログラムの中で数値を一時的・または継続的に保持するための「入れ物」のことです。通常のNCプログラムでは、座標値や送り速度の数字を直書きしますが、変数を使うと「値の部分を差し替えるだけ」でプログラムを使い回せるようになります。
ファナック系では「#」の後ろに数字を付けて変数を表します。たとえば #1=100. と書いた場合、変数 #1 に 100 という数値が代入されます。その後 G0 G90 X#1 と書けば、機械は X100. の位置へ移動します。数字を直書きする場合と見た目は似ていますが、#1 の値を変えるだけで複数の異なる加工に同じプログラムを流用できるのが最大の強みです。
変数を使うメリットは「プログラムの標準化」にあります。たとえば医療機器部品のように形状が似ていてもサイズが異なる製品を多品種加工する現場では、変数を使ってパラメータだけ変えれば済むため、加工プログラムの本数を大幅に削減できます。これは入力ミスのリスクを減らすという点でも重要です。
変数には大きく分けて3種類あり、その番号帯によって性質が全く異なります。つまり変数の「番号」は単なる識別子ではなく、その変数がどのような振る舞いをするかを決める重要な情報です。
| 変数の種類 | 番号帯 | 特徴 | 値が消えるタイミング |
|---|---|---|---|
| ローカル変数 | #1〜#33 | プログラム間で独立 | プログラム終了時にクリア |
| コモン変数(揮発型) | #100〜#199 | メイン・サブ共通 | 電源OFF時にクリア |
| コモン変数(保持型) | #500〜#999 | メイン・サブ共通 | 電源OFFでも保持 |
| システム変数 | #1000以上 | CNC内部情報にアクセス | 機械仕様に依存 |
変数の選び方で加工の信頼性が変わります。用途に応じた使い分けが基本です。
参考:ファナック公式によるカスタムマクロコースの解説(変数・演算・分岐の習得内容を確認できます)
カスタムマクロコースで習得できること|ファナック株式会社
ローカル変数は #1〜#33 の範囲に定義されており、プログラムが異なれば同じ番号でもまったく別の値として動作します。たとえばメインプログラムの #1 に 500 が入っていても、G65 でサブプログラムを呼び出した場合、そのサブプログラム内の #1 はまた別の領域が確保されます。メインプログラムの #1 の値に影響しないのが特徴です。
これは「スコープが分離されている」と表現されます。C言語で言えば関数のローカル変数と同じ概念で、あるプログラムの変数が別のプログラムの変数を誤って上書きする事故を防げます。特に複数のマクロを多重呼び出しする現場では、ローカル変数の独立性が誤動作防止の第一線になります。
ローカル変数への値の渡し方が「引数指定」です。G65 でマクロを呼び出す際、アルファベット(A〜Z)と数値を並べると、対応するローカル変数に値が自動的に入ります。たとえば G65 P101 A10. B20. と書けば、O101 というマクロプログラムの #1 に 10、#2 に 20 が渡されます。
引数指定には「引数指定Ⅰ」と「引数指定Ⅱ」の2種類があります。引数指定Ⅰは A〜Z を1回ずつ使う方式で、引数指定Ⅱは A・B・C を1回と I・J・K を最大10組まで使う方式です。どちらの指定になるかは自動で判別されるため、意図しない指定になっていないか確認する習慣が必要です。
注意すべき点として、M98(通常のサブプログラム呼び出し)で呼ばれたサブプログラムはローカル変数の独立性がありません。メインプログラムと同じローカル変数領域を共有するため、G65 呼び出しとは挙動が異なります。この差を理解しないまま M98 と G65 を混用すると、変数の上書きによる予期しない動作につながります。
この仕様は意外と見落とされがちですね。用途に合わせた呼び出し方法の選択が条件です。
参考:変数の種類とローカル変数・コモン変数の詳細解説
変数|NCプログラム基礎知識
コモン変数は #100〜#199 と #500〜#999 の2つの番号帯に分かれており、メインプログラムとサブプログラムの両方から共通してアクセスできます。ローカル変数と異なり「プログラムをまたいで値を共有したい」場面に向いています。
ただし、この2つの番号帯には決定的な違いがあります。#100〜#199 は「揮発型」と呼ばれ、制御装置の電源を切ると中身がクリアされます。一方 #500〜#999 は「保持型」で、電源OFF後も値が記憶されています。この特性は非常に重要です。
たとえば加工カウンタを #100 に入れて運用していた場合、電源を落としたその瞬間にカウンタはゼロに戻ります。前日まで積み上げてきた加工実績が消えます。一方 #500 番台に入れておけば、翌朝の電源投入後もカウンタ値は保持されています。痛いですね。
医療機器部品の加工現場では、加工完了数や補正値などを変数で管理しているケースがあります。揮発型と保持型を取り違えると、「昨日設定した補正値がなくなった」「カウンタが毎朝ゼロになる」というトラブルが発生します。これは記憶の消えた変数を気づかずに使い続けることで、加工精度に直接影響するリスクでもあります。
また、保持型の #500〜#999 は「電源が切れても残る」という特性ゆえに、誤った値が入り込んだ場合でもそれが残り続けます。特定のマクロが #500 番台を無断で書き換えていると、他のプログラムが呼び出した際に意図しない値で動作する場合があります。こうしたコモン変数の「汚染」を防ぐために、使用する変数番号を現場でルール化しておくことが大切です。
コモン変数は「共有」であることを忘れずに扱うのが原則です。
参考:変数の使い分けと「保持型 vs 揮発型」の現場的な使い方
マクロ解説:第2回 変数の扱いについて|NCVIEW
システム変数は #1000 以上の番号が割り当てられており、CNCの内部情報(工具補正量・現在座標・モーダル情報など)を読み書きするためのインタフェースです。これはカスタムマクロの中でも特に応用の幅が広い仕組みで、「単純なプログラム自動化」を超えた高度な制御を実現します。
たとえばタッチセンサを使った自動工具長測定では、システム変数で工具補正値を書き換えます。加工前にタッチセンサが工具先端に触れ、測定した長さをシステム変数に代入することで、手動での測定・入力作業をゼロにできます。1台のマシニングセンタで1日30回程度の工具交換があるとすれば、1回あたり5分の手入力を省くだけで1日150分もの時間短縮につながります。これは使えそうです。
現在位置情報はシステム変数で取り出せます。
- ワーク座標系での現在位置:#5041(X軸)、#5042(Y軸)、#5043(Z軸)
- 機械座標系での現在位置:#5021(X軸)、#5022(Y軸)、#5023(Z軸)
モーダル情報も取得できます。たとえばマクロ呼び出し前の G90/G91 の状態は #4003 で確認できます。マクロ内で G91 に切り替えた場合、マクロ終了前に元の座標指令モードへ戻さないと、メインプログラムに戻ったときに軸が予期しない位置へ移動する原因になります。#4003 を使ってモーダル情報を保存・復元するコードを書いておくことで、こうした事故を防げます。
また、PMCとの通信専用のシステム変数として #1000〜#1035(PMC→NC入力用)と #1100〜#1135(NC→PMC出力用)が用意されています。これを使うと、NCプログラム内の加工進捗情報を外部機器に伝えたり、外部からNCプログラムの動作を変えたりすることが可能です。
2021年12月にはファナックが「CNCカスタムマクロ変数アクセス機能」を発表し、ロボットの動作プログラムからCNCのカスタムマクロ変数を直接読み書きできるようになりました。2000年以降に製造された組込イーサネット対応のファナックCNCであれば、既存の機械でもCNC側のラダー変更なしに対応できます。
参考:ファナック公式のCNCカスタムマクロ変数アクセス機能の解説
ロボット新機能:CNCカスタムマクロ変数アクセス機能|ファナック株式会社
カスタムマクロの本領は、変数を組み合わせた「条件分岐(IF文)」と「繰り返し(WHILE文)」にあります。これにより、単純な数値の並びだったNCプログラムが、状況に応じて動作を変える「インテリジェントなプログラム」に変わります。
条件分岐は IF #1 EQ 10 GOTO 100 のように記述します。「もし #1 が 10 に等しければ N100 へジャンプ」という意味です。比較演算子には EQ(等しい)、NE(等しくない)、GT(より大きい)、LT(より小さい)などがあり、これらを組み合わせることで多様な条件判断が可能です。
繰り返しは WHILE 文で書きます。たとえば円ポケット加工で「#18 が #26 より大きい間は Z 方向へ切り込みながら円弧加工を続ける」という動作を WHILE 文1本で実装できます。1回の切り込みが 2mm、最終深さが 50mm(名刺の長辺より少し長い程度)なら、25回分の繰り返しを数行のコードで表現できます。
医療機器や福祉用具の部品加工では、形状が似ているが寸法が異なる製品(例:骨固定プレートの各サイズや、ドリルガイドの径違いシリーズ)を多品種小ロットで加工するケースが多くあります。このような場面でカスタムマクロは威力を発揮します。引数に寸法パラメータを渡すだけで、一本のマクロが複数のサイズに対応できるからです。
実際の現場では「モーダル情報の戻し忘れ」が隠れたトラブルの原因になりやすいです。特に G90/G91 のモーダルは、マクロ内で変えたまま復元しないと、次の軸移動が意図しない距離だけ動くことがあります。マクロの先頭で #27=#4003 のようにモーダル値を退避し、終了前に G#27 で復元する習慣をつけると安全です。これは必須です。
参考:カスタムマクロの読みやすい書き方とモーダル情報の扱い方
カスタムマクロの読みやすい書き方を考えてみる|じじぃの引出し
カスタムマクロ変数を使い続けていると、多くの現場で見えてくる問題があります。それは「どの番号が何に使われているかわからなくなる」という変数の管理問題です。NCプログラムの変数は #100、#101、#502 のように数字の並びでしかなく、後から見た人間には目的がわかりません。
これは一般的なプログラミング言語では「変数名」が付けられることで自然に解決されますが、カスタムマクロでは番号しか使えないため、コメント文と運用ルールで補うしかありません。医療部品の加工現場のように品質管理が厳格な環境では、誰かの「変数の使いまわし」や「番号の重複使用」が加工不良の原因になるリスクがあります。
現場レベルでの対策として効果的なのは「変数番号の台帳管理」です。使用するマクロ変数の番号とその役割を一覧表にしてドキュメント化しておくことで、プログラム修正時の誤上書きを防ぎます。具体的には次のようなルールが有効です。
こうした番号の「縄張り」を決めることで、別のマクロが誤ってその番号を使い始めた際にすぐ気づけます。
PMC連携という面では、ファナックのシステム変数 #1000〜#1035 をPMCラダーから書き込むことで、外部センサや搬送設備の状態をNCプログラムの条件分岐に使えるようになります。たとえばパレット搬送ロボットがワークをセットし完了信号を G054.0 で出力した場合、NCプログラム側では IF#1000 EQ 1 GOTO 10 と書くだけで「セット完了を確認してから加工スタート」という連携動作が実現します。
拡張設定(パラメータ No.6001#0〈MIF〉を1に変更)を行うと、PMC連携に使える変数点数が標準の16点から32点以上に増えます。この設定によるデメリットはないため、導入初期に有効化しておくことをおすすめします。
結論は「変数番号には意味を持たせ、台帳で管理する」です。
参考:PMCラダーとNCプログラム間でカスタムマクロ変数を使う方法
【FANUC】PMCラダーとNCプログラム間でカスタムマクロから入出力する方法