カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。

カスタムマクロ

前回、カスタムマクロプログラムの例として、ハイデンハインサイクルをマクロ化する例を紹介しました。

ハイデンハインサイクルに比べると、ファナック固定サイクルの機能は非常に貧弱ですが、
カスタムマクロを自作する事で、無限に拡張する事が可能です。
今回は、カスタムマクロのモーダル呼び出し「G66」を利用して、穴を面取りするサイクルを作成してみようと思います。

G66:マクロモーダル呼び出し

固定サイクルを呼び出すには、「G83 R5.0 Q2.0」のように引数により値を渡す事ができます。
単純なサブプログラム呼び出し「M98」は、引数により値を渡す事はできません。
しかしマクロ呼び出しは引数を渡す事ができますから、固定サイクルが自作できます。
マクロ呼び出しには「G65」という一行のみの単純呼び出し指令もありますが、
「G66」を使用すると、定義したサイクルを「X」「Y」座標指示のみで、モーダルで動作させる固定サイクル的な機能を実現できます。

G66 P1234 A10.2 B5.0 C3.56
X0 Y10.0
X10.0 Y25.6
X-20.3 Y-56.2
G67

この例のように、「G67」でキャンセルされるまで、指定座標で「G66」の呼び出しを実行する事ができます。

引数と変数

カスタムマクロでプログラミングする時に厄介なのが、変数です。
カスタムマクロの変数は「#」+「数値」で定義しますが、識別は「数値」のみなので、
他のプログラム言語に比べると後で読み返した時に、非常に分かりづらいです。
さらに、変数の種類は「ローカル」や「コモン」「システム」などありますが
その種類も「数値」の範囲を意識する必要もあります。
さらにさらにです、カスタムマクロに引数を渡す場合には、「#」ではなく、
「アルファベット」+「数値」で渡します。
例えば、「A10.5」と指令した場合には、マクロ内では、「#1=10.5」と扱われます。
なんとも、分かりづらい仕様です。
さらにさらにさらに、渡された、この「アルファベット」の引き数値と「#」変数番号が連続でなく、制限があったりします。
ほんと、他人が作成したマクロや、昔作ったマクロなど、解読するのに苦労します。
もしかすると、ユーザーに簡単に使用させないための、言語仕様かもしれませんね~。

引数

カスタムマクロの引き数は、「アルファベット」+「数値」で指令しますが、その指令方法には2種類あります。
1・「G」「L」「N」「O」「P」以外のアルファベット

A:#1 B:#2 C:#3 D:#7 E:#8 F:#9 H:#11 I:#4 J:#5 K:#6  M:#13
Q:#17 R:#18 S:#19 T:#20 U:#21 V:#22 W:#23 X:#24 Y:#25 Z:#26

2・「A」「B」「C」と「I」「J」「K」の多重指令

A:#1 B:#2 C:#3 I:#4 J:#5 K:#6 I:#7 J:#8 K:#9 I:#10 J:#11 K:#12 ~  K:#33

1.は、マクロを使う立場からは、21種類のアルファベットを使えるので、識別しやすいと思いますが、アルファベットに対応する「#」番号が連続していないので、作る立場からは面倒です。
2.は、「#」番号は連続しますが、「I」「J」「K」が連続するので、使用する側からは間違いやすいかもしれません。

ここでは、1.の方法で作成したいと思います。

面取りの動作をマクロ化

真円をGコード化

まずは、Φ20真円輪郭をGコード化してみます。
分かりやすいように、G90(絶対座標系)モードで作成します。

G90G00G17
G00X0Y0Z30.
G00Z5.
G01Z-10.F500
G01X10.
G03X-10.I-10.
G03X10.I10.
G01X0
G00Z30.

こんな感じでしょうか?進入Rは省略しています。
円の定義は1行で定義可能ですが、一定義で一周させると、昔うまく処理できない制御機や
CAMがあったので、2分割しています。

G91(相対座標系)に変換

