NCプログラムのマクロを説明(ファナック編)
マシニングセンターを使っている人ならNCのプログラムで加工すると思います。
でも、マクロは使ってない人は結構多い気がします。
この記事は
- NCのマクロを使ったことがない。
- 少しやったけど途中であきらめた。
- カスタムマクロを作りたい。
そんな人のお役に立てるよう書きました。
最後まで読むとマクロプログラムの基礎からカスタムマクロの作り方までが理解できるようになります。
ファナックNCプログラム初心者の方はこちら⇓NCプログラム入門「ファナック編」NCプログラムの作り方-1「ファナック編」
他のNCプログラムのマクロはこちら⇓NCプログラムのマクロを説明【オークマ(OSP)編】NCプログラムのマクロを説明【 トスナック(TOSNUC) 編 】
さて、普段仕事をしていると加工したことがあるプログラムを、編集して使うこともあると思いますが面倒な作業ですよね?
単純に1ヵ所ずつ編集したり、置換機能を使ったり・・・全部直して「OK」と思っても後で「あっ、直し忘れてた」なんてこと、よくありませんか?
マクロ機能を使うとプログラムを短くか、見やすく、計算も自動化できたりします。
もちろん何でも楽になるわけでありません。
しかし、例えば自分好みの穴加工用サイクルや、ポケット穴用のサイクルも作ることができます。手打ちでプログラミングしている人にはメリットが大きい機能です。
マクロは難しそうなイメージがありますが、簡単なマクロでも十分プログラミングの楽になります。
分厚い取説より簡単にまとめてます。この機会にぜひ目を通してみてください。
プログラム例を記載していますが、分りやすくするためスペースを入れています。掲載してあるプログラムを利用して不利益を負ったとしても、一切の責任を負いかねますのでご了承ください。
目次- NCプログラムのマクロって?
- 簡単なマクロプログラム
- 変数
- ローカル変数
- マクロ呼び出しについて
- 引数指定Ⅰ
- 引数指定Ⅱ
- コモン変数
- システム変数
- 未定義変数
- ローカル変数
- 演算
- 算術演算子
- 比較演算子
- 論理演算子
- 関数
- 分岐と繰返し
- GOTO(無条件分岐)
- IF文(条件分岐)
- WHILE(繰返し)
- マクロプログラムの練習
- 実践的なカスタムマクロ
- まとめ NCプログラムのマクロについて
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#1G65 P101 A600. X#1 M30O101 (SUB)G0G90X#1M99
上のプログラム例は次の順番で動きます。
- X500 (メインプログラムで#1には500が入っているため)
- X600 (サブプログラムO101の#1には600が入ってるため)
- X500 (メインプログラムの#1は500から変わってないため)
G65P101A600. でサブプログラムO101のローカル変数 #1 に数値を入れることできます。対応するアルファベットと変数には決まりがあり引数と呼ばれます。
サブプログラムの呼び出しについてサブプログラムを呼び出すには「M98」や「G65」を使いますが、M98で呼び出されサブプログラムはメインプログラムのローカル変数と同じ扱いになります。O100(MAIN)#1=200M98P101M30O101(SUB)G0 G90 X#1M99結果は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 のローカル変数は引数でサブプログラムへ受け渡しできません。
変数番号アドレス#1A#2B#3C#4I#5J#6K#7D#8E#9F#11H#13M 変数番号アドレス#17Q#18R#19S#20T#21U#22V#23W#24X#25Y#26Z 引数指定ⅡABC IJK を使うタイプ(ABCを一回IJKを最大10組)G65 P102 A10. B11. C12. I20. J21. K22. I30. J31. K32.I J K は入力の順序でマクロの#4から順番に割り当てられます。
変数番号アドレス#1A#2B#3C#4I#5J#6K#7I#8J#9K#10I#11J#12K#13I#14J#15K#16I#17J#18K 変数番号アドレス#19I#20J#21K#22I#23J#24K#25I#26J#27K#28I#29J#30K#31I#32J#33K コモン変数コモン変数は#100~#199と#500~#999の変数です。制御装置やカスタムマクロのオプションにより使える範囲が違います。
コモン変数はメインプログラムとサブプログラム共通で1つか存在しない変数です。#100~#199は制御装置の電源が切れると初期化されます。#500~#999は制御装置の電源が切れても記憶されています。
システム変数システム変数は#1000より大きい変数で補正関係のデータやNCの状態などを扱うことができます。登録してある工具径補正を読取りや書換え、有効なGコードやMコードを調べたりもできます。
システム変数は用途により決まっていますが、制御装置により違います。取説で確認してください。
未定義変数未定義変数は中身がない「空」という意味で#0であらわされます。#0に数値を代入することはできません。変数の初期値は「空」です。変数を初期化したいときは #1=#0 と入力します。
未定義変数の演算について位置決め指令の座標値が未定義(空)の場合無視されます。#1=#0G0 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 / 0NCのプログラムでも同じように 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=-11IF [ #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~0ATAN [ #i ]逆正接 (引数1つ)答えの範囲はパラメータにより異なります。360~0 の場合と -180~180 の場合があります。ATAN [ #i ]/[ #J ]逆正接 (引数2つ)※1ATAN [ #i , #J ]同上※1SQRT [ #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乗 )※1ADP [ #i ]小数点付加※1小数点なしで受け渡された引数(Add Decimal Point)※1 制御装置により使えないことがあります。
関数の使い方#2=30#1= SIN [#2] #1に0.5が入ります。
分岐と繰返しNCのプログラムは上から順番に実行していきますが、任意の場所へ分岐させたり、条件により同じ処理を繰返すこともできます。無条件分岐、条件分岐、繰返しを説明します。
GOTO(無条件分岐)無条件分岐は「指定するシーケンス番号へ行きなさい」という意味です。
GOTO 数値 (シーケンス番号)
プログラム例GOTO 3 ←ここからN1 N2 N3 ←ここへM30GOTO 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=1WHILE [ #1 LT 5 ] DO 1G0 G91 X100.#1=#1+1END 1M30
上のプログラムは #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 最終加工高さ
プログラムの説明#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 Y0G43 Z100. H1S1000 M3G65 P500 R2.2 Q2. Z-50. I50. J7.5 F200M30O500 (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=#0IF [ #17 NE #0 ] THEN #17=ABS [ #17 ]#12=#18 (R/ SAVE)G0 Z#4 (NIGE TAKASA)Z#18WHILE [#18 GT #26] DO 1IF [ #17 NE #0 ] THEN #18=#18-#17IF [ #17 EQ #0 ] THEN #18=#26IF [ #18 LT #26 ] THEN #18=#26G1 Z#18 F#9G91 Y#5 (ENKO)G3 J-#5Y-#5G90END 1G0 Z#4#18=#12(R/ MODOSU)M99N9999M0 (ALARM)GOTO 9999
マクロで使う変数
G65でアドレスIとJ を使います。必ずIはJより前に入力してください。
ローカル変数アドレス説明引数のない場合#18Rレファレンス点エラー※#17Q切り込み量Zの位置で一回加工、下に詳細あります#26Z最終加工高さエラー※#4I逃げ高さエラー※#5J円弧半径エラー※#9F送り速度モーダル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. F200G90 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版)
https://amzn.to/3k3dbhCamzn.toNCマクロプログラムをもっと知りたい人への書籍紹介
https://amzn.to/2H7r4Ncamzn.to https://amzn.to/31cVTqFamzn.toこの記事が、NCのマクロプログラムに触れるきっかけになってくれたら嬉しいです。以上で終わりです。最後まで読んでいただきありがとうございます。