Fusion360でMach3用のGコードを作る(macOS)

切削用のGコードを作るのに今までRhinoCAMを使っていましたがFusion360に乗り換えたいと思います。その忘備録。
標準のMach3ポストプロセッサでは最初にZ=0に移動したり、最後に原点に移動する、スピンドル起動直後の待ち時間が無い、など使いにくい点があります。それを改善します。

過去のこちらの記事も参照してください。
「Fusion360 CAMポストプロセッサのカスタマイズ」https://www.mkbtm.jp/?p=1310
今までの作業手順を変えたく無いのでRhinoCAMの設定をそのままもってきたいな〜と。

RhinoCAMのMach3の設定画面

上図がRhinoCAMのMach3の設定になります。ここでMach3用のGコードの先頭と末尾の設定になります。Gコードの先頭は設定と初期処理、末尾は終了処理ということになります。これで書き出されたGコードの先頭部分は次の通り。

G00 G49 G40.1 G17 G80 G50 G90
G21
M03 M08
G04 P15
(1 ???????? ?1)
(??)
M6 T22
M03 S18000
G00 Z7.5000
X15.3601 Y20.9318
G01 Z2.1350  F72.0

末尾は次の通り

G02X35.2136I-17.5170J0.0000
X70.2476I17.5170J0.0000
G00 Z7.5000
M5 M9
M30

Gコード先頭の
G00 G49 G40.1 G17 G80 G50 G90
G21
は作業平面とかの設定(よくわかってません)。最初のG00はいらないと思う。

M03は主軸(スピンドル)の回転開始
M08はクーラント(切削液)のポンプをON
G04 P15はドウェル(一時停止)、P15で15秒停止します。

一時停止はスピンドルの回転が上がるのを待つために入れています。
( )の中はコメント文です。レイヤー名とかが入ってますが文字化けしています。コメント行ですので関係ありません。

次にG00でZ軸を退避距離まで上げています。
私の作業のやり方ではエンドミルの先端を材料の下面に合わせてZ=0としています。

材料と原点

7.5mmはこの時の退避距離です。この距離は材料の厚さによって変わります。
ここから先は切削処理になります。

ファイルの終わりは
G00 Z7.5000 Z軸を退避距離まで上げる
M5 主軸停止
M9 クーラントオフ
M30 プログラム終了
以上になります。

これと同じことをFusion360のポストプロセッサで設定します。Fusion360にはmach3用の設定が入っています。

カスタムポストプロセッサの作成

まずは標準のMach3のポストプロセッサファイルをコピーしてカスタムを作成します。ポストプロセッサファイルの保存場所は以下になります。
このファイルの場所ですがAutoDeskからダウンロードした場合とAppStoreからインストールした場合で違うらしいです。(後述しています)
私の場合はAutoDeskからダウンロードしたものです。ただし過去にAppStore版も入れているのでそのファイルパスが残っているかも?
*UserName*の部分はユーザーネームになるので読み替えてください。
Finderで操作する時にはLibrary(日本語OSではライブラリと表記)フォルダは不可視になってます。コマンド+Shift+ピリオドで不可視ファイルを表示させます。

/Users/*UserName*/Library/Application Support/Autodesk/webdeploy/production/231dbef1a5aa079c840f4fab916109b1af2683c8/Autodesk Fusion 360.app/Contents/Libraries/Applications/CAM360/data/Posts

この場所は次のファイルに書き込んであります。
/Users/*UserName*/Autodesk/Fusion\ 360\ CAM/postsData.json 

上記パスにある「\ 」は半角スペースのことです。Terminalで操作するときには上記のパスのまま、Finderで操作する時には半角スペースに読み替えてください。
ファイルをデスクトップとかにコピーします。Terminalでの操作はディレクトリに移動して次のコマンド。

$ cp mach3mill.cps /Users/*UserName*/Desktop/mach3mill.cps

デスクトップにコピーしたファイルを適当なエディタで開きます。
200行付近に

function onOpen() {
      ...
}

があります。この部分でGコードファイル先頭部分の処理をしています。このfunctionの中の328行に

  // absolute coordinates and feed per min
  writeBlock(gAbsIncModal.format(90), gFeedModeModal.format(94), gFormat.format(91.1), gFormat.format(40), gFormat.format(49), gPlaneModal.format(17));

があります。ここで最初のGコードを書き出しています。先ほどの内容に合わせて書き換えます。

