カスタムマクロ変数ファナックの種類と現場活用法
#100番台の変数は電源を切ると値が消え、加工ミスを招くことがあります。
カスタムマクロ変数ファナックの基本:3種類の変数とは
ファナック系のCNCでカスタムマクロを使うとき、まず理解しなければならないのが「変数の種類」です。変数は「#」と「数字」の組み合わせだけで表現されますが、その番号帯によって性質がまったく異なります。大きく分けると、ローカル変数・コモン変数・システム変数の3種類です。
つまり、番号を見ればその変数の性格がわかる、ということですね。
ローカル変数(#1〜#33)は、呼び出されたプログラムの中だけで有効な変数です。メインプログラムとサブプログラムでは、同じ番号でも別の値として独立して扱われます。たとえばメインプログラムで`#1=500`と設定した後、G65でサブプログラムを呼び出しても、サブプログラム側の`#1`はメインの値に影響されません。プログラムが終了するか、リセットがかかると値はクリアされます。
引数指定でサブプログラムへ値を渡すとき、アルファベット(A〜Z)と変数番号の対応が決まっています。たとえば`A→#1`、`B→#2`、`I→#4`、`J→#5`、`K→#6`という具合です。ただし`G・L・N・O・P`は引数に使えないため注意が必要です。また、`#10・#12・#14〜#16・#27〜#33`は引数で渡すことができない番号なので、設計時に意識しておく必要があります。
コモン変数(#100〜#199、#500〜#999)は、メインプログラムとサブプログラムの両方から参照・変更できる変数です。コモン変数が重要なのは「値が消えるタイミング」が番号帯によって異なる点です。詳しくは次のセクションで解説します。
システム変数(#1000以上)は、工具補正量や現在位置、モーダル情報など、機械の状態そのものを読み書きできる特殊な変数です。この変数を使いこなすことで、段取り作業の自動化が実現します。これは使えそうです。
| 分類 | 番号帯 | 主な用途 | 値が消えるタイミング |
|---|---|---|---|
| ローカル変数 | #1〜#33 | 計算途中の一時値 | プログラム終了でクリア |
| コモン変数(揮発) | #100〜#199 | 作業用・使い回し | 電源OFFや初期化でクリア |
| コモン変数(保持) | #500〜#999 | 段取り値・補正・管理カウンタ | 電源OFFでも保持(機種依存) |
| システム変数 | #1000以上 | 機械状態の参照・書き込み | 機械仕様に依存 |
ファナックの公式研修では、カスタムマクロで「変数と演算指令、条件分岐・繰り返し」を使うことで、類似異形状の加工プログラム作成時間を大幅に短縮できると説明されています。
参考:ファナック公式カスタムマクロコース案内(習得できる内容の詳細が確認できます)
カスタムマクロ変数ファナックのコモン変数:揮発と保持の違いと使い分け
コモン変数を選ぶとき、「番号は何でもいい」と思っていると痛い目に遭います。
#100〜#199と#500〜#999は見た目は同じコモン変数ですが、電源オフ時の挙動が根本的に異なります。#100〜#199は電源をオフにすると値が消去されます。一方、#500〜#999は電源をオフにしても値を保持します(ただし機械の設定やパラメータによって異なる場合もあります)。
これが原因で起きやすいのが「前日に設定したはずの値が消えていた」というトラブルです。たとえば段取りのたびに呼び出す加工パラメータを#100番台に入れたまま翌朝起動すると、値は空の状態になっています。その変数が未定義のまま位置決め指令で使われると、動作が無視されたり、意図しない座標へ移動したりする場合があります。これは注意が必要です。
使い分けの基本原則はシンプルです。一つのプログラム実行中にだけ使う「作業用の数値」は揮発型の#100番台、電源を切っても次回以降も参照したい「段取り値・管理用カウンタ・補正値」は保持型の#500番台に寄せると、トラブルが大幅に減ります。
また、制御機によってはコモン変数の使える範囲がオプション扱いになっている場合もあります。特に#550〜#999がオプションになっているケースがあるため、事前に機械の取扱説明書で確認しておくことが必須です。
さらに注意すべき点として、コモン変数は複数のプログラムから共通でアクセスできるという性質があります。別のマクロプログラムが同じ番号のコモン変数を書き換えてしまう可能性があるため、マクロ内でコモン変数を使う場合は「どのマクロがどの番号を使っているか」を社内でルール化しておくことが重要です。使用する番号をプログラム上部にコメントで明示しておく習慣をつけるだけで、デバッグ工数が大幅に減ります。
ローカル変数を使える場面では積極的にローカル変数を選ぶ方が安全です。これが原則です。
| 番号帯 | 電源OFFの挙動 | 推奨用途 |
|---|---|---|
| #100〜#199 | 値が消える(揮発) | 計算途中・プログラム実行中のみ使う値 |
| #500〜#999 | 値が残る(保持) | 段取り値・補正値・加工カウンタ |
参考:変数の種類と消えるタイミングについての詳細解説(NCVIEWのマクロ解説シリーズ)

カスタムマクロ変数ファナックのシステム変数:段取り自動化への活用
システム変数こそ、カスタムマクロの「本領発揮」の舞台です。
#1000番以上の番号帯に分類されるシステム変数には、工具補正量・現在位置・ワーク座標系のオフセット量・モーダル情報など、機械の内部状態がリアルタイムで格納されています。これらの値を読み取るだけでなく、プログラムから書き込むこともできます。この仕組みを使えば、手作業でやっていた段取り入力を自動化できます。
よく使われるシステム変数をまとめると以下の通りです。
| システム変数 | 内容 |
|---|---|
| #2001〜#2400 | 工具オフセット量(読み取り・書き込み可) |
| #5021〜#5024 | 現在位置(機械座標系) |
| #5041〜#5044 | 現在位置(ワーク座標系) |
| #5061〜#5064 | スキップ信号検出位置(G31使用時) |
| #5221〜#5240 | G54ワーク原点オフセット量 |
| #4001〜#4120 | モーダル情報(G90/G91など現在のGコード状態) |
| #3901 | 加工部品数(終了数) |
たとえばワーク上面のZ座標をG54に自動登録するマクロは、次のような流れで実現できます。マスター工具をセットして主軸端面をゲージに合わせた時点の機械座標(#5023)を読み取り、そこからゲージ厚とマスター工具長を引いた値を、G54のZ軸オフセット変数(#5223)に書き込む、という手順です。
また、工具長補正値の自動登録マクロも同様の考え方で作れます。測定後の機械座標とマスター工具の基準座標の差分を計算し、#11001(工具長補正番号1の形状補正値)などへ代入する形です。この処理を毎回の段取りに組み込むことで、補正値の入力ミスという人的ミスを排除できます。
モーダル情報の保存と復元も重要なテクニックです。マクロ内でG91(インクリメンタル)に変更した場合、マクロ終了時にもとのG90/G91状態に戻さないと、メインプログラムで予期しない動作を引き起こします。`#1=#4003`でG90/G91状態を取得してから処理し、終了前に`G#1`で元に戻す、というパターンを必ず組み込むようにしましょう。
参考:システム変数を使った段取り支援マクロの実例(工具長補正・ワーク座標系の自動設定)

参考:FANUC Series 0 システム変数一覧(変数番号と用途の対応を確認できます)
カスタムマクロ変数ファナックの演算と条件分岐:繰り返し加工への応用
変数の使い方を覚えたら、次は「演算と分岐」でマクロを動かせるようにします。
ファナックのカスタムマクロでは、四則演算・三角関数・比較演算子・IF文・WHILE文を組み合わせることで、柔軟な加工サイクルを自作できます。演算の記述は数学式に近い形で書け、優先順位は通常の算数と同じです。角カッコ` `で括った部分が先に計算されます。
演算の種類は以下の通りです。
| 演算の種類 | 記述例 | 意味 |
|---|---|---|
| 加算 | #100 = #1 + #2 | #1と#2の合計を#100に代入 |
| 減算 | #100 = #1 – #2 | 差を#100に代入 |
| 乗算 | #100 = #1 * #2 | 積を#100に代入 |
| 除算 | #100 = #1 / #2 | 商を#100に代入(0除算はアラーム) |
| 正弦 | #100 = SIN#1 | 角度(deg単位)の正弦値 |
| 平方根 | #100 = SQRT#1 | #1の平方根 |
| 切り捨て | #100 = FIX#1 | 小数点以下を切り捨て |
| 四捨五入 | #100 = ROUND#1 | 小数点第1位で四捨五入 |
条件分岐にはIF文を使います。`IF #1 EQ 10 GOTO 100`という形でシーケンス番号へジャンプするか、`IF #1 EQ 10 THEN #2=20`の形で代入処理を実行します。比較演算子は`EQ(等しい)・NE(等しくない)・GT(より大きい)・GE(以上)・LT(より小さい)・LE(以下)`の6種類です。
繰り返し処理はWHILE文が基本です。`WHILE 条件式 DO 1 〜 END 1`の形で、条件が成立している間はDO〜ENDの間を繰り返します。識別番号は1・2・3の3種類が使え、最大3重のネストが可能です。WHILE文のDO〜END区間の外から中への分岐(GOTO)はアラームになるため厳禁です。
たとえばφ35の穴をφ20エンドミルで2mm刻みに深さ50mmまで切り込む加工を自動化する場合、`#18`(現在のZ位置)と`#26`(最終深さ)を比較しながらWHILE文でループさせ、`IF #18 LT #26 THEN #18=#26`で最終パスの行き過ぎを防ぐ、という構成が定石です。これは使えそうです。
“`
#18=2.2 (レファレンス点)
#17=2 (切込量)
#26=-50 (最終加工高さ)
G0 Z#18
WHILE #18 GT #26 DO 1
#18=#18-#17
IF #18 LT #26 THEN #18=#26
G1 Z#18 F200
Y7.5
G3 J-7.5
G1 Y0
END 1
G0 Z100.
“`
また、未定義変数(#0)の扱いには注意が必要です。`#0`は「空」を意味し、数値の0とは異なります。座標値に未定義変数を使った場合はその軸の移動が無視されますが、演算では0として扱われます。ただし比較演算子の`EQ・NE`では`#0`と0は異なる値として処理されます。これが条件で大丈夫でしょうか? デバッグ時によくハマるポイントです。
カスタムマクロ変数ファナックを使ったプログラムの可読性を上げる実践テクニック
マクロが正しく動くだけでは、現場での保守性は高まりません。
カスタムマクロは`#1・#2・#100`という記号の羅列になりやすく、時間が経った後や他の人が見ると何のための変数かわからなくなる、という問題が現場では非常によく起きます。これを防ぐための実践的なテクニックを紹介します。
① 変数宣言とコメントをプログラム冒頭にまとめる
使用する変数を冒頭に列挙し、各変数にコメントを付けるだけで可読性が大きく上がります。`#1=#0(Tool Length)`のように、初期化と目的説明を同時に書くのがポイントです。「この変数は何のために存在するのか」が一目でわかる状態にしておくことが基本です。
“`
(—変数定義エリア—)
#1=#0 (工具径)
#2=#0 (切込量)
#3=#0 (最終深さ)
#4=#0 (初期点Z)
(——————–)
“`
② ローカル変数を優先して使う
コモン変数は複数プログラムから共有されるため、別マクロが同じ番号を書き換えてしまうリスクがあります。特に必要な場面以外はローカル変数(#1〜#33)を使い、コモン変数の使用箇所を最小化することで、予期せぬ値の破壊を防げます。ローカル変数が基本です。
③ 引数対応表コメントを残す
G65でマクロを呼び出す際の引数(アドレスと変数番号の対応)は非常にわかりにくいため、マクロの呼び出し直前にコメントとして対応表を書く習慣が有効です。たとえば`(A:#1=穴径 B:#2=深さ R:#18=レファレンス点)`のように書くと、月日が経ってから見ても迷いません。
④ モーダル情報は必ず保存・復元する
マクロ内でG90/G91・工具交換・座標系変更などのモーダル情報を変更した場合、マクロ終了前に必ず元の状態に戻す必要があります。`#4003`でG90/G91状態を取得し、終了前に`G#27`で復元するのが定石です。これを省くと、メインプログラムでの動作が変わってしまい、加工ミスや機械への干渉リスクが生じます。
⑤ 変数番号の管理ルールを社内で統一する
保持型コモン変数(#500番台)は電源オフでも値が残るため、複数のマクロが同じ番号を使い始めると、予期しない値を参照し合う状態になります。機械ごとに「どのマクロがどの番号帯を担当するか」をルール化し、プログラム内のコメントにも明記しておくことが、現場のトラブルを根本から防ぐ方法です。
参考:カスタムマクロの読みやすい書き方と変数管理のコツ(実践的なサンプルコードつき)

参考:ファナックCNCカスタムマクロのオンデマンドセミナー概要(習得内容と受講料の確認が可能)
https://www.fanuc.co.jp/ja/training/course/ondemand/pdf/ondemand_fpc.pdf