前回で作成したいNCプログラムの構成は決定できました。
また、参考にしている「fanuc.cps」のエントリー関数の影響範囲も把握できました。
今回からは、希望のプログラム構成にするために、オリジナル「fanuc.cps」を改造していきます。
オリジナルと希望NCプログラム構成を比較
NCスタート時のプログラム構成は、このようにしようと思います。
%
O番号(コメント)
(全工具情報)
G90G00G17G40G80G49 (初期化コード)
G54 (ワーク座標系指令)
GOTO 1 (セクション・工程番号へジャンプ)
まずは、onOpen( ) の担当部分の比較をしてみましょう。
% O1001 (TEST01) (T1 D=12. CR=0. - ZMIN=-9.995 - FLAT END MILL) (T21 D=6. CR=0. TAPER=140DEG - ZMIN=-16. - DRILL) N10 G90 G94 G17 G49 G40 G80 N15 G21 (---- End of onOpen ----)
↓ このように改造したい。
% O1001 (TEST01) (T01 D=12. CR=0. - ZMIN=-9.995 - FLAT END MILL) (T21 D=6. CR=0. TAPER=140DEG - ZMIN=-16. - DRILL) G90G00G17G40G80G49 G54 GOTO 1 (--- End of onOpen ---)
それほど大きな違いはありませんね。
①.シーケンス番号(N番号)を削除
②.ワードとワードの「 」(スペース)区切りを削除
③.モーダル初期化コードを若干手直し
④.「G21」指令は、省略
⑤.ワーク座標系指令を追加
⑥.No1工程へのジャンプ指令を追加
こんなところですね。
onOpen( ) の改造
早速改造していきましょう。
①シーケンス番号 ②スペース区切り
この二つ「①と②」は、グローバル変数の「properties」で定義されています。
デフォルトではどちらも「true」になっているので、「false」に編集します。
ついでに、「preloadTool」も「false」にしておきます。
これは、工具交換時に、次の工具を待機されておくオプションですが、このオプションも筆者は使用しないので「false」にしておきます。
編集した箇所には、「//」で編集者と日付などをコメントにしておくと、後々編集箇所を検索するのに便利です。
では、「fanuc_new.cps」と言うファイル名で保存して、ポスト処理してみます。
% O1001 (TEST01) (T1 D=12. CR=0. - ZMIN=-9.995 - FLAT END MILL) (T21 D=6. CR=0. TAPER=140DEG - ZMIN=-16. - DRILL) G90G94G17G49G40G80 G21 (---- End of onOpen ----)
これで、①と②の編集は終了です。
%、O番号、工具情報
ここからは、「onOpen( )」関数の編集に入ります。
まずは、エディタで「onOpen( )」関数を眺めてみましょう。
301行付近に、「writeln(“%”);」が見つかります。
ここで「%」を出力させているのがわかります。
その上部にも、40行近いプログラムがありますが、実際の出力では、「%」の上部には、なにも出力されていないので、その部分はそのままにしておきます。
「%」出力の次には「O番号」の出力です。
325付近を眺めてみると、8桁の「O番号」への対応もしているみたいですね。
その次でO番号とコメント文を出力させています。
oFormat = createFormat({width:(properties.o8 ? 8 : 4), zeropad:true, decimals:0}); if (programComment) { writeln("O" + oFormat.format(programId) + " (" + filterText(String(programComment).toUpperCase(), permittedCommentChars) + ")"); } else { writeln("O" + oFormat.format(programId)); }
programIdがO番号
programCommentがコメントです。
O番号とコメント文は、ポスト処理ダイアログの設定を参照しています。
次に360行付近で工具情報リスト情報を取得し、「zRanges」配列に加工深さ情報を登録しています
var zRanges = {}; if (is3D()) { var numberOfSections = getNumberOfSections(); for (var i = 0; i < numberOfSections; ++i) { var section = getSection(i); var zRange = section.getGlobalZRange(); var tool = section.getTool(); if (zRanges[tool.number]) { zRanges[tool.number].expandToRange(zRange); } else { zRanges[tool.number] = zRange; } } }
その後、377行付近以降の
var tools = getToolTable(); if (tools.getNumberOfTools() > 0) { for (var i = 0; i < tools.getNumberOfTools(); ++i) { var tool = tools.getTool(i); var comment = "T" + toolFormat.format(tool.number) + " " + "D=" + xyzFormat.format(tool.diameter) + " " + localize("CR") + "=" + xyzFormat.format(tool.cornerRadius); if ((tool.taperAngle > 0) && (tool.taperAngle < Math.PI)) { comment += " " + localize("TAPER") + "=" + taperFormat.format(tool.taperAngle) + localize("deg"); } if (zRanges[tool.number]) { comment += " - " + localize("ZMIN") + "=" + xyzFormat.format(zRanges[tool.number].getMinimum()); } comment += " - " + getToolTypeName(tool.type); writeComment(comment); } }
var tools = getToolTable();
tools.getNumberOfTools()
関数、getNumberOfTools()で、ポスト作成時に選択したセクション(工程)で使用した、工具の個数を取得しています。
使用する工具の工具情報をその個数だけ繰り返し入手し、コメントとして出力させています。
このルーチンは、工具情報を取得する方法として、別の操作でも利用できる可能性があるので、覚えておくと便利です。
次の423行付近で、ワーク座標系のチェックをしています。
if ((getNumberOfSections() > 0) && (getSection(0).workOffset == 0)) { for (var i = 0; i < getNumberOfSections(); ++i) { if (getSection(i).workOffset > 0) { error(localize("Using multiple work offsets is not possible if the initial work offset is 0.")); return; } } }
CAMの設定画面のポスト処理画面が参照されます。
複数の「設定」を一度にポスト処理する場合で、違うワーク座標系を使用したい場合には、ここでの設定は「0」以外にしなければエラーを出すみたいです。
③モーダル初期化コードを若干手直し
432行付近で、「N10 G90 G94 G17 G49 G40 G80」のコードを出力させてます。
これを、「G90G00G17G40G80G49」に変更しましょう。
writeBlock(gAbsIncModal.format(90), gFeedModeModal.format(properties.useG95 ? 95 : 94), gPlaneModal.format(17), gFormat.format(49), gFormat.format(40), gFormat.format(80)); ↓ 希望のコードに変更します。 //kazuban 2021/01/16 writeBlock(gAbsIncModal.format(90),gMotionModal.format(0),gPlaneModal.format(17), gFormat.format(40), gFormat.format(80), gFormat.format(49));
④「G21」指令は、省略
次の435行付近の「switch」分で、「G21」コードを出力させています。
ここは省略したいので、「writeBlock( )」関数をコメントにして無力化します。
//kazuban 2021/01/15 switch (unit) { case IN: //writeBlock(gUnitModal.format(20)); break; case MM: //writeBlock(gUnitModal.format(21)); break; }
⑤ワーク座標系指令を追加⑥N0001工程へのジャンプ指令を追加
次では、「G95」関連の定義ですが、筆者は使っていないので、
ここではそのままにしておきます。
オリジナルでは、「onOpen( )」はここで終了ですが、
終了前に「ワーク座標系」指令を追加します。
今回のNCプログラムでは、最初にワーク座標系を指令後、
途中では変更しない仕様で考えています。
こうする事で、機械側でワーク座標系番号を変更したい場合には、
この指令一か所のみの変更ですみます。
また、多数個取りなどに対応したい場合でも、NCデータの改造が楽になります。
オリジナルでは、onSection( )にワーク座標系出力があるので、各セクション(工程)ごとに、出力されます。
どちらがいいかは、実際の加工方法によって違ってくると思いますので、あくまでもポスト編集の例題としてお考えください。
Fusion360のポストでは、CAMの設定画面でワーク座標系を設定します。
wcsオフセットが、
「0」であれば、「G54」。
「1~6」までは、「G54~G59」
「7」以上になると、
拡張座標系「G54.1 P1~」
を使用できる仕様とします。
このような仕様で、プログラムを追加します。
加えて、シーケンス番号N0001へ無条件ジャンプのコードも追加します。
//kazuban 2021/01/15 var WCS = getSection(0).workOffset; WCS = (WCS==0)?1:WCS; if(WCS>6){ writeBlock(gFormat.format(54.1),"P"+(WCS-6)); }else{ writeBlock(gFormat.format(53+WCS)); } writeln("GOTO 1"); writeln("(---- End of onOpen ----)");
この部分を簡単に説明すると、
- 「WCS」と言う変数を用意し、最初のセクション(工程)のワークオフセット番号を代入します。
- ワークオフセット番号が「0」なら、「1」に変更します。
- ワークオフセット番号が「6」より大きければ、「G54.1P」の指令とします。
- 1~6の場合には、G「53+オフセット番号」のワークオフセットとします。
- N0001 へジャンプする指令を追加します。
ジャンプ指令は、実際の加工時、任意工程を再加工したい場合に使用します。
今回の例題では、セクション2(2工程目)で、ポケット側面の仕上げ加工を行う想定です。
実際の加工で仕上げ工程でいきなり、仕上げる事は少ないです。
通常は、最初は取り代を付けた状態で加工し、その後の測定結果をもとに工具径補正を再調整し、その工程のみ再加工をおこなうような操作をします。
そのような場合に、とりあえず全加工したのち、2工程目のみ再加工を行うような操作を想定しています。
その場合、機械コントローラで「GOTO 1」を「GOTO 2」へ修正する事で、2工程目からの加工が可能になります。
ポスト処理実行
% O1001 (TEST01) (T1 D=12. CR=0. - ZMIN=-9.995 - FLAT END MILL) (T21 D=6. CR=0. TAPER=140DEG - ZMIN=-16. - DRILL) G90G94G17G49G40G80 G54 GOTO 1 (---- End of onOpen ----)
onOpen( )の改造終了
出力は、わずか6行程度のデータですが、結構ボリュームありました。
onOpen()関数は、200行ありますね。
いろいろなパターンに対応しているのだと思います。
結構面倒ですが、一行ずつ解読していくと、理解が深まりますので、お時間あれば挑戦してみてください。
次は、onSection()の改造へ移りますが、こちらはさらに長いですね!
Fuison360 ポストの情報
- 概要編
- 構成編
- 変数
- グローバルセクション
- 関数
- NCプログラム仕様検討
- onOpen( )
- onSection( ) No1
- onSection( ) No2
- onSectionEnd( ) & onClose( )
コメント