今回は自作固定サイクルを目指していますが、通常固定サイクルは
・サイクル動作の定義
・加工位置指令で、その位置へ移動しサイクル加工
・サイクル動作のキャンセル
こんな動作ですね。
このように、位置決めした後、同じ動作をさせたい場合には、「G91」が便利です。
G91に関してはこちらでも紹介してあるので、興味ある方は参考にしてください

G90をG91に変換するには、上記またはフリーソフト紹介ページでも公開している、
変換ソフトを利用して変換する事ができます。

G90G00G17
G00X0Y0Z30.
G91
G00Z-25.000
G01Z-15.000F500
G01X10.000
G03X-20.000I-10.
G03X20.000I10.
G01X-10.000
G00Z40.000

変換させると、こんなコードにしてくれました。
3行目からG91モードで指令しているので、2行目「G00X0Y0Z30.」の
X,Y座標を変更すれば、任意位置で円加工できます。

マクロ化

では、マクロ化してみましょう。
変換された「G91」プログラムは、若干手直しします。
そのままでも使用できますが、ポイントは、Z方向だけは「G90」にしようと思います。
加工動作は、位置決め後「G91」にしますが、Z方向のみの指令は、退避位置やR点など、
「G90」のほうが分かりやすいです。
上の例では、加工Zまで下りるコードと、最後の「G00Z40.000」は「G91」モードでの指令値ですが、
「G90G00Z30.000」の方が分かりやすいと思います。

