Fusion360 CAM ポストプロセッサ徹底解説・onOpen()の編集

Fusion360

前回で作成したい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 ポストの情報


  1. 概要編
  2. 構成編
  3. 変数
  4. グローバルセクション
  5. 関数
  6. NCプログラム仕様検討
  7. onOpen( )
  8. onSection( ) No1
  9. onSection( ) No2
  10. onSectionEnd( ) & onClose( )

1 2 3 4 5 6 7 8 9 10

コメント

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