マシニングセンターを使っている人ならNCのプログラムで加工すると思います。
でも、マクロは使ってない人は結構多い気がします。
この記事は
- NCのマクロを使ったことがない。
- 少しやったけど途中であきらめた。
- カスタムマクロを作りたい。
そんな人のお役に立てるよう書きました。
最後まで読むとマクロプログラムの基礎からカスタムマクロの作り方までが理解できるようになります。
ファナックNCプログラム初心者の方はこちら⇓
NCプログラム入門「ファナック編」
NCプログラムの作り方-1「ファナック編」
他のNCプログラムのマクロはこちら⇓
NCプログラムのマクロを説明【オークマ(OSP)編】
NCプログラムのマクロを説明【 トスナック(TOSNUC) 編 】
さて、普段仕事をしていると加工したことがあるプログラムを、編集して使うこともあると思いますが面倒な作業ですよね?
単純に1ヵ所ずつ編集したり、置換機能を使ったり・・・全部直して「OK」と思っても後で「あっ、直し忘れてた」なんてこと、よくありませんか?
マクロ機能を使うとプログラムを短くか、見やすく、計算も自動化できたりします。
もちろん何でも楽になるわけでありません。
しかし、例えば自分好みの穴加工用サイクルや、ポケット穴用のサイクルも作ることができます。手打ちでプログラミングしている人にはメリットが大きい機能です。
マクロは難しそうなイメージがありますが、簡単なマクロでも十分プログラミングの楽になります。
分厚い取説より簡単にまとめてます。この機会にぜひ目を通してみてください。
プログラム例を記載していますが、分りやすくするためスペースを入れています。
掲載してあるプログラムを利用して不利益を負ったとしても、一切の責任を負いかねますのでご了承ください。
NCプログラムのマクロって?
NCプログラムのマクロを簡単に説明すると、仮の数字「変数」を使ったり、「演算」したり、条件により「分岐や繰返し」するのがマクロプログラムです。これらを表現するためマクロ文を使います。詳しく説明していきます。
簡単なマクロプログラム
まず簡単なマクロプログラムを紹介します。
G0 G90 G54 X0 Y0
#1=100.
X#1 Y10.
M30
プログラムの説明
- 最初に X0Y0 に移動します。
- 次に X100.Y10. に移動して終わりです。
#1 は変数といいファナックでは「#」と「数字」の組み合わせて使います。「#1=100」で変数 #1 に数値 100 が代入されます。(定義ともいいます。)
したがって「X#1」 は「X100.」という意味になります。
変数
変数にはローカル変数、コモン変数、システム変数の3つがあり、「#」の後ろの数字で決まります。
また、初期状態で、定義されてない変数を未定義変数といい「#0」で表されます。
ローカル変数
ローカル変数は#1~#33で表される変数です。メインプログラム、サブプログラム(G65、G66)にそれぞれ個別に用意された変数でリセットやプログラムエンドで初期化されます。
G65、G66はマクロ呼び出しと呼ばれる機能です。サブプログラムを実行するとき、ローカル変数に数値を定義する機能があります。
X軸の移動するマクロプログラムの例
O100 (MAIN)
#1=500.
G0 G90 X#1
G65 P101 A600.
X#1
M30
O101 (SUB)
G0G90X#1
M99
上のプログラム例は次の順番で動きます。
- X500 (メインプログラムで#1には500が入っているため)
- X600 (サブプログラムO101の#1には600が入ってるため)
- X500 (メインプログラムの#1は500から変わってないため)
G65P101A600. でサブプログラムO101のローカル変数 #1 に数値を入れることできます。
対応するアルファベットと変数には決まりがあり引数と呼ばれます。
サブプログラムの呼び出しについて
サブプログラムを呼び出すには「M98」や「G65」を使いますが、M98で呼び出されサブプログラムはメインプログラムのローカル変数と同じ扱いになります。
O100(MAIN)
#1=200
M98P101
M30
O101(SUB)
G0 G90 X#1
M99
結果はG0 G90 X200. に位置決め動作するだけです。 M98 で呼び出されたサブプログラムの #1 とメインプログラムで定義された #1 は同じになります。
マクロ呼び出しについて
マクロ呼び出し
G65 P「プログラム番号」 L「 繰返し回数」 「引数指定」
例)G65 P101 L2 A10. B20.
呼び出しマクロプログラムは O101、繰返しは2回 、マクロに渡すデータはA10とB20という意味になります。
マクロ呼び出しの引数の使い方には2通りあります。
- G L O N P 以外の A~Z を1回だけ使う場合(引数指定Ⅰ)
- A B C を一回と I J Kを10組まで使う場合(引数指定Ⅱ)
*使わない引数は省略できます。どちらの引数指定になるかは自動で判別されます。
引数指定Ⅰ
A~Z を使うタイプ(G L N O P 以外)
G65 P101 A10. C12. U30. X20.
基本的に引数の順番は関係ありませんが、I J K を使う場合はアルファベットの順番通りに入力が必要です。 I→J→K
#10, #12, #14~#16, #27~#33 のローカル変数は引数でサブプログラムへ受け渡しできません。
変数番号 | アドレス |
#1 | A |
#2 | B |
#3 | C |
#4 | I |
#5 | J |
#6 | K |
#7 | D |
#8 | E |
#9 | F |
#11 | H |
#13 | M |
変数番号 | アドレス |
#17 | Q |
#18 | R |
#19 | S |
#20 | T |
#21 | U |
#22 | V |
#23 | W |
#24 | X |
#25 | Y |
#26 | Z |
引数指定Ⅱ
ABC IJK を使うタイプ(ABCを一回IJKを最大10組)
G65 P102 A10. B11. C12. I20. J21. K22. I30. J31. K32.
I J K は入力の順序でマクロの#4から順番に割り当てられます。
変数番号 | アドレス |
#1 | A |
#2 | B |
#3 | C |
#4 | I |
#5 | J |
#6 | K |
#7 | I |
#8 | J |
#9 | K |
#10 | I |
#11 | J |
#12 | K |
#13 | I |
#14 | J |
#15 | K |
#16 | I |
#17 | J |
#18 | K |
変数番号 | アドレス |
#19 | I |
#20 | J |
#21 | K |
#22 | I |
#23 | J |
#24 | K |
#25 | I |
#26 | J |
#27 | K |
#28 | I |
#29 | J |
#30 | K |
#31 | I |
#32 | J |
#33 | K |
コモン変数
コモン変数は#100~#199と#500~#999の変数です。制御装置やカスタムマクロのオプションにより使える範囲が違います。
コモン変数はメインプログラムとサブプログラム共通で1つか存在しない変数です。
#100~#199は制御装置の電源が切れると初期化されます。
#500~#999は制御装置の電源が切れても記憶されています。
システム変数
システム変数は#1000より大きい変数で補正関係のデータやNCの状態などを扱うことができます。
登録してある工具径補正を読取りや書換え、有効なGコードやMコードを調べたりもできます。
システム変数は用途により決まっていますが、制御装置により違います。取説で確認してください。
未定義変数
未定義変数は中身がない「空」という意味で#0であらわされます。
#0に数値を代入することはできません。
変数の初期値は「空」です。変数を初期化したいときは #1=#0 と入力します。
未定義変数の演算について
位置決め指令の座標値が未定義(空)の場合無視されます。
#1=#0
G0 G90 X#1 Y100.
→G0 G90 Y100.と同じ
X#1は無視されます。
未定義変数が演算された場合は 0 として扱われます。
#1=#0
#2=#1+5
→ #2=5
#2=#1*5
→ #2=0
比較演算子の EQ と NE は #0と 0 は異なる値として処理されます。
その他の比較演算子(GT, GE, LT, LE)は #0 と 0 は同じ値として処理されます。
演算
プログラム上で演算処理ができます。算術演算子、論理演算子、比較演算子、関数を説明します。
算術演算子
演算指令 | 意味 |
#i + #j | 加算(+ 足し算) |
#i – #j | 減算(- 引き算) |
#i * #j | 積算(× 掛け算) |
#i / #j | 除算(÷ 割り算) |
#i MOD #j | 余り(#i、#j は整数に丸めてから余りを求めます。) ※制御装置よって使えないこともあります。 |
演算方法
- #100=2 + 5 * 5
- → #100 には 27 が入ります
変数の演算もできます。
- #110=3
- #100=#110*5
- → #100 には 15 が入ります。
計算の順番は数学と同じです。優先させたい場合は [ ] (角カッコ)を使います。
- #100=[ 2 + 5 ] * 5
- → #100 には 35 が入ります
[ ]カッコを重ねることもできます。
- #100=[ [ 2 + 5 ] * 5 ] / 7
- → 35/7 = 5 で#100には 5 が入ります
電卓で 50 ÷ 0 を計算するとエラーになります。
✖ #1=50 / 0
NCのプログラムでも同じように 0(ゼロ) で割る計算はアラームがでます。
0で割れない理由はこちら(外部リンクです)
比較演算子
比較演算子は IF(条件分岐)や WHILE(繰り返し) とセットで使われます。
2つの値を比較するときに使います。
演算指令 | 意味 |
#i EQ #j | = 等しい |
#i NE #j | ≠ 等しくない |
#i GT #j | > より大きい |
#i GE #j | ≧ 等しいかより大きい |
#i LT #j | < より小さい |
#i LE #j | ≦ 等しいかより小さい |
IF文については、下で詳しく説明します。ここでは比較演算子の使い方を確認してください。
#1=-11
IF [ #1 LT -10 ] THEN #1=-10
→ もし#1が-10より小さいときは #1に-10を代入するという意味です。
IF [ #1 EQ -11 ] GOTO 999
→もし#1が-10と等しいときは シーケンスナンバーのN999へ分岐するという意味です。
論理演算子
演算指令 | 意味 |
#i AND #j | 論理積 |
#i OR #j | 論理和 |
#i XOR #j | 排他的論理和 |
条件式での例
IF [[ #1 EQ #2] AND [ #3 EQ #4 ]] GOTO 10
→#1と#2が等しいとき、かつ#3と#4も等しいとき、N10へ分岐します。
IF [[ #1 EQ #2] OR [ #3 EQ #4 ]] GOTO 10
→#1と#2が等しいとき、または#3と#4も等しいとき、N10へ分岐します。
関数
マクロプログラムでは関数を扱うこともできます。
関数 | 意味 |
SIN [ #i ] | 正弦 deg単位 |
COS [ #i ] | 余弦 deg単位 |
TAN [ #i ] | 正接 deg単位 |
ASIN [ #i ] | 逆正弦 答えの範囲はパラメータにより異なります。 270~90 の場合と -90~90 の場合があります。 |
ACOS [ #i ] | 逆余弦 答えの範囲は 180~0 |
ATAN [ #i ] | 逆正接 (引数1つ) 答えの範囲はパラメータにより異なります。 360~0 の場合と -180~180 の場合があります。 |
ATAN [ #i ]/[ #J ] | 逆正接 (引数2つ)※1 |
ATAN [ #i , #J ] | 同上※1 |
SQRT [ #i ] | 平方根 |
ABS [ #i ] | 絶対値 |
BIN [ #i ] | BCD から BINARY 変換 |
BCD [ #i ] | BINARY から BCD 変換 |
ROUND [ #i ] | 四捨五入 (小数点第一位) |
FIX [ #i ] | 小数点以下切り捨て |
FUP [ #i ] | 小数点以下切り上げ |
LN [ #i ] | 自然対数 |
EXP [ #i ] | e ( 2.718… ) を底とする指数 |
POW [ #i , #J ] | べき乗( #i の #j乗 )※1 |
ADP [ #i ] | 小数点付加※1 小数点なしで受け渡された引数 (Add Decimal Point) |
※1 制御装置により使えないことがあります。
関数の使い方
#2=30
#1= SIN [#2]
#1に0.5が入ります。
分岐と繰返し
NCのプログラムは上から順番に実行していきますが、任意の場所へ分岐させたり、条件により同じ処理を繰返すこともできます。無条件分岐、条件分岐、繰返しを説明します。
GOTO(無条件分岐)
無条件分岐は「指定するシーケンス番号へ行きなさい」という意味です。
GOTO 数値 (シーケンス番号)
プログラム例
GOTO 3 ←ここから
N1
N2
N3 ←ここへ
M30
GOTO 3 でシーケンス番号 N3 のブロックに行きます。N1 N2 は飛ばされます。
GOTO より上のシーケンス番号でも構いません。
N1 … ←ここへ
N2 …
GOTO 1 ←ここから上のN1へ
シーケンス番号は重複しないよう注意してください。
IF文(条件分岐)
条件分岐は「もし、条件を満たしていれば、○○の処理をして、満たさなければ素通りしてください」という意味になります。
条件を満たすか判断するを条件式といい [ データ 比較演算子 データ] で表します。
○○の処理には GOTO と THEN の2通りの使い方があります。
1.IF [ 条件式 ] GOTO シーケンス番号
2.IF [ 条件式 ] THEN マクロ文
IF文の例 (GOTO)
IF [ #1 EQ 10 ] GOTO 101
→「もし #1=10 の場合、N101へ行きなさい」という意味になります。
IF文の例 (THEN)
IF [ #1 EQ 10 ] TEHN #1=20
→「もし #1=10 の場合、#1=20 の処理をしなさい」という意味になります。
WHILE(繰返し)
プログラムの同じところを繰返すには GOTO や IF文を使っても可能ですが 、WHILE を使うと簡単にできます。
WHLE [ 条件式 ] DO 識別子
(繰り返したいプログラム)
END 識別子
DO から END までのプログラムを条件式を満たす間は繰り返します。
DO と END の識別子は 1 2 3 のどれかの同じ数字をセットで使います。
プログラム例
#1=1
WHILE [ #1 LT 5 ] DO 1
G0 G91 X100.
#1=#1+1
END 1
M30
上のプログラムは #1が5より小さい間はDO~ENDまでのプログラムを繰返します。
#1=#1+1
このブロックはマクロプログラムはよく使う形です。数学ではありえない数式ですが、マクロプログラムでは「#1に1を足して#1を書き換える」という意味になります。#1=#1+1のブロックを読み込むたびに #1は1ずつ増えていき、 5 になると 条件式 [ #1 LT 5 ]を満たさなくなるので繰り返し部分を抜けてM30でプログラムエンドになります。
WHILE文 でできること
1. 識別子は何度でも使えます。
WHILE [ … ] DO 1
. . .
END1
:
WHILE [ … ] DO 1
. . .
END1
:
識別子を変える必要はありません。
2. DO-END を重ねて使うことできます。
識別子を使い分けて3重まで可能になります。
:
WHILE [ … ] DO 1
WHILE [… ] DO 2
WHILE [ … ] DO 3
. . .
END 3
END 2
END 1
:
重ねる場合は同じ識別子のDO~ENDの中に他の識別子DO~ENDをすっぽり入れます。
3. DO~END の間からの分岐はできます。
:
WHILE [ … ] DO 1
IF [ … ] GOTO 10 ←DO~END抜ける
END1
N10 ←ここへ
:
GOTO文で繰返しから抜けさせることができます。
WHILE文 でできないこと
1. DO~END の間への分岐はできません。
:
GOTO 1
WHILE [ … ] DO 1
N1 . . . ←エラー
END1
:
2. 識別番号の違うDO~ENDを交差させることはできません。
:
WHILE [ … ] DO 1
WHILE [ … ] DO 2
END1 ←エラー
END2 ←エラー
:
上の例の場合、識別番号 DO2~END2 の間にEND1 があります。
このような使い方はできません。
マクロプログラムの練習
マシニングセンターのプログラムは同じ工具経路を繰返すことが多くあります。今回は穴を円弧切削で加工するプログラムでマクロプログラムを作ります。
- 加工径 φ35の穴、深さ50
- 穴位置 X0 Y0
- 工具 φ20エンドミル
変数は3つ使います。固定サイクルの R, Q, Z と同じと思ってください。
- #18 レファレンス点
- #17 切込量
- #26 最終加工高さ
プログラム | 説明 |
O1 (PROGRAM) | プログラム名 |
T1M6 (20ENDMILL) | 工具交換 φ20エンドミル |
G0 G90 X0 Y0 | 穴位置 |
G43 Z100. H1 | |
S1000 M3 | |
#18=2.2 | レファレンス点 (初期値) |
#17=2 | 切込み量 (増分値) |
#26=-50 | 最終加工高さ (最終値) |
G0 Z#18 | |
WHILE [#18 GT #26 ] DO 1 | 繰返し文 #18 が #26 より大きい間は繰返し、それ以外は END 1 の下へ |
#18=#18-#17 | 加工高さの計算 |
IF [ #18 LT #26 ] THEN #18=#26 | 条件分岐 加工高さに制限を設ける #18が#26より小さいときは、#18に#26を代入 |
G1 Z#18 F200 | 加工高さへ移動 |
Y7.5 | 円弧加工スタート位置へ移動 |
G3 J-7.5 | 円弧加工 |
G1 Y0 | 穴中心に戻る |
END 1 | WHILE -DOへ |
G0 Z100. | |
M30 |
プログラムの説明
#18にR点を設定しています。#18に切込み量を増やしていき、#26を超えると IF文 で強制的に#18を#26に定義します。#18と#26が等しい場合は DO-ENDを抜けてプログラムエンドです。
加工高さは初回が 0.2 (2.2-2) で円弧加工を行い -1.8 , -3.8 ,と2㎜ずつ切込み、-47.8 , -49.8と続き#18が -51.8になると IF THEN が働いて -50 になります。#18と#26が等しくなり繰返しを抜けます。
このように初期値(#18)に増分値(#17)を加えて、最終値(#26)になるまで繰返すようにします。
実践的なカスタムマクロ
上のマクロプログラムでは毎回コピーして穴径などを変更して使わなければなりません。
そこでサブプログラムに登録しておき(カスタムマクロ)、マクロ呼び出し (G65 G66) で使えば便利になります。自分でGコードをつくる感覚です。
練習のマクロプログラムをベースにカスタムマクロを作ります。メインプログラムから引数を設定すればいろいろな穴径、深さに対応できるようになります。
G65 P500 R2.2 Q2. Z-50. I50. J7.5 F200(マクロ呼び出し)
サンプルプログラム
O1 (MAIN PROGRAM)
G0 G90 G54 X0 Y0
G43 Z100. H1
S1000 M3
G65 P500 R2.2 Q2. Z-50. I50. J7.5 F200
M30
O500 (MACRO ENKO)
(#18 R) (#17 Q) (#26 Z)
(#4 I/NIGE TAKASA)
(#5 J/ENKO)
(#9 F/OKURI)
IF [ #18 EQ #0 ] GOTO 9999 ( R/ NOT SET)
IF [ #26 EQ #0 ] GOTO 9999 ( Z/ NOT SET)
IF [ #4 EQ #0 ] GOTO 9999 ( I/ NOT SET)
IF [ #5 EQ #0 ] GOTO 9999 ( J/ NOT SET)
IF [ #5 LE 0 ] GOTO 9999 ( J/ LE 0)
IF [ #18 LE #26 ] GOTO 9999 ( R LE Z ERROR)
IF [ #4 LT #18 ] GOTO 9999 ( I LT R ERROR)
IF [ #17 EQ 0 ] THEN #17=#0
IF [ #17 NE #0 ] THEN #17=ABS [ #17 ]
#12=#18 (R/ SAVE)
G0 Z#4 (NIGE TAKASA)
Z#18
WHILE [#18 GT #26] DO 1
IF [ #17 NE #0 ] THEN #18=#18-#17
IF [ #17 EQ #0 ] THEN #18=#26
IF [ #18 LT #26 ] THEN #18=#26
G1 Z#18 F#9
G91 Y#5 (ENKO)
G3 J-#5
Y-#5
G90
END 1
G0 Z#4
#18=#12(R/ MODOSU)
M99
N9999
M0 (ALARM)
GOTO 9999
マクロで使う変数
G65でアドレスIとJ を使います。必ずIはJより前に入力してください。
ローカル変数 | アドレス | 説明 | 引数のない場合 |
#18 | R | レファレンス点 | エラー※ |
#17 | Q | 切り込み量 | Zの位置で一回加工、下に詳細あります |
#26 | Z | 最終加工高さ | エラー※ |
#4 | I | 逃げ高さ | エラー※ |
#5 | J | 円弧半径 | エラー※ |
#9 | F | 送り速度 | モーダルFコードに従う |
#12 | 引数Rの保存用 |
※エラー処理について
誤作動を防ぐため、N9999 に分岐してM0プログラムストップします。
- エラーの条件
- R、Q、Z、I、Jのいずれかの引数がない。
- J円弧半径が 0 以下の数値。
- I 逃げ高さ よりR点が大きい。
- R点よりZ最終高さが大きい。
切込み量の処理について
Q(#17) の値により、切込み量に応じて繰り返して加工する場合、Zの高さで1度で加工を終わる場合の2通りに分かれます。
切り込み量のブロック | 意味 |
IF [ #17 EQ 0 ] THEN #17=#0 | #17(Q)が 0 のとき、#17を空(#0)にする #17が空の場合と同じ処理にするため |
IF [ #17 NE #0 ] THEN #17=ABS [ #17 ] | #17が空でないとき、#17は正の数値にする 負の数値だと誤作動するため |
IF [ #17 NE #0 ] THEN #18=#18-#17 | #17が空でないとき、加工高さ#18に切込み量を増やす |
IF [ #17 EQ #0 ] THEN #18=#26 | #17が空のときは、加工高さ#18をZの値#26に設定する |
モーダルマクロ呼び出し(G66)について
今回のマクロはG65で呼び出していますが、G66でも使う想定で作っています。
G66ので最初に引数を受取ってから2回目以降の引数の読込みはされないようです。そのため、はじめに#18を変更する前に#12に保存して、最後に#18を初期値に戻します。
G66 P500 R2.2 Q2. Z-50. I7.5 I90. F200
G90 X0 Y0 ←最初はG66で引数を読込んでO500を実行する
X40. Y30. ←2回目以降は引数の再読込みはしない
G67
引数を受取るローカル変数は最初と最後で同じになるようにしてください。
NCマクロのサンプルプログラムはこちら⇓
NCマクロ【ヘリカル加工のプログラム例を掲載】(ファナック編)
NCマクロ【裏座ぐりカッターのプログラム例】(ファナック編)
NCマクロ【正面フライスのサンプルプログラム】(ファナック編)
まとめ NCプログラムのマクロについて
マクロプログラムには変数、演算機能、繰返しと分岐がありましたね。
- 変数
- ローカル変数 #1~#33
- コモン変数 #100~#199 #500~#999
- システム変数 #1000~
- 演算
- 算術演算子 +、-、*、/
- 比較演算子 EQ 、NE、 GT、 GE、LT、LE
- 論理演算子 AND、OR、XOR
- 関数 SIN、COS、TAN …
繰返しと分岐- 無条件分岐 GOTO
- 条件分岐 IF
- 繰返し WHILE
ここまで、NCプログラムのマクロについて説明してきましたが、いかがでしたか?
基本的な文法を理解したら、簡単なマクロプログラムを作ってみてください。
変数を1つ使うだけでも十分マクロです。
サンプルのカスタムマクロも自分流にアレンジすると理解がより深まります。
マクロプログラムのシミュレーションしたい人へ、フリーソフトの「CAM13」紹介
自宅の学習に最適です。64bit版と32bit版があるのでお使いのパソコンの仕様を確認してダウンロードしてください。
CAM13(64bit版)
CAM13(32bit版)
NCマクロプログラムをもっと知りたい人への書籍紹介
この記事が、NCのマクロプログラムに触れるきっかけになってくれたら嬉しいです。
以上で終わりです。
最後まで読んでいただきありがとうございます。