(+++++++++++++++++++)
#1=20     (DIA)
#2=[#1/2] (R)
#3=30.0   (Initial Point)
#4=5.0    (R Point)
#5=-10.0  (Z)
#6=500    (F)
(+++++++++++++++++++)
G90G00G17
Z[#3] 
Z[#4] 
G01Z[#5]F#6
G91X[#2]
G03X-[#1]I-[#2]J0. 
X[#1]I[#2]J0.
G01X-[#2] 
G90G00Z[#3] 

このようにしてみました。
変数化したので、上部の「#1」~「#6」の数値を変更する事で、加工径や条件を変更する事ができます。
これは、この変数を変更する仕様として、通常のNCプログラム的に使用する事も可能ですが、マクロ化する事で固定サイクルのように、引数で呼び出す事ができるようになります。

ここで使用する変数を確認すると、「#1」~「#6」を使用しています。
このマクロを「G66」で呼び出すには、上記のルールにより、引数アドレスと
「#」番号を確認する必要があります。

A=#1 B=#2 C=#3 I=#4 J=#5 K=#6  

ですね。
マクロファイルは、上記プログラムの変数定義以下の部分(9行目以降)を、
「O番号」を付け、「M99」で終了させるNCファイルを作成します。
このマクロファイルを、「O6000」とした場合、上の定義で呼び出す指令は
「G66 P6000 A20. C30.0 I5.0 J-10.0 K500.」となります。

面取りをプログラム化

これで、円動作させる事はできましたが、狙いの面取りをさせるためには、
使用工具径や面取り量、オフセット量などから、加工径や深さを求める必要があります。
動作は単純な円加工ですが、円要素を求めるのは意外と面倒です。
電卓で加工径を求めて、「#1=」で設定してもいいですが、せっかくなので、
工具径と加工穴径と面取り量から、自動計算させましょう。

今回の面取りは、45°のみを想定しています。
工具も45°の円錐工具を使用します。
加工動作の円弧径は、工具径補正を使用しない場合、工具(主軸)中心になります。
したがって、「加工半径=穴半径ー(工具半径+オフセット量)」になります。
加工深さは、「面取り量+オフセット量」ですね。

これを考慮すると、上記のマクロ変数に「面取り量」「オフセット」「工具径」「穴径」を追加する事になります。
「加工径」と「加工深さ」は自動計算させましょう。
ついでに、加工面深さも追加して、マクロを作成してみました。

%
O6000
( Chamfering Macro Ver1.0 By kazuban ) 
(+++++++++++++++++++)
#1=[#8/2-[#6+#7/2]] (circle radius)
(+++++++++++++++++++)
(B:#2 : Surface Coordinat) 
(C:#3 : Initial Point) 
(I:#4 : R Point) 
(J:#5 : Chamfer) 
(K:#6 : Offset)
(D:#7 : Tool Dia)
(E:#8 : Hole Dia)
(F:#9 : Feed)
(+++++++++++++++++++)
G90G00G17
Z[#2+#3] 
Z[#2+#4] 
G01Z[#2-[#6+#5]]F[#9] 
G91X[#1]
G03X-[#1*2]I-[#1]J0. 
X[#1*2]I[#1]J0.
G01X-[#1] 
G90G00Z[#2+#3] 
M99
%

こんなマクロプログラムになりました。
これを呼び出すには、「G66」と共に「P」+「O番号」「引数」を付加して呼び出します。
続いて、加工位置を追加して、最後に「G67」で終了です。

G66 P6000 B0.0 C30.0 I5.0 J2.0 K1.0 D0.5 E12.0 F200
X10.0 Y12.0
X-10.0 Y-10.0
G67

メインプロ作成

次に、実際の加工に使用できるように、工具交換や加工条件などを定義できるメインププログラムを作成します。
このメインプロから、ここまでで作ってきた、面取りマクロプログラムを呼び出すようにします。

変数化

やはり汎用化を考えて、メインプロも変数化しましょう!
パラメータは、「ワーク座標系」「工具番号」「回転数」など実際の加工に必要な項目をプログラム上部にまとめます。
使用者はこの項目だけの変更で、加工できるようになるので便利です。

(++++++++++++++++++++) 
#1=54 (WORK ORIGIN)
#2=10 (Tool Number)
#3=#2 (H Number)
#4=0.5(Tool Diameter)
#5=2300 (Spindle Speed)
#6=200 (Feed)
#7=8 (Coolant)
#8=0.0(Surface Coordinat)
#9=50.0 (Initial Point) 
#10=5.0 (R Point)
(++++++++++++++++++++) 
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++) 
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++) 

メイン内変数とマクロ内変数

上記のように、必要な項目を変数化してみましたが、ここで定義した変数番号「#番号」とマクロ内で定義している変数番号「#番号」は数値的には同じでも、違うものとして扱われますから注意が必要です。
ただ、逆に同じに扱われるとかなり面倒で、変数の値が他のマクロで変更されていまう事も起こってしまいますね。
ほとんどのプログラミング言語に、ローカル変数とグローバル変数がありますが、
よく理解して使い分けしないと思わぬミスにつながります。
一塊のプログラム内だけでリセットされる、ローカル変数のほうがトラブルは少ないです。

メインプロからマクロを呼び出す場合、マクロで使われている変数番号と引数のアドレスを把握し、
メインにおいてその要素を示す変数番号をマクロ引数に渡します。
なんだか、よくわからない説明になってしまいましたが、例えば上記の例で
メインで定義している「Initial Point」は「#9=50.0」です。
マクロで使用する「Initial Point」は「#3 」です。
そうして、引数で渡す「#3」は「C」アドレスですから、「C#9」を渡します。
分かりづらいので、整理してみると

    マクロ変数            メイン変数
(B:#2:SurfaceCoordinat)  ←  #8
(C:#3:InitialPoint)      ←  #9
(I:#4:RPoint)             ←  #10
(J:#5:Chamfer)           ←  #12
(K:#6:Offset)             ←  #13
(D:#7:ToolDia)           ←  #4
(E:#8:HoleDia)           ←  #11
(F:#9:Feed)               ←  #6

具体的なマクロ呼び出し指令は、マクロの「O番号」をたとえば「O6000」とすると

G66 P6000 B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]

となります。

穴座標位置ファイル

マクロ呼び出しの次は、穴位置のX,Yの列挙になりすが、この穴位置指令もサブプログラムとして別のファイルにする事ができます。

%
O6100
( Hole Position )
X-35.Y55.
X-50.Y55.
X10.Y10. 
M99
%

この位置ファイルは、今回作成中のマクロだけでなく、通常の固定サイクルにも使用できるので
同じ位置で複数の加工を行う場合には、非常に便利です。
タップ加工をイメージしてください、
センター穴 ⇒ 下穴加工 ⇒ 面取り ⇒ タップ となりますが
この一連の工程をメインプロから固定サイクルやマクロで呼び出すように作成しておけば
穴座標ファイルは一つのみの編集で、大きさの違う同等の加工が可能になります。
M6用、M8用、M10用、M12用 などのように、用意しておくと便利だと思います。

( CENTER DRILL )
・
・
G98 G81 Z-1.0 R5.0 F100 L0(K0)
M98P6100
G80
・
・
( DRILL )
・
・
G98 G83 Z-20.0 R5.0 Q3.0 F200 L0(K0)
M98P6100
G80 
・
・
( CHAMFER  )
・
G66 P6000 B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]
M98P6100
G67
・
・
( TAP )
・
・
S100
G98 G84 Z-15.0 R5.0 Q2.5 F125 L0(K0)
M98P6100
G80 
・
・
M30

G66 モーダル呼び出し メインプロ

上記で作成した、マクロを呼び出すメインプロを作成してみました。
マクロと位置座標ファイルの番号も変数化しています。

%
O1000
( Chamfering Program Ver1.0 By kazuban ) 
G90G00G17G40G80G49 
(++++++++++++++++++++) 
#1=54 (WORK ORIGIN)
#2=10 (Tool Number)
#3=#2 (H Number)
#4=0.5(Tool Diameter)
#5=2300 (Spindle Speed)
#6=200 (Feed)
#7=8 (Coolant)
#8=0.0(Surface Coordinat)
#9=50.0 (Initial Point) 
#10=5.0 (R Point)
(++++++++++++++++++++) 
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++) 
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++) 
N0001
G#1
T#2
M06
G90G00X0Y0 
(G43Z#8H#3)
G43Z[#8+#9]H#3
( Chamfer Process )
S#5M03 
M#7
(----------------------------)
(B:#2=#8 : Surface Coordinat) 
(C:#3=#9 : Initial Point) 
(I:#4=#10 : R Point) 
(J:#5=#12 : Chamfer) 
(K:#6=#13 : Offset)
(D:#7=#4 : Tool Dia)
(E:#8=#11 : Hole Dia)
(F:#9=#6 : Feed)
(++++++++++++++++++++) 
G66 P[#30] B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]
M98P[#31]
G67
(G90G00Z#9)
G90G00Z[#8+#9]
M09
M05
G91G28Z0 
G91G49Z0 
G90M05 
( End of Process )
M30
%

まとめ

固定サイクル的な機能を自作する方法を説明しました。
こちらから、ダウンロードできます。
一例として、穴面取り用のマクロを作成しましたが、机上で検討したのみで
実機での検証・確認はやっておりません
もし、実際に使用する場合には、十分な確認をお願いします。
また、不具合、気になる点などありましたら、コメントいただけるとたすかります。

コメント

  1. ZENKYU より:

    かずばんさん、こんにちは。

    T#2
    M06
    G90G00X0Y0
    G43Z#8H#3

    と工具長補正をかけて Z#8 に降りていますが、これは怖いです(^_^;;)
    G43Z#9H#3 か、マクロの中みたいにするなら
    G43Z[#8+#9]H#3 ですかね。

    加工終了後の高さもですが。

    現在自由に機械を使える状態にないので、シミュレーションソフトで検証してみました。

    • kazuban kazuban より:

      ZENKYUさん、ご指摘ありがとうございました。
      確かに、これは危なかったですね~
      G43Z[#8+#9]H#3
      に修正しました。

      私も機械に触れる環境にないので、マクロは確認ができません
      シミュレーションソフトがほしいな~
      作れるもんなら作りたいけど、どえらい大変ですね!

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