カスタムマクロでハイデンハインサイクルを作ってみよう!

カスタムマクロでハイデンハインサイクルを作ってみよう!

最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。
忘れられそうなので、5月の連休の空き時間で更新します。
ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデンハインサイクルをマクロ化してみたいと思います。
ハイデンハインサイクルについては、下記で記事にしています。
ご興味あれば、覗いてみてください。

マクロとは?

マクロ言語は、プログラム言語に似ていますが、単独では動作しません。
アプリケーションから呼び出される事で動作できます。
エクセルのマクロを思い浮かべると理解しやすいと思います。
エクセルマクロはかなり複雑な処理をプログラミングできますが、
結局、エクセルを起動しなければ単独では実行できません。
カスタムマクロも同様で単独では動作しません。
ファナック系制御機から呼び出される形で使用されます。

カスタムマクロを使う利点

マクロ言語は、変数や演算、条件判断、分岐など、基本的なプログラム機能を持っています。
したがって、類似形状をパラメータ化して定義できたり、単純な計算をやらせたり
対話的に操作させたりすることができます。
カスタムマクロについては、下記記事で少し書いてあるので、参考にしてください。


ハイデンハインのサイクルも、変数を変更するだけで、穴やポケットの加工が可能になっています。
ファナックの固定サイクルに比べるとはるかに豊富で単純な形状であればCAMなしで切削加工も可能です。
ファナックでもカスタムマクロを駆使すれば、同様のサイクルを作成する事が可能です。
今回は、マクロ作成の一例として、ハイデンハインのドリルサイクルを作ってみようと思います。
では、一番基本的な、「サイクル200」を見てみましょう。
ハイデンハインの変数は、「Q」+「数値」で設定します。

CYCL DEF 200 DRILLING
Q200=2 ;SAFETY CLEARANCE 
Q201=-15 ;DEPTH
Q206=250 ;FEED RATE FOR PLUNGING
Q202=5 ;INFEED DEPTH
Q210=0 ;DWELL TIME AT TOP
Q203=+20 ;SURFACE COORDINATE
Q204=100 ;2ND SAFETY CLEARANCE
Q211=0.1 ;DWELL TIME AT DEPTH

参考図と見比べるとだいたい、わかりますね。

  • Q200=2 ;SAFETY CLEARANCE は、ドリル動作が始まる高さ。ファナックの「R点」
  • Q201=-15 ;DEPTH は、最終加工深さ
  • Q206=250 ;FEED RATE FOR PLUNGING は、加工送りスピード
  • Q202=5 ;INFEED DEPTH は、一回の切込み量。ファナックでは「Q5.0」
  • Q210=0 ;DWELL TIME AT TOP は、サイクルに入る前のドウェル時間みたいです。
    固定サイクルにはない機能です
  • Q203=+20 ;SURFACE COORDINATE は、穴の上面座標です。段差がある場合に有効です。
  • Q204=100 ;2ND SAFETY CLEARANCE は、次の穴への移動高さ。ファナックでは「イニシャル点」
  • Q211=0.1 ;DWELL TIME AT DEPTH は、穴加工底面でのドウェル。ファナックでは「G82」の機能

ファナックの、G81、G82、G83 が合体したようなサイクルですね。
基本的には、G83に近いですが、Q201とQ202を同じ値にすれば、G81になりますし、
Q211を設定すればG82です。
ただし、G82の場合注意が必要です。
ハイデンハインでは「秒」で指定しますが、「G82」は一般的には「ミリ秒」単位です。
小数点指示も受け付ける機種もあると思いますが、今回は「ミリ秒」指示で小数点なしにしたいのですが変数を演算させた場合どうなるのか?
わかりません、実機での確認が必要です。
したがって、ハイデンハインサイクルを移植する場合では、Q211 の値を×1000する事になります。
Q200(SAFETY CLEARANCE)とQ204(2ND SAFETY CLEARANCE)も
ファナックのR点とイニシャル点を指定する場合の基準高さが違います。
ハイデンハインは、Q203(SURFACE COORDINATE)が基準になりますが
ファナックは、ワーク座標系のZ原点が基準になります。
Q210は、固定サイクルにはない項目なので、固定サイクルに入る直前にドウェル指令を追加する感じでしょうか・・

カスタムマクロで変数化

