最近は、CAMの充実もあって、カスタムマクロの利用もかなり減少しいていると思います。
ただ、穴などの基本的な加工の場合、座標値入力だけで加工できるのでうまく使えば、かなり重宝します。
マシニングセンターを、操作フライス盤的な使い方で利用する事もできます。
カスタムマクロの欠点
Google で「カスタムマクロ欠点」で検索してみると、下記のAi概要が最上部に表示されました
話は変わりますが、最近では通常検索でもAi回答が出てくるようになりましたね。
AI による概要
カスタムマクロは、NCプログラムの効率化や自動化に役立つ一方で、いくつかの欠点も存在します。主な欠点としては、プログラミングの難易度、デバッグの複雑さ、互換性の問題、そして過度な依存によるリスクなどが挙げられます。
カスタムマクロの欠点
- プログラミングの難易度:カスタムマクロは、通常のNCプログラムよりも複雑なロジックを記述する必要があるため、習得に時間がかかり、プログラミングの難易度が高いです。特に、条件分岐やループ処理を多用する場合、複雑さが増し、エラーが発生しやすくなります。
- デバッグの複雑さ:カスタムマクロのデバッグは、通常のNCプログラムよりも難易度が高いです。変数の値の変化や処理の流れを追跡するのが難しく、エラーの原因特定に時間がかかることがあります。また、マクロプログラムが複雑になるほど、デバッグ作業はさらに困難になります。
- 互換性の問題:カスタムマクロは、使用するNC工作機械や制御装置の種類によって、互換性の問題が発生する可能性があります。同じマクロプログラムでも、機械が異なると正しく動作しない場合や、エラーが発生する場合があります。そのため、マクロプログラムを作成する際には、互換性を考慮する必要があります。
- 過度な依存によるリスク:カスタムマクロに過度に依存すると、マクロプログラムの変更や修正が必要になった場合に、他の作業に影響が出たり、生産性が低下する可能性があります。また、マクロプログラムの作成者が不在になった場合、保守や管理が困難になるというリスクもあります。
その他の考慮事項
- マクロプログラムの可読性:カスタムマクロは、可読性の高い書き方を心がける必要があります。コメントを適切に記述し、変数名や処理の流れを分かりやすくすることで、他の人がマクロプログラムを理解しやすくなります。
- マクロプログラムのバージョン管理:カスタムマクロは、バージョン管理を行うことで、変更履歴を把握し、必要に応じて以前のバージョンに戻すことができます。
- マクロプログラムのテスト:カスタムマクロは、実際に機械を動かす前に、シミュレーション環境などで十分にテストを行う必要があります。これにより、エラーの発生を未然に防ぎ、安全に運用することができます。
これらの欠点や考慮事項を踏まえ、カスタムマクロの導入を検討する必要があります。
なるほど・・ここのサイトでもいくつか取り上げていますが、まさに同意見です。
プログラミングの難易度
マクロは数多く作成してきましたが
機械の制御器に処理させる言語になるので、どうしても、一般的なプログラミング言語と比較すると、中途半端で可読性は悪くなってしまします。
ちなみに、レダース(Roeders)機は、独自開発されたプログラミング言語ライクな言語です。
加工動作のGコードのサブプロ部分と、その動作部分を管理するメインプロ部分を分離する事を基本で開発されているように感じています。
特にWindowsソフトウェアとして開発された言語なので、自動化や多数個など、複雑なメインプロを開発する場合でもかなり楽です。
デバッグの複雑さ
このサイトでも、何度か書いていますが、一番は変数の制限が可読性を悪くしているように思います。
筆者は通常のGコードだけであれば、TRYCUT と言うシミュレーションソフトを使っていますが、TRYCUTにはマクロ展開機能が付いていません。
シミュレートできないので、マクロのデバッグはエディタやプリントアウトして目視で追っかけ確認ますがかなかな面倒で、リスクもあります。
社内設備機械で、一台だけマクロも含めたシミュレート機能がある制御器があるので、確認のためだけに、その機械を起動させる場合もあります。
大人しく、マクロ機能付きのシミュレータを購入したら・・・の意見もあると思いますが、マクロ利用頻度から検討すると、どうしても費用対効果の面で無理があります。
そうだ、Aiに展開してもらおう!
前回、Fusion python API を、Aiに教わったらすごかった・・を記事にしました
Fusion API は、一般的なpython言語構文やライブラリだけでなく、独自のオブジェクトを絡み合わせて開発していくので、そのパッケージの理解だけでも大変です。
それを、Aiに聞いたら、サンプルコードを出してくれたり、自作したコードを添削してくれたりと、驚きでした。
そこで上の記事を書いてたら、ピ~ンときました。
「そうだ、Fusion APIのパッケージを瞬時に解読できるなら、カスタムマクロなら簡単に解読してくれるかも!」
課題データ
課題NCデータは、以前記事にした、下記ページのデータをそのまま使ってみようと思います
穴の面取りを輪郭加工で行うマクロです。
メインプロ「O1000」に加工条件や面取り条件を変数で定義して、G66モーダル呼び出しで「O6000」の面取り加工マクロを呼び出し、指定位置「O6100」で面取りを行うプログラムです
若干変数での計算式もあります。
こちらのファナックマクロを展開してください
%
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[#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[#8+#9]
M09
M05
G91G28Z0
G91G49Z0
G90M05
( End of Process )
M30
%
%
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
%
%
O6100
( Hole Position )
X-35.Y55.
X-50.Y55.
X10.Y10.
M99
%
このデータをそのまま、「Gemini 2.5 Flash」に突っ込んで、展開をお願いしてみました。
Aiの回答
G66仕様で、G66への変数渡しが「#変数」そのままでないので、作者が見直す時も結構面倒ですが、Aiは瞬時に分析してくれました。
提供されたFANUCマクロプログラムを解析し、その内容を以下に解説します。
プログラム全体の概要
このマクロは、複数の穴の面取り加工を自動化するために設計されています。主プログラム (
O1000
) で加工条件を設定し、マクロプログラム (O6000
) で実際の面取り動作を実行、そしてもう一つのプログラム (O6100
) で穴の位置情報を呼び出す、という構成になっています。O1000: 主プログラム
このプログラムは、加工に必要な初期設定と、マクロ呼び出しを行います。
- 初期設定:
#1=54 (WORK ORIGIN)
: ワーク原点の位置を#1
に設定。#2=10 (Tool Number)
: 工具番号を#2
に設定。#4=0.5(Tool Diameter)
: 工具径を#4
に設定。#5=2300 (Spindle Speed)
: 主軸回転速度を#5
に設定。#6=200 (Feed)
: 送り速度を#6
に設定。#11=12.0 (Hole Diameter)
: 穴の直径を#11
に設定。#12=1.0 (Chamfer)
: 面取り量を#12
に設定。#13=0.5 (Offset)
: 工具のオフセット量を#13
に設定。- マクロ呼び出し:
G66 P[#30] ...
: ここで、面取りマクロプログラムO6000
(#30
)を呼び出しています。B[#8] C[#9]...
: マクロに渡す引数を設定しています。
B[#8]
: 面取り加工の開始基準となるワーク表面座標。C[#9]
: 加工前の待機位置である初期点。I[#10]
: 加工開始前の退避点(R点)。J[#12]
: 面取り量。K[#13]
: オフセット量。D[#4]
: 工具径。E[#11]
: 穴径。F[#6]
: 送り速度。M98 P[#31]
: 穴の位置情報を記述したプログラムO6100
(#31
)を呼び出します。これにより、O6100
に記述された各座標で、G66
で指定されたマクロが繰り返して実行されます。O6000: 面取りマクロプログラム
このプログラムは、
O1000
から渡された情報をもとに、実際の面取り加工を行います。
- 面取り加工の半径計算:
#1=[#8/2-[#6+#7/2]]
: この式は、面取り加工を行う円弧の半径を計算しています。
#8/2
: 穴の半径。#6
: 面取り量。#7/2
: 工具の半径。- 結果: 面取り加工する円弧の半径 = (穴の半径) – (面取り量) – (工具の半径)
- 加工シーケンス:
G90G00G17
: 絶対指令、早送り、XY平面選択。Z[#2+#3]
、Z[#2+#4]
: Z軸を初期点、R点へと移動。G01Z[#2-[#6+#5]]F[#9]
: Z軸を面取り深さまで切り込みながら移動します。G91X[#1]
: ワーク座標を基準に、計算された半径分だけX軸を移動。円弧加工の開始位置に移動します。G03X-[#1*2]I-[#1]J0.
: 半径#1
の円弧で、左回りに180度円弧切削。X[#1*2]I[#1]J0.
: さらに、半径#1
の円弧で、左回りに180度円弧切削。これにより、1周分の面取り加工が完了します。G01X-[#1]
: 円弧加工の開始位置から中心に戻ります。G90G00Z[#2+#3]
: Z軸を初期点に戻します。M99
: マクロプログラムの終了。主プログラム(O1000
)に戻ります。O6100: 穴位置プログラム
このプログラムは、加工する穴のXY座標をリストアップしています。
X-35.Y55.
: 1つ目の穴の座標。X-50.Y55.
: 2つ目の穴の座標。X10.Y10.
: 3つ目の穴の座標。これらの座標は、
O1000
のM98 P[#31]
によって順番に読み込まれ、それぞれの位置でO6000
の面取り加工が実行されます。
まとめ
このプログラムは、以下のような処理フローで動作します。
- 主プログラム
O1000
がスタートします。- 工具交換、初期位置決め、主軸回転、クーラントONなど、準備が完了します。
O6100
に記述された最初の座標(X-35.Y55.)に移動します。G66
によってO6000
の面取りマクロが呼び出されます。- マクロ内で計算されたパスで、面取り加工が行われます。
- 面取り加工が完了すると、
O1000
に戻ります。O6100
の次の座標(X-50.Y55.)に移動します。- 再び
O6000
が呼び出され、面取り加工が行われます。- この繰り返し処理が
O6100
の最後まで行われます。- 全ての加工が終了すると、クーラントOFF、主軸停止、安全位置への退避が行われ、プログラムが終了します。
この構成は、複数の同じ形状の加工を効率的に行うための、NCプログラミングの典型的な手法です。プログラムを分割することで、位置情報や加工条件の変更が容易になります。
丁寧な解説ですが、加工シーケンス:4.の「ワーク座標を基準」と言うのがちょっと間違っていますね・・
無料版だからでしょうか?
でも、きちんとGコードに展開してくれれば、問題ないですから
再度、一般的なGコードへの展開をお願いすると・・・
%
O1000_EXPANDED
( Chamfering Program Expanded Version )G90 G00 G17 G40 G80 G49
( Tool and Spindle Setup )
T10 M06
G90 G00 X0 Y0
G43 Z[0.0+50.0] H10
S2300 M03
M08( — Hole 1 at X-35. Y55. — )
G90 G00 X-35. Y55.
G00 Z[0.0+50.0]
G00 Z[0.0+5.0]
G01 Z[0.0-[1.0+0.5]] F200
G91 X[12.0/2-[1.0+0.5/2]]
G03 X-[[12.0/2-[1.0+0.5/2]]2] I-[12.0/2-[1.0+0.5/2]] J0. X[[12.0/2-[1.0+0.5/2]]2] I[12.0/2-[1.0+0.5/2]] J0.
G01 X-[12.0/2-[1.0+0.5/2]]
G90 G00 Z[0.0+50.0]( — Hole 2 at X-50. Y55. — )
・
・
・以下省略
G66呼び出しの部分も、きちんと、展開してくれました。
さらに、[]内で、変数を数値に置き換えた計算式で表現してくれています。
おそらく、[]を認識できるコントローラであれば、このまま動作すると思いますが、トライカットは動作してくれないので、再度、[]内の計算式部分を、実数値に変換をお願いしました。
完成
以下が完成したデータです
%
O1000
( Chamfering Program Expanded Numeric Version )
G90 G00 G17 G40 G80 G49
( Tool and Spindle Setup )
T10 M06
G90 G00 X0 Y0
G43 Z50.0 H10
S2300 M03
M08
( Chamfering Path Calculation )
( Hole Diameter: 12.0 )
( Chamfer: 1.0 )
( Tool Diameter: 0.5 )
( Offset: 0.5 )
( Radius for cutting: 12.0/2 - 1.0 - 0.5/2 = 6.0 - 1.0 - 0.25 = 4.75 )
( Cutting Depth: 1.0 + 0.5 = 1.5 )
( --- Hole 1 at X-35. Y55. --- )
G90 G00 X-35. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0
( --- Hole 2 at X-50. Y55. --- )
G90 G00 X-50. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0
( --- Hole 3 at X10. Y10. --- )
G90 G00 X10. Y10.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0
( End of Program )
M09
M05
G91 G28 Z0
G91 G49 Z0
G90 M05
M30
%
シミュレーション
さっそく、シミュレーションしてみましょう!
正常に動作しました。
まとめ
やっぱり、Aiはすごいです。
座標値を変数で置き換えている程度のマクロであれば、エクセルやスクリプト言語などで、比較的簡単に変換できるかもしれませんが、計算式が入ってくると格段に難易度が上がります。
さらに、G66などのマクロ呼出しになると、引数への変数渡しに癖があるので、PC上での目視確認においても結構面倒です。
以前、マクロの変換ソフトの作成も考えた事もありますが、難易度高くで止めました。
今回のように、Aiに展開してもらえれば、手持ちのシミュレータで動作確認できるので、かなり気軽にマクロに取り組めると思います
それに、今回使用したAiは、「Gemini 2.5flash」で基本無料で利用できます。
ちょっと、間違った回答もありましたが、Fusion API の質問も含めて、制限が出ることはなかったです。「chatGPT」無料版では、制限に引っかかりました。
コメント