<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ポストプロセッサ | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/post-processor/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Tue, 23 Dec 2025 07:42:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.kazuban.com/blog/wp-content/uploads/2020/05/cropped-ICON-1-32x32.png</url>
	<title>ポストプロセッサ | じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Fusion360、更新でポスト処理が変わった？デフォルトになった「NCプログラム」機能を説明します</title>
		<link>https://www.kazuban.com/blog/post-setting/</link>
					<comments>https://www.kazuban.com/blog/post-setting/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 29 Aug 2021 12:23:03 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<category><![CDATA[共有フォルダ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6002</guid>

					<description><![CDATA[2021/08/24付近の更新からかな？「アクション」＞「ポスト処理」で出てくる、ダイアログが変わったみたいですね。「NCプログラム作成」がデフォルトになったようです。ちょっと戸惑ったのと、「NCプログラム」意外と便利な [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>2021/08/24付近の更新からかな？<br>「アクション」＞「ポスト処理」で出てくる、ダイアログが変わったみたいですね。<br>「NCプログラム作成」がデフォルトになったようです。<br>ちょっと戸惑ったのと、「NCプログラム」意外と便利なので、説明したいと思います。<br>後半では、ポストファイルをネットワークフォルダで共有する方法も解説しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ポスト処理ダイアログが変わった</a></li><li><a href="#toc2" tabindex="0">NCプログラム</a><ol><li><a href="#toc3" tabindex="0">こんな時に便利</a></li><li><a href="#toc4" tabindex="0">設定方法</a></li><li><a href="#toc5" tabindex="0">「NCプログラム作成」と「ポスト処理」</a></li><li><a href="#toc6" tabindex="0">個人ライセンスで試してみましょう</a></li></ol></li><li><a href="#toc7" tabindex="0">ＬAN上の共有フォルダでポストファイルを共有する</a><ol><li><a href="#toc8" tabindex="0">以前のポスト処理に戻す</a></li><li><a href="#toc9" tabindex="0">旧「ポスト処理」でネットワークフォルダを共有</a></li><li><a href="#toc10" tabindex="0"> 「NCプログラム」でネットワークフォルダを共有 </a></li><li><a href="#toc11" tabindex="0">ローカルフォルダとネットワークフォルダ</a></li><li><a href="#toc12" tabindex="0">ネットワークドライブの割り当て</a></li><li><a href="#toc13" tabindex="0">シンボリックリンク</a></li></ol></li><li><a href="#toc14" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ポスト処理ダイアログが変わった</span></h2>



<p>以前はこんなダイアログでした。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/legacy.png" alt=""/></figure>



<p>先日気が付いたのですが、「ポスト処理」を押すと、こんな感じに変わっています。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/NcProgram.png" alt=""/></figure>



<p>実はこれ以前から「設定」⇒「NCプログラムを作成」の画面です。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/NCProgramuSetting.png" alt=""/></figure>



<p>ポスト処理の設定で、以前のダイアログでの設定から、こちらがデフォルトになったようです。<br>「NCプログラム」を使っていなかった方はダイアログの変更程度かもしれませんが、<br>「NCプログラム」機能は意外と便利ですのでもう少し詳しく説明します。</p>



<h2 class="wp-block-heading"><span id="toc2">NCプログラム</span></h2>



<p>複数のセットアップ（工程）をグループ分けしたり、複数のポストを使う場合に便利です<br>NCプログラムの画面を見てみましょう</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/NcProgram02.png" alt=""/></figure>



<p>「設定」タグで、使用ポストやNCの出力フォルダなどが設定できます。<br>「操作」タグで、この「NCプログラム」に処理させたい、セットアップ（工程）を選択します。<br>以前の「ポスト処理」では、ポストや工程を分割したい場合には、分割数だけその処理を行う必要がありましたが「NCプログラム」を利用して複数作成しておくと一度に複数のNCデータを作成してくれます。</p>



<h3 class="wp-block-heading"><span id="toc3">こんな時に便利</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>・NCデータと加工手順書を同時に出力したい。<br>　筆者は加工手順書もポストで作成しています。<br>　要するに、機械が一種類の場合でも、常に２個のポストが必要なので２回の「ポスト処理」作業が必要でした。</p><p>・複数の機械用でデータを作成したい場合。<br>　多種類の機械がある場合で加工機械が決まっていない場合、とりあえず数種類のNCデータを出しておきます</p><p>・加工工程（セットアップ）を分割したい場合<br>　荒と仕上げとか、裏・表とか、Fusion360では一気に作りますが、NCデータは分割したい場合があります</p><p>・工程によって、機械（ポスト）を変更したい場合。<br>　荒加工は機械A、仕上げは機械Bのような、上記２点の複合的な場合ですね。</p><p>・出力フォルダを変更したい場合。<br>　少ないケースかもしれませんが、複数個所のフォルダにNCデータを作成したい場合や、複数工程で出力フォルダを変えたい場合など。</p><p>・個人ライセンスで、複数工程（工具）のデータを一気に出力したい。<br>　これはあまりお勧めではありませんが、一回のポスト処理では一個の工具しかできませんが「NCプログラム」を複数作成すれば、とりあえず一気に出力できます。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc4">設定方法</span></h3>



<p>設定は、「設定」と「操作」タブで行います。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/PostDiarog.png" alt=""/><figcaption>「設定」タブでの設定は、以前のダイアログとほとんど同じです。<br>使用ポスト設定やプログラム名、ポストのプロパティの設定などを行います。<br>ただ、プロパティ設定が、グループ分けされていて、以前よりも設定しやすいように思います。<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-04/#outline__2_2">プロパティグループは、別記事でも紹介していますので 興味ある方は覗いてみてください</a><a href="https://www.kazuban.com/blog/fusion360-post-processor-04/#outline__2_2">。</a></figcaption></figure>



<p>「操作」タブは、NCデータ化したい対象のセクション（工程）を選択します。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/PostOperation02.png" alt=""/></figure>



<p>この二つのタブで、複数のポストと複数のセクション（工程）の組み合わせでNCデータが作成できます。</p>



<h3 class="wp-block-heading"><span id="toc5">「NCプログラム作成」と「ポスト処理」</span></h3>



<p>「NCプログラム」を作成するには、「設定」⇒「NCプログラムを作成」で作成できます。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/NCProgramuSetting-1.png" alt=""/></figure>



<p>この方法で、必要な種類の「NCプログラム」を作成します。<br> 「アクション」⇒「ポスト処理」のアイコンを押しても「NCプログラム」が作成されます。<br>さらに押すと、追加されます。<br>タスクバーの「ポスト処理」ボタンではブラウザに勝手に「NCプログラム」が作られるだけなので、<br>ちょっと戸惑ってしまいますね。<br>最終的にポストでNCデータを作成するには、ブラウザから作成したい設定の「NCプログラム」を選択後、「ポスト処理」アイコンで実行します。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/Execute.png" alt=""/></figure>



<p>ツリーの親を選択すると、その下のすべてを実行して、複数のNCを作成してくれます。</p>



<h3 class="wp-block-heading"><span id="toc6">個人ライセンスで試してみましょう</span></h3>



<p>個人ライセンスの場合、複数の工具を使用したNCデータは作成する事ができません。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/SelfError.png" alt=""/></figure>



<p>もちろん、今までも単独で何回も処理すれば単体では作成できましたが、セクションの編集など行った場合、再度処理する必要があり面倒だったと思います。<br>「NCプログラム」を使用すれば、一回の実行で、複数個のNCデータを一気に作成してくれます。<br> セクション一個につき、「NCプログラム」も一個用意し、「操作」では、一個ずつセクションのみ選択します。 </p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/PostSettion03.png" alt=""/></figure>



<p>プログラムの「名前／番号」も変更します。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/AllPost.png" alt=""/></figure>



<p>親の「NCプログラム」を選択し、「ポスト処理」を実行すれば、５個のNCデータを一気に作成してくれました</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/successful.png" alt=""/></figure>



<p>もちろん、個人ライセンスでは、早送りの制限もあり、実際の加工に使うには無理がありますが、<br>ポストプロセッサの改造で早送り処理を変更し、サブプログラム化にすれば、使用できるかもしれません。<br>まぁ、工作機械への利用は、商用ライセンスをお勧めします。</p>



<h2 class="wp-block-heading"><span id="toc7">ＬAN上の共有フォルダでポストファイルを共有する</span></h2>



<p>ポストファイルを数人で管理している場合、LAN上の共有フォルダを利用すると便利です。<br>以前のポスト処理ダイアログでは、「ポストコンフィグ」で共有フォルダを設定できました。<br>まずは、以前の「ポスト処理」で確認してみましょう。</p>



<h3 class="wp-block-heading"><span id="toc8">以前のポスト処理に戻す</span></h3>



<p>今回の更新で、複数のポスト処理を行いたい場合は便利になりそうですが、一種類の処理で間に合う場合には逆に面倒になりますね。<br>場合によっては、今後の更新で使用できなくなるかもしれませんが、現状では戻せるようです。</p>



<p>Fusion360 画面の右上のログイン名アイコンからの「基本設定」で設定可能です。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/BaseSetting.png" alt=""/></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>「基本設定」⇒「プレビュー機能」⇒「製造」⇒<br> 　　「Post Process NC code with legacy post processing dialog」</p></blockquote>



<p>にチェックすると、以前の「ポスト処理」にもどります</p>



<h3 class="wp-block-heading"><span id="toc9">旧「ポスト処理」でネットワークフォルダを共有</span></h3>



<p>旧「ポスト処理」のダイアログでは、「コンフィグフォルダ」の「&#8230;」ボタンで、ネットワークフォルダを設定できます。</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/OnServer.png" alt=""/></figure>



<p>この設定で、メンバーでネットワーク上のポストファイルを共有できます。<br>複数人でポストを利用している場合には便利です。</p>



<h3 class="wp-block-heading"><span id="toc10"> 「NCプログラム」でネットワークフォルダを共有 </span></h3>



<p>「NCプログラム」でも、「ポスト」の「&#8230;」ボタンから設定できます。</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2021/08/net-folder-1024x310.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/net-folder-1024x310.png" alt=""/></a></figure>



<p>「リンク済み」右ボタン、「フォルダをリンク」から、ネットワークフォルダを設定可能です。<br>ここで、設定できたはずなので実際にポストを実行してみると・・・・あれっ？</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/NetfolderError.png" alt=""/></figure>



<p>なぜか、エラーが発生してしまいました。</p>



<h3 class="wp-block-heading"><span id="toc11">ローカルフォルダとネットワークフォルダ</span></h3>



<p>Windows の場合、ローカルフォルダとネットワークフォルダでは、形式が違います。<br>ローカルフォルダは、「ドライブ：￥フォルダ名１￥フォルダ名２・・」の形式ですが<br>ネットワークフォルダは、 「￥￥フォルダ名１￥フォルダ名２・・」の形式です。<br>この「 ドライブ：￥ 」と「 ￥￥ 」の違いが影響しているのでしょうか？<br>いずれにしても、旧「ポスト処理」では設定できたので、改善を期待します。<br>とは言っても、いつ改善してくれるかわかりません。<br>現状でできる事を考えてみます。 </p>



<h3 class="wp-block-heading"><span id="toc12">ネットワークドライブの割り当て</span></h3>



<p>ネットワークフォルダ形式（￥￥フォルダ名）に対応していないのであれば、<br>「ネットワークドライブの割り当て」で認識してくれるかもしれません。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/net-drive-assign-1024x456.png" alt=""/></figure>



<p>エクスプローラのネットワークから、対象のネットワークフォルダを右クリック<br>ネットワークドライブからドライブを割り当てできます。<br>ドライブ名は、プルダウンから選択できます。<br>割り当てが完了したら、<a href="https://www.kazuban.com/blog/post-setting/#outline__3_3" data-type="internal" target="_blank">「ネットワークドライブの共有」で説明した</a>「フォルダをリンク」で<br>そのドライブを設定します。<br>私の環境では、正常にNCデータが作成されました。</p>



<h3 class="wp-block-heading"><span id="toc13">シンボリックリンク</span></h3>



<p>別の方法として、<a href="https://www.kazuban.com/blog/fusion360-tool-sharing/#outline__2_2" data-type="URL" target="_blank">こちらのサイトでも解説している</a>「シンボリックリンク」も使えるかもしれません。<br><a href="https://www.kazuban.com/blog/fusion360-tool-sharing/#outline__2_2" target="_blank">工具共有説明のサイト</a>ではうまくいきませんでしたが、今回も試してみたいと思います。<br>「シンボリックリンク」は、別の場所のフォルダへのリンクが書かれたショートカットファイルではなく、<br>別の場所にあるディレクトリを、いかにも自分のディスクにあるように見せる機能です。<br>Fusion360のポストがでデフォルトで参照するフォルダは</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>C:\Users\「ユーザー名」\AppData\Roaming\Autodesk\Fusion 360 CAM\Posts<br></p></blockquote>



<p>です。<br>この「Posts」フォルダが存在すれば、その中から「.cps」ファイルを探します。<br>「NCプログラム」の「ポストライブラリ」には「インポート」がありますが、</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/post-import.png" alt=""/></figure>



<p>「インポート」は選択したポストファイルを上記のデフォルトフォルダへコピーするだけなので、共有ポストが変更された場合でも反映されません。<br>このデフォルトフォルダは、ローカル（自分のハードディスク内）なので、他のPCとの共有はできません。<br>しかし今回は、「シンボリックリンク」により、ネット上の共有フォルダを、<br>このデフォルトフォルダへ見せかけ、Fusion360ポストへは、ローカルだと思わせる事で、他のメンバーとも共有が可能にするのが狙いです。<br>ただし、 Fusion360ポスト がネット上の共有フォルダをローカルだと騙されてくれないと、この方法は使いない事になります。<br>それでは、やってみましょう！<br>「シンボリックリンク」はWindows のコマンドの一つなので、怪しいコマンドではありません。<br>「MKLINK」というコマンドなので、このコマンドを「コマンドプロンプト」から実行するか<br>「BAT」ファイルを作成、そのファイルを実行する事で実現できます。<br>具体的には、メモ帳やエディタなどで、下記テキストを書き込み、「.bat」の拡張子で保存します<br>「\\server2\Share\Posts」は、共有フォルダ名なので、適宜変更してください。</p>



<pre>mklink /D C:\Users\%username%\AppData\Roaming\Autodesk\"Fusion 360 CAM"\Posts   \\server2\Share\Posts
pause
</pre>



<p>完成したら、そのバッチファイルを右ボタンから「管理者として実行」します。<br>「・・・シンボリックが作成されました」と表示されれば、完了です。<br><br></p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/local-folder.png" alt=""/></figure>



<p>ポストライブラリからは「ローカル」として参照されているのがわかります。<br>私の環境では、無事にNCデータが作成されました。</p>



<h2 class="wp-block-heading"><span id="toc14">まとめ</span></h2>



<p>2021/08/24日あたりの、更新でFusion360 CAMの「ポスト処理」の動作が変更になったようです。<br>以前の「ポスト処理」ダイアログが表示される代わりに、「ＮＣプログラム」の機能に登録する形式になりました。<br>「ＮＣプログラム」自体は以前からありましたが、複数のポストを使用しない方には無縁だったかもしれません。<br>以前のダイアログに戻す事も可能ですが、意外と便利な機能でもあるので興味ある方は試してみてください。<br>また、ネットワークの共有フォルダの利用方法も解説しました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/post-setting/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>Fusion360  ポストプロセッサ危険な設定</title>
		<link>https://www.kazuban.com/blog/fusion360-collision/</link>
					<comments>https://www.kazuban.com/blog/fusion360-collision/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 09 May 2021 01:00:27 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=5321</guid>

					<description><![CDATA[このサイトでも、下記記事から連載でFusion360 CAM のポストプロセッサの編集方法を紹介してきました。筆者も自作したポストを実際の加工にも使用していますが、先日製品に食い込んでしまうパスを発見しました。シミュレー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このサイトでも、下記記事から連載でFusion360 CAM のポストプロセッサの編集方法を紹介してきました。<br>筆者も自作したポストを実際の加工にも使用していますが、先日製品に食い込んでしまうパスを発見しました。<br>シミュレーションレベルで発見できたので大事にはいたりませんでしたが、その事例を紹介します。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-じじぃの引出し wp-block-embed-じじぃの引出し"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion360-post-processor-01/" title="Fusion360 CAM ポストプロセッサ徹底解説・概要編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="121" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost.png 1099w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-300x223.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-1024x761.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-768x571.png 768w" sizes="(max-width: 121px) 100vw, 121px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360 CAM ポストプロセッサ徹底解説・概要編</div><div class="blogcard-snippet internal-blogcard-snippet">数回にわたって、Fusion360 CAM のポストプロセッサの説明をしようと思います。しかし、筆者自身も独学なので、わかっている範囲での説明になりますし、もしかすると間違いもあるかもしれませんので、ご了承ください。ただ、ポストプロセッサはＮＣデータを出力する機能であり、それ自身が機械を動かすわけで...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.11.28</div></div></div></div></a>
</div></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">あっ！食い込んでる。</a></li><li><a href="#toc2" tabindex="0">NCデータ分析</a></li><li><a href="#toc3" tabindex="0">ポスト見直し</a></li><li><a href="#toc4" tabindex="0">カーネル設定変数</a></li><li><a href="#toc5" tabindex="0">小数点以下桁数</a></li><li><a href="#toc6" tabindex="0">解決策</a></li><li><a href="#toc7" tabindex="0">二重対策</a></li><li><a href="#toc8" tabindex="0">ポスト修正</a></li><li><a href="#toc9" tabindex="0">確認</a></li><li><a href="#toc10" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">あっ！食い込んでる。</span></h2>



<p>Fusion360 CAMは、全ての加工ではないですが実際の加工にも自作のポストプロセッサで利用しています。<br>やはりCAMには得意不得意があるので、使い分けしています。<br>今回かなり複雑なパスをFusin360で出力させてみました。<br>ところが、加工前のNCデータシミュレーションで<span class="markerPink">  食い込み</span>を発見しました。<br>別のCAMでも、気に入らないデータを出力する事はよくありますが、これはかなり<strong>致命的</strong>です。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/Trycut-1024x735.png" alt=""/></figure>



<p>上画像は、NCデータを<a href="http://www.trycut.com/">TRYCUT</a>でシミュレーションした結果です。<br>下画像は<span class="markerYellow"> 
Fusion360 でのシミュレートで不具合は発生していません。</span></p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/Fusion-1024x744.png" alt=""/></figure>



<p>おそらく、Fusion360 CAMの内部計算レベルでの不具合ではなく、<span class="markerPink"> 
ポストプロセッサでの不具合</span>だと推測できます。</p>



<h2 class="wp-block-heading"><span id="toc2">NCデータ分析</span></h2>



<p>まずは、食い込んだNCデータを分析してみると、このようなデータが見つかりました。</p>



<pre class="wp-block-preformatted">・
・
N128625 G01 X114.328 Y-83.682
N128630 G02 X114.332 Y-83.676 I0.437 J-0.282
N128635 G01 X114.384 Y-83.598
N128640 G02 X114.388 Y-83.592 I0.433 J-0.288
N128645 G01 X114.413 Y-83.555
N128650<span class="has-inline-color has-vivid-red-color"> <strong>G02 I0.429 J-0.294</strong></span>
N128655 G01 X114.446 Y-83.507
N128660 G02 X114.45 Y-83.501 I0.428 J-0.295
N128665 G01 X114.486 Y-83.45
N128670 G02 X114.488 Y-83.448 I0.424 J-0.301
N128675 G01 X114.522 Y-83.401
N128680 G02 X114.525 Y-83.396 I0.423 J-0.303
・
・</pre>



<p><strong><span class="has-inline-color has-vivid-red-color">これだ！</span></strong><br>この行は、X、Y軸指令がなく、I、J指令しかありません。<br>Ｘ，Ｙ軸は<strong>モーダル</strong>なので、始点終点が同じ円弧補間指令だと言うことですね。<br>これは、ＮＣ言語的にはどのような指令でしょうか？<br>そう、<span class="markerPink"><font size="+1"><strong>真円</strong></font></span>指令です。<br>直前の、Ｘ，Ｙ座標に戻ってくる<strong>真円動作</strong>となります。<br>確認のためデータ量が多いので、その付近の一部分だけ抜粋し、<br>以前このサイトで公開した、<a href="https://www.kazuban.com/blog/nc-check-ver2/">自作のＮＣデータチェックソフト</a>で確認してみましょう</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/0.001-1024x648.png" alt=""/></figure>



<p>予想通りです。<br>この部分で、真円動作となるため、食い込みが発生したのです。<br>Fusion360 CAMのシミュレータでは食い込みは発生していないため、内部計算レベルでの不具合ではなく、<br>NCデータを出力するのは、ポストプロセッサなので、ポストが原因だと思われます。<br><span class="markerYellow">食い込みは標準付属の「fanuc.cps」でのデフォルト設定では発生しませんでした。<br>使用した自作のポストを見直してみる必要がありそうです。</span></p>



<h2 class="wp-block-heading"><span id="toc3">ポスト見直し</span></h2>



<p>ポストプロセッサで、円弧補間を出力させている箇所は、<font size="+1">「<strong>onCircular( )</strong>」</font>関数です。<br>ところが、この部分は自作ポストでは、標準ポストから修正していませんから、改造が原因ではなさそうです。<br>Ｘ，Ｙ軸指令が消えてしまっているので、Ｘ，Ｙの出力方法を見てみます。<br>この関数で、X座標を出力させている部分は、<font size="+1">「<strong>xOutput.format(x)</strong>」ですが、この指令はモーダル情報も考慮するため直前の座標と同じ場合には、モーダル仕様により、出力データは<span class="markerPink"> 「空（ヌル）」</span>になります。<br>ようするに、直前のＸ，Ｙ座標が同じだったため、Ｘ，Ｙ指令が省略されてしまったのです。<br>ところが、Ｉ，Ｊ指令は出力されているので、ＣＡＭ的には移動要素はあるようです。<br>ただし、ポストが円弧と判断する限界値の設定は必要なので、その設定値が問題ではないか？と推測しました。</font></p>



<h2 class="wp-block-heading"><span id="toc4">カーネル設定変数</span></h2>



<p>ポストプロセッサには、<a href="https://www.kazuban.com/blog/fusion360-post-processor-04/#outline__1">こちらでも紹介している</a>、特殊な変数があります。<br>そのなかでも下記の円弧指令に関連すると思われる変数ですが、<br>この変数でデフォルト値を設定していますが、<br>この部分、あまり意識しないまま設定していました。</p>



<pre class="wp-block-preformatted">minimumChordLength = spatial(<strong>0.25</strong>, MM);
minimumCircularRadius = spatial(<strong>0.01</strong>, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(<strong>0.01</strong>);
maximumCircularSweep = toRad(180);</pre>



<p>とりあえず、小さいほうが精度がよくなりそうな気がしたので、あまり考えずデフォルトは「0.001」に設定するような仕様にしていました。</p>



<pre class="wp-block-preformatted">minimumChordLength = spatial(<strong>0.001</strong>, MM);
minimumCircularRadius = spatial(<strong>0.001</strong>, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(<strong>0.001</strong>);
maximumCircularSweep = toRad(180);</pre>



<p>「minimumChordLength」は、円弧の最小弦の長さ。<br>「minimumCircularRadius」は、円弧の最小半径です。<br>推測するに、ＣＡＭ側からこの数値よりも小さい値の円弧が定義された場合には、円弧指令コード「G02 , G03」コードは出力せずに、直線補間コード「G01」を出力するのだと思います。<br>この変数は、<span class="markerPink"> ポスト処理のプロパティで設定可能</span>です</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="603" height="540" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting.png" alt="" class="wp-image-4186" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting.png 603w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting-300x269.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></figure>



<p>標準ポスト「fanuc.cps」のプロパティで「（ビルトイン）最小弦の長さ」を「<strong>0.001</strong>」にした所<br>今回テーマと同様の<span class="markerPink"> 不具合のあるNCデータを吐き出しました。</span><br>このプロパティは、設定値より大きい場合、円弧として出力するような意味のようです。</p>



<h2 class="wp-block-heading"><span id="toc5">小数点以下桁数</span></h2>



<p>もう一つ重要な変数があります。</p>



<pre class="wp-block-preformatted">var xyzFormat = createFormat({decimals:(unit == MM ? 3 : 4), forceDecimal:true});</pre>



<p>これは、Ｘ，Ｙ，Ｚの出力フォーマットは、「mm」単位であれば、<strong>小数点以下３桁</strong>で出力しろ、の定義です。<br>この設定値と上のプロパティの設定値の関係が不具合の原因がだったと分かってきました。<br>「円の弦の長さプロパティ」を「0.001」に設定した場合、CAMからの指令が「0.001」よりも若干でも大きい場合、ポストは円弧指令として出力させます。<br>ところが、ＸＹ軸の小数点以下出力桁数は３桁なので、<strong>単軸</strong>での移動距離が「0.001」より小さい場合には、まるめ方によっては移動距離ゼロ（直前と同じ値）になります。<br><span class="markerPink">結局、モーダル仕様の場合、Ｘ，Ｙ指令は省略される</span>事になります。<br>これが、「G02 I0.429 J-0.294」と出力され、真円動作となり食い込みが発生した原因ではないでしょうか？！。<br>ちなみに、小数点以下桁数を、<strong>４桁</strong>にしたとろ</p>



<pre class="wp-block-preformatted">var xyzFormat = createFormat({decimals:(unit == MM ? 4 : 4), forceDecimal:true});</pre>



<p>食い込み動作は発生しませんでした。</p>



<h2 class="wp-block-heading"><span id="toc6">解決策</span></h2>



<p>したがって、<span class="markerPink"> 「minimumChordLength（円弧最小弦長さ）」は、ＸＹ軸の小数点出力桁数よりも一桁大きな数値</span>にしたほうが安全だと言えます。<br>さらに、どうしても微小な円弧補間が必要な場合を除いて、「minimumCircularRadius（円弧最小半径）」も極端に小さくする必要ななさそうです。<br>NC指令値の小数点以下桁数を、増やすのも一つの策ですし、実際に１μを狙う機械には４や５にしています。<br>ただし、工作機械によっては、小数点以下３桁以上では動作しないか誤動作する機械もあるので注意が必要です。<br>まずは「minimumChordLength」のデフォルトは、２桁（0.01）で対応しようと思います。</p>



<pre class="wp-block-preformatted">minimumChordLength = spatial(<strong>0.01</strong>, MM);
minimumCircularRadius = spatial(0.01, MM);
maximumCircularRadius = spatial(1000, MM);
minimumCircularSweep = toRad(0.001);
maximumCircularSweep = toRad(180);</pre>



<h2 class="wp-block-heading"><span id="toc7">二重対策</span></h2>



<p>これで、デフォルトで使用する場合では今回のような不具合は発生しないと思いますが、<br>いいのか？悪いのか？Fusion360はポスト設定プロパティ画面で変更が可能になってます。<br>「（ビルトイン）最小弦の長さ」を「0.001」に変更してしまうと、同様のデータが出力されてしまう可能性がありますね。<br>安全を考慮するなら、この部分もポスト側でチェックさせてほうがいいと思います。<br>方法は、２種類考えられます。<br>一つは、「var xyzFormat」変数の、「decimals:」の値と、「minimumChordLength」の値を比較して、エラーを出力させる方法です。<br>もう一つは、<span class="markerPink"> 円弧出力時に、Ｘ，Ｙ軸指令両方が省略されたら、その指令自体省略してしまう</span>方法です。<br>今回は、後者で対策しようと思います。</p>



<h2 class="wp-block-heading"><span id="toc8">ポスト修正</span></h2>



<p>ポストプロセッサの「円弧補間」を出力する関数は、<font size="+1">「<strong>onCircular( )</strong>」</font>です。<br>この関数を修正します。<br>以前紹介した、<a href="https://www.kazuban.com/blog/fusion360-post-processor-01/#outline__2_1">「Microsoftの「Visual Studio Code」」</a>であれば、「FUNCTION LIST」から簡単に関数を見つける事ができます。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/onCircular-1024x551.png" alt=""/></figure>



<p>この関数の上部では、</p>



<pre class="wp-block-preformatted">if (isFullCircle()) {
 ・
 ・</pre>



<p>で、真円かどうかの条件判断をしています。<br>今回の場合、Ｘ，Ｙの指令がモーダルにより省略されて真円動作となってしまいましたが、本質的には真円ではないので、この条件のブロックには属しません。<br>このブロックから抜けた、</p>



<pre class="wp-block-preformatted">} else if (!properties.useRadius) {</pre>



<p>このブロック以降が対象となります。<br>まず、<font size="+1">「<strong>!properties.useRadius</strong>」</font>の意味は、プロパティ設定で「円弧指令にＲ指令を使わない」の意味で、<br>この場合に、このブロックを実行します。<br>「円弧にＲ指令を使う場合」にはその次の「else」以下のブロックになります。<br>R指令の場合は、円弧が１８０度以上の場合には「マイナス（ー）」指示となるため、今回の場合にはCAMは「マイナス（ー）」指令は出さないと思います。<br>したがって、<font size="+1">「<strong>!properties.useRadius</strong>」</font>の「円弧指令にＲ指令を使わない」場合のブロックを修正します。<br>修正の概要としては、<br>・まずＸ，Ｙ，Ｚ軸の出力内容を、変数に代入<br>・その、Ｘ，Ｙの内容がどちらかでも「<strong>空（ヌル）</strong>」でない場合のみ<br>・円弧補間（G02,G03）の出力<br>・逆に、どちらも「<strong>空（ヌル）</strong>」の場合に、出力省略。<br>・同様処理を、ＺＸ、ＹＺ平面にも適応<br>という処理に変更したいと思います。</p>



<pre class="wp-block-preformatted">　・
　・
&nbsp;&nbsp;}&nbsp;else&nbsp;if&nbsp;(!properties.useRadius)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(getCircularPlane())&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;PLANE_XY:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xOut&nbsp;=&nbsp;xOutput.format(x);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;yOut&nbsp;=&nbsp;yOutput.format(y);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;zOut&nbsp;=&nbsp;zOutput.format(z);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(<strong>!(xOut==""&nbsp;&amp;&amp;&nbsp;yOut=="")</strong>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//writeBlock(gPlaneModal.format(17),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOutput.format(x),&nbsp;yOutput.format(y),&nbsp;zOutput.format(z),&nbsp;iOutput.format(cx&nbsp;-&nbsp;start.x,&nbsp;0),&nbsp;jOutput.format(cy&nbsp;-&nbsp;start.y,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeBlock(gPlaneModal.format(17),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOut,&nbsp;yOut,&nbsp;zOut,&nbsp;iOutput.format(cx&nbsp;-&nbsp;start.x,&nbsp;0),&nbsp;jOutput.format(cy&nbsp;-&nbsp;start.y,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;PLANE_ZX:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xOut&nbsp;=&nbsp;xOutput.format(x);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;yOut&nbsp;=&nbsp;yOutput.format(y);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;zOut&nbsp;=&nbsp;zOutput.format(z);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(<strong>!(zOut==""&nbsp;&amp;&amp;&nbsp;xOut=="")</strong>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//writeBlock(gPlaneModal.format(18),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOutput.format(x),&nbsp;yOutput.format(y),&nbsp;zOutput.format(z),&nbsp;iOutput.format(cx&nbsp;-&nbsp;start.x,&nbsp;0),&nbsp;kOutput.format(cz&nbsp;-&nbsp;start.z,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeBlock(gPlaneModal.format(18),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOut,&nbsp;yOut,&nbsp;zOut,&nbsp;iOutput.format(cx&nbsp;-&nbsp;start.x,&nbsp;0),&nbsp;kOutput.format(cz&nbsp;-&nbsp;start.z,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;PLANE_YZ:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xOut&nbsp;=&nbsp;xOutput.format(x);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;yOut&nbsp;=&nbsp;yOutput.format(y);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;zOut&nbsp;=&nbsp;zOutput.format(z);&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(<strong>!(yOut==""&nbsp;&amp;&amp;&nbsp;zOut=="")</strong>){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//writeBlock(gPlaneModal.format(19),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOutput.format(x),&nbsp;yOutput.format(y),&nbsp;zOutput.format(z),&nbsp;jOutput.format(cy&nbsp;-&nbsp;start.y,&nbsp;0),&nbsp;kOutput.format(cz&nbsp;-&nbsp;start.z,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeBlock(gPlaneModal.format(19),&nbsp;gMotionModal.format(clockwise&nbsp;?&nbsp;2&nbsp;:&nbsp;3),&nbsp;xOut,&nbsp;yOut,&nbsp;zOut,&nbsp;jOutput.format(cy&nbsp;-&nbsp;start.y,&nbsp;0),&nbsp;kOutput.format(cz&nbsp;-&nbsp;start.z,&nbsp;0),&nbsp;getFeed(feed));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;default:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(properties.allow3DArcs)&nbsp;{
　・
　・</pre>



<h2 class="wp-block-heading"><span id="toc9">確認</span></h2>



<p>オリジナルと修正したポストファイル両方でパス出力し比較してみます。<br>比較しやすように、シーケンス番号は出力させず<br>どちらも「（ビルトイン）最小弦の長さ」は「0.001」にしています。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/comp-1024x604.png" alt=""/></figure>



<p>予定通り、Ｉ，Ｊのみの、円弧補間の行は出力されていません。<br>TRYCUTでNCデータシミュレーションしてみます。<br>食い込みは改善されました！</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/05/Trycut-ok.png" alt=""/></figure>



<h2 class="wp-block-heading"><span id="toc10">まとめ</span></h2>



<p>今回の不具合は標準ポストでデフォルト設定での使用では出なかった不具合ですが、<br>プロパティでは変更できてしまう設定なので、やはり危険ではあります。<br>また、Fusion360のシミュレータはCAMレベルでのシミュレーションなので<br>ポスト出力も含め、NCデータの不具合は発見できません。<br>特に、ポストプロセッサを自作や編集で使う場合は<br>やはり、実加工前には最終的にNC工作機械へ入力する、<br>NCデータシミュレーターはほしいですね。<br></p>



<p><br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/fusion360-collision/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Fusin360 CAMポストプロセッサ徹底解説・onSectionEnd( ) &#038; onClose( )</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-10/</link>
					<comments>https://www.kazuban.com/blog/fusion360-post-processor-10/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 20 Feb 2021 02:16:24 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=5026</guid>

					<description><![CDATA[いよいよ最後の締めくくりです。今回検討している、NCデータ仕様では、各セクション（工程）の終了と、NCプログラム全体の終了処理を担当します。 目次 加工後の終了処理現状の状態最初のG17 の削除①M09（クーラント停止） [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>いよいよ最後の締めくくりです。<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-06/#outline__3" target="_blank">今回検討している、NCデータ仕様</a>では、各セクション（工程）の終了と、NCプログラム全体の終了処理を担当します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">加工後の終了処理</a></li><li><a href="#toc2" tabindex="0">現状の状態</a></li><li><a href="#toc3" tabindex="0">最初のG17 の削除</a></li><li><a href="#toc4" tabindex="0">①M09（クーラント停止）</a></li><li><a href="#toc5" tabindex="0">②M05（主軸回転停止）</a><ol><li><a href="#toc6" tabindex="0">onCommand( )関数</a></li></ol></li><li><a href="#toc7" tabindex="0">③G91G28Z0.　（リファレンス点へ退避）④G49（工具長補正キャンセル）⑤G90G00G17（モーダル情報リセット）</a></li><li><a href="#toc8" tabindex="0">⑥M01（オプショナルストップ）</a></li><li><a href="#toc9" tabindex="0">⑦M30⑧%</a></li><li><a href="#toc10" tabindex="0">終了です。</a></li><li><a href="#toc11" tabindex="0">完成ポストファイル</a><ol><ol><li><a href="#toc12" tabindex="0">Fusion360 ポストの情報</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">加工後の終了処理</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>セクション（工程）の終了<br><br>①M09　（クーラント停止）<br>②M05　（主軸回転停止）<br>③G91G28Z0.　（リファレンス点へ退避）<br>④G49　（工具長補正キャンセル）<br>⑤G90G00G17　（モーダル情報リセット）<br>⑥M01　（単工程再加工考慮、オプショナルストップ）</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>ポスト処理終了<br><br>⑦M30<br>⑧%</p></blockquote>



<p>工程と全体の終了処理です。<br>各工程の終了時には、クーラントや主軸回転停止、退避処理、を行い、機械側で一旦停止ができるように「M01」を出力させます。<br>全体では「M30」と「%」で終了とします。</p>



<h2 class="wp-block-heading"><span id="toc2">現状の状態</span></h2>



<p>まずは、現状で出力させてみます。</p>



<pre class="wp-block-preformatted">N0001
・
・
(---- <strong>onSectionEnd</strong> ----)
(----<strong> End of onSectionEnd </strong>----)
・
N0002
・
・
(---- <strong>onSectionEnd</strong> ----)
<strong>G17</strong>
(---- <strong>End of onSectionEnd </strong>----)
・
N0003
・
・
(---- <strong>onSectionEnd</strong> ----)
(----<strong> End of onSectionEnd</strong> ----)
(---- <strong>onClose</strong> ----)

<strong>M09
G91G28Z0.
G49
G90G00G17
G49
G91G28X0.Y0.
G90G00G17
M30
%</strong>
(---- <strong>End of onClose</strong> ----)</pre>



<p>オリジナルの「fanuc.cps」では、今回やらせたいキャンセル処理などは、「onSection( )」が担当しているので、「onSectionEnd( )」では、ほとんど出力されていませんね。<br>したがって、<span class="markerYellow">「onSection( )」でのキャンセル処理を「onSectionEnd( )」に移行させます</span></p>



<h2 class="wp-block-heading"><span id="toc3">最初のG17 の削除</span></h2>



<p>２工程目（N0002）のセクションでは、１工程目の加工データが「G19」モードで終了しているため、「G17」コードが出力されています。<br>今回は、<br>⑤G90G00G17　（モーダル情報リセット）<br>で事前のモーダル状態にかぎらず、無条件にリセットコードを出力させようと思っているので、ここでは無効にします。</p>



<pre class="wp-block-preformatted">function onSectionEnd() {
//kazuban 2021/01/08
writeln("(---- onSectionEnd ----)");
if (typeof inspectionProcessSectionEnd == "function") {
inspectionProcessSectionEnd();
}
<strong>//kazuban 2021/02/14
//writeBlock(gPlaneModal.format(17));</strong></pre>



<h2 class="wp-block-heading"><span id="toc4">①M09（クーラント停止）</span></h2>



<p>次に、「M09」を出力させます。<br>これは簡単ですね。<br>onSection( )でも使用した、「setCoolant( )」を利用します。</p>



<p>setCoolant(COOLANT_OFF);</p>



<p>を追加する事で、「M09」を出力する事ができます。</p>



<h2 class="wp-block-heading"><span id="toc5">②M05（主軸回転停止）</span></h2>



<p>こちらは、出力させる関数は見当たりませんね。<br>単純に「writeln(&#8220;M05&#8221;)」とするだけで、「M05」を出力させる事はできますが、「fanuc.cps」では結構面倒な事しています。<br>「onCommand( )」関数で出力させています。</p>



<h3 class="wp-block-heading"><span id="toc6">onCommand( )関数</span></h3>



<p>ただし、この関数がまた、複雑です。<br>なんでこんなプログラムにしたのか？よくわかりません。<br>簡単に分析してみると、引数で「コマンド」のキーワードを受け取り、<br>「COMMAND_COOLANT_OFF」など「switch文」でいくつかのコマンドは分類されます。<br>ただし、「switch文」に当てはまらない場合には、<br>var stringId = <strong><span class="has-inline-color has-vivid-red-color">getCommandStringId(command)</span></strong><br>というパブリック関数でキーワードに変換し、<br>さらに、mapCommand[stringId]という連想配列で、Ｍコード番号を取り込み<br>writeBlock(mFormat.format(mcode))　でやっと出力させています。</p>



<p>う～ん、ここまで複雑にする必要があるのだろうか・・・<br>いずれにしても、<br>onCommand(COMMAND_STOP_SPINDLE);<br>のコードで、「M05」が出力できるみたいです。</p>



<p>ここで、「<em>ZENKYU</em>」さんのコメントにあるように、「M03」コードが出力されないバグがありました。<br>一つは「onSection( ) No2」での単純なミスでした。<br>ここは元記事を直しています。<br>もう一つは、「同じ工具（同じ回転数）」の場合、省略されるようです。<br>いろいろ方法はあるかと思いますが、私は「onCommand( )」関数を修正する方法とします。<br>この関数の最後に、「COMMAND_STOP_SPINDLE」の場合の定義を追加して、この場合は強制的にスピンドル指令をださせるようにします。</p>



<pre class="wp-block-preformatted">  ・
  ・
  case COMMAND_PROBE_OFF:
    return;
  //kazuban 2021/01/21
  <strong>case COMMAND_STOP_SPINDLE:</strong>
    <strong><span class="has-inline-color has-vivid-red-color">forceSpindleSpeed=true;</span></strong>
}</pre>



<p>これで、同じ回転数の場合でも強制的に主力されると思います。<br>今回は、上述のG17出力をコメントにした、行の次に下記コードを追加する事で「M09」「M05」を出力できます。</p>



<pre class="wp-block-preformatted"><strong>setCoolant(COOLANT_OFF);
onCommand(COMMAND_STOP_SPINDLE);</strong></pre>



<h2 class="wp-block-heading"><span id="toc7">③G91G28Z0.　（リファレンス点へ退避）<br>④G49（工具長補正キャンセル）<br>⑤G90G00G17（モーダル情報リセット）</span></h2>



<p>このコードは、<a href="https://www.kazuban.com/blog/fusion360-post-processor-08/" data-type="URL" data-id="https://www.kazuban.com/blog/fusion360-post-processor-08/">「onSection( )」の最初</a>にも出てきました。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-じじぃの引出し wp-block-embed-じじぃの引出し"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion360-post-processor-08/" title="Fusin360 CAMポストプロセッサ徹底解説・onSection( )の編集 No1" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="160" height="72" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/onSection_No1.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/01/onSection_No1.png 762w, https://www.kazuban.com/blog/wp-content/uploads/2021/01/onSection_No1-300x135.png 300w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusin360 CAMポストプロセッサ徹底解説・onSection( )の編集 No1</div><div class="blogcard-snippet internal-blogcard-snippet">前回は、NCプログラムの始まりを担当する、onOpen( )関数を編集しました。今回は、各セクション（工程）ごとの始まりを担当する、onSection( )を編集していきます。オリジナルポストの確認前回、オリジナル（fanuc.cps）のonOpen部分を改造し「fanuc_new.cps」として保...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.01.24</div></div></div></div></a>
</div></figure>



<p>その時に<a href="https://www.kazuban.com/blog/fusion360-post-processor-08/#outline__3_4" target="_blank">「writeRetract<strong>()</strong>」関数</a>を編集したので、この関数を呼び出す事で、同じコードを出力させる事ができます。</p>



<pre class="wp-block-preformatted">function onSectionEnd() {
  //kazuban 2021/01/08
  writeln("(---- onSectionEnd ----)");
  if (typeof inspectionProcessSectionEnd == "function") {
    inspectionProcessSectionEnd();
   }
   //kazuban 2021/02/14
   //writeBlock(gPlaneModal.format(17));
   setCoolant(COOLANT_OFF);
   onCommand(COMMAND_STOP_SPINDLE);
 <strong>  writeRetract(Z);</strong> // retract
    ・
    ・</pre>



<h2 class="wp-block-heading"><span id="toc8">⑥M01（オプショナルストップ）</span></h2>



<p>実際の加工においては、一つの工程が終了した時点で、ストップし加工状況や加工精度を確認したい場合があります。<br>確実に停止したい場合には、「<strong>M00</strong>」のコードを使用しますが、状況による場合には「<strong>M01</strong>」コードを使用します。<br>これは、機械側でこのオプションスイッチを有効にした場合のみ停止させるコードです。<br>今回のＮＣデータ構成においては、<span class="markerYellow">各工程の先頭に<strong>工程と同じ</strong>シーケンス番号を追加し</span>、ＮＣデータの最初の<span class="markerYellow">「<strong>GOTO 文</strong>」で任意の工程へジャンプさせる</span>ような仕様にしています。<br>仕上げ工程などの場合、一旦加工を停止し、測定などした後に再度この工程を行いたい場合に、このオプションを利用します。</p>



<p>具体的には、２７１６行付近の、onSectionEnd( )関数のブロックの最後に下記のコードを追加します。</p>



<pre class="wp-block-preformatted">    ・
    ・
  //kazuban 2021/02/20
  if <strong>(properties.optionalStop</strong>) {
    <strong>onCommand(COMMAND_OPTIONAL_STOP)</strong>;
  }
  //kazuban 2021/01/08
  writeln("(---- End of onSectionEnd ----)");
}</pre>



<p>ポストのプロパティで出力制御が可能なように、「properties.optionalStop」が「true」な場合のみ、「M01」を出力する仕様にしています。<br>ここまでで、「onSectionEnd( )」関数の改造は終了です。</p>



<h2 class="wp-block-heading"><span id="toc9">⑦M30<br>⑧%</span></h2>



<p>後は、onClose( )関数です。<br>不要な改行を削除し<br>リトラクト、工具長補正キャンセルは、onSectionEnd( )で、各工程の終了でやらせる仕様としたので、ここでは無効にします。<br>「M30」と「%」の出力はオリジナルのコードをそのまま使用します。</p>



<pre class="wp-block-preformatted">function onClose() {
 //kazuban 2021/01/05
 writeln("(---- onClose ----)");
 nullProbeAngle(false);
 <strong>//kazuban 2021/02/20
 //writeln("");</strong>
 optionalSection = false;
 onCommand(COMMAND_COOLANT_OFF);
 <strong>//kazuban 2021/02/20
 //writeRetract(Z); // retract
 //disableLengthCompensation(true);</strong>
 setSmoothing(false);
 zOutput.reset();
 setWorkPlane(new Vector(0, 0, 0)); // reset working plane
 if (isG54x4Used) {
   writeBlock(gFormat.format(54.4), "P0");
 }
 //kazuban 2021/02/20
 //writeRetract(X, Y); // return to home
 onImpliedCommand(COMMAND_END);
 onImpliedCommand(COMMAND_STOP_SPINDLE);
<strong> writeBlock(mFormat.format(30));</strong> // stop program, spindle stop, coolant off
 if (subprograms.length &gt; 0) {
   writeln("");
   write(subprograms);
 }
<strong> writeln("%");</strong>
 //kazuban 2021/01/05
 writeln("(---- End of onClose ----)");
}</pre>



<h2 class="wp-block-heading"><span id="toc10">終了です。</span></h2>



<p>早速ポスト処理させてみましょう！</p>



<pre class="wp-block-preformatted">%
<strong> O1001 (M10)
 (T1 D=12. CR=0. - ZMIN=-9.995 - FLAT END MILL)
 (T21 D=6. CR=0. TAPER=140DEG - ZMIN=-16. - DRILL)</strong>
 <strong>G90G94G17G49G40G80
 G54
 GOTO 1</strong>
 (---- End of onOpen ----)
 (--- onSection ---)
<strong> N0001
 (T01 D=12.000 R=0.000 ZMIN=-9.995 )
 ( ap:0.02D ae:1D )
 G91G28Z0.
 G90G00G17
 T1
 M06
 G00G43Z30.H01
 S2300M03
 M08
 G04X10.</strong>
 (---- End of onSection ----)
 G00X-44.303Y-9.527
 Z5.
 ・
 ・　（加工データ）
 ・
 X-39.768Z0.205
 G00Z30.
 (---- onSectionEnd ----)
 <strong>M09
 M05
 G91G28Z0.
 G49
 G90G00G17
 M01</strong>
 (---- End of onSectionEnd ----)
 (--- onSection ---)
<strong> N0002
 (T01 D=12.000 R=0.000 ZMIN=-9.980 )
 ( ap:0.02D ae:1D )
 G91G28Z0.
 G90G00G17
 /T1
 /M06
 G00G43Z30.H01</strong>
 <strong>S2300M03
 M08
 G04X10.</strong>
 (---- End of onSection ----)
 G00X-37.2Y11.2
 Z5.
 ・
 ・　（加工データ）
 ・
 G19G02Y8.8Z-8.78K1.2
 G00Z30.
 (---- onSectionEnd ----)
 <strong>M09
 M05
 G91G28Z0.
 G49
 G90G00G17
 M01</strong>
 (---- End of onSectionEnd ----)
 (--- onSection ---)
 <strong>N0003
 (T21 D=6.000 R=0.000 ZMIN=-16.000 )
 ( NSB-Drill )
 G91G28Z0.
 G90G00G17
 T21
 M06
 G00G43Z30.H21
 S2650M03
 M08
 G04X10.</strong>
 (---- End of onSection ----)
 G00X-40.Y15.
 ・
 ・　（加工データ）
 ・
 Z30.
 (---- onSectionEnd ----)
<strong> M09
 M05
 G91G28Z0.
 G49
 G90G00G17
 M01</strong>
 (---- End of onSectionEnd ----)
 (---- onClose ----)
 <strong>M30
 %</strong>
 (---- End of onClose ----)</pre>



<p>いかがでしょうか？<br>ほぼ思い通りに出力されていますが、最初の初期化コード<br>「G90G94G17G49G40G80」を編集忘れていました。<br>「G94」は「G00」にする予定でした。<br>ここが気になる方は、「<strong>onOpen( )</strong>」を編集してみてください。<br>また、今回のポスト構成は、「&#8212;- End of onSection &#8212;-」と「&#8212;- onSectionEnd &#8212;-」の間に実際の加工プログラムが出力されます。<br>この部分を、サブプロファイルとして別ファイルい出力させ、「M98」や「M198」で呼び出す仕様にすれば、メイン・サブ構成のNCプログラムにも変化させる事も可能です。<br>サブプロ化のポストプロセッサは、要望あれば検討します。</p>



<h2 class="wp-block-heading"><span id="toc11">完成ポストファイル</span></h2>



<p>参考までに、完成したポストファイルを公開しようと思いましたが、<br>やはりオリジナルの著作権などもあると思うのでここでの公開は<br>やめようと思います。<br><a href="https://cam.autodesk.com/posts/posts/guides/Post%20Processor%20Training%20Guide.pdf" data-type="URL" data-id="https://cam.autodesk.com/posts/posts/guides/Post%20Processor%20Training%20Guide.pdf">このトレーニングガイド</a>の「1-6」ページ<br>「<strong>1.5 Creating/Modifying a Post Processor</strong>」の中に</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>The good news is, all of posts are open source and can be modified without limitation to create the post you need. </p></blockquote>



<p>とあるので、おそらく大丈夫だとは思うのですが、ブログでの公開でなく配布形式にしようと思います。<br>Fusion360 ポストの改造を検討している方であれば、何かしらの参考になるかと思います。<br>もし興味ある方がいらっしゃれば、<a href="https://www.kazuban.com/blog/page-1709/">こちらまで問い合わせいただければ、</a>Ｅメール経由で配布いたします。<br><br></p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc12">Fusion360 ポストの情報</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li>グローバルセクション</li><li>関数</li><li>NCプログラム仕様検討</li><li>onOpen( )</li><li>onSection( ) No1</li><li><span class="has-inline-color has-black-color">onSection( ) No2</span></li><li><strong><span class="has-inline-color has-vivid-purple-color"><span style="text-decoration: underline;">onSectionEnd( ) &amp; onClose( )</span></span></strong></li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <span aria-current="page" class="page-numbers current">10</span>
  <!-- <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">NEXT</a> -->
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/fusion360-post-processor-10/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Fusin360 CAMポストプロセッサ徹底解説・onSection( )の編集 No2</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-09/</link>
					<comments>https://www.kazuban.com/blog/fusion360-post-processor-09/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 07 Feb 2021 02:37:49 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4839</guid>

					<description><![CDATA[onSection( )改造の第二弾です。前回は、シーケンス番号、工具情報、リファレンス点へ退避、工具長補正キャンセル、モーダル初期化、まで行いました。今回は、⑥～⑪　工具交換、工具長補正、主軸回転、クーラント、ドゥウェ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>onSection( )改造の第二弾です。<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-08/">前回は、</a>シーケンス番号、工具情報、リファレンス点へ退避、工具長補正キャンセル、モーダル初期化、まで行いました。<br>今回は、⑥～⑪　工具交換、工具長補正、主軸回転、クーラント、ドゥウェルのコードの出力を行います。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-8" checked><label class="toc-title" for="toc-checkbox-8">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">onSection( )編集 第二弾</a></li><li><a href="#toc2" tabindex="0">不要コード削除</a></li><li><a href="#toc3" tabindex="0">注釈（notes）</a></li><li><a href="#toc4" tabindex="0">⑥、⑦　工具交換指令</a><ol><li><a href="#toc5" tabindex="0">クーラントOFF指令</a></li><li><a href="#toc6" tabindex="0">オプショナルストップ</a></li><li><a href="#toc7" tabindex="0">工具番号の制限</a></li><li><a href="#toc8" tabindex="0">disableLengthCompensation()</a></li><li><a href="#toc9" tabindex="0">工具交換指令</a></li></ol></li><li><a href="#toc10" tabindex="0">⑨回転指令を移動処理</a></li><li><a href="#toc11" tabindex="0">⑧G00G43Z30.H01・工具長補正指令</a></li><li><a href="#toc12" tabindex="0">⑨スピンドル回転⑩クーラントコード⑪ドゥウェル</a></li><li><a href="#toc13" tabindex="0">onSection( ) 改造終了</a></li><li><a href="#toc14" tabindex="0">まとめ</a><ol><ol><li><a href="#toc15" tabindex="0">Fusion360 ポストの情報</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">onSection( )編集 第二弾</span></h2>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow"><p>セクション（工程）の始まり<br><br><em>①N0001　（工程番号と同じシーケンス番号）<br>②（工具情報）<br>③G91G28Z0.　（途中再開時の安全を考慮して工具退避）<br>④G49　（工具長補正キャンセル）<br>⑤G90G00G17　（とりあえずモーダルコードリセット）</em><br><strong>⑥T01　（工具番号）<br>⑦M06　（行を分け工具交換、Tと同じ行ではNGな機種への対応）<br>⑧G00G43Z30.H01　（工具長補正、この例では、T番号とH番号は同じ）⑨S2300M03　（スピンドル回転）<br>⑩M08　（クーラントコード、飛び散り防止で回転の後で指令）<br>⑪G04X10.　（クーラントの安定を待つ、PとXでの指令あり）</strong></p></blockquote>



<p>前回までの改造で、一度NCデータを出力させてみます。<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-08/#outline__1">使用工具の情報により、３パターンありました</a>が、全ての要素が含まれている、３パターン目（２回目以降で前工具と違う工具の場合）を見てみましょう。</p>



<pre class="wp-block-preformatted"> (--- onSection ---)
 N0003
 (T21 D=6.000 R=0.000 ZMIN=-16.000 )
 ( NSB-Drill )
 G91G28Z0.
 G49
 G90G00G17

<strong> (6)
 M09
 M01
 T21M06
 (NSB-DRILL)
 S2650M03
 G54
 M08
 G00X-40.Y15.
 G43Z30.H21
</strong> (---- End of onSection ----)</pre>



<p>これを基本に、希望の出力に改造していきましょう。</p>



<h2 class="wp-block-heading"><span id="toc2">不要コード削除</span></h2>



<p>前回「G90G00G17」までは完成しています。<br>次に⑥工具呼び出しですが、その前に、今回には不要なコードが出力されています<br>まず、「改行」がありますが、これは省きたいと思います<br>次に、「(6)」と言うコメントが出力されています。<br>これは、Fusion360　CAMで、ドリル機能を設定した時の名前です。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/Drill6.png" alt=""/></figure>



<p>テスト的に何度かドリルを定義したので、「６」は自動的につけられた番号です。<br>「ドリル」が日本語（２バイト文字）なので、ポストにより日本語部が省かれたのだと思います。<br>次に「M01」が出力されています。<br>これは、<span class="markerBlue"> onSectionEnd( ) にやられようと思っている</span>ので、ここでは無効にします。</p>



<pre class="wp-block-preformatted">if (hasParameter("operation-comment")) {
     var comment = getParameter("operation-comment");
     if (comment &amp;&amp; ((comment !== lastOperationComment) || !patternIsActive || insertToolCall)) {
<strong>       //kazuban 2021/01/30
       //writeln("");
       //writeComment(comment);</strong>
       lastOperationComment = comment;
     } else if (!patternIsActive || insertToolCall) {
     <strong>  //writeln("");</strong>
     }
   } else {
   <strong>  //writeln("");</strong>
   }</pre>



<p>改造中の「fanuc_new.cps」の、１２０４行付近の「hasParameter( )」以降のブロック内で、<br>「writeln( )」「writeComment( )」関数で出力させていますので、「／／」でコメント化して無効にしました。</p>



<h2 class="wp-block-heading"><span id="toc3">注釈（notes）</span></h2>



<p>次に工具交換指令ですが、その前に１２１８行付近に <strong>hasParameter(&#8220;notes&#8221;) </strong>という条件判断がありますね。</p>



<pre class="wp-block-preformatted">if (properties.showNotes &amp;&amp; <strong>hasParameter("notes")</strong>) {
　・
　・
}</pre>



<p>これは、定義済みのセクションをマウス右ボタンで表示されるダイアログの「注釈を変更」で定義した文字列をNCデータへコメント文として出力する定義です。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/notes.png" alt=""/></figure>



<p>デフォルトでは、「showNotes」プロパティが「false」になっているため、無視されますが、「true」にする事でNCデータにコメント文を追加できます。<br>このブロック内に、「RegExp(&#8220;^[\s]+&#8221;, &#8220;g&#8221;)」のようなコードがありますが、これは<strong>「正規表現」</strong>を利用する関数です。<br>文字列から指定したルールで希望の文字列のみを取り出す事ができます。<br>この例では、前後の「　」（スペース）を削除するために、利用しています。<br>もし、「正規表現」に興味ありましたら、検索してみてください。<br>非常に奥が深く、パズルみたいで面白そうですが筆者もあまり理解していません。</p>



<h2 class="wp-block-heading"><span id="toc4">⑥、⑦　工具交換指令</span></h2>



<p>１２３３行付近の「<strong>insertToolCall</strong>」で判定しているブロックでは、ポストが新しい工具挿入を確認したらこのブロックを実行します。<br>クーラント指令や工具交換指令などの出力を制御しています。</p>



<pre class="wp-block-preformatted">if (<strong>insertToolCall</strong>) {
   forceWorkPlane();

   <strong>onCommand(COMMAND_COOLANT_OFF)</strong>;
  ・
  ・
}</pre>



<h3 class="wp-block-heading"><span id="toc5">クーラントOFF指令</span></h3>



<p>工具交換指令の前に、このブロックでは、「クーラントOFF」の定義を行っています。<br>今回は「クーラントOFF」に関しては、セクション（工程）の終了時に指令する予定なので、ここでは不要ですが<br><span class="markerYellow"> 事前にOFFに設定されていればモーダルなのでここでは無視されます。</span><br>あえて、無効にする必要はないと思います。</p>



<h3 class="wp-block-heading"><span id="toc6">オプショナルストップ</span></h3>



<p>次に１２３９行付近で「オプショナルストップ」の定義になっています。<br>今回はここは出力させない予定なので、「／／」で無効にします。</p>



<pre class="wp-block-preformatted">if (!isFirstSection() &amp;&amp; properties.optionalStop) { 
  //kazuban 2021/01/31
  <strong>//onCommand(COMMAND_OPTIONAL_STOP);</strong>
}</pre>



<h3 class="wp-block-heading"><span id="toc7">工具番号の制限</span></h3>



<p>if (tool.number &gt; 99)　この条件判断で９９番以上の指令では、ワーニングを出力するように定義しています。<br>最近は、３桁指令でも受け入れる制御機も多いので、その場合には、「99」を変更してください。 </p>



<h3 class="wp-block-heading"><span id="toc8">disableLengthCompensation()</span></h3>



<p>次に、disableLengthCompensation() 関数が定義されています。<br>これは、工具長補正キャンセル（G49）を出力させるコードですが、<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-08/#outline__3_4">事前の④ですでに出力させているので、</a>ここではモーダルが効いているので無視されます。</p>



<h3 class="wp-block-heading"><span id="toc9">工具交換指令</span></h3>



<p>１２４８行付近、やっと工具交換指令が出てきました。<br>オリジナルでは、「T03 M06」と一行で工具呼出しと工具交換指令を行っていますが、<span class="markerYellow"> 機種によっては、２行に分割しなければエラーになる機械もありますし<br>逆に一行制限やどちらでもいい場合</span>もあります。<br>今回は、２行にしてみます。<br>Tool Comment も②で書き出しているので、ここでは、出力させません。</p>



<pre class="wp-block-preformatted"><strong>//kazuban 2021/01/31
writeBlock("T" + toolFormat.format(tool.number)); 
writeBlock(mFormat.format(6));
//writeBlock("T" + toolFormat.format(tool.number), mFormat.format(6));</strong>
if (tool.comment) {
   <strong>//writeComment(tool.comment);</strong>
}</pre>



<p>次の「showToolZMin」のブロックは「false」なので実行されません。<br>次の条件判断「if&nbsp;(properties.preloadTool)」もpropertiesで「false」に設定してあるので実行されません。<br>さて、工具交換も含めて上記の処理は、「<strong>insertToolCall</strong>」判定によるブロック内（１２３３～１２８５）で行われています。<br>「<strong>insertToolCall</strong>」判定なので、違う工具が設定された場合のみ工具交換コードが出力されるようになっていますが、今回は<span class="markerPink"> 同じ工具でも出力させたい</span>と思っています。<br>しかし、主軸と同じ工具を呼び出すとエラーになる機種もあるので、<br>オプショナルスキップ「／」を付加して機械側で対応する仕様とします。<br>１２８５付近の「if (insertToolCall){   }」ブロックの最後に、「else」処理を追加して、「insertToolCall」でなくても、「／」付きで工具交換指令を出力するようにします。</p>



<pre class="wp-block-preformatted">if (insertToolCall) {
   ・・
   ・・
}<strong>else{
  //kazuban 2021/01/31
  writeBlock("/T" + toolFormat.format(tool.number));
  writeBlock("/",mFormat.format(6));
}</strong></pre>



<p>新しい工具であれば・・のブロックを処理し、ない場合でも「／」を付加して工具交換指令を出力するように、追加しています。</p>



<h2 class="wp-block-heading"><span id="toc10">⑨回転指令を移動処理</span></h2>



<p>１２９１行付近、次で始まる<strong><em>長～い</em></strong>条件判断ブロック内で、スピンドル回転指令を出力させてます。</p>



<pre class="wp-block-preformatted">if (!isProbeOperation() &amp;&amp; 
・
・</pre>



<p>このブロック内の１３１３付近の「writeBlock( )」関数で、出力させています。</p>



<pre class="wp-block-preformatted">if (!tapping || (tapping &amp;&amp; !(properties.useRigidTapping == "without"))) {
<strong>  writeBlock(
    sOutput.format(spindleSpeed), mFormat.format(tool.clockwise ? 3 : 4)
  );</strong>
}</pre>



<p>今回やりたいのは、⑨回転指令は、⑧G00G43Z30.H01　の後へ移動させたいのでこの長いブロックを全て⑧の後方へ移動すればいいのですが、<br>コピペなどで⑧の後ろへ移動させるのは、ミスも出やすく結構大変です。<br>このような場合には、<a href="https://www.kazuban.com/blog/fusion360-post-processor-08/#outline__3_2">前回説明した</a>関数化するのも一つの方法です。<br>ただし、関数化するにしても、このブロック全部を新規の関数内へ移動する事になるので同様に大変です。<br>今回は、<span class="markerYellow"> writeBlock( ) で書き出している部分</span>を、<span class="markerPink"> 変数へ代入する</span>ような仕様に変更し、その変数を出力させたい場所でwriteBlock( ) させるようにします。<br>まず、１２９１行付近の、この if文 の直前に、適当な名前（<strong>spindleCode</strong>）のグローバル変数を宣言しておきます。</p>



<pre class="wp-block-preformatted">//kazuban 2021/02/06
<strong>var spindleCode;  </strong> 
if (!isProbeOperation() &amp;&amp;
・
・</pre>



<p>そうして、１３１３付近の「writeBlock( )」関数で書き出す予定のコードを書き出す代わりに、writeBlock をコメント化で無力化し、出力予定のコードをこの変数へ代入させます。</p>



<pre class="wp-block-preformatted"> ・
if (!tapping || (tapping &amp;&amp; !(properties.useRigidTapping == "without"))) {
  //kazuban 2021/02/06
 <strong> //writeBlock(</strong>
  <strong>//kazuban 2021/02/21
  //spindleCode = output.format(spindleSpeed),mFormat.format(tool.clockwise ? 3 : 4);</strong>
<strong>spindleCode = output.format(spindleSpeed)<span class="has-inline-color has-vivid-red-color"> + </span>mFormat.format(tool.clockwise ? 3 : 4);
  //);</strong>
}
 ・</pre>



<p>これで、回転指定は書き出されずに、変数「spindleCode」へ代入されました。<br><s>spindleCode = sOutput.format(spindleSpeed) <strong>, </strong> mFormat.format(tool.clockwise ? 3 : 4);</s><br>このコード間違っていました。<br>spindleCode = sOutput.format(spindleSpeed)<strong> +</strong> mFormat.format(tool.clockwise ? 3 : 4);<br>こちらにしないと、「M03」が出力させません。<br><span class="markerPink">「<strong>writeBlock(spindleCode)</strong>」</span>とする事で、任意の箇所へ書き出せるようになります。</p>



<h2 class="wp-block-heading"><span id="toc11">⑧G00G43Z30.H01・工具長補正指令</span></h2>



<p>次に、工具長補正指令の処理をしている場所を探しますが、その前に、「ワーク座標指令」と「クーラント指令」が見つかりました。<br>今回の構成では<span class="markerYellow">「ワーク座標系」指定は「onOpen( )」関数で、ＮＣデータの最初でのみの指令</span>としているので、ここでの出力は行いません。<br>また、「クーラント指令」は「スピンドル回転」の後にしたいので、やはりここでは出力させません。<br>１３５０付近と</p>



<pre class="wp-block-preformatted">    if (workOffset != currentWorkOffset) {
      //kazuban 2021/02/06
      <strong>//writeBlock(gFormat.format(54.1), "P" + p); // G54.1P</strong>
      currentWorkOffset = workOffset;
    }</pre>



<p>１３５７付近の「writeBlock」をコメント化します。</p>



<pre class="wp-block-preformatted">  if (workOffset != currentWorkOffset) {
    //kazuban 2021/02/06
    <strong>//writeBlock(gFormat.format(53 + workOffset)); // G54-&gt;G59</strong>
    currentWorkOffset = workOffset;
  }</pre>



<p>さらに、１３７２付近のクーラント指令もコメントにします</p>



<pre class="wp-block-preformatted">// set coolant after we have positioned at Z
//kazuban 2021/02/06
<strong>//setCoolant(tool.coolant);</strong></pre>



<p>さて、工具長補正指令は、１３９８行付近のこのブロック内で定義されています。</p>



<pre class="wp-block-preformatted">if (insertToolCall || !lengthCompensationActive || retracted || (!isFirstSection() &amp;&amp; getPreviousSection().isMultiAxis())) {
・
<strong>var offsetCode = 43;</strong>
・</pre>



<p>「offsetCode」変数へ、Gコードを代入し、後で出力させていますが、その前に、１４２０行付近で加工スタート位置へ位置決めさせています。<br>今回は、今後サブプロ化も考慮してここでは位置決めさせたくないので、このコードはコメントにします。<br>ただし<strong><font color="red">注意が必要</font></strong>です。<br><span class="markerYellow">工具交換後移動しないで、工具長補正位置まで下りてくる</span>ので、<br>機械の工具交換位置へ高いクランプなどがある場合、<span class="markerPink">ぶつかってしまいます。</span><br>工具長補正する高さは、<span class="markerYellow">確実に安全な高さに設定</span>してください。<br>場合によっては、工具長補正前に、「G90G00X0Y0」と加工原点への移動指令を追加したほうがいいかもしれません。</p>



<pre class="wp-block-preformatted">if (!machineConfiguration.isHeadConfiguration()) {
   <strong>//kazuban 2021/02/06
   //writeBlock(
   //  gAbsIncModal.format(90),
   //  gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y)   
  //);</strong>
   writeBlock(
     gMotionModal.format(0),
     gFormat.format(offsetCode),
     zOutput.format(initialPosition.z),
     hFormat.format(lengthOffset)
   );
   lengthCompensationActive = true; } else {
　　・
　　・</pre>



<p><br>位置決めは<strong>モーダル</strong>なので、ここで移動させなくても、実際の加工データ出力の際、必要であれば<strong>自動的</strong>に出力されます。<br>ここで、「!machineConfiguration.isHeadConfiguration()」の条件判断がでてきます。<br>詳細はよくわかりませんが、ヘッド軸がＸ，Ｙ，Ｚ以外の機械の事のようです。<br>特にマシンライブラリを定義していない筆者の環境では、この判断は否定（！）との判断で常にこのブロックを通りますので、このブロック内を修正します。<br>出力させたい、工具長補正指令は、１４２６行付近の「writeBlock( )」関数で出力させています。</p>



<pre id="block-37c27019-3842-42ab-a16f-f866fb13f570" class="wp-block-preformatted">if (<strong>!</strong>machineConfiguration.isHeadConfiguration()) {
   //kazuban 2021/02/06
   //writeBlock(
   //  gAbsIncModal.format(90),
   //  gMotionModal.format(0), xOutput.format(initialPosition.x), yOutput.format(initialPosition.y)   
  //);
   <strong>writeBlock(
     gMotionModal.format(0),
     gFormat.format(offsetCode),
     zOutput.format(initialPosition.z),
     hFormat.format(lengthOffset)</strong>
   );
   lengthCompensationActive = true; } else {
　　・
　　・</pre>



<h2 class="wp-block-heading"><span id="toc12">⑨スピンドル回転<br>⑩クーラントコード<br>⑪ドゥウェル</span></h2>



<p>ここまでで、⑧工具長補正指令まで終了しました。<br>⑧を定義していた、ブロックの次、１４５５行付近にこの３つの指令を追加します。</p>



<pre id="block-3b8a44c3-e8bb-4cba-8080-2140906a4cff" class="wp-block-preformatted">if (insertToolCall || !lengthCompensationActive || retracted || (!isFirstSection() &amp;&amp; getPreviousSection().isMultiAxis())) {
・
・
}
<strong>//kazuban 2021/02/06
writeBlock(spindleCode);
setCoolant(tool.coolant);
writeBlock(gFormat.format(4), "X10.");</strong></pre>



<h2 class="wp-block-heading"><span id="toc13">onSection( ) 改造終了</span></h2>



<p>やっと、終了しました。<br>ポスト処理させてみます。</p>



<pre class="wp-block-preformatted"> (--- onSection ---)
 <strong>N0001</strong>
 (T01 D=12.000 R=0.000 ZMIN=-9.995 )
 ( ap:0.02D ae:1D )
 G91G28Z0.
 G90G00G17
 T1
 M06
 G00G43Z30.H01
<strong> S2300
 M08</strong>
 G04X10.
 (---- End of onSection ----)
    ・
    ・
 (--- onSection ---)
 <strong>N0002</strong>
 (T01 D=12.000 R=0.000 ZMIN=-9.980 )
 ( ap:0.02D ae:1D )
 G91G28Z0.
 G49
 G90G00G17
 /T1
 /M06
 G00G43Z30.H01
 G04X10.
 (---- End of onSection ----)
   ・
   ・
 (--- onSection ---)
 <strong>N0003</strong>
 (T21 D=6.000 R=0.000 ZMIN=-16.000 )
 ( NSB-Drill )
 G91G28Z0.
 G49
 G90G00G17
 M09
 T21
 M06
 G00G43Z30.H21
<strong> S2650
 M08</strong>
 G04X10.
 (---- End of onSection ----)</pre>



<h2 class="wp-block-heading"><span id="toc14">まとめ</span></h2>



<p>だいたい、希望のデータになっていると思いますが、スピンドル回転と冷却指令が、N0002 の工程と N0003の工程 では思うように出力されていません。<br>これは、モーダルコードが効いているからで、次回、<strong>onSectionEnd( ) 関数</strong>で、各セクション（工程）の終了時に、回転と冷却指令のキャンセルコードを追加する予定です。<br>それでおそらく、この省略されているコードは出力されるようになると思います。<br>今回は、スピンドル回転指令の長いブロック処理を移動する方法が、ポイントの一つだったと思います。<br>このように、条件判断文が長く複雑な、ブロック全体を移動させるのは、面倒だしミスるリスクもあります。<br>プログラミング的には、関数化するのがいいのではないかと思いますが、今回は変数への代入方法でやってみました。</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc15">Fusion360 ポストの情報</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li>グローバルセクション</li><li>関数</li><li>NCプログラム仕様検討</li><li>onOpen( )</li><li>onSection( ) No1</li><li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">onSection( ) No2</span></span></strong></li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <span aria-current="page" class="page-numbers current">9</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">NEXT</a>
</div>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/fusion360-post-processor-09/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Fusin360 CAMポストプロセッサ徹底解説・onSection( )の編集 No1</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-08/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 24 Jan 2021 04:44:00 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4676</guid>

					<description><![CDATA[前回は、NCプログラムの始まりを担当する、onOpen( )関数を編集しました。今回は、各セクション（工程）ごとの始まりを担当する、onSection( )を編集していきます。 目次 オリジナルポストの確認１．最初のセク [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.kazuban.com/blog/fusion360-post-processor-07/">前回は、NCプログラムの始まりを担当する、onOpen( )関数を編集しました。</a><br>今回は、各セクション（工程）ごとの始まりを担当する、onSection( )を編集していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-10" checked><label class="toc-title" for="toc-checkbox-10">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">オリジナルポストの確認</a><ol><li><a href="#toc2" tabindex="0">１．最初のセクション（工程）の場合</a></li><li><a href="#toc3" tabindex="0">２．２回目以降で、直前工程と同じ工具を使用する場合</a></li><li><a href="#toc4" tabindex="0">３．２回目以降で、直前工程と違う工具を使用する場合</a></li><li><a href="#toc5" tabindex="0">３パターンから考察</a></li><li><a href="#toc6" tabindex="0">変更点</a></li></ol></li><li><a href="#toc7" tabindex="0">NCプログラムの構成</a></li><li><a href="#toc8" tabindex="0">onSection( )の改造 No1</a><ol><li><a href="#toc9" tabindex="0">①シーケンス番号</a></li><li><a href="#toc10" tabindex="0">②工具情報</a></li><li><a href="#toc11" tabindex="0">スピンドル回転停止</a></li><li><a href="#toc12" tabindex="0">③G91G28Z0.④G49⑤G90G00G17</a></li></ol></li><li><a href="#toc13" tabindex="0">まとめ</a><ol><ol><li><a href="#toc14" tabindex="0">Fusion360 ポストの情報</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">オリジナルポストの確認</span></h2>



<p>前回、オリジナル（fanuc.cps）のonOpen部分を改造し「fanuc_new.cps」として保存しました。<br>onSection( )はオリジナルのままなので、このファイルでポスト処理させてみます。<br>実際に処理させてわかりましたが、状況により３パターンの違いがみられました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>１．最初のセクション（工程）の場合<br>２．２回目以降で、直前工程と<strong>同じ</strong>工具を使用する場合<br>３．２回目以降で、直前工程と<strong>違う</strong>工具を使用する場合</p></blockquote>



<h3 class="wp-block-heading"><span id="toc2">１．最初のセクション（工程）の場合</span></h3>



<pre class="wp-block-preformatted">(---- onSection ----)
 G28G91Z0.
 G90

 (3)
 T1M06
 (AP0.02D AE1D)
 S2300M03
 G54
 M08
 G00X-44.303Y-9.527
 G43Z30.H01
 (---- End of onSection ----)</pre>



<h3 class="wp-block-heading"><span id="toc3">２．２回目以降で、直前工程と同じ工具を使用する場合</span></h3>



<pre class="wp-block-preformatted">(---- onSection ----)
(2D 7)
G00X-37.2Y11.2
(---- End of onSection ----)</pre>



<h3 class="wp-block-heading"><span id="toc4">３．２回目以降で、直前工程と違う工具を使用する場合</span></h3>



<pre class="wp-block-preformatted">(---- onSection ----)
 M05
 G28G91Z0.
 G90
 G49

 (6)
 M09
 M01
 T21M06
 (NSB-DRILL)
 S2650M03
 G54
 M08
 G00X-40.Y15.
 G43Z30.H21
 (---- End of onSection ----)</pre>



<h3 class="wp-block-heading"><span id="toc5">３パターンから考察</span></h3>



<p>最初のセクション（工程）の始まりは、<br>・工具退避<br>・G90、相対座標系<br>・加工機能コメント表示<br>・工具交換<br>・工具コメント、コメント表示<br>・主軸回転<br>・ワーク座標<br>・クーラント<br>・加工位置へ位置決め<br>・工具長補正<br>このようになっていますが、直前の工具と同じ工具を使用する場合には、<br><span class="markerYellow">工具交換を省略</span>するようで、ほとんど<span class="markerYellow">一つの工程として処理</span>されています。<br>直前の工具と違う場合には、ほぼ最初の工程の場合と同じ処理ですが、<br>回転やクーラントのキャンセルが追加になっています。</p>



<h3 class="wp-block-heading"><span id="toc6">変更点</span></h3>



<p><a href="https://www.kazuban.com/blog/fusion360-post-processor-06/#outline__3" target="_blank">今回考えているNCプログラム構成</a>は、先頭でワーク座標系指示を行い、<br>各セクション（工程）へは、「GOTO」の無条件ジャンプ指示で任意の工程からでもスタートできるようにしたいと考えています。<br>ジャンプ先番号は、デフォルトでは「GOTO 1」と「N0001」へのジャンプするコードにしますが、変更したければ、機械側で編集する仕様とします。<br>したがって、直前と同じ工具だからといって、<span class="markerYellow">工具交換などの処理を省略してしまうと、途中スタートで問題が出てきます。</span><br>使用工具の状態にはとらわれず、工程終了時には、<span class="markerPink">一旦すべてキャンセル</span>するような処理をさせたいと思います。<br>このキャンセル処理は、オリジナルの「funuc.cps」では、「<strong>onSection( )</strong>」でやらせているようですが、今回は「onSection( )」でのキャンセル」処理は無効にして「<strong>onSectionEnd( )</strong>」に担当させようと思っています。<br>ただし、工作機械によっては、主軸にある工具と同じ工具番号をＴ指令で指定するとアラームなる機械も存在します。<br>そのような場合、無理やりダミー工具と交換させる事も一つの方法として考えられますが、今回は、同じ工具だった場合には、「／」を追加して、オプショナルスキップで機械側での対応にしようかと思います。<br></p>



<h2 class="wp-block-heading"><span id="toc7">NCプログラムの構成</span></h2>



<p>上記を考慮して、ＮＣプログラム構成を再検討します。<br>筆者は基本的には使用工具状態にはとらわれず、全ての工程で下記のようなコードが出力するようにポストを改造していきます。<br>ただし、同じ工具だった場合には、「/T01」「/M06」とオプショナルスキップコードにしようと思います。<br>また、スピンドル回転やクーラント作動は、フルカバーでない機械は、クーラントが飛び散る場合もあるので、主軸が下りてきて工具長補正が完了した後とし、クーラントの安定と暖気を兼ねて、ドウェル指令を追加します。</p>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow"><p>セクション（工程）の始まり<br><br><strong>①N0001　（工程番号と同じシーケンス番号）<br>②（工具情報）<br>③G91G28Z0.　（途中再開時の安全を考慮して工具退避）<br>④G49　（工具長補正キャンセル）<br>⑤G90G00G17　（とりあえずモーダルコードリセット）</strong><br><em>⑥T01　（工具番号）<br>⑦M06　（行を分け工具交換、Tと同じ行ではNGな機種への対応）<br>⑧G00G43Z30.H01　（工具長補正、この例では、T番号とH番号は同じ）⑨S2300M03　（スピンドル回転）<br>⑩M08　（クーラントコード、飛び散り防止で回転の後で指令）<br>⑪G04X10.　（クーラントの安定を待つ、PとXでの指令あり）</em></p></blockquote>



<h2 class="wp-block-heading"><span id="toc8">onSection( )の改造 No1</span></h2>



<p>オリジナルと見比べながら改造していきます。<br>ちょっと前置きが長くなってしまったので、実際の編集作業の説明は、今回は①～⑤までとします。</p>



<h3 class="wp-block-heading"><span id="toc9">①シーケンス番号</span></h3>



<p>いきなり、オリジナルにはないコードが必要になりました。<br>①は、ジャンプさせるための番地としてシーケンス番号を追加します。<br>番号は、セクション（工程）番号と同じ番号とします。<br>例えば、２工程目であれば、N0002 となります。</p>



<pre class="wp-block-preformatted">function onSection() {
   //kazuban 2021/01/05
   writeln("(---- onSection ----)");
   //kazuban 2021/01/23
<strong>   var nFormat = createFormat({prefix:"N", width:4, zeropad:true});
   writeln(nFormat.format(getCurrentSectionId()+1));</strong>
　　・
　　・
</pre>



<p>シーケンス番号用として、「N」+「4桁数字」の出力用で、Format関数を作成しました。<br><a href="https://www.kazuban.com/blog/fusion360-post-processor-04/" target="_blank">Format関数は、グローバルセッション編で詳しく説明しています、</a>ので、<br>まだ理解されていない場合にはこちらを参照してください。<br>また、シーケンス番号は、セクション番号と同じ番号にしたいため、<br>「<strong>getCurrentSectionId()</strong>」関数で、現在のセクション番号を取得しています。<br>ただし、この関数が返す現在のセクション番号は、<span class="markerYellow">「0」から始まるため<br>「+1」</span>としています。</p>



<h3 class="wp-block-heading"><span id="toc10">②工具情報</span></h3>



<p>②は工具情報をコメントとして入れてみようと思います。<br>onOpen( )でも、先頭で出力されますが、ここには、各工程で使用する工具の情報とします。<br>工具深さ情報は、onOpen( )では、別の工程で同じ工具を使用する場合には、<span class="markerPink">使用工程全体で</span>最小深さの情報を出力しますが、ここでは、<span class="markerPink">この工程のみ</span>の最小深さを出力しようと思います。<br>この仕様もオリジナルにはないので、工具情報を得るコードを書く必要があります。<br>onSection( )内に直接書いてもいいですが、行数も多いので、関数を作成したほうが、読みやすく後に修正しやすくなります。</p>



<pre class="wp-block-preformatted">//kazuban 2021/01/23
//Tool Infomation
function writeToolInfo(){
  var section = getSection(getCurrentSectionId());
  var tool = section.getTool();
  var number = tool.number;
  var diameter = tool.diameter;
  var cornerRadius = tool.cornerRadius;
  var zRange = section.getGlobalZRange();
  var zMin = zRange.getMinimum();

  var tFormat = createFormat({decimals:3,trim:false,forceDecimal:true,decimals:3});
  var tOutput = createFormat({prefix:"T",width:2, zeropad:true});
  var tdiaOutput = createVariable({prefix:" D="}, tFormat);
  var trOutput = createVariable({prefix:" R="}, tFormat);
  var zminOutput = createVariable({prefix:" ZMIN="}, tFormat);
  write("(");
  write(tOutput.format(number));
  write(tdiaOutput.format(diameter));
  write(trOutput.format(cornerRadius));
  write(zminOutput.format(zMin));
  writeln(" )");
  writeln("( "+tool.comment+" )");
}</pre>



<p>ちょっと長くなってしまいましたが、この工具情報を取得するコードは他でも参考になるかもしれません。<br>まず、<br>var section = getSection(getCurrentSectionId());<br>「getSection( getCurrentSectionId() )」関数で、現在のセクションオブジェクトを、「section」という変数に代入しています。<br>次に、<br>var tool = section.getTool();<br>では、現在のセクションの工具情報オブジェクトで「tool」変数を定義しました。<br>さらに、「tool」オブジェクトから、<br>「tool.number」「tool.diameter」「 tool.cornerRadius」で、<br>「工具番号」「工具径」「工具角R」を取得できます。<br>var zRange = section.getGlobalZRange();<br>では、現在のセクションの「Z範囲」情報オブジェクトを定義して<br>var zMin = zRange.getMinimum();<br>「getMinimum()」で、このセクションでの最小Z値を取り出せます。</p>



<p>次に、「T01」「D=12.000」 「R=0.000」 「ZMIN=-9.995」など、工具情報を出力する、Format を定義しています。<br>工具のコメントは、「tool.comment」で取り出せます。<br>最後は、write( )とwriteln( )関数で、コメントとして出力させる関数です。<br>writeComment( )　関数も用意されていますが、大文字にしたり、（　）を省いたり、<br>なんだか面倒そうな処理をしているので、ここでは、自前で書き込ませます。<br>この関数を、先ほどのシーケンス番号を出力するコードの次の行に追加します。<br>onSection( )内は、この一行で済みますから、読みやすくなります。</p>



<pre class="wp-block-preformatted">function onSection() {
  //kazuban 2021/01/05
  writeln("(---- onSection ----)");
  //kazuban 2021/01/23
  var nFormat = createFormat({prefix:"N", width:4, zeropad:true});
  writeln(nFormat.format(getCurrentSectionId()+1));
 <strong> writeToolInfo();</strong>
　　・
　　・</pre>



<h3 class="wp-block-heading"><span id="toc11">スピンドル回転停止<br></span></h3>



<p>次は、オプショナルスキップや、工具交換の状態などの定義がされていますが、<br>１１８６行目付近で、工具交換されて、最初のセクションでない場合には、<br>回転停止指令（M05)を出すように定義されています。<br>ただし今回は、このような終了処理は、<strong>onSectionEnd( )</strong>関数にやらせようと思っているので、ここでは無効にしておこうと思います。</p>



<pre class="wp-block-preformatted">if (insertToolCall &amp;&amp; !isFirstSection()) {
    //kazuban 2021/01/23
    //onCommand(COMMAND_STOP_SPINDLE);
  }</pre>



<h3 class="wp-block-heading"><span id="toc12">③G91G28Z0.<br>④G49<br>⑤G90G00G17</span></h3>



<p>「G28」は主軸リファレンス点復帰指令です。<br>とりあえず、安全位置へ退避させる場合によく使用されるGコードです。<br>２工程目以降のセクション（工程）の場合に、前セクション終了時、すでにこの指令が実行されていて重複する可能性もありますが、<span class="markerYellow">プログラム途中スタートなどの場合も考慮して</span>、セクション（工程）初めにはこの指令を入れるようにします。<br>また、「G49」は、工具長補正キャンセルコードです。<br>機種によっては、「G28」に「G49」機能も含まれている機種もあります。<br>その場合「G49」は不要ですが、あっても問題はないので、多少冗長であってもこの３行はセットで出力させようと思います。<br>余談ですが、「G49」指令は、キャンセルに動作を伴う機種もあります。<br>その場合、補正値によっては、Ｚ軸がマイナス側へ下がったり、逆に上がってＺ軸がオーバートラベルになる場合も、まれにあります。<br>そのような場合には、動作を伴わないよう現在位置でキャンセルさせるの意味で「G91G49Z0.」の指令とする場合もあります。<br>今回は、「G49」のみの出力とします。</p>



<p>「G28」の指令は、「<strong>writeRetract(Z)</strong>」の関数で出力させています。<br>ここまで編集してきた「fanuc_new.cps」では、１１８３行付近のこの条件判断のブロックの中で定義されています。</p>



<pre class="wp-block-preformatted">if&nbsp;(insertToolCall&nbsp;||&nbsp;newWorkOffset&nbsp;||&nbsp;newWorkPlane&nbsp;||&nbsp;forceSmoothing)&nbsp;{
  ・
  ・
}</pre>



<p>これは主に新しい工具が挿入された場合の条件判断で書かれていますが、今回はセクション（工程）が変われば、同じ工具であっても<strong>無条件</strong>でこの指令は出力さてたいと思います。<br>無条件で実行させたい方法は、条件判断文を「true（真）」にすればいいので、方法はいろいろありますが、なるべくオリジナルのコードは崩したくないので、この条件判断に「真」の条件を一つ加える方法で対応します。<br>具体的には、「<strong>var&nbsp; runWriteRetract&nbsp;=&nbsp;true</strong>」の変数を追加して、条件判断に追加します。</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<pre class="wp-block-preformatted">//kazuban 2021/01/23
 var <strong>runWriteRetract = true</strong>; 
 if (insertToolCall || newWorkOffset || newWorkPlane || forceSmoothing || <strong>runWriteRetract</strong>) {
   ・
   ・
 }</pre>
</div></div>



<p>これで無条件にこのブロックを実行します。<br>この条件判断内のブロックの中で、「<strong>writeRetract(Z)</strong>」と言う関数を呼び出しています。</p>



<pre class="wp-block-preformatted">// retract to safe plane
<strong>writeRetract(Z); </strong>// retract 
forceXYZ(); 
if ((insertToolCall &amp;&amp; !isFirstSection()) || forceSmoothing) { 
  disableLengthCompensation();   
  setSmoothing(false); 
}</pre>



<p>この関数が「G28」関連の出力をさせていますので、「writeRetract(Z)」関数を確認してみます。<br>③、④、⑤の３行は、セットで出力させたいと思っているので、この関数で出力させるように改造します。<br>writeRetract()関数は２６９６行付近にあります。</p>



<pre class="wp-block-preformatted">function writeRetract() {
   // initialize routine
   var _xyzMoved = new Array(false, false, false);
   var _useG28 = properties.useG28; // can be either true or false
    ・
    ・
</pre>



<p>この関数の、２７５８付近に「_useG28」の条件判断で「G28G91Z0.」「G90」を出力させるコードがあります。</p>



<pre class="wp-block-preformatted">// output move to home
if (words.length &gt; 0) {
  if (<strong>_useG28</strong>) {
    gAbsIncModal.reset();
 <strong>   writeBlock(gFormat.format(28), gAbsIncModal.format(91), words);
    writeBlock(gAbsIncModal.format(90));</strong>
  } else {
    gMotionModal.reset();
    writeBlock(gAbsIncModal.format(90), gFormat.format(53), gMotionModal.format(0), words);
  }
   ・
   ・</pre>



<p>この部分を、このように編集します。</p>



<pre class="wp-block-preformatted">if (words.length &gt; 0) {
  if (_useG28) {
    gAbsIncModal.reset();
   <strong> //kazuban 2021/01/23
    writeBlock(gAbsIncModal.format(91), gFormat.format(28), words);
    disableLengthCompensation();
    gMotionModal.reset();
    gPlaneModal.reset();
</strong>    <strong>writeBlock(gAbsIncModal.format(90),gMotionModal.format(0),gPlaneModal.format(17));
    //writeBlock(gFormat.format(28), gAbsIncModal.format(91), words);
    //writeBlock(gAbsIncModal.format(90));</strong>
  } else {
    gMotionModal.reset();
    writeBlock(gAbsIncModal.format(90), gFormat.format(53), gMotionModal.format(0), words);
  }</pre>



<p>まず、writeBlock( )を少し修正して「G28G91Z0.」を「G91G28Z0.」に編集しています。<br>順番を変えるのは特に意味はありません。<br>気分の問題と編集の参考になるかも、と言うだけで、ＮＣ的には意味はないです。<br>次に、「disableLengthCompensation()」関数で、「G49」を出力させています。<br>上に書いた、「G91G49Z0.」などにしたい場合には、この関数を編集する事になりますが、今回は省略します。<br>次の２行「gMotionModal.reset()」「gPlaneModal.reset()」は、「G00」「G17」を必ず出力させるために、事前のモーダル情報をキャンセルさせています。<br>基本的に、モーダルコードは、事前の状態で出力の有無が変わりますが、<span class="markerPink">無条件に出力させたい場合には、「reset()」関数でモーダル情報を初期化</span>します。</p>



<h2 class="wp-block-heading"><span id="toc13">まとめ</span></h2>



<p>onSection( )、まだ半分ですね。<br>シーケンス番号（N番号）を出力するために、Formatを利用してみました。<br>工具情報を出力するために、sectionオブジェクトの使用例を紹介しました。<br>また、モーダルコードをリセットして、強制的に出力させてみました。<br>次回は残りを編集してみたいと思います。</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc14">Fusion360 ポストの情報</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li>グローバルセクション</li><li>関数</li><li>NCプログラム仕様検討</li><li>onOpen( )</li><li><strong><span class="has-inline-color has-vivid-purple-color"><span style="text-decoration: underline;">onSection( ) No1</span></span></strong></li><li>onSection( ) No2</li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <span aria-current="page" class="page-numbers current">8</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">NEXT</a>
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fusion360 CAM ポストプロセッサ徹底解説・onOpen()の編集</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-07/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 14 Jan 2021 06:03:31 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4559</guid>

					<description><![CDATA[前回で作成したいＮＣプログラムの構成は決定できました。また、参考にしている「fanuc.cps」のエントリー関数の影響範囲も把握できました。今回からは、希望のプログラム構成にするために、オリジナル「fanuc.cps」を [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.kazuban.com/blog/fusion360-post-processor-06/" target="_blank">前回で作成したいＮＣプログラムの構成は決定できました</a>。<br>また、参考にしている「fanuc.cps」のエントリー関数の影響範囲も把握できました。<br>今回からは、希望のプログラム構成にするために、オリジナル「fanuc.cps」を改造していきます。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">オリジナルと希望ＮＣプログラム構成を比較</a></li><li><a href="#toc2" tabindex="0">onOpen( ) の改造</a><ol><li><a href="#toc3" tabindex="0">①シーケンス番号　　②スペース区切り</a></li><li><a href="#toc4" tabindex="0">％、Ｏ番号、工具情報</a></li><li><a href="#toc5" tabindex="0">③モーダル初期化コードを若干手直し</a></li><li><a href="#toc6" tabindex="0">④「G21」指令は、省略</a></li><li><a href="#toc7" tabindex="0">⑤ワーク座標系指令を追加⑥N0001工程へのジャンプ指令を追加</a></li></ol></li><li><a href="#toc8" tabindex="0">ポスト処理実行</a></li><li><a href="#toc9" tabindex="0">onOpen( )の改造終了</a><ol><ol><li><a href="#toc10" tabindex="0">Fuison360 ポストの情報</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">オリジナルと希望ＮＣプログラム構成を比較</span></h2>



<p>NCスタート時のプログラム構成は、このようにしようと思います。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>%<br>O番号(コメント)<br>(全工具情報)<br>G90G00G17G40G80G49　(初期化コード)<br>G54　(ワーク座標系指令)<br>GOTO 1　（セクション・工程番号へジャンプ）</p></blockquote>



<p>まずは、onOpen( ) の担当部分の比較をしてみましょう。</p>



<pre class="wp-block-preformatted">%
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 ----)</pre>



<p><strong><font size="6">　↓　</font></strong>このように改造したい。</p>



<pre class="wp-block-preformatted">%
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 ---)</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>それほど大きな違いはありませんね。<br>①．シーケンス番号（Ｎ番号）を削除<br>②．ワードとワードの「　」（スペース）区切りを削除<br>③．モーダル初期化コードを若干手直し<br>④．「G21」指令は、省略<br>⑤．ワーク座標系指令を追加<br>⑥．Ｎｏ１工程へのジャンプ指令を追加</p></blockquote>



<p>こんなところですね。</p>



<h2 class="wp-block-heading"><span id="toc2">onOpen( ) の改造</span></h2>



<p>早速改造していきましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">①シーケンス番号　　②スペース区切り</span></h3>



<p>この二つ「①と②」は、グローバル変数の「properties」で定義されています。<br>デフォルトではどちらも「true」になっているので、「false」に編集します。<br>ついでに、「preloadTool」も「false」にしておきます。<br>これは、工具交換時に、次の工具を待機されておくオプションですが、このオプションも筆者は使用しないので「false」にしておきます。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/properties.png" alt=""/></figure>



<p>編集した箇所には、「//」で編集者と日付などをコメントにしておくと、後々編集箇所を検索するのに便利です。<br>では、「fanuc_new.cps」と言うファイル名で保存して、ポスト処理してみます。</p>



<pre class="wp-block-preformatted">%
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 ----)
</pre>



<p>これで、①と②の編集は終了です。</p>



<h3 class="wp-block-heading"><span id="toc4">％、Ｏ番号、工具情報</span></h3>



<p>ここからは、「onOpen( )」関数の編集に入ります。<br>まずは、エディタで「onOpen( )」関数を眺めてみましょう。<br>３０１行付近に、「<strong>writeln(&#8220;%&#8221;);</strong>」が見つかります。<br>ここで「%」を出力させているのがわかります。<br>その上部にも、４０行近いプログラムがありますが、実際の出力では、「%」の上部には、なにも出力されていないので、その部分はそのままにしておきます。<br>「%」出力の次には「Ｏ番号」の出力です。<br>３２５付近を眺めてみると、８桁の「Ｏ番号」への対応もしているみたいですね。<br>その次でＯ番号とコメント文を出力させています。</p>



<pre class="wp-block-preformatted">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));
 }</pre>



<p>programIdがＯ番号<br>programCommentがコメントです。<br>Ｏ番号とコメント文は、ポスト処理ダイアログの設定を参照しています。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/ProgramID.png" alt=""/></figure>



<p>次に３６０行付近で工具情報リスト情報を取得し、「zRanges」配列に加工深さ情報を登録しています</p>



<pre class="wp-block-preformatted">var zRanges = {};
if (is3D()) {
   var numberOfSections = getNumberOfSections();
   for (var i = 0; i &lt; 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;
     }
   }
 }</pre>



<p>その後、３７７行付近以降の</p>



<pre class="wp-block-preformatted">var tools = getToolTable();
if (tools.getNumberOfTools() &gt; 0) {
   for (var i = 0; i &lt; 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 &gt; 0) &amp;&amp; (tool.taperAngle &lt; 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);
   }
 }</pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>var tools = getToolTable();<br>tools.getNumberOfTools()</p></blockquote>



<p>関数、getNumberOfTools()で、ポスト作成時に選択したセクション（工程）で使用した、工具の個数を取得しています。<br>使用する工具の工具情報をその個数だけ繰り返し入手し、コメントとして出力させています。<br>このルーチンは、工具情報を取得する方法として、別の操作でも利用できる可能性があるので、覚えておくと便利です。</p>



<p>次の４２３行付近で、ワーク座標系のチェックをしています。</p>



<pre class="wp-block-preformatted">if ((getNumberOfSections() &gt; 0) &amp;&amp; (getSection(0).workOffset == 0)) {
  for (var i = 0; i &lt; getNumberOfSections(); ++i) {
    if (getSection(i).workOffset &gt; 0) {
      error(localize("Using multiple work offsets is not possible if the initial work offset is 0."));
      return;
    }
  }
}</pre>



<p>ＣＡＭの設定画面のポスト処理画面が参照されます。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/WCS.png" alt=""/></figure>



<p>複数の「設定」を一度にポスト処理する場合で、違うワーク座標系を使用したい場合には、ここでの設定は「0」以外にしなければエラーを出すみたいです。</p>



<h3 class="wp-block-heading"><span id="toc5">③モーダル初期化コードを若干手直し</span></h3>



<p>４３２行付近で、「N10 G90 G94 G17 G49 G40 G80」のコードを出力させてます。<br>これを、「G90G00G17G40G80G49」に変更しましょう。</p>



<pre class="wp-block-preformatted">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));</pre>



<h3 class="wp-block-heading"><span id="toc6">④「G21」指令は、省略</span></h3>



<p>次の４３５行付近の「switch」分で、「G21」コードを出力させています。<br>ここは省略したいので、「writeBlock( )」関数をコメントにして無力化します。</p>



<pre class="wp-block-preformatted">//kazuban 2021/01/15
 switch (unit) {
 case IN:
   <strong>//</strong>writeBlock(gUnitModal.format(20));
   break;
 case MM:
   <strong>//</strong>writeBlock(gUnitModal.format(21));
   break;
 }</pre>



<h3 class="wp-block-heading"><span id="toc7">⑤ワーク座標系指令を追加<br>⑥N0001工程へのジャンプ指令を追加</span></h3>



<p>次では、「G95」関連の定義ですが、筆者は使っていないので、<br>ここではそのままにしておきます。<br>オリジナルでは、「onOpen( )」はここで終了ですが、<br>終了前に「ワーク座標系」指令を追加します。<br>今回のＮＣプログラムでは、最初にワーク座標系を指令後、<br>途中では変更しない仕様で考えています。<br>こうする事で、機械側でワーク座標系番号を変更したい場合には、<br>この指令一か所のみの変更ですみます。<br>また、多数個取りなどに対応したい場合でも、NCデータの改造が楽になります。<br>オリジナルでは、onSection( )にワーク座標系出力があるので、各セクション（工程）ごとに、出力されます。<br>どちらがいいかは、実際の加工方法によって違ってくると思いますので、あくまでもポスト編集の例題としてお考えください。<br>Fusion360のポストでは、CAMの設定画面でワーク座標系を設定します。</p>



<div class="wp-block-group alignwide"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="245" height="279" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/WCS.png" alt="" class="wp-image-4580 size-full"/></figure><div class="wp-block-media-text__content">
<p>wcsオフセットが、<br>「0」であれば、「G54」。<br>「1～6」までは、「G54～G59」<br>「7」以上になると、<br>拡張座標系「G54.1 P1～」<br>を使用できる仕様とします。</p>



<p></p>
</div></div>
</div></div>



<p>このような仕様で、プログラムを追加します。<br>加えて、シーケンス番号Ｎ０００１へ無条件ジャンプのコードも追加します。</p>



<pre class="wp-block-preformatted">//kazuban 2021/01/15
var WCS = getSection(0).workOffset;
WCS = (WCS==0)?1:WCS;
if(WCS&gt;6){
  writeBlock(gFormat.format(54.1),"P"+(WCS-6));
}else{
  writeBlock(gFormat.format(53+WCS));
}
writeln("GOTO 1");
writeln("(---- End of onOpen ----)");</pre>



<p>この部分を簡単に説明すると、</p>



<ul class="wp-block-list"><li>「WCS」と言う変数を用意し、最初のセクション（工程）のワークオフセット番号を代入します。</li><li>ワークオフセット番号が「0」なら、「1」に変更します。</li><li>ワークオフセット番号が「6」より大きければ、「G54.1P」の指令とします。</li><li>１～６の場合には、G「53+オフセット番号」のワークオフセットとします。</li><li>N0001 へジャンプする指令を追加します。</li></ul>



<p>ジャンプ指令は、実際の加工時、任意工程を再加工したい場合に使用します。<br>今回の例題では、セクション２（２工程目）で、ポケット側面の仕上げ加工を行う想定です。<br>実際の加工で仕上げ工程でいきなり、仕上げる事は少ないです。<br>通常は、最初は取り代を付けた状態で加工し、その後の測定結果をもとに工具径補正を再調整し、その工程のみ再加工をおこなうような操作をします。<br>そのような場合に、とりあえず全加工したのち、２工程目のみ再加工を行うような操作を想定しています。<br>その場合、機械コントローラで「GOTO 1」を「GOTO 2」へ修正する事で、２工程目からの加工が可能になります。</p>



<h2 class="wp-block-heading"><span id="toc8">ポスト処理実行</span></h2>



<pre class="wp-block-preformatted">%
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 ----)</pre>



<h2 class="wp-block-heading"><span id="toc9">onOpen( )の改造終了</span></h2>



<p>出力は、わずか６行程度のデータですが、結構ボリュームありました。<br>onOpen()関数は、２００行ありますね。<br>いろいろなパターンに対応しているのだと思います。<br>結構面倒ですが、一行ずつ解読していくと、理解が深まりますので、お時間あれば挑戦してみてください。<br>次は、onSection()の改造へ移りますが、こちらはさらに長いですね！</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc10">Fuison360 ポストの情報</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li>グローバルセクション</li><li>関数</li><li>NCプログラム仕様検討</li><li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">onOpen( )</span></span></strong></li><li>onSection( ) No1</li><li>onSection( ) No2</li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <span aria-current="page" class="page-numbers current">7</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">NEXT</a>
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fusion360 CAM ポストプロセッサ徹底解説・NCプログラム仕様検討</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-06/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 09 Jan 2021 04:28:05 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4478</guid>

					<description><![CDATA[ポストプロセッサファイルの編集前にNCデータ仕様を検討します。対象は、Fanuc系マシニングセンター用のＮＣプログラムで工具の自動交換に対応したデータをターゲットにしようと思っています。今回もFusion360に標準でイ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ポストプロセッサファイルの編集前にNCデータ仕様を検討します。<br>対象は、Fanuc系マシニングセンター用のＮＣプログラムで工具の自動交換に対応したデータをターゲットにしようと思っています。<br>今回もFusion360に標準でインストールされている「fanuc.cps」を参考に説明していきます。<br>まずは、適当な名前でコピーしておきましょう。<br>ここでは、<strong>「fanuc_new.cps」</strong>としました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-14" checked><label class="toc-title" for="toc-checkbox-14">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ポストプロセッサ構成</a></li><li><a href="#toc2" tabindex="0">NCプログラム構成</a></li><li><a href="#toc3" tabindex="0">ポストとNCのすり合わせ</a></li><li><a href="#toc4" tabindex="0">エントリー関数の影響範囲確認</a></li><li><a href="#toc5" tabindex="0">まとめ</a><ol><ol><li><a href="#toc6" tabindex="0">Fusin360 ポスト情報</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ポストプロセッサ構成</span></h2>



<p>Fusion360 ポストプロセッサの構成については、以前の記事で描いてあるので、こちらも目を通しておくことをお勧めします。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-じじぃの引出し wp-block-embed-じじぃの引出し"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion360-post-processor-02/" title="Fusion360 CAM ポストプロセッサ徹底解説・構成編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="144" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/PostConfiguration.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/PostConfiguration.png 1037w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/PostConfiguration-300x188.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/PostConfiguration-1024x642.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/PostConfiguration-768x481.png 768w" sizes="(max-width: 144px) 100vw, 144px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360 CAM ポストプロセッサ徹底解説・構成編</div><div class="blogcard-snippet internal-blogcard-snippet">このサイトのＮＣプログラム構成の記事でも、触れていますが、ＮＣデータの構成は４つに整理する事ができます。・全工程の始まり・加工工程の前・・・　実際の加工経路　・・・・加工工程の後・全工程の終わり同様の視点でしょうか、前回の記事、ポストプロセッサの構成も同様になっていますね～onOpen( )onSe...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.12.05</div></div></div></div></a>
</div></figure>



<p>Fusion360 CAM ポストプロセッサで、希望するNCプログラム構成に改造するには、次の４つの関数を編集する事になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>① onOpen( ) 　　　　・ポスト処理開始時<br>② onSection( )　　　 ・ＣＡＭ定義の各セクションの開始時<br>③ onSectionEnd( )　 ・各セクションの終了時<br>④ onClose( )　　　　・ポスト処理の終了時</p></blockquote>



<p>ポストプロセッサは、この４つの関数を自動的に呼び出しながら処理します。<br>実際に編集を始める前に、希望するＮＣプログラムを出力させるには、この４つの関数とNCプログラムとの関係性を整理しておく必要があります。<br>再度、使用しているNCプログラムの構成を整理してみてください。<br>なるべく、４構成に整理する事を推奨します。<br>どの関数をどのように編集するかなど、作業がしやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc2">NCプログラム構成</span></h2>



<p>NCプログラムの構成は、以前の記事で説明してあります。<br>こちらでも、４構成で説明していますので、構成に迷われた場合には参考にしてみてください。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-じじぃの引出し wp-block-embed-じじぃの引出し"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/main-sub-pro/" title="NCプログラム／プログラム構成" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="122" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/Milling2.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/01/Milling2.png 1022w, https://www.kazuban.com/blog/wp-content/uploads/2021/01/Milling2-300x221.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/01/Milling2-768x567.png 768w" sizes="(max-width: 122px) 100vw, 122px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／プログラム構成</div><div class="blogcard-snippet internal-blogcard-snippet">NCプログラムの構成は、大きく分けると２種類にわける事ができます。一つは加工に必要な準備機能で、もう一つは、実際の加工経路の動作指令です。さらに、マシニングセンターを対象にすると、準備機能は４つに分ける事ができます。CAMのポストプロセッサを編集する場合やプログラム全体の構成を検討する際、この基本構...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.01.28</div></div></div></div></a>
</div></figure>



<p><br>４構成で整理すると、NCプログラムもポストの基本の関数も同じ構成数なので、各構成で整合性を持たせておきます。<br>まず全体的には、筆者は下記のような設定で考えています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>全体的な仕様としては、<br>・加工の始まりは、「%」「O番号」に続き、ワーク座標系指令も出力<br>・ワーク座標系は、最初に定義し、各セクション・工程では変更しない<br>・こうする事でワーク座標を変更する場合や多数個加工への対応が楽になります<br>・NCワードとワードはスペースで区切らない。（私の好み）<br>・基本的にシーケンス番号（Ｎ番号）は付加しない。<br>・ワーク座標系指令後、任意セクション（工程）へジャンプできる仕様とする<br>・そのため、各工程の始まりのみに、シーケンス番号を追加する<br>・各工程には、途中再開でも安全なように、退避やキャンセルコードを追加<br>・同様の理由で、次工程で同じ工具でも、とりあえず工具交換させる<br>・冷却コードは、飛び散り防止で工具回転の後に指令する。<br>・ただし、冷却水排出量を安定させるため、停止コード「G04」を追加<br>・各工程の終わりには、冷却・回転の停止、工具退避、キャンセルを行う<br>・単工程のみの加工も考慮して、各工程の最後に「M01」コードを出力<br>・加工終了時は、「M30」「%」で終了。</p></blockquote>



<h2 class="wp-block-heading"><span id="toc3">ポストとNCのすり合わせ</span></h2>



<p>以上の仕様を、上記４つのエントリー関数に当てはめてみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>① 加工始まり<br>　%<br>　O番号(コメント)<br>　(全工具情報)<br>　G90G00G17G40G80G49　(初期化コード)<br>　G54　(ワーク座標系指令)<br>　GOTO 1　（セクション・工程番号へジャンプ）</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>②セクション（工程）の始まり<br>N0001　（工程番号と同じシーケンス番号）<br>（工具情報）<br>G91G28Z0.　（途中再開時の安全を考慮して工具退避）<br>G90G00G17　（とりあえずモーダルコードリセット）<br>T01　（工具番号）<br>M06　（行を分け工具交換、Tと同じ行ではNGな機種への対応）<br>G00G43Z30.H01　（工具長補正、この例では、T番号とH番号は同じ）<br>S2300M03　（スピンドル回転）<br>M08　（クーラントコード、飛び散り防止で回転の後で指令）<br>G04X10.　（クーラントの安定を待つ、PとXでの指令あり）</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>ここから、エントリ関数以外の処理で、加工指令開始<br>加工位置へ位置決め後、加工に入る</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>③セクション（工程）の終了<br>M09　（クーラント停止）<br>M05　（主軸回転停止）<br>G91G28Z0.　（リファレンス点へ退避）<br>G49　（工具長補正キャンセル）<br>G90G00G17　（モーダル情報リセット）<br>M01　（単工程再加工考慮、オプショナルストップ）</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>④ポスト処理終了<br>M30<br>%</p></blockquote>



<h2 class="wp-block-heading"><span id="toc4">エントリー関数の影響範囲確認</span></h2>



<p>前回も書いてますが、４つのエントリー関数の影響範囲を知る事が、編集の近道です。<br>各関数の最初と最後に、「writeln( )」関数で、印をつけてみます。<br>具体的には、このように、わかりやすい文字列を追加します。</p>



<pre class="wp-block-preformatted">function onSection() {
   writeln("(---- onSection ----)");
    ・
    ・
   writeln("(---- End of onSection ----)");
}</pre>



<p>筆者はこんな感じにしてみました。<br>ところで、関数のブロックの最初（　{　）と最後（　}　）を探すのは結構面倒です。<br>特に、「onSection( )」は３００行以上あるので、矢印キーで追っていくのは大変です。<br>もし筆者お勧めの「VSCode」を使用しているなら、「Ctrl」+「Shift」+「\」のショートカットが便利です。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/BlockEnd-1.png" alt=""/></figure>



<p>この機能を利用すれば、ブロックの最初と最後、どちらへも簡単にジャンプできます。<br><br>まずは、参考までに、サンプル用モデルを公開しておきます。</p>



<figure class="wp-block-table"><table><tbody><tr><td><a href="https://www.kazuban.com/soft/Post_Sample.zip"><img decoding="async" width="512" class="alignnone size-full wp-image-4504" src="https://www.kazuban.com/blog/wp-content/uploads/2021/01/sample.png" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/01/sample.png 706w, https://www.kazuban.com/blog/wp-content/uploads/2021/01/sample-300x225.png 300w" sizes="(max-width: 706px) 100vw, 706px" /></a></td><td><a href="https://www.kazuban.com/soft/Post_Sample.zip">サンプルモデルは、こちらからダウンロードできます。</a></td></tr></tbody></table></figure>



<p>ポケット加工です。<br>３つのセクション（工程）構成です。<br>・１工程は、「T01」で負荷制御で荒加工。<br>　　底面は仕上げますが、側面は「+0.5」の残り代<br>・２工程は、やはり「T01」での側面仕上げ加工<br>・３工程は、「T21」でのドリル加工<br>このCAMのポイントは、１，２工程で同じ工具を使っています<br>２工程目は、側面仕上げなので、全加工後、再度この工程のみ実行する可能性があります<br>この点も考慮して、ポストプロセッサを改造していきたいと思います。</p>



<p>では、印を出力するように編集した、ポスト「fanuc_new.cps」を実行</p>



<pre class="wp-block-preformatted">%
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 ----)
(---- onSection ----)
N20 G28 G91 Z0.
N25 G90
(3)
N30 T1 M06
(AP0.02D AE1D)
N35 T21
N40 S2300 M03
N45 G54
N50 M08
N55 G00 X-44.303 Y-9.527
N60 G43 Z30. H01
(---- End of onSection ----)
N65 G00 Z5.
N70 Z2.505
N75 G03 X-55.697 Y-9.904 Z1.88 I-5.697 J-0.188 F333.
・
・
N6445 X-39.768 Z0.205
N6450 G00 Z30.
(---- onSectionEnd ----)
(---- End of onSectionEnd ----)
(---- onSection ----)
(2D 7)
N6455 G00 X-37.2 Y11.2
(---- End of onSection ----)
N6460 Z30.
N6465 Z5.
N6470 G01 Z1. F333.
・
・
N6555 G19 G02 Y8.8 Z-8.78 K1.2
N6560 G00 Z30.
(---- onSectionEnd ----)
N6565 G17
(---- End of onSectionEnd ----)
(---- onSection ----)
N6570 M05
N6575 G28 G91 Z0.
N6580 G90
N6585 G49
(6)
N6590 M09
N6595 M01
N6600 T21 M06
(NSB-DRILL)
N6605 T1
N6610 S2650 M03
N6615 G54
N6620 M08
N6625 G00 X-40. Y15.
N6630 G43 Z30. H21
(---- End of onSection ----)
N6635 G00 Z5.
N6640 G98 G81 X-40. Y15. Z-16. R-5. F420.
・
・
N6660 G80
N6665 Z30.
(---- onSectionEnd ----)
(---- End of onSectionEnd ----)
(---- onClose ----)
N6670 M09
N6675 G28 G91 Z0.
N6680 G90
N6685 G49
N6690 G28 G91 X0. Y0.
N6695 G90
N6700 M30
%
(---- End of onClose ----)
</pre>



<p>このように出力されました。<br>上記の、すり合わせで検討した構成とは、少し違う結果です。<br>やはり、改造が必要ですね。</p>



<h2 class="wp-block-heading"><span id="toc5">まとめ</span></h2>



<p>ポストプロセッサのエントリー関数から、NCプログラムの構成を検討してみました。<br>現在マシニング加工をされている方は、すでにNCプログラム構成はできあがっていると思います。<br>しかし、そのNCプログラムをFusion360 ポストプロセッサで出力させる場合、ポストのエントリー関数に合わせて４構成で整理したほうが、改造がしやすくなります。<br>また４構成で整理しておくと、複数のマシニングセンターを使用する場合にコンバータソフトなど開発する場合でもやりやすくなります。<br>お時間あれば、一度検討してみてもいいと思います。<br>次回からはいよいよ実際に、希望のNCプログラムと、標準ポストが出力したデータを比較して、改造していきたいと思います。</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc6">Fusin360 ポスト情報</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li>グローバルセクション</li><li>関数</li><li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">NCプログラム仕様検討</span></span></strong></li><li>onOpen( )</li><li>onSection( ) No1</li><li>onSection( ) No2</li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <span aria-current="page" class="page-numbers current">6</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">NEXT</a> 
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fusion360 CAM ポストプロセッサ徹底解説・関数</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-05/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Fri, 25 Dec 2020 23:12:05 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4309</guid>

					<description><![CDATA[Fusion360 ポストファイルの構成は、グローバルセクションやグローバル変数定義の後は、関数の集まりになっています。関数とはなんでしょう？ 目次 関数とは？JavaScript の関数Fusion360 ポストの関数 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Fusion360 ポストファイルの構成は、グローバルセクションやグローバル変数定義の後は、関数の集まりになっています。<br>関数とはなんでしょう？</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">関数とは？</a><ol><li><a href="#toc2" tabindex="0">JavaScript の関数</a></li><li><a href="#toc3" tabindex="0">Fusion360 ポストの関数</a></li><li><a href="#toc4" tabindex="0">Entry Functions</a></li><li><a href="#toc5" tabindex="0">Public Member Functions</a></li></ol></li><li><a href="#toc6" tabindex="0">定義済み関数を調べてみる</a><ol><li><a href="#toc7" tabindex="0">writeBlock()&nbsp;</a><ol><li><a href="#toc8" tabindex="0">関数宣言</a></li><li><a href="#toc9" tabindex="0">引数</a></li><li><a href="#toc10" tabindex="0">argumentsオブジェクト</a></li><li><a href="#toc11" tabindex="0">真偽（論理）値</a></li><li><a href="#toc12" tabindex="0">グローバル変数で条件分岐</a></li><li><a href="#toc13" tabindex="0">writeWords() と writeWords2()</a></li><li><a href="#toc14" tabindex="0">加算代入演算子（+=）と インクリメント演算子（++）</a></li></ol></li></ol></li><li><a href="#toc15" tabindex="0">まとめ</a><ol><ol><li><a href="#toc16" tabindex="0">ポスト記事</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">関数とは？</span></h2>



<p>決まった処理をさせるプログラミング指令のかたまりですが、場合によっては引数から情報を受け取り、結果を返したりします。<br>NC言語で例えると、サブプログラムやマクロ呼び出しのような機能です。<br>関数は、言語に標準で付属している定義もありますし、自分で作成する事もできます。</p>



<h3 class="wp-block-heading"><span id="toc2">JavaScript の関数</span></h3>



<p><strong>JavaScript</strong>の関数の情報は、文献やネット上に多数情報がありますから、詳細はそちらを参照してください。<br>ただし、紹介されている関数が、ポストプロセッサですべて利用できるとは限りません。<br>関数の定義方法も何種類かあるみたいですが、Fusion360ポストでは、ほとんど「宣言方式」が使われているようです。<br>基本的な関数宣言は</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>function 名前 ( 引数、・・) {<br>　// 処理、プログラム<br>　return 結果;<br>｝</p>
</blockquote>



<p>こんなイメージです。<br>「fanction」が関数である事のキーワードで、その後に、適当な「名前」を書きます。<br>その後の 　(　)　内に、関数へ渡す引数を　,　で区切り記述します。<br><span class="markerBlue"> 引数がない場合でも、　(　)　は必要です。</span><br>次の　{　}　の間に、関数にやらせたい処理をプログラムします。<br>もし、関数からの結果を渡したい場合には、「return」コマンドにつづけて、結果の値を書きます。<br>名前は使えない記号とか、ある程度の命名規則もあるようですが、半角英数字であればそれほど気にしなくてもいいと思います。<br>ただし、<span class="markerYellow"> その関数の処理内容をある程度イメージできる名前</span>がいいと思います。<br>日本語も使えそうですが、使わないほうが無難ですね。<br>また、<span class="markerYellow"> 大文字小文字は識別する</span>ので、注意が必要です。<br>関数の使い方は、こんな感じです<br>２個の引数を受け取り、大きい方を返す関数です</p>



<pre class="wp-block-preformatted">// 引数、aとb で大きい方を返す関数
function returnMax(a,b) {
  return (a&gt;=b?a:b);
}
function onOpen() {
  var x1=10.23;
  var x2=11.56;
  var Max = returnMax(x1,x2);
  writeln(Max); //11.56が出力される。</pre>



<p>このように、関数は引数を与えて呼び出すだけで決められた処理をしたり結果をもらうことができます。<br>関数がうまく使えるようになると、プログラムも見やすくなります。</p>



<h3 class="wp-block-heading"><span id="toc3">Fusion360 ポストの関数</span></h3>



<p>Fusion360のポストも、基本的にはJavaScript言語を使用しているので、定義の方法は同じです。<br>ただし、JavaScriptに標準で組み込まれている関数と、Fusion360特有の関数。ポストファイル作者個人が作成した関数、などがあります。<br>区別する意味でも、個人的に作成した関数は、命名ルールを決めておくと分かりやすくなります。<br>Fusion360の関数の詳細は、<a rel="noopener" href="https://cam.autodesk.com/posts/reference/index.html" target="_blank">こちらの「<strong>Autodesk CAM Post Processor Documentation</strong>」</a>に情報があります。<br>また、ポストファイル内に定義されている関数は、前回紹介した下記ページで紹介している「VSCode」エディタなら一覧で見る事ができます。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://www.kazuban.com/blog/fusion360-post-processor-01/" title="Fusion360 CAM ポストプロセッサ徹底解説・概要編" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="121" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost.png 1099w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-300x223.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-1024x761.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/FusionPost-768x571.png 768w" sizes="(max-width: 121px) 100vw, 121px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360 CAM ポストプロセッサ徹底解説・概要編</div><div class="blogcard-snippet internal-blogcard-snippet">数回にわたって、Fusion360 CAM のポストプロセッサの説明をしようと思います。しかし、筆者自身も独学なので、わかっている範囲での説明になりますし、もしかすると間違いもあるかもしれませんので、ご了承ください。ただ、ポストプロセッサはＮＣデータを出力する機能であり、それ自身が機械を動かすわけで...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.11.28</div></div></div></div></a>
</div></figure>



<p>「VSCode」の、「エクスプローラー」機能の「FUNCTION LIST」に関数のリストが表示され、マウスクリックで瞬時にその関数にジャンプしてくれます。<br>特にこだわりのエディタがない場合には、VSCode がお勧めです。</p>


<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/FunctionList-1024x629.png" alt=""></figure>


<h3 class="wp-block-heading"><span id="toc4">Entry Functions</span></h3>



<p>カーネルとポストプロセッサ間のやりとりをする関数をエントリ関数と呼んでいるようです。<br>この関数は、<span class="markerPink"> 接頭に半角小文字の「<strong>on</strong>」が付いている名前</span>で、他の関数と区別されています。<br>したがって、自分で作成する関数の名前には、先頭に「<strong>on</strong>」は付けないほうがいいですね。<br>「VSCode」のエクスプローラで確認すると、かなり沢山のエントリ関数があるのがわかります。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="331" height="707" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/FunctionList-1.png" alt="" class="wp-image-4337" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/FunctionList-1.png 331w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/FunctionList-1-140x300.png 140w" sizes="(max-width: 331px) 100vw, 331px" /></figure>



<p>ポストプロセッサファイルを編集するには、このエントリ関数を編集する事になります。<br>この関数は、Fusion360がポスト処理する際に、自動的に呼び出されます。<br>全てを編集する必要はありませんが、ある程度は各関数の役目を理解しておいたほうが、作業しやすくなると思います。<br>詳細は、<a rel="noopener" href="https://cam.autodesk.com/posts/reference/entry_functions.html" target="_blank">「<strong>Autodesk CAM Post Processor Documentation</strong>」</a>に記載されています。</p>



<h3 class="wp-block-heading"><span id="toc5">Public Member Functions</span></h3>



<p>ポストファイル内で、明示的に定義されている関数以外に、ポストプロセッサ内部で定義されている関数もあります。<br>「パブリックメンバー関数」と呼ばれるようですが、前回記事にした「format」などもこのメンバーです。<br>こちらも<a rel="noopener" href="https://cam.autodesk.com/posts/reference/annotated.html" target="_blank">「Post Processor DocumentationのClassList」</a>に情報があります。<br>ながめていると、使えそうなクラスもみつかります<br>たとえば、「<strong>FileSystem</strong>」には、ファイルのコピーや削除などの関数も用意されています。<br>NCデータを出力するだけでなく、加工工程や工具リスト、NCコードをDXF化したDXFファイルなど、NCデータとは別のファイルを出力させる事も可能です。<br>Fuison360のポストプロセッサは、単にNCデータ出力だけでなく、CAMからの情報をいろいろな形式で出力する事ができる非常に高機能なポストプロセッサです。</p>



<h2 class="wp-block-heading"><span id="toc6">定義済み関数を調べてみる</span></h2>



<p>参考の「fanuc.cps」に定義されている、関数を調べてみましょう。<br>前述の「VSCode・Function List」で確認すると、「on」で始まるエントリ関数以外にも、かなりの関数が定義されているのがわかります。<br>では、上部で定義されていて、その名前からNCデータを出力しそうな重要で使用頻度が高そうな「writeBlock()&nbsp;」関数を分析してみましょう。</p>



<h3 class="wp-block-heading"><span id="toc7">writeBlock()&nbsp;</span></h3>



<p>この関数はNCデータを出力しそうだ？<br>と言う事が関数名でだいたいわかりますね。<br>おそらく、引数に与えられたNCワードを書きだす関数でしょう。<br>NC言語のブロックとは、一行に複数の指令コードが集まったコードですから、複数のNCワードを引数にとりなんらかの処理後、一行に書きだす関数と予想できます。<br>では、関数の中身を眺めてみましょう</p>



<pre class="wp-block-preformatted">function&nbsp;writeBlock()&nbsp;{
&nbsp;&nbsp;var&nbsp;text&nbsp;=&nbsp;formatWords(arguments);
&nbsp;&nbsp;if&nbsp;(!text)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return;
&nbsp;&nbsp;}
&nbsp;&nbsp;if&nbsp;(properties.showSequenceNumbers)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(optionalSection)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(text)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeWords("/",&nbsp;"N"&nbsp;+&nbsp;sequenceNumber,&nbsp;text);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeWords2("N"&nbsp;+&nbsp;sequenceNumber,&nbsp;arguments);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;sequenceNumber&nbsp;+=&nbsp;properties.sequenceNumberIncrement;
&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(optionalSection)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeWords2("/",&nbsp;arguments);
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeWords(arguments);
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}
}</pre>



<p>ポスト編集の学習するには、なかなかいい例題です。<br>結構、盛沢山です。</p>



<h4 class="wp-block-heading"><span id="toc8">関数宣言</span></h4>



<p>function writeBlock() で宣言されています。<br>「writeBlock」という「名前」の「関数」の定義の始まりです。</p>



<h4 class="wp-block-heading"><span id="toc9">引数</span></h4>



<p>あれ？不思議です。<br>この関数は、受け取った引数を細工して、一行に書きだす関数だと推測しているのですが、引数がありません。<br>どうやって、引数を受け取るのでしょうか？</p>



<h4 class="wp-block-heading"><span id="toc10">argumentsオブジェクト</span></h4>



<p>JavaScript には、こんな機能があるんですね。<br>C言語のコマンドライン引数「　*argv[ ]　」に似ていますかね。<br><span class="markerBlue"> 関数が呼び出された時の引数</span>が、自動的に<span class="markerYellow"> argumentオブジェクトの配列内</span>に格納されるみたいです。<br>この機能を利用して、text 変数に引数を取り込んでいます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>var text = formatWords(arguments);</p>
</blockquote>



<p>ここでまた、formatWords( )　関数が出てきました。<br>これは、パブリックメンバー関数です。<br>引数に与えられた、複数のワードをセパレータで区切り、一つの文字列にして最後に改行文字を追加する関数です。<br>また疑問が・・・セパレータとは？<br>実はこれは、「properties」にヒントがありました。<br>デフォルトでは「separateWordsWithSpace: true」と定義されています。<br>「true」であれば、デフォルトで「　」（スペース）になるようです。<br>したがって「arguments」で指定されたワードとワードは、「スペース」で区切られます。<br>実験してみます。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;writeln(formatWords("test1","test2","test3"));
　・
　・</pre>



<p>ポスト処理してみます</p>



<pre class="wp-block-preformatted">test1 test2 test3
 %
 O1001 (TEST01)
・
・</pre>



<p>予想通り、３つの文字列が、「　」（スペース）で区切られました。<br>このセパレータは「setWordSeparator( )」のパブリックメンバー関数で再設定可能です。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;setWordSeparator("/");
&nbsp;&nbsp;writeWords("test1",&nbsp;"test2",&nbsp;"test3");
　・
　・</pre>



<pre class="wp-block-preformatted">test1/test2/test3
 %
 O1001 (TEST01)</pre>



<p>今度は、&#8221;　/　&#8221;が区切り文字になりました。</p>



<h4 class="wp-block-heading"><span id="toc11">真偽（論理）値</span></h4>



<p>次に、「if」文（条件分岐）がでてきました。</p>



<pre class="wp-block-preformatted">if&nbsp;(!text)&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;return;
}</pre>



<p>if文の　(　)　は、論理的に「真(true)」であれば次の　{　}　内を実行し、「偽(false)」で　{　}　の後に「else」があれば、その内部を実行します。<br>「else」がなければなにも実行せずに次に移ります。<br>論理判断は、例えば、「X == 0」とか「X &gt; 10」など数値の比較はわかりやすいですが、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>! text</p>
</blockquote>



<p>はわかりづらいですね。<br><span class="markerYellow"> 「!」は、条件判断の否定</span>の意味です。条件が「真」であれば逆の「偽」になります。<br>また、条件判断は、<span class="markerPink"> 「何もない」場合には「偽」</span>となります。<br>したがって、「 ! text 」の論理判断は、変数「text」になにも定義されていなければ「偽」と判断され、「!」により、逆の「真」の判断で次の定義が実行されます。<br>この例では「return」とあるので、そのままこの関数は終了となります。<br>まとめると</p>



<p><span class="markerYellow"> 変数「text」に何も定義されていなければ、そのまま終了！</span></p>



<p>の意味となります。</p>



<h4 class="wp-block-heading"><span id="toc12">グローバル変数で条件分岐</span></h4>



<p>次も、「if」文です。<br>今回はちょっと複雑で、「if」文のなかに、「if」文が入っています。<br>さらに、「if」での判断が「偽」だった場合に実行させる「else」文も使われています。<br>条件判断の因子として、「properties.showSequenceNumbers」や「optionalSection」の変数が使われています。<br>前者は、プロパティテーブルで「showSequenceNumbers: true」と定義されていて、NC言語のシーケンス番号の出力の有無です。<br>この場合は、「true」なので、出力する仕様となります。<br>後者は、グローバル変数で「var&nbsp;optionalSection&nbsp;=&nbsp;false;」と定義されています<br>NC言語では、オプショナルスキップ「/」の出力の有無となります。<br>この部分のプログラムを要約すると</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>propertiesテーブルの<strong> showSequenceNumbers </strong>が <strong>真</strong>で、さらに<strong>optionalSection</strong> が<strong>真</strong>であれば、あれば、データに「/」と「Nシーケンス番号」を付加します。<br><strong>optionalSection</strong> が<strong>偽</strong>であれば、「Nシーケンス番号」のみを付加します。<br><strong>showSequenceNumbers </strong>が<strong>偽</strong>であれば、<br><strong>optionalSection</strong>の内容により「<strong>/</strong>」を付けるか付けないか、となります。</p>
</blockquote>



<h4 class="wp-block-heading"><span id="toc13">writeWords() と writeWords2()</span></h4>



<p>データを書きだすのに、writeWords() と writeWords2()を使用していますね。<br>調べるとこの関数は、「パブリックメンバー関数」でした。<br>ドキュメントを読んでもよく理解できていませんが、writeWords2()は、引数が２個以上の時のみ書きだすような関数かと思っています。<br>「シーケンス番号」や「/」のみの出力を制限するのが目的でしょうか？<br>よくわかっていません。<br>さらに、writeBlock()をよく読んでみると、writeWords()で書きだすワードには、「text」の場合と「arguments」の場合があります。<br>これもよく理解できていません。<br>せっかく、変数「text」を準備したのだから、全て「text」でも結果は変わらないように思うのですが、よく理解できません。<br>もしわかる方いらっしゃったら教えてください。</p>



<h4 class="wp-block-heading"><span id="toc14">加算代入演算子（+=）と インクリメント演算子（++）</span></h4>



<p>カスタムマクロなどにはない、演算子を使っていたので説明しておきます。<br>「sequenceNumber　<strong>+=</strong>　properties.sequenceNumberIncrement」<br>ちょっと見慣れない方もいらっしゃるかもしれません。<br>これは、加算代入演算子と呼ばれていて、「X += 10.5」は</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>X = X+ 10.5</p>
</blockquote>



<p>と同等です。<br>さらに、「-=」、「*=」、「/=」などもあります。<br>現在の値に相対的な演算をさせたい時に便利な記述です。<br>ちなみに、インクリメント演算子（++）というのもあります。<br>これは、現在の値を「1」増やす（カウントアップ）演算子です。<br>「－－」はデクリメント演算子でカウントダウンとなります。<br>さらに、この演算子は、変数への前置と後置の方法があります。</p>



<pre class="wp-block-preformatted">var A = 1;
var B = 1;
++A;
B++;</pre>



<p>この場合は、AもBも結果的は同じで、「2」になります。<br>では、次の例ではどうでしょう。</p>



<pre class="wp-block-preformatted">var a = 1;
var b = 1;
writeWords(++a);
writeWords(b++);
writeWords("a=",a);
writeWords("b=",b);</pre>



<p>onOpen( )に追加してポストを通すとこうなりました。</p>



<pre class="wp-block-preformatted">2
1
a= 2
b= 2
%
O1001 (TEST01)
・</pre>



<p>まず、変数「a」「b」は「1」に定義しています。<br>writeWords(<strong>++a</strong>)　は<span class="markerPink"> 加算された後</span>に関数に渡される意味となり「2」が出力されてます。<br>次のwriteWords(<strong>b++</strong>)では、<span class="markerPink"> 関数に渡された後に加算</span>される意味で「1」が出力されます。<br>その後、もう一度「a =」「b =」を付加して、現状の状態を書きだしてます<br>結果は、「a=2」「b=2」どちらも加算された後なので「2」です<br>「前置」と「後置」は次に処理が移ると、その変数の内容は同じですが、同じ行では相手への影響の与え方が違います。<br>「++a（前置）」は、インクリメントされた後の値を相手に渡します。<br>「b++（後置）」は、現在に値を相手に渡した後、インクリメントされます。<br>ちょっと、ややこしい仕様ですが、覚えておくと意外と便利です。</p>



<h2 class="wp-block-heading"><span id="toc15">まとめ</span></h2>



<p>本記事では関数の説明をしました。<br>ポストの編集では、自作の関数は必須ではありませんが、他人が作成した関数を分析し調べる事が理解を早める一番の近道だと思います。<br>最初は真似しながら、自分の関数を定義していくと、理解も深まりコードもわかりやすくなります。<br>writeBlock()　だけでも、かなりのボリュームでした。<br>少しでもプログラミングの経験がある方は、だいたいの感覚でも、ポスト編集はできてしまいますが、言語の理解を深める事で簡潔でトラブルが少ないポストファイルとなります。<br>また、ポスト編集だけでなく、編集したコードがすぐに結果に反映するので、ゲーム感覚でプログラミングが体験でき、プログラミング言語の学習として利用してもいいと思います。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h4 class="wp-block-heading"><span id="toc16">ポスト記事</span></h4>



<hr class="wp-block-separator has-css-opacity"/>



<ol class="wp-block-list">
<li>概要編</li>



<li>構成編</li>



<li>変数</li>



<li>グローバルセクション</li>



<li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">関数</span></span></strong></li>



<li>NCプログラム仕様検討</li>



<li>onOpen( )</li>



<li>onSection( ) No1</li>



<li>onSection( ) No2</li>



<li>onSectionEnd( ) &amp; onClose( )</li>
</ol>



<hr class="wp-block-separator has-css-opacity"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <span aria-current="page" class="page-numbers current">5</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">NEXT</a>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Fusion360 CAM ポストプロセッサ徹底解説・グローバルセクション</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-04/</link>
					<comments>https://www.kazuban.com/blog/fusion360-post-processor-04/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Tue, 15 Dec 2020 07:02:43 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4179</guid>

					<description><![CDATA[ポストプロセッサが最初の初期化に使用する、変数やテーブルをグローバルセクションと呼ぶようです。これには、ポストカーネルからの情報であるカーネル設定変数、ポスト処理のダイアログに表示されるプロパティテーブル、ＮＣデータの出 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ポストプロセッサが最初の初期化に使用する、変数やテーブルをグローバルセクションと呼ぶようです。<br>これには、ポストカーネルからの情報であるカーネル設定変数、ポスト処理のダイアログに表示されるプロパティテーブル、ＮＣデータの出力形式を制御するフォーマット定義、さらに、全ての関数がアクセスできるグローバル変数などが定義されています。<br>今回の記事を書くにあたっては、標準でインストールされている「fanuc.cps」を参考にしていますが、このファイルでは慣習的にグローバルセクションは分かりやすいように、ポストファイルの上部に配置されています。<br></p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">カーネル設定(Kernel Settings）</a></li><li><a href="#toc2" tabindex="0">プロパティ(Property Table)</a><ol><li><a href="#toc3" tabindex="0">properties = { }</a></li><li><a href="#toc4" tabindex="0">propertyDefinitions = { }</a></li></ol></li><li><a href="#toc5" tabindex="0">冷却コード変数(coolants)</a></li><li><a href="#toc6" tabindex="0">フォーマット定義(Format Definitions)</a><ol><li><a href="#toc7" tabindex="0">createFormat( )</a></li><li><a href="#toc8" tabindex="0">三項演算子</a></li><li><a href="#toc9" tabindex="0">createVariable()</a></li><li><a href="#toc10" tabindex="0">createReferenceVariable()</a></li><li><a href="#toc11" tabindex="0">createModal()</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a><ol><ol><li><a href="#toc13" tabindex="0">Fusion360 ポスト記事</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">カーネル設定(Kernel Settings）</span></h2>



<p>参考の「fanuc.cps」では、上部３６行までに、変数宣言（「var」が付かない）がない変数として定義されています。<br>これは、ポストエンジンとのやりとりに使われます。<br>ファイルの上部に配置され「var」がないので、<strong>特殊な変数</strong>である事はわかりますが、<span class="markerPink">注意が必要</span>です。<br>前回も話題にしましたが、<span class="markerYellow">JavaScript言語は変数宣言に「var」がなくても使用できて</span>しまいます。<br>したがって、この付近へ新規に「var」なし変数への代入定義をしても、<span class="markerPink"> エラーを出してくれません。</span><br>安易に宣言なしの、変数を使ってしまうと、カーネル変数なのか、個人的な変数なので分からなくなってしまうので、必ず新しい変数を定義する時には、<strong>宣言付き</strong>で定義し、カーネル変数の後部エリアで宣言する事をお勧めします。<br>では、Fusion360 CAM でポスト処理を実行し、ポストファイルとして「fanuc.cps」に設定してみます。<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="603" height="540" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting.png" alt="" class="wp-image-4186" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting.png 603w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/KernelSetting-300x269.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></figure>



<p>プロパティのテーブルに接頭（ビルトイン）が付いたプロパティが見つかります。<br>これは、「fanuc.cps」ファイルで「var」のない変数と見比べると、カーネル設定変数の一部なのが分かります。<br>この値自体は、ダイアログで編集する事も可能ですが、「fanuc.cps」の変数を直接編集する事で、デフォルト値にする事ができます。<br>この他にも、いくつか、ダイアログに表示される変数があります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>description = &#8220;FANUC&#8221;;<br>「ポスト処理」ダイアログでポストファイルを選択する、ボックスに表示されるタイトルの左側の文字になります。その後「/」の後に、実際のポストファイル名が表示されます</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>extension = &#8220;nc&#8221;;<br>この値が、作成されるＮＣデータの拡張子になります。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>programNameIsInteger = true;<br>この値が、「true」の場合、「ポスト処理ダイアログ」の「プログラム名と番号」の項目に、数字しか使用できません。<br>「false」にする事で英文字なども使用できるようになります。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>setCodePage(&#8220;ascii&#8221;);<br>ＮＣデータを出力する時のエンコードを指定するようです。<br>ポストエラーログなどが文字化けたりした場合に「utf-8」に変更すると漢字が正常になったりします<br>「ansi」「utf-8」などがあるようです。</p></blockquote>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>allowedCircularPlanes</strong> = undefined;<br>これは重要な変数です。見つけるまでに、結構時間がかかりました。<br>この１行がないと、<span class="markerYellow"> 全ての出力が<strong>直線補間</strong></span>で処理されるようです。<br>通常、円弧の場合「onCircle( )」関数が実行されますが<br><span class="markerPink">この変数がないと、</span>この関数に飛んでいきません。<br>ようするに、<span class="markerPink">全て<strong>直線補間</strong>で処理されます。</span><br>これは結構、悩みました。</p></blockquote>



<p>これらの変数も編集可能です。<br>試しに、拡張子など変更してみると、ポスト処理の再起動で反映されます。</p>



<h2 class="wp-block-heading"><span id="toc2">プロパティ(Property Table)</span></h2>



<p>ポストダイアログの「プロパティテーブル」には、（ビルトイン）以外の変数もリストされています。<br>ここを定義しているのが、properties = { }; 　とpropertyDefinitions = { };　の配列です。<br>JavaScript言語では、{  } で囲った配列は、通常の配列の拡張版で、「連想配列」と呼ばれています。<br>連想配列は、「:」を区切りに、「キーワード:値」　の形式で定義します。<br>使用時は「変数名」.「キーワード」の形式で参照する事ができます。<br>「propertyDefinitions」の配列は、さらに複雑ですね<br>連想配列の要素に、さらに連想配列が定義されています。<br>ただこれも、<span class="markerYellow"> 「.」でつないで行く事で参照できます。</span><br>たとえば、<br> writeln ( propertyDefinitions.writeMachine.title );<br>のように、使用する事ができます。</p>



<h3 class="wp-block-heading"><span id="toc3">properties = { }</span></h3>



<p>properties変数は、ポスト処理ダイアログを開くと、「プロパティ」の項目にそのタイトルと値が表示されるのが分かります</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="331" height="208" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/property.png" alt="" class="wp-image-4196" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/property.png 331w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/property-300x189.png 300w" sizes="(max-width: 331px) 100vw, 331px" /></figure>



<p>したがって、ポストファイルの「properties」の内容を変更したり、追加・削除する事で、項目やデフォルト値を変更する事ができます。<br>使用しない項目は削除したほうが、すっきりしますね。<br>削除の場合は、いきなり削除せず「//」でコメントにしておいた方が安全です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>// writeMachine: true, // write machine</p></blockquote>



<h3 class="wp-block-heading"><span id="toc4">propertyDefinitions = { }</span></h3>



<p>この変数は、プロパティテーブルへの表示を制御できます。<br>「title:」の値が表示されるタイトルとなり、「description:」でその項目の説明を定義できます。<br>説明は、プロパティテーブルの項目の上にマウスカーソルも持っていくと表示されます。<br>さらに、「group:」で、プロパティテーブルへの表示順序を制御できます。<br>「0」[1]・・と若い数字の「group」が上部に表示されるので、よく使用する変数は「0」「1」にしておくと、プロパティ設定が分かりやすくなります。<br>実は、この「propertyDefinitions」変数は、無くても動作するようです。<br>この変数全体をコメントアウトして実験してみましたら、説明分がでないだけで普通にポスト処理できました。<br>ただ、「Training Guide」マニュアルには、全てのエントリに一致するエントリが必要だとの記述がありますし、これがないと「tool tip text」が関連付けられないとあるので、よく理解できていませんが、<span class="markerYellow"> 「properties」と「propertyDefinitions」の項目は合わせて</span>おいたほうが無難なようです。</p>



<h2 class="wp-block-heading"><span id="toc5">冷却コード変数(coolants)</span></h2>



<p>propertiesまでが、カーネル変数ですが、この定義から、下がっていくと「coolants」変数が定義されています。<br>こんな上部にクーラント定義が出てくるとはちょっと意外でしたが、<span class="markerPink"> 機械の依存コードで違いが多い</span>のも、クーラントコードです。<br>同じメーカーの機械でも違う場合がありますから、そんな配慮でしょうか？<br>読んで字のごとく、機械の「クーラント（冷却）コード」指令の定義です。<br>まず、「var&nbsp;singleLineCoolant&nbsp;=&nbsp;false」とありますから、おそらく、クーラント指令で、単体か複数指令かの判定をする変数だと思われます。<br>たとえば、外部エアー指令の場合「M07」だけではなく、「M140 M07」と複数のＭコード指令が必要な機械などへの対応だと思います。<br>複数定義の場合には、<br>&nbsp;on:&nbsp;[8,&nbsp;88],&nbsp;off:&nbsp;[9,&nbsp;89]<br>のように、連想配列のキー名の値として、さらに配列で指令するみたいです<br>結構複雑ですね。<br>ここまで、複雑にしなくても、いいように思いますが、ポスト作者の思想（性格）でしょうか？<br>ところで、参考にしている「fanuc.cps」を見てみると<br>{id:&nbsp;COOLANT_FLOOD,&nbsp;on:&nbsp;8},　のように、「on」や「off」要素があるものと<br>{id:&nbsp;COOLANT_MIST},　のように「id」要素しかないケースがあります。<br>実は、工具設定で「ミスト」を指定して、このポストファイルで処理させると、エラーになってしまいます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="250" height="549" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/Mist.png" alt="" class="wp-image-4199" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/Mist.png 250w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/Mist-137x300.png 137w" sizes="(max-width: 250px) 100vw, 250px" /></figure>



<pre class="wp-block-preformatted">　　・
　　・
#
エラー:<strong> Unsupported 'mist' coolant.</strong>
Error in operation: '2D 輪郭1'
Failed while processing onSection() for record 475.
#
　　・
　　・</pre>



<p>Fusion360 CAM の工具のクーラント設定の値をポスト処理する時には、この変数を参照しているのが分かります。<br>したがって、使用する機械のクーラントコードに合わせるには、この変数を編集すればいいと言うことになります。<br>使用機械の設備にない仕様には、意識して設定なしにしておく事で、<span class="markerYellow"> 間違って指定した場合は、エラーが教えてくれる！</span>がいい場合には、このように値を入れない事で実現できます。<br>ポストでエラーが出ると、戸惑ってしまうので、仕様にない設定でも、<span class="markerYellow"> とりあえず「M08」にしておこう！</span>の場合は、on:&nbsp;8の設定で実現できます。<br>ちなにに、実際のＭコードへの変換は、2465行付近のsetCoolant(coolant) やgetCoolantCodes(coolant) 関数で行っています。<br>本当面倒な事しているように思います、もっと単純なプログラムにする事もできると思いますが、汎用性を意識するとこうなるのかもしれません。</p>



<h2 class="wp-block-heading"><span id="toc6">フォーマット定義(Format Definitions)</span></h2>



<p>次に、Format関連の定義が出てきました。<br>これは、主にＮＣプログラムの、ワード（G01とかM03とか）を出力するのに<br>使われています。<br>さらに、モーダル状態なども、定義しているようです。<br>ざっと眺めると、４個の組込関数があります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>createFormat()<br>createVariable()<br>createReferenceVariable()<br>createModal()</p></blockquote>



<h3 class="wp-block-heading"><span id="toc7">createFormat( )</span></h3>



<p>ＮＣコードの出力フォーマットを定義しています。<br>連想配列を引数でうけとり、出力方法を制御しています。</p>



<pre class="wp-block-preformatted">var gFormat = createFormat({prefix:"G", width:2, zeropad:true, decimals:1});
writeln(gFormat.format(1));
writeln(gFormat.format(53.1));</pre>



<p>たとえばこの例では、まずは「G」を出力、文字列の幅２、幅が少ない場合には「0」を追加、小数点以下１桁。<br>の意味になり、このプログラムでは、「G01」「G53.1」が出力されます。</p>



<h3 class="wp-block-heading"><span id="toc8">三項演算子</span></h3>



<p>フォーマット定義からは、ちょっと脱線しますが、フォーマット定義を眺めていると、</p>



<p>(unit&nbsp;==&nbsp;MM&nbsp;?&nbsp;3&nbsp;:&nbsp;4)</p>



<p>このような構文が多数でてきますので、説明しておきます。<br>これは、「三項演算子」と呼ばれている、「演算子」の一つです。<br>C言語など他の言語にも同じような構文があります。<br>「if」文と同じように、条件判断をするときに使用します。<br>一行で表現できるので、単純な条件の場合には便利ですが、複雑になってくると暗号のようになって、理解しづらいプログラムになってしまいます。<br>複雑な場合には「if」文のほうが読みやすくなります。<br>この演算の意味は、<br>「 ? 」の前の式を評価し、結果が「真」であれば、「 : 」前の値を返し、「偽」であれば「 : 」の後ろの値を返します。</p>



<p>var a = (unit&nbsp;==&nbsp;MM&nbsp;?&nbsp;3&nbsp;:&nbsp;4);</p>



<p>この定義では、<br>「unit が MM であれば、a=3、そうでなければ、a=4」<br>となります。<br>if 文で書くと、こうなります。</p>



<pre class="wp-block-preformatted">var a;
if(unit == MM){
  a = 3;
}else{
  a = 4;
}</pre>



<p>ちなみに、「unit」や「MM」の変数はなんでしょうか？<br>「fanuc.cps」には、この変数の定義がみつかりません。<br>おそらく、ポストカーネル側で定義されている変数だと思います。<br>使用中デザインの単位ですね。<br>MMがミリ単位。INがインチ単位です。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="338" height="202" src="https://www.kazuban.com/blog/wp-content/uploads/2020/12/MM_IN.png" alt="" class="wp-image-4252" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/12/MM_IN.png 338w, https://www.kazuban.com/blog/wp-content/uploads/2020/12/MM_IN-300x179.png 300w" sizes="(max-width: 338px) 100vw, 338px" /></figure>



<p>この変数はどのように定義されているのでしょうか？<br>不明な変数を確認したい場合は、onOpen( )の最初にwriteln( )で出力させる方法が簡単です。<br>onOpen( )は、ポスト処理の最初に呼ばれるので、その先頭に書き込む事で、データの先頭に書きだされます。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;writeln(unit);
&nbsp;&nbsp;writeln(IN);
&nbsp;&nbsp;writeln(MM);
・
・
</pre>



<p>このように、「writeln( )」で出力されてみると、どのように定義されているのか、わかります。<br>上の例では、</p>



<pre class="wp-block-preformatted">1
0
1
%
O1001 (TEST01)
・
・</pre>



<p>このようになりました。<br>私の環境では、「unit = 1」なのがわかります。<br>その後の結果から、「IN = 0」「MM = 1」なので、「unit == MM」なのがわかります、<br>これを理解の上、下記のコードを分析してみましょう。</p>



<pre class="wp-block-preformatted">var&nbsp;xyzFormat&nbsp;=&nbsp;createFormat({decimals:(unit&nbsp;==&nbsp;MM&nbsp;?&nbsp;3&nbsp;:&nbsp;4),&nbsp;forceDecimal:true});
</pre>



<p>まず「decimais:」で小数点以下の桁数を定義しています。<br>その値は、「三項演算子」で条件判断されます。<br>具体的には、unit がミリであれば、「3」、インチであれば「4」になります。<br>「forceDecimal:」は整数の場合、小数点を出すか出さないかです。<br>この例では「true」なので、小数点を出力します。<br>このように、単純な条件判断の場合には、三項演算子は便利です。</p>



<h3 class="wp-block-heading"><span id="toc9">createVariable()</span></h3>



<p>定義済みのフォーマットを用いて、新しい出力を定義します<br>次のコードを見てみましょう</p>



<pre class="wp-block-preformatted">var&nbsp;<strong>xyzFormat</strong>&nbsp;=&nbsp;createFormat({decimals:(unit&nbsp;==&nbsp;MM&nbsp;?&nbsp;3&nbsp;:&nbsp;4),&nbsp;forceDecimal:true});
var&nbsp;xOutput&nbsp;=&nbsp;createVariable({prefix:"X"},&nbsp;<strong>xyzFormat</strong>);
var&nbsp;yOutput&nbsp;=&nbsp;createVariable({prefix:"Y"},&nbsp;<strong>xyzFormat</strong>);</pre>



<p>まず、「xyzFormat」で、ミリ単位であれば、３桁の小数点出力を定義してます。<br>その後、「createVariacle( )」で、接頭に「X」を付加するように再定義しています。<br>これも、onOpen( )へのwriteln( )で確認してみましょう。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;var&nbsp;x&nbsp;=&nbsp;12.345678;
&nbsp;&nbsp;writeln(xOutput.format(x));
  ・
  ・</pre>



<p>ポスト処理させてみます。</p>



<pre class="wp-block-preformatted">X12.346<br>%<br>O1001 (TEST01)<br>・<br>・</pre>



<p>きちんと、四捨五入までされて、下３桁の小数点で出力されました。</p>



<h3 class="wp-block-heading"><span id="toc10">createReferenceVariable()</span></h3>



<p>このオブジェクトは、最初の引数と次の引数が同一である場合に出力を省略させる場合に使用します。<br>主に円弧補間の「I J K」指令で、「0」の場合には出力させたくない場合に用いるようです。<br>「fanuc.cps」では、このように定義されています。</p>



<pre class="wp-block-preformatted">var&nbsp;xyzFormat&nbsp;=&nbsp;createFormat({decimals:(unit&nbsp;==&nbsp;MM&nbsp;?&nbsp;3&nbsp;:&nbsp;4),&nbsp;forceDecimal:true});
var&nbsp;iOutput&nbsp;=&nbsp;createReferenceVariable({prefix:"I"},&nbsp;xyzFormat);</pre>



<p>createVariable()と同じに見えますが、createVariable()は、引数が一つなのに対して、createReferenceVariable()は、2個の引数をとります。<br>今回も、onOpen( )で確認してみましょう。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;var&nbsp;x&nbsp;=&nbsp;12.3;
&nbsp;&nbsp;writeln(iOutput.format(x,0));
&nbsp;&nbsp;x&nbsp;=&nbsp;0.000;
&nbsp;&nbsp;writeln(iOutput.format(x,0));
  ・
  ・</pre>



<p>ポスト処理させてみます。</p>



<pre class="wp-block-preformatted">I12.3

 %
 O1001 (TEST01)
　・
　・</pre>



<p>このように、最初の引数の変数が、第２引数の「0」以外の時は、データが出力されますが、「0」の時には、改行だけとなりました。</p>



<h3 class="wp-block-heading"><span id="toc11">createModal()</span></h3>



<p>Ｇコードのモーダルコードの出力に使用します<br>モーダルコードが分からない方は、<a href="https://www.kazuban.com/blog/nc-gcode-02/">こちらで説明しています。</a><br>モーダルなコードは、同じグループのコードが指定されるまで、そのコードが引き継がれ省略可能なコードです。<br>関数の第一引数に「force:true」を指定すれば。モーダル状態であっても<br>出力します。<br>デフォルトは「false」なので、省略すると「false」になります。<br>次のコードで試してみましょう。</p>



<pre class="wp-block-preformatted">var <strong>gFormat</strong> = createFormat({prefix:"G", width:2, zeropad:true, decimals:1});
var gModal = createModal({},<strong>gFormat</strong>);
var gModalForce = createModal({force:true}, <strong>gFormat</strong>);</pre>



<p>gModal はモーダルな場合省略されますが、gModalForce は省略されません。<br>では、onOpen( )にコードを書き込んでみましょう。<br>省略状況を確認するために、グローバルで「gModal」と「gModalForce」を定義しています。</p>



<pre class="wp-block-preformatted">var&nbsp;gModal&nbsp;=&nbsp;createModal({},gFormat);
var&nbsp;gModalForce&nbsp;=&nbsp;createModal({force:true},&nbsp;gFormat);
function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;writeln(gModal.format(0));
&nbsp;&nbsp;writeln(gModal.format(0));
&nbsp;&nbsp;writeln(gModalForce.format(0));
　・
　・</pre>



<p>ポスト処理すると、このようになりました。</p>



<pre class="wp-block-preformatted">G00

G00
%
O1001 (TEST01)
　・
　・</pre>



<p>一行目は「G00」が出力されていますが、二行目はモーダルなので省略されています。<br>三行目もモーダルですが、「force:true」の影響で出力されています。<br>では、モーダルでない場合もテストしてみましょう。</p>



<pre class="wp-block-preformatted">var&nbsp;gModal&nbsp;=&nbsp;createModal({},gFormat);
var&nbsp;gModalForce&nbsp;=&nbsp;createModal({force:true},&nbsp;gFormat);
function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;writeln(gModal.format(1));
&nbsp;&nbsp;writeln(gModal.format(0));
　・
　・</pre>



<pre class="wp-block-preformatted">G01
G00
%
O1001 (TEST01)
　・
　・</pre>



<p>期待通り、「G01」の後、モーダルコードの値が変わったので「G00」が出力されました。<br>実は、Gコードなどを出力させるには、このようなフォーマット関数を使用しなくても、<span class="markerBlue"> 「writeln(&#8220;G01&#8221;)」のように<strong>直接文字列</strong>を書けば、出力させる事は可能</span>です。<br>ただその場合、現在のモーダル状態を記憶しません、「&#8221;G01&#8243;」はただの文字列と認識するだけです。<br>試してみましょう。</p>



<pre class="wp-block-preformatted">function&nbsp;onOpen()&nbsp;{
&nbsp;&nbsp;writeln(gModal.format(1));
&nbsp;&nbsp;writeln("G00");
&nbsp;&nbsp;writeln(gModal.format(1));
　　・
　　・</pre>



<p>本来であれば、「G01」の後「G00」が指令されているので、次に「G01」が来る場合<span class="markerYellow"> モーダルでないので「G01」が出力されなくてはいけません。</span><br>ところが、</p>



<pre class="wp-block-preformatted">G01
G00

%
O1001 (TEST01)
　・
　・</pre>



<p><span class="markerYellow"> 「G00」指令でフォーマット関数を使用しなかったた</span>め、モーダル情報では「G01」だと思っているので、三行目は「G01」が省略されてしまいました。<br>これ・・<span class="markerPink"> Gコード的には結構怖いですよね～</span><br>切削モードのはずが、早送りになってしまっています。<br>このように、Gコードを直接文字列で出力させる事は簡単ですが、なるべく（特にモーダルコードは）フォーマット定義で出力させるようにしましょう！</p>



<h2 class="wp-block-heading"><span id="toc12">まとめ</span></h2>



<p>主に上部で定義してあるグローバルセクションの説明をしました。<br>フォーマット定義は単純に文字列を出力させるだけでなく、NCデータの状態や桁数、四捨五入も行う重要な定義です。<br>Gコード出力にはなるべくこの関数を使います。<br>さらにこの下段には、各関数から参照できるグローバル変が「var」で宣言されています。<br>ここでのグローバル変数は、自分で定義する関数からも参照できますし、自分で宣言したグローバル変数に既存の関数からもアクセスさせることもできます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>例えば、<br>「var G01Code_ = 0;」などとグローバルエリアで宣言しておき、この変数で「直線補間:G01」の出現個数を集計したいとします。<br>ポストは直線補間が現れると、「onLinear( )」関数が自動的に呼ばれますから<br>この関数の内部に、「G01Code_++;」を書いておくと、呼ばれるごとに、カウントアップされます。<br>ポスト処理最後には、「onClose( )」がよばれるので、ここに、この変数を表示させる事で目的の「直線補間の出現個数」を表示させる事ができます。<br>このように、グローバル変数をうまく使うと、ポスト処理の情報を取り込む事ができます。</p></blockquote>



<p><br>次には、関数の定義が続いていますね。<br>ここからようやく、思い通りのデータを出力できるようになります。</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc13">Fusion360 ポスト記事</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li>変数</li><li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">グローバルセクション</span></span></strong></li><li>関数</li><li>NCプログラム仕様検討</li><li>onOpen( )</li><li>onSection( ) No1</li><li>onSection( ) No2</li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<p><a href="https://www.kazuban.com/blog/wp-admin/edit.php?post_type=post"></a></p>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-03/">3</a>
  <span aria-current="page" class="page-numbers current">4</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">NEXT</a> 
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/fusion360-post-processor-04/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Fusion360 CAM ポストプロセッサ徹底解説・変数</title>
		<link>https://www.kazuban.com/blog/fusion360-post-processor-03/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 13 Dec 2020 08:03:43 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=4069</guid>

					<description><![CDATA[さぁ、いよいよ前回説明した、エントリ関数を編集して、希望のＮＣデータ構成にしてみようか・・・と思っていましたが、トレーニングガイドを眺めて見るとポストプロセッサとのやりとりや、ＮＣデータの出力書式などを定義している、グロ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>さぁ、いよいよ前回説明した、エントリ関数を編集して、希望のＮＣデータ構成にしてみようか・・・と思っていましたが、トレーニングガイドを眺めて見るとポストプロセッサとのやりとりや、ＮＣデータの出力書式などを定義している、グローバルセクションは少し理解しておいた方がよさそうです。<br>その前に、JavaScript言語の変数についても、少し詳しく調べてみました。<br>偶然、変数宣言で、Fusion360ポストと一般的なJavaScript言語との違いも見つかったので、報告しています。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">変数の寿命・スコープ（影響範囲）</a><ol><li><a href="#toc2" tabindex="0">グローバルスコープとローカルスコープ</a></li><li><a href="#toc3" tabindex="0">関数スコープ</a></li><li><a href="#toc4" tabindex="0">ブロックスコープ</a></li><li><a href="#toc5" tabindex="0">var　と　let</a><ol><li><a href="#toc6" tabindex="0">再宣言の可不可</a></li><li><a href="#toc7" tabindex="0">スコープの違い</a></li><li><a href="#toc8" tabindex="0">変数の巻き上げ</a></li></ol></li></ol></li><li><a href="#toc9" tabindex="0">まとめ</a><ol><ol><li><a href="#toc10" tabindex="0">Fusion360　ポスト記事</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">変数の寿命・スコープ（影響範囲）</span></h2>



<p>プログラミング言語では、まず変数を定義するところから始まりますが、その変数の寿命を意識していないと、エラーになるならまだいいですが、違う結果を吐き出されてしまう可能性もあります。<br>変数は大きく分けると、「グローバル変数」と「ローカル変数」に分類され、その寿命（スコープ）は「グローバルスコープ」「ローカルスコープ」となります<br>さらにＣ言語ではあまり気にした事なかったですが、JavaScriptの「ローカルスコープ」は「関数スコープ」と「ブロックスコープ」の違いも気にした方がいいようです。<br>この違いは、後述する「var」と「let」の違いの一つでもあるようです。<br><a rel="noopener" href="https://www.javadrive.jp/javascript/var/index2.html" target="_blank">「参考サイト」</a></p>



<h3 class="wp-block-heading"><span id="toc2">グローバルスコープとローカルスコープ</span></h3>



<p>Fusion360のポストは、イベント処理的に対象の関数を呼び出します。<br>例えば、ポスト処理開始時には、「onOpen( )」関数が呼ばれ、定義された操作ごとに「onSection( )」が呼ばれます。<br>工具経路処理で、直線補間の動作では、「onLinear( )」、円弧補間時には「onCircular( )」が呼ばれます。<br>こんな感じで、処理する内容によりイベント的に関数が呼ばれポスト処理されていきます。<br>変数は各関数内部で宣言される場合と、関数の外側で宣言される場合があります。<br>関数の外側で宣言された変数はグローバル変数と呼ばれ、プログラム内のどの関数からでも参照でき、プログラムが終了するまで生き残ります。<br>これをグローバルスコープと呼びます。<br>どこからでも参照できるため、グローバル上では変数の宣言は重複出来ないほうが安全ですが、<span class="markerPink"><strong>Fusion360では同じ名前で宣言できてしまうので、注意が必要です。</strong></span><br>関数内部や、さらにその内部のブロック内部で宣言された変数は、ローカル変数と呼ばれ、その関数やブロック内部からしか参照できません。<br>したがって、違う関数やブロックでは同じ名前の変数を使用してもお互いに影響を与えません。さらにグローバル変数と同じ名前でもグローバル変数に影響をあたえません。<br>その関数やブロックから出るとグローバル変数の値に戻ります。<br>このように内側の変数をローカルスコープと呼びます。<br><span class="markerYellow">Fusion360ポストファイルでは、上部に重要なグローバル変数がまとめて定義されています。</span><br>自分で変数を宣言する場合、ローカル変数は、関数内部での寿命なので、それほど気を使う必要はないですが、<span class="markerYellow">グローバル変数を定義する場合には混乱を避けるたためにも、定義済みグローバル変数の下段ぐらいにまとめておいたほうが分かりやすいです。</span></p>



<h3 class="wp-block-heading"><span id="toc3">関数スコープ</span></h3>



<p>関数スコープは関数（Function）内で定義された変数です。<br>違う関数では、変数に同じ名前を使用しても、お互いに影響を与えないため、グローバル変数よりも気楽に使用する事ができます。<br>Fusion360ポストでテストしてみます。</p>



<pre class="wp-block-preformatted">var global_01; // &lt;----- グローバル変数
var global_02; // &lt;----- グローバル変数
function wtest(){
  var local_01 = "R01"; // &lt;---- ローカル変数・関数スコープ
  var local_02 = "R02"; // &lt;---- ローカル変数・関数スコープ
  writeln(local_01);
  writeln(local_02);
}
wtest();//&lt;------ R01 , R02   が出力される
writeln(local_01);// &lt;---- local_01 is not defined</pre>



<p>関数外部からは内部で定義された変数は、参照できないのがわかります</p>



<h3 class="wp-block-heading"><span id="toc4">ブロックスコープ</span></h3>



<p> ブロックスコープは、関数スコープ内部でさらに、「if」や「for」など　｛　｝　に囲まれたブロックの内側でしか生き残れない寿命です。<br>関数スコープよりも短い寿命になりますが、JavaScript言語では、ちょっと複雑なようです。<br>次で少し掘り下げてみます。<br><a href="https://www.codegrid.net/articles/2017-js-scope-1">参考サイト</a></p>



<h3 class="wp-block-heading"><span id="toc5">var　と　let</span></h3>



<p>JavaScript言語では、変数宣言の「var」と「let」では再宣言やスコープが違うようです。<br><a href="https://qiita.com/wannabe/items/b2a0d63fc786eab13c48">参考サイト</a></p>



<h4 class="wp-block-heading"><span id="toc6">再宣言の可不可</span></h4>



<p>「var」は同じスコープ内で再宣言できるのに対して、「let」はできないようです。</p>



<pre class="wp-block-preformatted">function vartest(){
  var x = 0;
  writeln(x);
  var x = 1; // 再宣言
  writeln(x);
}
</pre>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p>ポストファイルを編集し、この関数を呼んでみると、やはりエラーはでなくて、「0」「1」が出力されました。<br>気持ち的には、同じ変数名なので。エラーを出してほしいです。<br>同じスコープ内で再宣言できるというのは、私はどうも違和感あります、<br>故意に同じ名前を使いたい場合ならいいですが、特に長いプログラムで誤って宣言してしまった場合トラブルの原因になりそうだし、トラブル時に問題点を探すのも大変です。<br>なので、やっぱり筆者は<span class="markerBlue">「let」の再宣言不可がいいですね！</span><br>ということで、Fusion360ポストでも、「let」のテストをしてみました。</p>
</div></div>



<pre class="wp-block-preformatted">function lettest(){
   let x = 0; 
   writeln(x);
   let x = 1; // 再宣言。let なのでエラーになるはず。
   writeln(x);
 }</pre>



<p>今度は、「let」で宣言し、呼び出してみました。<br><span class="markerPink"><strong>うん、なぜだろう？？</strong><br>エラーにならず、「ver」と同じ結果になりました。</span><br>試しに、centOS7 に node.js をインストールして確認してみます。<br>まずは「var」から。<br>「test.js」ファイルを作成し、実行します。</p>



<pre class="wp-block-preformatted">--- test.js ----
<strong>va</strong>r x = 0;
console.log(x);
<strong>var</strong> x = 1; // 再宣言
console.log(x);

$ node test.js
0
1
</pre>



<p>期待通り、再定義でもエラーにならず、出力されました。<br>次に、「var」を「let」に変更して実行します</p>



<pre class="wp-block-preformatted">--- test.js ----
<strong>let</strong> x = 0;
console.log(x);
<strong>let</strong> x = 1; // 再宣言
console.log(x);

$ node test.js
 /home/kazu/test.js:3
   let x = 1; // 再宣言
       ^
<strong> SyntaxError: Identifier 'x' has already been declared</strong></pre>



<p>やはり、JavaScript言語では、エラーになるのが正常のようです。<br>Fusion360のこの現象はこの記事を書いていて見つかったので、ある意味よかったです。<br>これは、<span class="markerPink"><strong>Fusion360の仕様なのか？バグなのか？</strong></span><br>いずれにしても現状ではしょうがないので、<span class="markerYellow">Fusion360ポストでの変数は「let」であっても再宣言が許可されていると言うことを認識し、関数内部でも変数はなるべく上部でまとめて宣言するようにして、意識して重複宣言は避ける</span>ようにしようと思います。</p>



<h4 class="wp-block-heading"><span id="toc7">スコープの違い</span></h4>



<p>さらに、「var」と「let」ではスコープも違うようです。<br>「var」は関数スコープ。「let」はブロックスコープです。<br>したがって、関数内部のブロック内で、変数を宣言した場合、「let」はその変数にはブロック内部でしか参照できませんが、「var」はブロックを出ても、関数内であれば、参照できてしまいます。<br>この違いも、Fusion360ポストでは、発生しないのでしょうか？<br>そうなると、Fusion360ポストでは、とりあえず「let」を使用してもエラーにはならないが、「var」と同じだと言うことになりますね。<br>とりあえず、実験してみましょう！</p>



<pre class="wp-block-preformatted">var vx = 1;
let lx = 2; 
writeln(vx); //　1　出力 
writeln(lx) //　2 出力 
if (true){　// ここからブロック内
     vx = 3; // vx に 3 代入
     lx = 4; // lx に 4 代入
     var vy = "v"; // 新規に var で vy 宣言と"v"割り当て
     let ly = "l"; // 新規に let で ly 宣言と"l"割り当て
} //ブロック終わり
writeln(vx); // 3 出力
writeln(lx); // 4 出力
writeln(vy); //v 「var」は関数スコープなので、「"v"」を出力
writeln(ly); //error vy is not defined「let」はエラーが出てくれた！</pre>



<p><span class="markerPink">こちらのテストでは、Fusion360のポストも、スコープの違いは一般的なJavaScript と同じ仕様となりました。</span></p>



<h4 class="wp-block-heading"><span id="toc8">変数の巻き上げ</span></h4>



<p>JavaScript には、「変数の巻き上げ」という、特融の概念もあるみたいです。<br>なんだか分かりにくい仕様ですが、<a rel="noopener" href="https://qiita.com/wannabe/items/b2a0d63fc786eab13c48" target="_blank">こちらを参考に</a>、Fusion360でポスト処理してみます。</p>



<pre class="wp-block-preformatted">var xxx =0;
 function onOpen() {
  writeln(xxx); 
  var xxx = 1;
  writeln(xxx);
    ・
    ・
</pre>



<p>onOpen( )の内部で、「xxx」変数を書きだしてみます。。<br>最初の「writeln( )」では、「xxx」は外側で、グローバル変数として、<br>var xxx =0;<br>と定義されているので、本来ならば「0」が出力されそうな気がしますが、<br>「<strong>undefined</strong>」となりました。<br>これは、onOpen( )関数内部に、<br>var xxx = 1;<br>の定義があるからのようです。<br>不思議な仕様ですね。C言語では、初期化と代入は違いますが、JavaScriptではブロック内に宣言があると自動的に「<strong>undefined</strong>」で<strong>初期化</strong>されるみたいです。<br>なので、「var xxx = 1」は初期化ではなく、<strong>代入</strong>なんでしょうねぇ<br>試しに、グローバル変数として定義してる「var xxx = 0」を削除してみました。<br>ポスト処理の結果は同じデータでした。<br>てっきりエラーが出るかと思いますが、そうではないようです。</p>



<h2 class="wp-block-heading"><span id="toc9">まとめ</span></h2>



<p>JavaScript の構文は、C言語に結構にているので、とりつきやすいですが、変数の仕様はかなり違和感ありました<br>変数宣言時に右辺で値を割り当てると、C言語では「初期化」になり、その後、別の値を割り当てると「代入」となりますが、<br>JavaScript では、どこかに宣言があると、自動的に「undefined」で初期化されその後の宣言は、「初期化」ではなく「代入」として扱われる感じですね<br>また、再宣言に関しては、「var」が可能で、「let」が不可との事なので、「let」のほうが、C言語の変数扱いに近いように思います。<br>ただ何故なのか？わかりませんが、Fusion360ポストでは同じ結果になってしまいました。<br>したがって、可能であっても、再宣言は使用しないで、代入としたほうがいいと思います。</p>



<hr class="wp-block-separator"/>



<h4 class="wp-block-heading"><span id="toc10">Fusion360　ポスト記事</span></h4>



<hr class="wp-block-separator"/>



<ol class="wp-block-list"><li>概要編</li><li>構成編</li><li><strong><span style="text-decoration: underline;"><span class="has-inline-color has-vivid-purple-color">変数</span></span></strong></li><li>グローバルセクション</li><li>関数</li><li>NCプログラム仕様検討</li><li>onOpen( )</li><li>onSection( ) No1</li><li>onSection( ) No2</li><li>onSectionEnd( ) &amp; onClose( )</li></ol>



<hr class="wp-block-separator"/>



<div class="pager">
  <a class="prev page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">PREV</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-01/">1</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-02/">2</a>
  <span aria-current="page" class="page-numbers current">3</span>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">4</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-05/">5</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-06/">6</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-07/">7</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-08/">8</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-09/">9</a>
  <a class="page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-10/">10</a>
  <a class="next page-numbers" href="https://www.kazuban.com/blog/fusion360-post-processor-04/">NEXT</a>
</div>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
