マクロの概要と種類
1.はじめに

しかし、加工されているワークにもよりますが、意外と同じ形状で寸法違いってありませんか? これこそ、マクロの出番です!「#」も良く見れば#に数字がくっついているだけです。
マクロ機能が難しいのでは無くて、マクロ機能を利用して何かを処理する内容によって難易度が変わります。まずは簡単な処理をするマクロを作成してみて下さい。マクロ機能が意外と簡単で便利であることが分かって頂けると思います。この「マクロのいろは」がお役に立てれば幸いです。
2.マクロの概要
マクロ機能は、
- 変数
- 演算指令
- 条件分岐
基本的にマクロは数値を扱うための機能で、通常、プログラムを作成するために使っているGコードやMコードと組み合わせて使います。
制御機によってマクロの呼び出し命令、変数名の付け方、システム変数、演算結果、などが異なりますので、お使いの制御機のマニュアルをご参照下さい。
3.マクロの種類

- カスタムマクロ
NCプログラムと混在し、NCプログラムから呼び出して実行します。NCプログラムと独立して動作することは出来ません。
殆どの制御機で利用可能です。 - リアルタイムマクロ
NCプログラム内にリアルタイムマクロ指令を記述しますが、NCプログラムと独立して動作しますので、マクロプログラムの条件によって実行を開始します。
従いまして、NCプログラムを実行中に、リアルタイムマクロも同時実行できます。
変数について その1
4.変数
前述でマクロは数値を扱うと表現しましたのはこの変数にあります。
通常、NCプログラムはGコードと移動座標を数値で表します。
例えば、早送りでX50.相対的に移動する命令はG91G00X50.;と指令します。
これを、変数を用いて指令しますと以下のようになります
通常、NCプログラムはGコードと移動座標を数値で表します。
例えば、早送りでX50.相対的に移動する命令はG91G00X50.;と指令します。
これを、変数を用いて指令しますと以下のようになります


更に #1=#1+50 とすることで、変数 #1 に 50 を加算することも出来ます。
5.変数の記述方法
直接番号を記述する


演算命令を使って変数の数字を指令する


6.変数の精度と範囲
マクロ変数の有効桁数は、一般的に10進8桁の小数点以下3桁と10進9桁の小数点以下4桁があります。これ以上の数値を扱える制御機もありますが、あまりにも大き過ぎるデータを代入しますと演算誤差が生じ、判定ミス、若しくはアラームになりますのでご注意下さい。