// absolute coordinates and feed per min
writeBlock(gFormat.format(49), gFormat.format(40.1), gPlaneModal.format(17), gFormat.format(80), gFormat.format(50), gAbsIncModal.format(90));

この次に続く

switch (unit) {
  case IN:
    writeBlock(gUnitModal.format(20));
    break;
  case MM:
    writeBlock(gUnitModal.format(21));
    break;
  }

ここはインチとミリを切り替えている部分になります。

スピンドルの開始は850行のあたりにあると思います。

  writeBlock(
        sOutput.format(spindleSpeed), mFormat.format(tool.clockwise ? 3 : 4)
      );

スピンドルスピードの設定とM3とM4の処理があります。私のシステムではスピンドルスピードはインバータで別に設定、回転方向は常に時計回り(M3)、M3コマンドだけでいいのですが、このままにしておきます。
ここに待ち時間のためのGコードを入れます。
onDwell(30)がその書き出しをするfunctionです。30は30秒。環境に合わせて変えてください。

writeBlock(
        sOutput.format(spindleSpeed), mFormat.format(tool.clockwise ? 3 : 4)
      );
      onDwell(30);

開始時にZ=0にならないようにします。

function onSection() {

が747行付近にあります。その中の以下の部分
writeRetract(Z)でZが0になっています。

if (insertToolCall || newWorkOffset || newWorkPlane) {

    // retract to safe plane
    //writeRetract(Z); 
  }

とコメントにしてRetractしないようにします。
以上で開始部分はおしまいです。

終了部分は

function onClose() {
  writeln("");

  setCoolant(COOLANT_OFF);

  writeRetract(Z);

  setWorkPlane(new Vector(0, 0, 0)); // reset working plane

  writeRetract(X, Y);

  onImpliedCommand(COMMAND_END);
  onImpliedCommand(COMMAND_STOP_SPINDLE);
  writeBlock(mFormat.format(30)); // stop program, spindle stop, coolant off
  if (subprograms.length > 0) {
    writeln("");
    write(subprograms);
  }
}
  function onClose() {
  writeln("");

  setCoolant(COOLANT_OFF);

  //writeRetract(Z);
  //setWorkPlane(new Vector(0, 0, 0)); // reset working plane
  //writeRetract(X, Y);

  onImpliedCommand(COMMAND_END);
  onImpliedCommand(COMMAND_STOP_SPINDLE);
  writeBlock(mFormat.format(5));//stop spindle
  writeBlock(mFormat.format(9));//stop coolant
  writeBlock(mFormat.format(30)); // stop program
  if (subprograms.length > 0) {
    writeln("");
    write(subprograms);
  }
}

とコメントを入れたり、新規に書き足したりとかします。

ポストプロセッサの場所

以下のサイトを参考にしてください。macOSの場合、Autodeskからダウンロードした場合とAppStoreから入れた場合で場所が違うので注意が必要です。

https://knowledge.autodesk.com/ja/support/fusion-360/learn-explore/caas/sfdcarticles/sfdcarticles/JPN/How-to-add-a-Post-Processor-to-your-Personal-Posts-in-Fusion-360.html

私の場合はAutoDeskからダウンロードしたバージョンなので先ほど作成したカスタムポストファイルを以下に入れました。
 /Users/*UserName*/Autodesk/Fusion\ 360\ CAM/

使い方

下図のように「ポスト処理」を選びます。

Gコードを書き出すには

「雛形」と「カスタムポスト」が選べるので「カスタムポスト」でするとさきほど作成したカスタムポストがでてくるはずです。

OKをクリックすると保存場所を選択してGコードファイルが掻き出せます。開始部分はこんな感じで、余計なZ0はありません。主軸をonにした後で30秒の待ち時間が入っています。

(1001)
()
(   AUTODESK)
(  DESCRIPTION GENERIC 3-AXIS)
(T1  D=3. CR=0. - ZMIN=-1. -   )
G49 G40.1 G17 G80 G50 G90
G21

(1)
M5
T1 M6
S7000 M3
G4 P30.
G54
M8
G0 X21.7 Y15.7
G43 Z8. H1
Z4.8

終了部分は

G18 G3 X21.7 Z-0.7 I0. K0.3
G0 Z8.
G17

M9
M5
M9
M30

こんな感じで余計な原点復帰はありません。M9(クーラントOFF)が2回入ってますが、まああんまり害はないかなと。