カスタムマクロの変数は、「#」+「数値」で設定しますが、変数には数値の範囲により、
「ローカル変数」「コモン変数」「システム変数」など種類があるので注意が必要です。
今回は、#1~#33の「ローカル変数」を使用ししょうと思います。
また、サイクル機能以外に、ワーク座標系番号と工具番号、回転数なども追加しようと思います。

条件判断

ハイデンハインサイクルと固定サイクルでは、設定変数が一対一ではないので、設定値によって条件判断が必要になるので、事前に整理してみます。

  • Q204はQ200と等しいかそれ以上とする
  • Q204とQ200が等しい場合は、「G99」、Q204が大きい場合には、その値をイニシャル点として「G98」モード
  • Q202がQ201以上でQ211が「0」の場合は、「G81」
  • Q202がQ201以上でQ211が「0」より大きい場合は、「G82」
  • Q202がQ201より小さくて、Q211が「0」の場合は、「G83」
  • Q202がQ201より小さくて、Q211が「0」より大きい場合には、どうしよう?
    「G81」と「G82」の二工程にするか?

こんな感じで、条件判断させてみましょう。

条件分岐

条件分岐は、「IF」{条件式}「GOTO」{シーケンス番号}で{条件式}が「真」の場合、指定{シーケンス番号}へジャンプします。
ジャンプではなく、変数処理をさせる事もできます。
「IF」{条件式}「THEN」{処理}
この場合は、{条件式}が「真」の場合、変数への代入や計算をさせる事ができます。

条件式

条件式では、一般的な記号での比較演算子が使えないので、ちょっと取りつきにくいです。
下記の「EQ」「NE」「GT」「GE」「LT」「LE」の演算子を使用します

EQequal to左辺と右辺が等しい
NEnot equal to左辺と右辺が等しくない
GTgreater than左辺が右辺より大きい
GEgreater than or equal to左辺が右辺以上
LTless than左辺が右辺より小さい
LEless than or equal to左辺が右辺以下

変数定義

(+++++++++++++++++++)
#1 = 54. (Work coordinate)
#2 = 1. (T Number)
#3 = #2 (H Number)
#4 = 3200. (SP)
(+++++++++++++++++++)
(CYCL DEF 200 DRILLING)
#10 = 7.0 (Q200 SAFETY CLEARANCE) 
#11 = -20.0 (Q201 DEPTH)
#12 = 350.0 (Q206 FEED RATE FOR PLUNGING)
#13 = 3.0 (Q202 INFEED DEPTH)
#14 = 10.0 (Q210 DWELL TIME AT TOP)
#15 = -2.0 (Q203 SURFACE COORDINATE)
#16 = 52.0 (Q204 2ND SAFETY CLEARANCE)
#17 = 1.0 (Q211 DWELL TIME AT DEPTH)
(+++++++++++++++++++)
#10 = #10 + #15
#16 = #16 + #15
#18 = FIX[#17*1000] ( It may be no good)
(+++++++++++++++++++)
#20 = 98. (G98 OR G99)
#21 = 80. (CYCLE)
(+++++++++++++++++++)

