このサイトのNCプログラム構成の記事でも、触れていますが、NCデータの構成は4つに整理する事ができます。
・全工程の始まり
・加工工程の前
・・・ 実際の加工経路 ・・・
・加工工程の後
・全工程の終わり
同様の視点でしょうか、
前回の記事、ポストプロセッサの構成も同様になっていますね~
onOpen( )
onSection( )
・・・・・・・・
onSectionEnd( )
onClose( )
したがって、ポストファイルを編集・開発するには、まずは実績のあるNCデータを上記の4構成に整理するのが、わかりやすいと思います。
構成の整理ができれば、各構成ごとに上記4つの「on」で始まる関数が希望のデータを出力するように改造していくことから始めます
一番重要な「実際の加工経路」の部分(前回の記事ではサブプログラムの部分)には機種依存のコード(Mコードなど)が入らないように、4構成に機種依存コードを含むように検討します。
そうする事で、多種類の機械に対応しやすくなります。
ファナック系であれば、サンプルの「fanuc.cps」でも、ちょっとの修正で動作しそうですから、この部分を重点に検討していきます。
サンプルポストで分析
とりあえず、標準でインストール済みの「fanuc.cps」でNCデータをだしてみます。
φ20×深さ10mm穴と長方形50×30深さ20mmのポケットを
2D輪郭で一周させるモデルを作成してみました。
出力されたNCデータを眺めてみました。
そもままでも、動きそうですな感じです。
ほんのちょっと、自社のスタイルに変更するだけで、使用できそうです。
個人ライセンスの制限
まったく同じモデルで、会社のライセンスと、個人ライセンスでポスト処理してみました。
まず、違う工具を使う場合には、個人ライセンスでは、一度に処理できません。
同じ工具なら複数工程でも処理してくれますが、違う工具では工程ごとに別々に出力させる必要があります。
さらに、早送りでの移動が制限されています。
左が、サブスクリプションライセンス、右が個人ライセンスです。
まず、工具交換前に、早送りに制限ある旨のメッセージが追加されます。
さらに、比較してみると、やはり、早送り動作が制限されています。
一カ所目の加工が終了後、上昇し次へ移動する際の移動が直線補間になっています。
速度は、工具設定の「切削送り速度」になるみたいですね。
「切削送り速度」が遅い条件だったり、移動距離が長い場合には、実際の加工には修正なしでは使用できないでしょうね。
ただ、前回の記事でコメントいただいた、【kantoku】さんからの情報では、その部分を変更するアドインを公開されている方もいらっしゃるようです。
Fusion360 CAM をとりあえず試してみたいと言う場合は、自己責任でトライしてもいいと思いますが、一年間約6万円なので、お仕事で使用するなら、ライセンスを購入したほうがいいと思います。
入口関数(Entry Functions)
上で説明した、NCデータを構成する4つの関数(Function)がNCデータにおいてどの部分に影響を与えているか確かめてみようと思います。
writeln関数
writein( )は、( ) 内の文字列を改行付きで出力する関数です。
各関数の動作を調べるために、「writeln( )」関数で適当な文字列を、各関数の始まり直後と終了直前に出力させてみましょう。
まず、オリジナルの「fanuc.cps」は残しておくために、コピーを作っておきます。
筆者はとりあえず「fanuc_test.cps」というファイルを作成しました。
このファイルを、エディタで開き、各関数(まずは、onOpen( ))を探します。
VSCode であれば、
「エクスプローラー」→「FUNCTION_LIST」に一覧がありますし、「CTRL」+「F」でキーワード検索でも探せます。
「function onOpen( )」後 { ~ } までが、この関数の定義です
262 function onOpen( ) {
・
・
・
450 }
だいたい、「262行」から始まり「450行」で終了になっていると思います
探せたら、「onOpen( )」関数の始まりと終了に、「writeln( )」関数で適当な文字列を書き込ませてみます。
文字列は、ダブルコーテーション「 ” 」で囲みます。
修正箇所が分かるように、「//」の後に分かりやすいコメント文を書き込んでおくと、後から修正箇所を探すときに便利です。
さて、このファイルで実際にポスト処理してみましょう!
( onOpen begin <-------------) % O1001 (TEST) (T1 D=10. CR=0. - ZMIN=-20. - FLAT END MILL) N10 G90 G94 G17 G49 G40 G80 N15 G21 ( onOpen end <-------------) N20 G28 G91 Z0. N25 G90 (2D 2) N30 T1 M06 (AP1.5D AE0.02D) N35 S6400 M03
出力されました。
ポストファイルでは、200行近いプログラムですが、出力されたNCデータは5行程度ですね。
この間の指令を変更したい場合には、「onOpen( )」関数を編集すればいいと言うことになります。
また、この関数のどういう定義で、どのように出力されるかを分析していくと、だんだんポストの振る舞い(インプット、アウトプット)が分かってきます。
早速他の3関数「onSection( )、onSectionEnd( )、onClose( )」にも印をつけてみましょう。
( onOpen begin <-------------) % O1001 (TEST) (T1 D=10. CR=0. - ZMIN=-20. - FLAT END MILL) N10 G90 G94 G17 G49 G40 G80 N15 G21 ( onOpen end <-------------) ( onSection begin <-------------) N20 G28 G91 Z0. N25 G90 (2D 2) N30 T1 M06 (AP1.5D AE0.02D) N35 S6400 M03 N40 G54 N45 M08 N50 G00 X40. Y1. N55 G43 Z30. H01 ( onSection end <-------------) N60 G00 Z5. N65 G01 Z1. F333. N70 Z-10. N75 G41 X49. D01 F1000. N80 G03 X40. Y10. I-9. N85 Y-10. J-10. F2250. N90 Y10. J10. N95 X31. Y1. J-9. F1000. N100 G01 G40 X40. N105 G00 Z30. N110 X0. Y6. N115 Z5. N120 G01 Z1. F333. N125 Z-20. N130 G41 X9. D01 F1000. N135 G03 X0. Y15. I-9. N140 G01 X-18. F2250. N145 G03 X-25. Y8. J-7. N150 G01 Y-5. N155 G03 X-15. Y-15. I10. N160 G01 X16. N165 G03 X25. Y-6. J9. N170 G01 Y7. N175 G03 X17. Y15. I-8. N180 G01 X0. N185 G03 X-9. Y6. J-9. F1000. N190 G01 G40 X0. N195 G00 Z30. ( onSectionEnd begin <-------------) ( onSectionEnd end <-------------) ( onClose begin <-------------) N200 M09 N205 G28 G91 Z0. N210 G90 N215 G49 N220 G28 G91 X0. Y0. N225 G90 N230 M30 % ( onClose end <-------------)
出力されました。
やはり、以前記事にした、
「全加工の始まり:Header.nc」
「加工工程の前 :ProcessStart.nc」
「加工工程の後 :ProcessEnd.nc」
「全加工の終わり:Footer.nc」
NCデータの構成とよく似ていますね。
「onOpen( )」は、「%」「O番号」「初期設定」など・・
「onSection( )」は、「工具交換」「ワーク座標系」「冷却」「工具長補正」など
その後、実際の加工指令は、別の関数から出力される・・・・
「onSectionEnd( )」は、今回は何もしていません。
「onClose( )」は、主軸の退避、キャンセルコード、「M30」「%」
こんな感じになりました。
この出力結果と、実際使用している自社のNCデータをに比べながら、不要な指令を削除したり、足りない指令は対象の関数のところに追加していく事でだいたい理想のNCデータに近づいていくと思います。
まとめ
ポストファイルを眺めてみると、長~い定義だったり、暗号みたいな記号が並んでいたり、最初はとっつきにくいと思います。
ただあまり考えず、「writeln( )」で印をつける事で、なんとなくわかってくると思います。
いろいろ、やってみると、面白いです。
Fusion360 ポスト記事
- 概要編
- 構成編
- 変数
- グローバルセクション
- 関数
- NCプログラム仕様検討
- onOpen( )
- onSection( ) No1
- onSection( ) No2
- onSectionEnd( ) & onClose( )
コメント