NCプログラムのマクロを説明(ファナック編)

NCプログラム

マシニングセンターを使っている人ならNCのプログラムで加工すると思います。

でも、マクロは使ってない人は結構多い気がします。

この記事は

  • NCのマクロを使ったことがない。
  • 少しやったけど途中であきらめた。
  • カスタムマクロを作りたい。

そんな人のお役に立てるよう書きました。

最後まで読むとマクロプログラムの基礎からカスタムマクロの作り方までが理解できるようになります。

NCのプログラムは、「初心者」という人は入門編からどうぞ。

さて、普段仕事をしていると加工したことがあるプログラムを、編集して使うこともあると思いますが面倒な作業ですよね?

単純に1ヵ所ずつ編集したり、置換機能を使ったり・・・全部直して「OK」と思っても後で「あっ、直し忘れてた」なんてこと、よくありませんか?

マクロ機能を使うとプログラムを短くか、見やすく、計算も自動化できたりします。

もちろん何でも楽になるわけでありません

しかし、例えば自分好みの穴加工用サイクルや、ポケット穴用のサイクルも作ることができます。手打ちでプログラミングしている人にはメリットが大きい機能です。

マクロは難しそうなイメージがありますが、簡単なマクロでも十分プログラミングの楽になります

分厚い取説より簡単にまとめてます。この機会にぜひ目を通してみてください。

マクロプログラムのシミュレーションしたい人へ、フリーソフトの「CAM13」を紹介させていただきます。自宅の学習に最適です。
64bit版と32bit版があるのでお使いのパソコンの仕様を確認してダウンロードしてください。
CAM13(64bit版)
CAM13(32bit版)

入門NCプログラミング | 一見 大輔 |本 | 通販 | Amazon
Amazonで一見 大輔の入門NCプログラミング。アマゾンならポイント還元本が多数。一見 大輔作品ほか、お急ぎ便対象商品は当日お届けも可能。また入門NCプログラミングもアマゾン配送商品なら通常配送無料。

NCマクロプログラムの書籍紹介

MCのカスタムマクロ入門 (でか版技能ブックス) | 勝夫, 伊藤 |本 | 通販 | Amazon
Amazonで勝夫, 伊藤のMCのカスタムマクロ入門 (でか版技能ブックス)。アマゾンならポイント還元本が多数。勝夫, 伊藤作品ほか、お急ぎ便対象商品は当日お届けも可能。またMCのカスタムマクロ入門 (でか版技能ブックス)もアマゾン配送商品なら通常配送無料。
Amazon.co.jp: MCのマクロプログラム例題集 (でか版技能ブックス): 勝夫, 伊藤: 本
Amazon.co.jp: MCのマクロプログラム例題集 (でか版技能ブックス): 勝夫, 伊藤: 本

プログラム例を記載していますが、分りやすくするためスペースを入れています。
掲載してあるプログラムを利用して不利益を負ったとしても、一切の責任を負いかねますのでご了承ください。

NCプログラムのマクロって?

NCプログラムのマクロを簡単に説明すると、仮の数字「変数」を使ったり、「演算」したり、条件により「分岐や繰返し」するのがマクロプログラムです。これらを表現するためマクロ文を使います。詳しく説明していきます。

簡単なマクロプログラム

まず簡単なマクロプログラムを紹介します。

G0 G90 G54 X0 Y0
#1=100.
X#1Y10.
M30

プログラムの説明

  1. 最初に X0Y0 に移動します。
  2. 次に 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

上のプログラム例は次の順番で動きます。

  1. X500 (メインプログラムで#1には500が入っているため)
  2. X600 (サブプログラムO101の#1には600が入ってるため)
  3. 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通りあります。

  1. G L O N P 以外の A~Z を1回だけ使う場合(引数指定Ⅰ
  2. 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=#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文(条件分岐)

条件分岐は「もし、条件を満たしていれば、○○の処理をして、満たさなければ素通りしてください」という意味になります。
条件を満たすか判断するを条件式といい [ データ 比較演算子 データ] で表します。
○○の処理には GOTOTHEN の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 1WHILE -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より前に入力してください

ローカル変数アドレス説明引数のない場合
#18Rレファレンス点エラー※
#17Q切り込み量Zの位置で一回加工、下に詳細あります
#26Z最終加工高さエラー※
#4I逃げ高さエラー※
#5J円弧半径エラー※
#9F送り速度モーダルFコードに従う
#12引数Rの保存用

エラー処理について

誤作動を防ぐため、N9999 に分岐してM0プログラムストップします。

  • エラーの条件
    1. R、Q、Z、I、Jのいずれかの引数がない。
    2. J円弧半径が 0 以下の数値。
    3. I 逃げ高さ よりR点が大きい。
    4. 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プログラムのマクロについて

マクロプログラムには変数、演算機能、繰返しと分岐がありましたね。

  • 変数
    • ローカル変数 #1~#33
    • コモン変数  #100~#199 #500~#999
    • システム変数 #1000~
  • 演算
    • 算術演算子 +、-、*、/
    • 比較演算子 EQ 、NE、 GT、 GE、LT、LE 
    • 論理演算子 AND、OR、XOR
    • 関数    SIN、COS、TAN …

  • 繰返しと分岐
    • 無条件分岐 GOTO
    • 条件分岐  IF
    • 繰返し   WHILE

ここまで、NCプログラムのマクロについて説明してきましたが、いかがでしたか?

基本的な文法を理解したら、簡単なマクロプログラムを作ってみてください。
変数を1つ使うだけでも十分マクロです。
サンプルのカスタムマクロも自分流にアレンジすると理解がより深まります。

この記事が、NCのマクロプログラムに触れるきっかけになってくれたら嬉しいです。
最後まで読んでいただきありがとうございます。

タイトルとURLをコピーしました