変数について その2
7.変数の種類
変数には変数の番号により、ローカル変数、コモン変数、システム変数に分かれます。システム変数には読み取り専用のモノ、書き込み専用のモノが存在するなど、それぞれ用途、特性がことなります。また、一部の変数は電源をオフにしても、数値を保持する変数もあります。
- ローカル変数(#1~#33)
プログラム内で有効な数値を保持する変数をローカル変数と言います。
同じ変数であってもプログラムが異なる(例えばプログラムO1の#1と、プログラムO2の#1)場合、変数はそれぞれ別の意味を持つことが出来ます。
また、ローカル変数はマクロを呼出す際に数値を渡すことにも使われます。
例えば、G65P1000A100.B50.C70.;と命令しますと、O1000のマクロを呼出すと同時にO1000プログラムの#1にアドレスAの値、#2にアドレスBの値、#3にアドレスCの値が渡されます。このG65に続く数値を引数と言い、アドレスとローカル変数の番号が決まっています。
ローカル変数としては#1~#33まで使えますが、引数指定できるアドレスには制限がありますので、ご注意下さい。アドレス(引数)とローカル変数番号の対応表を以下に示します。利用の可
/不可引数アドレスローカル
変数番号○A#1○B#2○C#3○D#7○E#8○F#9×G#10○H#11○I#4○J#5○K#6×L#12○M#13×N#14×O#15×P#16○Q#17利用の可
/不可引数アドレスローカル
変数番号○R#18○S#19○T#20○U#21○V#22○W#23○X#24○Y#25○Z#26#27#28#29#30#31#32#33 - コモン変数(#100~#199、#500~#999)
一つのプログラム内で有効なローカル変数に対し、コモン変数はすべてのプログラムにおいて共通です。 よって、O1プログラムで#100に代入した値をO2で参照することが出来ます。
制御機によりすべて利用する場合はオプションが必要ですので、使用する変数番号が利用可能であるかを事前に調べておいて下さい。
(#550~#999までがオプションとなっている場合があります。)
コモン変数はプロテクトを掛けるために読取り専用にすることも出来ます。
(制御機により出来ない場合もあります。)
#100~#199は電源をオフにしますと消去されますが、#500~#999は電源をオフにしても数値を保持しておりますので、使用目的に合わせて変数番号を決めるようにして下さい。
8.未定義変数と変数の引用
システムの状況の取得、そして取得するためにシステムへ情報を渡すための数値をセット(代入)するなど、使用用途が決まっている変数です。
例えば、現在使用している工具径補正番号を取得し、補正値を書き換える場合など、システムの情報を必要とする処理を実行する際に利用します。
この変数は制御機によって番号が異なりますので、お持ちのマニュアルをご参照下さい。
例えば、現在使用している工具径補正番号を取得し、補正値を書き換える場合など、システムの情報を必要とする処理を実行する際に利用します。
この変数は制御機によって番号が異なりますので、お持ちのマニュアルをご参照下さい。
![#2=500;#2変数にのみ500を代入G00X#1Y#2;G00Y500.;と指令したことになります。G00X[#1+50]Y230.; G00X50.Y230.;と指令したことになります。#2=#0;#2変数を空の変数にします。](../../wp-content/themes/joc-responsive/images/macro/hennsuu07.gif)
9.代入する際の小数点の扱い
変数に数値を代入する際、小数点を付けなかった場合は、最後に小数点を付けた数値とみなされます。 但し、オフセット番号などに変数を用いた場合には、小数点が省かれた状態になります。
![#2=500;#2変数にのみ500を代入 G00X#1Y#2;G00Y500.;と指令したことになります。G00X[#1+50]Y230.;G00X50.Y230.;と指令したことになります。#2=#0;#2変数を空の変数にします。](../../wp-content/themes/joc-responsive/images/macro/hennsuu08.gif)
分岐と繰り返し その1
10.分岐と繰り返し その1
Xプログラムの流れ(処理順序)を制御(変更)することができる指令です。 指令には以下の3種類があります。・無条件分岐 ・条件分岐 ・繰り返し※これらの機能はメモリ運転の場合に限り有効です。 もし、DNC運転など外部からデータを取り込みながらの運転では、利用することが出来ません。
- .無条件分岐 「 GOTO n 」(n:シーケンス番号)
GOTOの後に続く番号にシーケンス番号を指令しますと、プログラム内の指令されたシーケンス番号へ無条件にジャンプします。 - 条件分岐 「 IF [ 条件式 ] GOTO n 」 (n:シーケンス番号)
件式が成立した(真)場合、GOTOの後に続く指定されたシーケンス番号へジャンプします。
条件式は以下のとおりです。
演算子意味#1 EQ #2=#1と#2が等しい。#1 NE #2≠#1と#2が等しくない。#1 GT #2>#1が#2より大きい。#1 GE #2≧#1が#2以上。#1 LT #2<#1が#2より小さい。#1 LE #2≦#1が#2以下。※空の変数であるかを判定する場合は、#0変数を利用します。
※ 制御機により IF [条件式] THEN {マクロ文} という指令が使えます。
この場合は条件式が成立した(真)場合、THENに続く後のマクロ文を実行します。
分岐と繰り返し その2
10.分岐と繰り返し その2
3.繰り返し「WHILE [条件式] DO n ・・・ END n 」 (n:WHILE文の識別番号)
条件式が成立している間、DOに続く番号と同じ番号を持つEND 番号の間のプログラムを実行します。 WHILE [条件式] DO n ・・・ END nは、必ずペアで使います。

多重指定も可能ですが、指令文間にまたがるような記述は出来ません。
識別番号は、実行した後であればもう一度、同じ番号が使えます。
※ 識別番号、多重数は制御機により指定できる番号に制限がありますので、お使いの制御機のマニュアルを参照下さい。
条件式が成立している間、DOに続く番号と同じ番号を持つEND 番号の間のプログラムを実行します。 WHILE [条件式] DO n ・・・ END nは、必ずペアで使います。

多重指定も可能ですが、指令文間にまたがるような記述は出来ません。
識別番号は、実行した後であればもう一度、同じ番号が使えます。
※ 識別番号、多重数は制御機により指定できる番号に制限がありますので、お使いの制御機のマニュアルを参照下さい。


演算指令
11.演算指令
変数間で種々の演算を行なうことが出来ます。演算指令は通常の算術式のように記述します。
#i = < 式 >
< 式 >は、定数、変数、関数または、演算子による結合です。
下記にある#j,#k変数の代わりに定数を使用することも出来ます。 また、前述にもありましたが、小数点の無い値は末尾に小数点があるものとみなされます。
演算で注意すべき点は、角度の単位、計算結果の数値の丸め、演算の優先順位などです。また、2引数のATAN演算指令を持つ制御機の場合も制御機により解が異なりますので、注意が必要です。
ATAN演算指令から返される解のチェックを事前にされることをお勧めします。 チェックするにはコモン変数へ解を代入するようにします。
返される解が、-180~180であるか、0~360であるかを調べます。
もし、希望される数値で無かった場合、パラメータで変更できないかを調べ、変更可能であれば変更します。 出来ない場合はNCプログラムに判定する処理を追加し、対応します。
#i = < 式 >
< 式 >は、定数、変数、関数または、演算子による結合です。
下記にある#j,#k変数の代わりに定数を使用することも出来ます。 また、前述にもありましたが、小数点の無い値は末尾に小数点があるものとみなされます。
※1 制御機によって計算結果、記述方法が異なります。
※2 制御機によってこの指令は使えません。
演算で注意すべき点は、角度の単位、計算結果の数値の丸め、演算の優先順位などです。また、2引数のATAN演算指令を持つ制御機の場合も制御機により解が異なりますので、注意が必要です。
ATAN演算指令から返される解のチェックを事前にされることをお勧めします。 チェックするにはコモン変数へ解を代入するようにします。
返される解が、-180~180であるか、0~360であるかを調べます。
もし、希望される数値で無かった場合、パラメータで変更できないかを調べ、変更可能であれば変更します。 出来ない場合はNCプログラムに判定する処理を追加し、対応します。
![例)ATAN指令の返される解のチェックを行う #100=ATAN[-100]/[100] 実行後にコモン変数#100を確認します](../../wp-content/themes/joc-responsive/images/macro/prog8.gif)
演算の種類
演算指令
意味
定義、置換
#i = #j
変数の定義、または置換
加法形演算
#i = #j+#k
#i = #i – #k
#i = #j OR #k
#i = #j XOR #k
#i = #i – #k
#i = #j OR #k
#i = #j XOR #k
加算
減算
論理和(32ビットの各ビット毎)
排他的論理和(32ビットの各ビット毎
減算
論理和(32ビットの各ビット毎)
排他的論理和(32ビットの各ビット毎
乗法形演算
#i = #j * #k
#i = #j / #k
#i = #j AND #k
#i = #j MOD #k
#i = #j / #k
#i = #j AND #k
#i = #j MOD #k
乗算
除算
論理積(32ビットの各ビット毎
余り(#j,#kは整数に丸めてから余りを求めます。
#jが負の場合、#iも負になります。)
除算
論理積(32ビットの各ビット毎
余り(#j,#kは整数に丸めてから余りを求めます。
#jが負の場合、#iも負になります。)
関数
#i = SIN[#j]
#i = COS[#j]
#i = TAN[#j]
#i = ASIN[#j]
#i = ACOS[#j]
#i = ATAN[#j]
#i = ATAN[#j]/[#k]
#i = ATAN[#j,#k]
#i = SQRT[#j]
#i = ABS[#j]
#i = BIN[#j]
#i = BCD[#j]
#i = ROUND[#j]
#i = FIX[#j]
#i = FUP[#j]
#i = LN[#j]
#i = EXP[#j]
#i = POW[#j]
#i = ADP[#j]
#i = COS[#j]
#i = TAN[#j]
#i = ASIN[#j]
#i = ACOS[#j]
#i = ATAN[#j]
#i = ATAN[#j]/[#k]
#i = ATAN[#j,#k]
#i = SQRT[#j]
#i = ABS[#j]
#i = BIN[#j]
#i = BCD[#j]
#i = ROUND[#j]
#i = FIX[#j]
#i = FUP[#j]
#i = LN[#j]
#i = EXP[#j]
#i = POW[#j]
#i = ADP[#j]
正弦(単位:DEG)
余弦(単位:DEG)
正接(単位:DEG
逆正弦
逆余弦
逆正接(1引数)、ATNでも可。※1
逆正接(2引数)、ATNでも可。※2
同上※2
平方根、SQRでも可。
絶対値
BCDからBINARY変換
BINARYからBCD変換
四捨五入、RNDでも可
少数点以下切捨て
小数点以下切上げ
自然対数
e (2.718…)を底とする指数。
べき乗(#jの#k乗)※2
少数点付加※2
余弦(単位:DEG)
正接(単位:DEG
逆正弦
逆余弦
逆正接(1引数)、ATNでも可。※1
逆正接(2引数)、ATNでも可。※2
同上※2
平方根、SQRでも可。
絶対値
BCDからBINARY変換
BINARYからBCD変換
四捨五入、RNDでも可
少数点以下切捨て
小数点以下切上げ
自然対数
e (2.718…)を底とする指数。
べき乗(#jの#k乗)※2
少数点付加※2
マクロ呼び出し
12.マクロ呼び出し
制御機の種類によってGコードが異なる場合がありますが、一部の制御機の除き、命令の種類、フォーマットは殆ど同じです。 以下の呼出し指令があり、指令方法により実行方法が異なります。 またMDIモードからも呼出すことが出来ます。- 単純呼び出し命令(G65)
指令されたブロックのみ有効です。 NC文から呼び出され一度実行し、終了します。 - モーダル呼出し[移動指令呼び出し](G66)
G66からG67の間に移動指令があるブロックに遭遇しますと、実行します。
移動指令では無いブロックでは実行しません。 - モーダル呼出し[毎ブロック呼び出し](G66.1)
G66.1からG67の間の、1ブロックごとに実行します。
G66と違い1ブロックごとに実行します。 - モーダル呼出しキャンセル(G67)
モーダル呼出しマクロモードをキャンセルする際に指令します。
モード中以外にG67を指令しますと、アラームになりますので注意が必要です。 - Gコードマクロ呼び出し
制御機により利用可能Gコード番号は異なりますが、G65P□□□□、G66P□□□□、G66.1P□□□□の変わりにGコードによりマクロ呼出しを指令することができます。
14.マクロの多重呼び出し
呼出されたマクロプログラムから更にマクロプログラムを呼び出すことを多重呼出しと言います。
制御機にもよりますが、マクロの多重呼出しは単純呼び出しとモーダル呼出しを合わせて4重まで、若しくは5重までが一般的です。
多重呼出しは多重度とローカル変数に注意が必要です。
制御機にもよりますが、マクロの多重呼出しは単純呼び出しとモーダル呼出しを合わせて4重まで、若しくは5重までが一般的です。
多重呼出しは多重度とローカル変数に注意が必要です。

14.マクロの多重呼び出し

(この指令を使うにはパラメータの設定が必要です。 パラメータの設定については御使いの制御機のマニュアルを参照下さい。)
この指令ではコードと呼出されるサブプログラム番号が1対1に対応付けられ、Pのプログラム番号の指令は不要です。 但し、殆どの制御きで、マクロ呼出し指令(G65~G67)と異なり、繰り返し指令を使うことが出来ません。
マクロのサンプル
サンプルマクロ
マクロ機能を知っていても、目的が無いとなかなかマクロを作成することがありません。そこで、もっとマクロ機能を身近に感じて頂こうと思い、簡単なマクロサンプルを作成してみました。
※実機での動作確認はしておりますが、機種により仕様がことなりますので、お客様の責任においてご使用下さい。
マクロ機能の説明
4軸の横型マシニングで、ロータリー軸を持っている機械のロータリー軸角度が360度以上であった場合、原点復帰する際にゼロになるまで復帰動作を行います。
この動作を360度以内にまるめる処理をします。(但し、ロータリー軸が近回りの設定にされていない場合に限り有効なマクロです。)
また、引数を指定した場合はロータリー軸の原点復帰も行います。
現在の機械の状態を取得するためにシステム変数を利用します。
この動作を360度以内にまるめる処理をします。(但し、ロータリー軸が近回りの設定にされていない場合に限り有効なマクロです。)
また、引数を指定した場合はロータリー軸の原点復帰も行います。
現在の機械の状態を取得するためにシステム変数を利用します。
内容
FANUC 18i以上では
MATRIX(MC系)では
現在の状態がG90 or G91
#4003
#4203
現在のロータリー軸角度
#5044
#5044
例題ではFANUC 18i以上の場合で説明します。
※ このマクロではロータリー軸をBとしておりますが、機械によってもしくは回転軸によってアドレスがかわりますので、その場合はA、若しくはCなどに変更して下さい。
基本的に4軸目ですので、アドレスはそのままで使用可能だと思います。
アドレスを変更した際は引数も変更した方が分かり易いので、IF [#2 EQ #0]のところの、#2を、アドレスがAであれば#1に、アドレスがCであれば#3に変更して下さい。
今回のマクロではロータリー軸のアドレスを指定しているかのみを判定しておりますので、詳しく判定される場合はさらに判定(IF)命令を使って詳しく判定してみて下さい。
O9010
(RESET ROTARY AX)
#29=#[4000+3]
(現在、G90かG91かをシステム変数から取得)
#110=#[5040+4]
(現在、ロータリー軸のワーク座標系での位置を取得)
#30=#110/360.
(ロータリー軸の角度が何回回転したかを求める)
#30=FIX[#30]
(小数点以下を切り捨てした回転回数にまるめる)
IF[ABS[#30] LT 1]GOTO 999
(1回転以下なら処理をしないで終了)
#111=#110-[#30*360]
(現在の位置を360度以内の角度に換算する)
G90G92B#111
(360度以内の角度になるようにロータリー角度を書替える)
IF[#2 EQ #0]GOTO 901
(マクロを呼出しで引数を指定していない場合は書替えで終了)
G91G28B0
(B0と引数指定していた場合は復帰)
N901
G#29
(書替え処理でG90にしていたので、もとの状態に戻す)
N999
M99
(プログラム復帰)
基本的に4軸目ですので、アドレスはそのままで使用可能だと思います。
アドレスを変更した際は引数も変更した方が分かり易いので、IF [#2 EQ #0]のところの、#2を、アドレスがAであれば#1に、アドレスがCであれば#3に変更して下さい。
今回のマクロではロータリー軸のアドレスを指定しているかのみを判定しておりますので、詳しく判定される場合はさらに判定(IF)命令を使って詳しく判定してみて下さい。
マクロの呼び出し方法
復帰動作をしない場合はG65P9010;
復帰する場合は呼出しの後に、ロータリー軸のアドレスを指定します。
G65P9010B0;
また、マクロをG65Pでは無く、GコードやMコードで呼出すことが出来ます。
例えばGコードで呼出したい場合(G192 、G192B0)
復帰する場合は呼出しの後に、ロータリー軸のアドレスを指定します。
G65P9010B0;
また、マクロをG65Pでは無く、GコードやMコードで呼出すことが出来ます。
例えばGコードで呼出したい場合(G192 、G192B0)
同じくFANUC 18i、30i, 31iの場合で説明します
パラメータ番号の書替えを可能になるようにセッティングパラメータを変更します。
次にGコードでマクロを呼べるようにパラメータ番号を設定します。
パラメータ№6050~6059とプログラム O9010~O9019が適応するようになっており、パラメータには、マクロを呼出すためのGコード番号をセットします。
例えば、G192を指令し、O9010マクロを呼出す場合、パラメータ№6050に192をセットします。
以上の設定により、今回のマクロをG192、若しくはG192B0で指令できるようになりました。
このようにすることで、他メーカーであっても、同じプログラムを使うことが出来るようにすることも可能になります。
パラメータ番号の書替えを可能になるようにセッティングパラメータを変更します。
次にGコードでマクロを呼べるようにパラメータ番号を設定します。
パラメータ№6050~6059とプログラム O9010~O9019が適応するようになっており、パラメータには、マクロを呼出すためのGコード番号をセットします。
例えば、G192を指令し、O9010マクロを呼出す場合、パラメータ№6050に192をセットします。
以上の設定により、今回のマクロをG192、若しくはG192B0で指令できるようになりました。
このようにすることで、他メーカーであっても、同じプログラムを使うことが出来るようにすることも可能になります。

是非、マクロを使ってアイデアを一つの機能にしてみて下さい。 きっと、機械が更に便利だと、感じられると思います。