こんな感じでしょうか?
ハイデンハインのQパラメータをそのまま、#変数と置き換えました。
R点(#10)とイニシャル点(#16)もZ原点からの指示に変更しています。
#18は「秒」を「ミリ秒」に変換していますが、この方法ではダメかもしれません。
記憶では、「P」に小数点で「秒指令」できる機種もありますが、
小数点が入るとエラーになる制御機もあったような・・・?
FIX 関数を使ってみましたが、これで正解なのかは??です。
たぶん、#18は小数点が入ってしまいそうです。
演算はやめて、直接「#18=2000」などどしたほうが、いいかもしれません。

コメントは、ファナックの場合、漢字が使用できない場合が多いので、英数文字にしました
ソディック機は漢字が使えるのですけどね~

条件設定

上記で検討した、条件をマクロ化してみましょう。

Q204はQ200と等しいかそれ以上とする
IF [#16 LT #10] THEN #16=#10

Q204とQ200が等しい場合は、「G99」
IF [#16 EQ #10] THEN #20=99.
Q204が大きい場合には、その値をイニシャル点として「G98」
IF [#16 GT #10] THEN #20=98.

Q202がQ201以上でQ211が「0」の場合には、「G81」
IF [[#13 GE #11]AND[#17EQ0]] THEN #21=81.

Q202がQ201以上でQ211が「0」より大きい場合には、「G82」
IF [[#13 GE #11]AND[#17GT0]] THEN #21=82.

Q202がQ201より小さくて、Q211が「0」の場合は、「G83」
IF [[#13 GE #11]AND[#17EQ0]] THEN #21=83.

Q202がQ201より小さくて、Q211が「0」より大きい場合にはどうするか?
苦肉の策で、「8382」とし、「G83」後、「G82」もやらせましょう。
IF [[#13 LT #11]AND[#17GT0]] THEN #21=8382.

こんな感じかな?!
固定サイクル「G81」「G82」「G83」の切り替えは、「#21」の数値により
条件ジャンプさせようと思います。
それから、固定サイクルは、定義した行の位置座標でサイクル加工を始めてしまいます。
X、Y軸はモーダルなので、指定しなくてもその場所で加工します。
加工させないで、固定サイクルの定義のみしたい場合には、「L」の繰り返し指令を利用し
繰り返しなしの意味で「L0」を指令します。
ただし、この「L」は制御機によって「K」の場合があります。
OKKの制御機は「K」だったように記憶していますが、お使いの制御機に合わせてください。

マクロ化

%
O1000
(CYCL DEF 200 DRILLING MACRO BY Kazuban)
(+++++++++++++++++++)
#1 = 54. (Work coordinate)
#2 = 1. (T Number)
#3 = #2 (H Number)
#4 = 3200. (SP)
(+++++++++++++++++++)
#10 = 7.0 (Q200 SAFETY CLEARANCE) 
#11 = -20.0 (Q201 DEPTH)
#12 = 350.0 (Q206 FEED RATE FOR PLUNGING)
#13 = 3.0 (Q202 INFEED DEPTH)
#14 = 10.0 (Q210 DWELL TIME AT TOP)
#15 = -2.0 (Q203 SURFACE COORDINATE)
#16 = 52.0 (Q204 2ND SAFETY CLEARANCE)
#17 = 1.0 (Q211 DWELL TIME AT DEPTH)
(+++++++++++++++++++)
#10 = #10 + #15
#16 = #16 + #15
#18 = FIX[#17*1000]
(+++++++++++++++++++)
#20 = 98. (G98 OR G99)
#21 = 80. (CYCLE)
(+++++++++++++++++++)
IF [#16 LT #10] THEN #16=#10
IF [#16 EQ #10] THEN #20=99.
IF [#16 GT #10] THEN #20=98.
IF [[#13 GE #11]AND[#17EQ0]] THEN #21=81.
IF [[#13 GE #11]AND[#17GT0]] THEN #21=82.
IF [[#13 GE #11]AND[#17EQ0]] THEN #21=83.
IF [[#13 LT #11]AND[#17GT0]] THEN #21=8182.
(++++++++++++++++++++)
(++++++++++++++++++++)
G90G00G17G40G80G49
G#1
N0001
T#2
M06
G90G00X0Y0
G43Z#16H#3
M00
(Check Start Point)
S#4M03
G04X#14
IF [#21 EQ 81] GOTO 0001
IF [#21 EQ 82] GOTO 0002
IF [#21 EQ 83] GOTO 0003
IF [#21 EQ 8382] GOTO 0003
(++++++++++++++++++++)
N0001(G81)
G#20 G81 Z#11 R#10 F#11 L0 (L may be K.)
GOTO 100
(++++++++++++++++++++)
N0002(G82)
#21 = 82
G#20 G82 Z#11 R#10 P#18 F#11 L0 (L may be K.)
GOTO 100
(++++++++++++++++++++)
N0003(G83)
G#20 G83 Z#11 R#10 Q#10 F#11 L0 (L may be K.)
GOTO 100
(++++++++++++++++++++)
N100
X-40.Y15.
X-60.Y15.
X-60.Y-15.
X-40.Y-15.
G80
Z#16
IF [#21 EQ 8382] GOTO 0002
GOTO 9999
(++++++++++++++++++++)
N9999
M09
M05
G91G28Z0
G91G49Z0
G90M05
M30
%

完成

こんな感じで作ってみましたが、機械を触れる環境でないので、まったく検証してません。
もし、実際の加工で使用する場合には、十分確認をお願いします。
また、どなたか、検証していただければ、助かります。
カスタムマクロ作成の参考になれば幸いです。

NCカテゴリの最新記事

%d人のブロガーが「いいね」をつけました。