カスタムマクロ変数をファナックで使いこなす完全ガイド
#100番台の変数を使ったプログラムは、電源を切った翌朝に値がすべて空になってあなたの段取りが白紙に戻ります。
カスタムマクロ変数のファナック独自の3分類とその基本的な役割
ファナックのカスタムマクロで使う変数は、すべて「#(シャープ)+数字」という形式で表現されます。一見シンプルに見えますが、この数字の範囲によって変数の性質がまったく異なります。大きく分けると「ローカル変数」「コモン変数」「システム変数」の3種類があり、それぞれが担う役割を理解することがマクロ活用の出発点です。
まずローカル変数は #1〜#33 の範囲に位置し、メインプログラムやサブプログラム(G65・G66で呼び出されたもの)ごとに個別に用意される変数です。つまり、メインプログラムで #1=100 と定義していても、G65でサブプログラムを呼び出した時点でそのサブプログラムには別の #1 が存在します。プログラムがリセットされるか終了すると初期化されるため、次のプログラム実行時には前の値は残りません。これが原則です。
コモン変数は #100〜#199 と #500〜#999 の2つのエリアに分かれています。どちらもメインプログラムとサブプログラムを横断して共有される点は同じですが、大きな違いが1点あります。#100〜#199 は電源をOFFにすると空(未定義)に戻りますが、#500〜#999 は電源OFFでも値が保持されます。これを知らずに #100番台に重要な段取りデータを保存していると、翌朝の立ち上げ時に値が消えていてプログラムが意図どおりに動かないというトラブルが起きます。
| 変数の種類 | 番号の範囲 | 電源OFF後 | スコープ |
|---|---|---|---|
| ローカル変数 | #1〜#33 | 初期化される | 各プログラム内のみ |
| コモン変数(揮発性) | #100〜#199 | 初期化される | 全プログラム共通 |
| コモン変数(不揮発性) | #500〜#999 | 保持される | 全プログラム共通 |
| システム変数 | #1000以上 | 機械が保持 | CNC内部情報へアクセス |
#500番台が保持されるというのは重要ですね。段取り設定値や工程間で引き継ぐデータはここに入れておけば、電源を落としても安心です。なお、制御装置の機種やオプションによって使える変数の範囲が変わることがあるため、使用機械の取扱説明書での確認が基本です。
参考リンク(ファナック公式・カスタムマクロコースで習得できる内容)。
ファナック株式会社 – カスタムマクロコースで習得できること(変数・システム変数の読み書き解説あり)
カスタムマクロ変数のシステム変数を使った位置情報・工具補正の読み書き
カスタムマクロの中でも特に強力なのがシステム変数です。#1000番以上の番号を持ち、CNCが内部で管理している各種情報(現在位置、工具補正量、ワーク座標系のオフセット量など)を直接読み書きできます。これを活用すると、段取り作業を大幅に自動化できます。
現場でよく使われるシステム変数をいくつか紹介します。
- 📍 #5021〜#5024:X・Y・Z・第4軸の現在位置(機械座標系)
- 📍 #5041〜#5044:X・Y・Z・第4軸の現在位置(ワーク座標系)
- 📍 #5001〜#5020:直前ブロックの終点位置(ワーク座標系)
- 🔧 #2001〜#2200:工具補正量(工具補正メモリAの場合)
- 🏭 #5221〜#5240:G54ワーク原点オフセット量(X・Y・Z・第4軸)
たとえば、マスター工具を使って手動でブロックゲージに合わせた後、その時点の機械座標 #5023 を読み取り、ゲージ厚や工具長を引いた計算結果を #5223(G54のZオフセット値)に書き込む、というマクロを組むことができます。これは手作業で数値を画面入力する作業を自動化するもので、入力ミスによる加工不良のリスクを大幅に下げられます。これは使えそうです。
注意すべき点は、システム変数の番号は制御装置のバージョンや工具補正メモリの種類(A・B・C)によって変わることがあるという点です。特に工具補正量のシステム変数は、パラメータ No.6000 の設定状態によって #2001 が「摩耗補正」を意味したり「形状補正」を意味したりと変わります。実機での確認が条件です。
また、システム変数を使った段取り自動化をさらに発展させると、タッチプローブとの組み合わせが強力です。ファナックのCNCカスタムマクロ変数アクセス機能(2021年より販売)を使えば、ファナックロボットからCNCのマクロ変数を直接読み書きすることも可能になっています。
参考リンク(ファナック公式・ロボットとCNCのマクロ変数連携)。
ファナック株式会社 – CNCカスタムマクロ変数アクセス機能(ロボットがCNCの変数を読み書きできる新機能)
カスタムマクロ変数の呼び出し方:G65とG66の正しい使い分け
カスタムマクロを呼び出す方法は2種類あります。G65(単発呼び出し)とG66(モーダル呼び出し)です。どちらもマクロプログラムに引数(ひきすう)として変数の値を渡せる点は同じですが、動き方がまったく異なります。
G65はその1行だけでマクロを1回呼び出して終わります。書き方は次のとおりです。
G65 P500 A10. B5. Z-20. F200.
P500 が呼び出すプログラム番号、A・B・Z・F などのアドレスが引数です。これらは引数指定のルール(アドレスとローカル変数の対応表)に従い、マクロ内の #1・#2・#26・#9 などに自動で代入されます。引数のアドレスと変数番号の対応がアルファベット順になっていないため、慣れないうちは混乱しやすい部分です。
G66 はモーダル呼び出しといって、G67でキャンセルするまでの間、XY座標指令のたびに自動でマクロが呼び出されます。たとえば複数の穴に同じ輪郭加工を施したいときは次のように書けます。
G66 P500 A10. B5. Z-20. F200.
X50. Y30.
X100. Y30.
X150. Y30.
G67
3行のXY座標指令それぞれに対してマクロO500が呼び出されるため、座標だけを並べれば同じ加工を繰り返せます。穴位置データを別のサブプログラムにまとめておけば、工程ごとに同じ座標データを使い回せるので管理が楽になります。
G66が便利なのは間違いありませんが、1点注意があります。G66はモーダルのGコードなので、G67で明示的にキャンセルしないとその後の移動指令でもマクロが呼ばれ続けます。意図しない呼び出しによる誤動作は現場ではリスクになるため、使い終わったら必ずG67でキャンセルするのが原則です。
参考リンク(マクロ呼び出しG65・G66の構造を図解で解説)。
NCプログラム基礎知識 – マクロの呼び出しと引数指定の解説(G65・G66・多重呼び出しまで)
カスタムマクロ変数のコモン変数を使う際の落とし穴と保持設定の考え方
コモン変数の落とし穴はいくつかあります。知らずに使うと、プログラムが誤動作したり段取りデータが消えたりするリスクがあるため、具体的に整理しておきます。
最初の落とし穴は、先述の電源OFFによる初期化です。#100〜#199 を段取りデータの保管に使うのはダメです。電源を落とすたびに値が消えます。継続して使いたい値は必ず #500〜#999 に入れてください。
2つ目の落とし穴は、コモン変数は全プログラムで共有されるという点です。メインプログラムが #100 に値を入れ、その後 G65 で呼び出したサブプログラムが同じ #100 を上書きすると、元の値は失われます。ローカル変数(#1〜#33)はプログラムごとに独立しているため、こうした競合は起きません。特に必要な理由がなければ、マクロ内ではローカル変数を使うほうが安全です。
3つ目は、リセットボタンを押したときの挙動についてです。制御装置のパラメータ(FANUC では #6001 のビット設定)によって、リセット時にコモン変数 #100番台を保持するか初期化するかが変わります。現場でNC旋盤や MC を複数台管理している場合、同じ機種でも設定が異なることがあるため、機械ごとに挙動を確認しておく必要があります。設定を変えたい場合は機械メーカーへ問い合わせるのが確実です。
- ⚠️ #100〜#199:電源OFFで初期化、場合によってはリセットでも消える
- ✅ #500〜#999:電源OFFでも保持、長期保存に向く
- 🔁 コモン変数の上書き競合:同じ番号を複数プログラムで使うと予期しない上書きが起きる
- ⚙️ リセット時の保持設定:パラメータ #6001 のビット設定で変わる(機種依存)
これが基本です。もう一点、古い制御装置ではカスタムマクロBが標準搭載されていない場合があります。この場合 G65 によるユーザー定義マクロ呼び出しが使えず、オプション費用を支払ってパラメータを書き換えてもらう必要があります。数万円〜十数万円の費用が発生するケースもあるため、中古機を導入する際にはカスタムマクロBが使えるかどうかを事前に仕様書で確認することが重要です。
参考リンク(コモン変数・ローカル変数の違いとNGパターンを詳しく解説)。
セドヤのブログ – NCプログラムのマクロを説明(ファナック編)(変数種別・未定義変数・演算の基礎まで)
カスタムマクロ変数を使って現場の段取り時間を短縮する独自の活用アイデア
ここでは、検索上位記事にはあまり掲載されていない独自の視点でカスタムマクロ変数の活用法を紹介します。「変数の仕組みは分かった、でも何に使えばいいのか」という疑問を持つ方向けの内容です。
一つ目は、主軸回転数の自動計算です。切削速度(Vc)と工具径から主軸回転数 S を計算する式は次の通りです。
S = Vc × 1000 ÷ 3.14 ÷ 工具径
これをそのままマクロに組み込み、プログラム冒頭で工具径 #2 と切削速度 #3 を入力するだけで自動計算させることができます。工具を変えるたびに回転数を電卓で計算して打ち直す手間がなくなります。
#2=10.0 (工具径)
#3=80. (切削速度 m/min)
#10=#3 * 1000. / 3.14 / #2 (主軸回転数)
S#10 M03
二つ目は、モーダル情報をシステム変数で保存してからマクロ内で変更し、終了前に元に戻すパターンです。マクロ内で G91(インクリメンタル)を使って加工した後、G90(アブソリュート)に戻し忘れると、メインプログラムに戻ったときに座標系が変わってしまいます。#4003 には現在の G90/G91 の状態が入っているため、次のように書いておくと安全です。
#27=#4003 (現在のG90/G91を退避)
G91 (マクロ内でインクリメンタルを使用)
...(加工処理)
G#27 (マクロ終了前に元の座標系に戻す)
M99
三つ目は、未定義変数(#0)を使った引数チェックです。マクロを呼び出す際に必須の引数が抜けていると、誤った動作をしてしまう可能性があります。次のように IF 文で引数が未定義かどうかをチェックしてアラームを出す処理を冒頭に入れておくと、ミスを防げます。
IF #1 EQ #0 GOTO 9999 (Aが未入力ならN9999へ)
IF #26 EQ #0 GOTO 9999 (Zが未入力ならN9999へ)
こうした引数チェックは、複数の作業者が同じマクロを使う現場では特に有効です。これを入れておけば問題ありません。段取りをパターン化してマクロにまとめておくことで、熟練者でなくても安定した加工が再現できるようになります。
ファナックの公式トレーニングとして「CNCカスタムマクロコース」が設けられており、オンデマンドセミナーも用意されています。変数の応用的な使い方を体系的に学びたい場合には、こちらを活用するのも一つの選択肢です。
参考リンク(ファナック公式オンデマンドセミナー・カスタムマクロ)。