<?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>CAM | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/cam/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Wed, 17 Dec 2025 22:56:56 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.kazuban.com/blog/wp-content/uploads/2020/05/cropped-ICON-1-32x32.png</url>
	<title>CAM | じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ファナック・カスタムマクロの展開をAiにやってもらう！</title>
		<link>https://www.kazuban.com/blog/custom-macro-with-ai/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 02 Aug 2025 02:50:55 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[生成Ai]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=11441</guid>

					<description><![CDATA[最近は、CAMの充実もあって、カスタムマクロの利用もかなり減少しいていると思います。ただ、穴などの基本的な加工の場合、座標値入力だけで加工できるのでうまく使えば、かなり重宝します。マシニングセンターを、操作フライス盤的な [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">最近は、CAMの充実もあって、カスタムマクロの利用もかなり減少しいていると思います。<br>ただ、穴などの基本的な加工の場合、座標値入力だけで加工できるのでうまく使えば、かなり重宝します。<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><ol><li><a href="#toc2" tabindex="0">プログラミングの難易度</a></li><li><a href="#toc3" tabindex="0">デバッグの複雑さ</a></li></ol></li><li><a href="#toc4" tabindex="0">そうだ、Aiに展開してもらおう！</a><ol><li><a href="#toc5" tabindex="0">課題データ</a></li><li><a href="#toc6" tabindex="0">Aiの回答</a><ol><li><a href="#toc7" tabindex="0">プログラム全体の概要</a></li><li><a href="#toc8" tabindex="0">O1000: 主プログラム</a></li><li><a href="#toc9" tabindex="0">O6000: 面取りマクロプログラム</a></li><li><a href="#toc10" tabindex="0">O6100: 穴位置プログラム</a></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol></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 class="wp-block-paragraph">Google で「カスタムマクロ欠点」で検索してみると、下記のAi概要が最上部に表示されました<br>話は変わりますが、最近では通常検索でもAi回答が出てくるようになりましたね。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>AI による概要</strong></p>



<p class="wp-block-paragraph">カスタムマクロは、NCプログラムの効率化や自動化に役立つ一方で、いくつかの欠点も存在します。主な欠点としては、<mark>プログラミングの難易度、デバッグの複雑さ、互換性の問題、そして過度な依存によるリスク</mark>などが挙げられます。</p>



<p class="has-light-grey-background-color has-background wp-block-paragraph"><strong>カスタムマクロの欠点</strong></p>



<ul class="wp-block-list">
<li><strong>プログラミングの難易度:</strong>カスタムマクロは、通常のNCプログラムよりも複雑なロジックを記述する必要があるため、習得に時間がかかり、プログラミングの難易度が高いです。特に、条件分岐やループ処理を多用する場合、複雑さが増し、エラーが発生しやすくなります。</li>



<li><strong>デバッグの複雑さ:</strong>カスタムマクロのデバッグは、通常のNCプログラムよりも難易度が高いです。変数の値の変化や処理の流れを追跡するのが難しく、エラーの原因特定に時間がかかることがあります。また、マクロプログラムが複雑になるほど、デバッグ作業はさらに困難になります。</li>



<li><strong>互換性の問題:</strong>カスタムマクロは、使用するNC工作機械や制御装置の種類によって、互換性の問題が発生する可能性があります。同じマクロプログラムでも、機械が異なると正しく動作しない場合や、エラーが発生する場合があります。そのため、マクロプログラムを作成する際には、互換性を考慮する必要があります。</li>



<li><strong>過度な依存によるリスク:</strong>カスタムマクロに過度に依存すると、マクロプログラムの変更や修正が必要になった場合に、他の作業に影響が出たり、生産性が低下する可能性があります。また、マクロプログラムの作成者が不在になった場合、保守や管理が困難になるというリスクもあります。</li>
</ul>



<p class="wp-block-paragraph">その他の考慮事項</p>



<ul class="wp-block-list">
<li><strong>マクロプログラムの可読性:</strong>カスタムマクロは、可読性の高い書き方を心がける必要があります。コメントを適切に記述し、変数名や処理の流れを分かりやすくすることで、他の人がマクロプログラムを理解しやすくなります。</li>



<li><strong>マクロプログラムのバージョン管理:</strong>カスタムマクロは、バージョン管理を行うことで、変更履歴を把握し、必要に応じて以前のバージョンに戻すことができます。</li>



<li><strong>マクロプログラムのテスト:</strong>カスタムマクロは、実際に機械を動かす前に、シミュレーション環境などで十分にテストを行う必要があります。これにより、エラーの発生を未然に防ぎ、安全に運用することができます。</li>
</ul>



<p class="wp-block-paragraph">これらの欠点や考慮事項を踏まえ、カスタムマクロの導入を検討する必要があります。</p>
</blockquote>



<p class="wp-block-paragraph">なるほど・・<a href="https://www.kazuban.com/blog/category/nc/custom-macro/">ここのサイトでもいくつか取り上げていますが</a>、まさに同意見です。<br></p>



<h3 class="wp-block-heading"><span id="toc2"><strong>プログラミングの難易度</strong></span></h3>



<p class="wp-block-paragraph">マクロは数多く作成してきましたが<br>機械の制御器に処理させる言語になるので、どうしても、一般的なプログラミング言語と比較すると、中途半端で可読性は悪くなってしまします。<br>ちなみに、レダース(Roeders）機は、独自開発されたプログラミング言語ライクな言語です。<br>加工動作のGコードのサブプロ部分と、その動作部分を管理するメインプロ部分を分離する事を基本で開発されているように感じています。<br>特にWindowsソフトウェアとして開発された言語なので、自動化や多数個など、複雑なメインプロを開発する場合でもかなり楽です。</p>



<h3 class="wp-block-heading"><span id="toc3"><strong>デバッグの複雑さ</strong></span></h3>



<p class="wp-block-paragraph">このサイトでも、何度か書いていますが、一番は変数の制限が可読性を悪くしているように思います。<br>筆者は通常のGコードだけであれば、<a href="https://www.trycut.com/">TRYCUT</a> と言うシミュレーションソフトを使っていますが、TRYCUTにはマクロ展開機能が付いていません。<br>シミュレートできないので、マクロのデバッグはエディタやプリントアウトして目視で追っかけ確認ますがかなかな面倒で、リスクもあります。<br>社内設備機械で、一台だけマクロも含めたシミュレート機能がある制御器があるので、確認のためだけに、その機械を起動させる場合もあります。<br>大人しく、マクロ機能付きのシミュレータを購入したら・・・の意見もあると思いますが、マクロ利用頻度から検討すると、どうしても費用対効果の面で無理があります。</p>



<h2 class="wp-block-heading"><span id="toc4">そうだ、Aiに展開してもらおう！</span></h2>



<p class="wp-block-paragraph">前回、Fusion python API を、Aiに教わったらすごかった・・を記事にしました</p>



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

<a href="https://www.kazuban.com/blog/fusion-python-api/" title="Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。" 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="160" height="90" src="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-160x90.png 160w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-120x68.png 120w, https://www.kazuban.com/blog/wp-content/uploads/2025/07/fusion-python-api-320x180.png 320w" sizes="(max-width: 160px) 100vw, 160px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Fusion360  Python API 再挑戦！AIの力を借りて、sketchなど基本ライブラリを作ってみた。</div><div class="blogcard-snippet internal-blogcard-snippet">Aiと言う強い味方を得て、Fusion API に再挑戦しています。pythonの学習もかねて、skrtch関連の関数をライブラリ化しています。筆者の環境では、正常に動作しています。コピペで利用可。Aiに教えてもらわないと、作成できなかった実例をレポートしています。</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">2025.07.09</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">Fusion API は、一般的なpython言語構文やライブラリだけでなく、独自のオブジェクトを絡み合わせて開発していくので、そのパッケージの理解だけでも大変です。<br>それを、Aiに聞いたら、サンプルコードを出してくれたり、自作したコードを添削してくれたりと、驚きでした。<br>そこで上の記事を書いてたら、ピ～ンときました。<br>「そうだ、Fusion APIのパッケージを瞬時に解読できるなら、カスタムマクロなら簡単に解読してくれるかも！」</p>



<h3 class="wp-block-heading"><span id="toc5">課題データ</span></h3>



<p class="wp-block-paragraph">課題NCデータは、以前記事にした、下記ページのデータをそのまま使ってみようと思います</p>



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

<a href="https://www.kazuban.com/blog/chamfering-with-g66/" title="カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。" 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="228" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01.png 878w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01-300x237.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer01-768x607.png 768w" sizes="(max-width: 228px) 100vw, 228px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。</div><div class="blogcard-snippet internal-blogcard-snippet">前回、カスタムマクロプログラムの例として、ハイデンハインサイクルをマクロ化する例を紹介しました。ハイデンハインサイクルに比べると、ファナック固定サイクルの機能は非常に貧弱ですが、カスタムマクロを自作する事で、無限に拡張する事が可能です。今回は、カスタムマクロのモーダル呼び出し「G66」を利用して、穴...</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">2022.05.30</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">穴の面取りを輪郭加工で行うマクロです。<br>メインプロ「O1000」に加工条件や面取り条件を変数で定義して、G66モーダル呼び出しで「O6000」の面取り加工マクロを呼び出し、指定位置「O6100」で面取りを行うプログラムです<br>若干変数での計算式もあります。</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-ada81581cdb38d9e779798ad0caed857"><code>こちらのファナックマクロを展開してください
%
O1000
( Chamfering Program Ver1.0 By kazuban )&nbsp;
G90G00G17G40G80G49&nbsp;
(++++++++++++++++++++)&nbsp;
#1=54 (WORK ORIGIN)
#2=10 (Tool Number)
#3=#2 (H Number)
#4=0.5(Tool Diameter)
#5=2300 (Spindle Speed)
#6=200 (Feed)
#7=8 (Coolant)
#8=0.0(Surface Coordinat)
#9=50.0 (Initial Point)&nbsp;
#10=5.0 (R Point)
(++++++++++++++++++++)&nbsp;
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++)&nbsp;
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++)&nbsp;
N0001
G#1
T#2
M06
G90G00X0Y0&nbsp;
G43Z&#91;#8+#9]H#3
( Chamfer Process )
S#5M03&nbsp;
M#7
(----------------------------)
(B:#2=#8 : Surface Coordinat)&nbsp;
(C:#3=#9 : Initial Point)&nbsp;
(I:#4=#10 : R Point)&nbsp;
(J:#5=#12 : Chamfer)&nbsp;
(K:#6=#13 : Offset)
(D:#7=#4 : Tool Dia)
(E:#8=#11 : Hole Dia)
(F:#9=#6 : Feed)
(++++++++++++++++++++)&nbsp;
G66 P&#91;#30] B&#91;#8] C&#91;#9] I&#91;#10] J&#91;#12] K&#91;#13] D&#91;#4] E&#91;#11] F&#91;#6]
M98P&#91;#31]
G67
G90G00Z&#91;#8+#9]
M09
M05
G91G28Z0&nbsp;
G91G49Z0&nbsp;
G90M05&nbsp;
( End of Process )
M30
%
%
O6000
( Chamfering Macro Ver1.0 By kazuban )&nbsp;
(+++++++++++++++++++)
#1=&#91;#8/2-&#91;#6+#7/2]] (circle radius)
(+++++++++++++++++++)
(B:#2 : Surface Coordinat)&nbsp;
(C:#3 : Initial Point)&nbsp;
(I:#4 : R Point)&nbsp;
(J:#5 : Chamfer)&nbsp;
(K:#6 : Offset)
(D:#7 : Tool Dia)
(E:#8 : Hole Dia)
(F:#9 : Feed)
(+++++++++++++++++++)
G90G00G17
Z&#91;#2+#3]&nbsp;
Z&#91;#2+#4]&nbsp;
G01Z&#91;#2-&#91;#6+#5]]F&#91;#9]&nbsp;
G91X&#91;#1]
G03X-&#91;#1*2]I-&#91;#1]J0.&nbsp;
X&#91;#1*2]I&#91;#1]J0.
G01X-&#91;#1]&nbsp;
G90G00Z&#91;#2+#3]&nbsp;
M99
%
%
O6100
( Hole Position )
X-35.Y55.
X-50.Y55.
X10.Y10.&nbsp;
M99
%</code></pre>



<p class="wp-block-paragraph">このデータをそのまま、「Gemini 2.5 Flash」に突っ込んで、展開をお願いしてみました。</p>



<h3 class="wp-block-heading"><span id="toc6">Aiの回答</span></h3>



<p class="wp-block-paragraph">G66仕様で、G66への変数渡しが「#変数」そのままでないので、作者が見直す時も結構面倒ですが、Aiは瞬時に分析してくれました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">提供されたFANUCマクロプログラムを解析し、その内容を以下に解説します。</p>



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



<h4 class="wp-block-heading"><span id="toc7"><strong>プログラム全体の概要</strong></span></h4>



<p class="wp-block-paragraph">このマクロは、複数の穴の面取り加工を自動化するために設計されています。主プログラム (<code>O1000</code>) で加工条件を設定し、マクロプログラム (<code>O6000</code>) で実際の面取り動作を実行、そしてもう一つのプログラム (<code>O6100</code>) で穴の位置情報を呼び出す、という構成になっています。</p>



<h4 class="wp-block-heading"><span id="toc8"><strong>O1000: 主プログラム</strong></span></h4>



<p class="wp-block-paragraph">このプログラムは、加工に必要な初期設定と、マクロ呼び出しを行います。</p>



<ul class="wp-block-list">
<li><strong>初期設定:</strong>
<ul class="wp-block-list">
<li><code>#1=54 (WORK ORIGIN)</code>: ワーク原点の位置を<code>#1</code>に設定。</li>



<li><code>#2=10 (Tool Number)</code>: 工具番号を<code>#2</code>に設定。</li>



<li><code>#4=0.5(Tool Diameter)</code>: 工具径を<code>#4</code>に設定。</li>



<li><code>#5=2300 (Spindle Speed)</code>: 主軸回転速度を<code>#5</code>に設定。</li>



<li><code>#6=200 (Feed)</code>: 送り速度を<code>#6</code>に設定。</li>



<li><code>#11=12.0 (Hole Diameter)</code>: 穴の直径を<code>#11</code>に設定。</li>



<li><code>#12=1.0 (Chamfer)</code>: 面取り量を<code>#12</code>に設定。</li>



<li><code>#13=0.5 (Offset)</code>: 工具のオフセット量を<code>#13</code>に設定。</li>
</ul>
</li>



<li><strong>マクロ呼び出し:</strong>
<ul class="wp-block-list">
<li><code>G66 P[#30] ...</code>: ここで、面取りマクロプログラム<code>O6000</code>（<code>#30</code>）を呼び出しています。</li>



<li><code>B[#8] C[#9]...</code>: マクロに渡す引数を設定しています。
<ul class="wp-block-list">
<li><code>B[#8]</code>: 面取り加工の開始基準となる<strong>ワーク表面座標</strong>。</li>



<li><code>C[#9]</code>: 加工前の待機位置である<strong>初期点</strong>。</li>



<li><code>I[#10]</code>: 加工開始前の<strong>退避点（R点）</strong>。</li>



<li><code>J[#12]</code>: <strong>面取り量</strong>。</li>



<li><code>K[#13]</code>: <strong>オフセット量</strong>。</li>



<li><code>D[#4]</code>: <strong>工具径</strong>。</li>



<li><code>E[#11]</code>: <strong>穴径</strong>。</li>



<li><code>F[#6]</code>: <strong>送り速度</strong>。</li>
</ul>
</li>



<li><code>M98 P[#31]</code>: 穴の位置情報を記述したプログラム<code>O6100</code>（<code>#31</code>）を呼び出します。これにより、<code>O6100</code>に記述された各座標で、<code>G66</code>で指定されたマクロが繰り返して実行されます。</li>
</ul>
</li>
</ul>



<h4 class="wp-block-heading"><span id="toc9"><strong>O6000: 面取りマクロプログラム</strong></span></h4>



<p class="wp-block-paragraph">このプログラムは、<code>O1000</code>から渡された情報をもとに、実際の面取り加工を行います。</p>



<ul class="wp-block-list">
<li><strong>面取り加工の半径計算:</strong>
<ul class="wp-block-list">
<li><code>#1=[#8/2-[#6+#7/2]]</code>: この式は、面取り加工を行う円弧の半径を計算しています。
<ul class="wp-block-list">
<li><code>#8/2</code>: 穴の半径。</li>



<li><code>#6</code>: 面取り量。</li>



<li><code>#7/2</code>: 工具の半径。</li>



<li><strong>結果:</strong> <strong>面取り加工する円弧の半径 = (穴の半径) &#8211; (面取り量) &#8211; (工具の半径)</strong></li>
</ul>
</li>
</ul>
</li>



<li><strong>加工シーケンス:</strong>
<ol start="1" class="wp-block-list">
<li><code>G90G00G17</code>: 絶対指令、早送り、XY平面選択。</li>



<li><code>Z[#2+#3]</code>、<code>Z[#2+#4]</code>: Z軸を初期点、R点へと移動。</li>



<li><code>G01Z[#2-[#6+#5]]F[#9]</code>: Z軸を<strong>面取り深さ</strong>まで切り込みながら移動します。</li>



<li><code><strong>G91</strong>X[#1]</code>: <span class="marker-under-red">ワーク座標を基準</span>に、計算された半径分だけX軸を移動。円弧加工の開始位置に移動します。</li>



<li><code>G03X-[#1*2]I-[#1]J0.</code>: 半径<code>#1</code>の円弧で、左回りに<strong>180度円弧切削</strong>。</li>



<li><code>X[#1*2]I[#1]J0.</code>: さらに、半径<code>#1</code>の円弧で、左回りに<strong>180度円弧切削</strong>。これにより、1周分の面取り加工が完了します。</li>



<li><code>G01X-[#1]</code>: 円弧加工の開始位置から中心に戻ります。</li>



<li><code>G90G00Z[#2+#3]</code>: Z軸を初期点に戻します。</li>



<li><code>M99</code>: マクロプログラムの終了。主プログラム（<code>O1000</code>）に戻ります。</li>
</ol>
</li>
</ul>



<h4 class="wp-block-heading"><span id="toc10"><strong>O6100: 穴位置プログラム</strong></span></h4>



<p class="wp-block-paragraph">このプログラムは、加工する穴のXY座標をリストアップしています。</p>



<ul class="wp-block-list">
<li><code>X-35.Y55.</code>: 1つ目の穴の座標。</li>



<li><code>X-50.Y55.</code>: 2つ目の穴の座標。</li>



<li><code>X10.Y10.</code>: 3つ目の穴の座標。</li>
</ul>



<p class="wp-block-paragraph">これらの座標は、<code>O1000</code>の<code>M98 P[#31]</code>によって順番に読み込まれ、それぞれの位置で<code>O6000</code>の面取り加工が実行されます。</p>



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



<h4 class="wp-block-heading"><span id="toc11"><strong>まとめ</strong></span></h4>



<p class="wp-block-paragraph">このプログラムは、以下のような処理フローで動作します。</p>



<ol start="1" class="wp-block-list">
<li>主プログラム<code>O1000</code>がスタートします。</li>



<li>工具交換、初期位置決め、主軸回転、クーラントONなど、準備が完了します。</li>



<li><code>O6100</code>に記述された最初の座標（X-35.Y55.）に移動します。</li>



<li><code>G66</code>によって<code>O6000</code>の面取りマクロが呼び出されます。</li>



<li>マクロ内で計算されたパスで、面取り加工が行われます。</li>



<li>面取り加工が完了すると、<code>O1000</code>に戻ります。</li>



<li><code>O6100</code>の次の座標（X-50.Y55.）に移動します。</li>



<li>再び<code>O6000</code>が呼び出され、面取り加工が行われます。</li>



<li>この繰り返し処理が<code>O6100</code>の最後まで行われます。</li>



<li>全ての加工が終了すると、クーラントOFF、主軸停止、安全位置への退避が行われ、プログラムが終了します。</li>
</ol>



<p class="wp-block-paragraph">この構成は、複数の同じ形状の加工を効率的に行うための、NCプログラミングの典型的な手法です。プログラムを分割することで、位置情報や加工条件の変更が容易になります。</p>
</blockquote>



<p class="wp-block-paragraph">丁寧な解説ですが、<strong>加工シーケンス:</strong>４．の<span class="marker-under-red">「ワーク座標を基準</span>」と言うのがちょっと間違っていますね・・<br>無料版だからでしょうか？<br>でも、きちんとGコードに展開してくれれば、問題ないですから<br>再度、一般的なGコードへの展開をお願いすると・・・</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O1000_EXPANDED<br>( Chamfering Program Expanded Version )</p>



<p class="wp-block-paragraph">G90 G00 G17 G40 G80 G49&nbsp;</p>



<p class="wp-block-paragraph">( Tool and Spindle Setup )<br>T10 M06&nbsp;<br>G90 G00 X0 Y0&nbsp;<br>G43 Z[0.0+50.0] H10<br>S2300 M03&nbsp;<br>M08</p>



<p class="wp-block-paragraph">( &#8212; Hole 1 at X-35. Y55. &#8212; )<br>G90 G00 X-35. Y55.<br>G00 Z[0.0+50.0]<br>G00 Z[0.0+5.0]<br>G01 Z[0.0-[1.0+0.5]] F200<br>G91 X[12.0/2-[1.0+0.5/2]]<br>G03 X-[[12.0/2-[1.0+0.5/2]]2] I-[12.0/2-[1.0+0.5/2]] J0. X[[12.0/2-[1.0+0.5/2]]2] I[12.0/2-[1.0+0.5/2]] J0.<br>G01 X-[12.0/2-[1.0+0.5/2]]<br>G90 G00 Z[0.0+50.0]</p>



<p class="wp-block-paragraph">( &#8212; Hole 2 at X-50. Y55. &#8212; )<br>・<br>・<br>・以下省略</p>
</blockquote>



<p class="wp-block-paragraph">G66呼び出しの部分も、きちんと、展開してくれました。<br>さらに、[]内で、変数を数値に置き換えた計算式で表現してくれています。<br>おそらく、[]を認識できるコントローラであれば、このまま動作すると思いますが、トライカットは動作してくれないので、再度、[]内の計算式部分を、実数値に変換をお願いしました。</p>



<h3 class="wp-block-heading"><span id="toc12">完成</span></h3>



<p class="wp-block-paragraph">以下が完成したデータです</p>



<pre class="wp-block-code has-cocoon-white-color has-black-background-color has-text-color has-background has-link-color wp-elements-66754072bbded3ae612360f6496ca273"><code>%
O1000
( Chamfering Program Expanded Numeric Version )

G90 G00 G17 G40 G80 G49&nbsp;

( Tool and Spindle Setup )
T10 M06&nbsp;
G90 G00 X0 Y0&nbsp;
G43 Z50.0 H10
S2300 M03&nbsp;
M08

( Chamfering Path Calculation )
( Hole Diameter: 12.0 )
( Chamfer: 1.0 )
( Tool Diameter: 0.5 )
( Offset: 0.5 )
( Radius for cutting: 12.0/2 - 1.0 - 0.5/2 = 6.0 - 1.0 - 0.25 = 4.75 )
( Cutting Depth: 1.0 + 0.5 = 1.5 )

( --- Hole 1 at X-35. Y55. --- )
G90 G00 X-35. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( --- Hole 2 at X-50. Y55. --- )
G90 G00 X-50. Y55.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( --- Hole 3 at X10. Y10. --- )
G90 G00 X10. Y10.
G00 Z50.0
G00 Z5.0
G01 Z-1.5 F200
G91 X4.75
G03 X-9.5 I-4.75 J0.
X9.5 I4.75 J0.
G01 X-4.75
G90 G00 Z50.0

( End of Program )
M09
M05
G91 G28 Z0
G91 G49 Z0
G90 M05
M30
%
</code></pre>



<h3 class="wp-block-heading"><span id="toc13">シミュレーション</span></h3>



<p class="wp-block-paragraph">さっそく、シミュレーションしてみましょう！</p>



<figure class="wp-block-video"><video height="852" style="aspect-ratio: 1032 / 852;" width="1032" controls src="https://www.kazuban.com/blog/wp-content/uploads/2025/08/macro-trycut.mp4"></video></figure>



<p class="wp-block-paragraph">正常に動作しました。</p>



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



<p class="wp-block-paragraph">やっぱり、Aiはすごいです。<br>座標値を変数で置き換えている程度のマクロであれば、エクセルやスクリプト言語などで、比較的簡単に変換できるかもしれませんが、計算式が入ってくると格段に難易度が上がります。<br>さらに、G66などのマクロ呼出しになると、引数への変数渡しに癖があるので、PC上での目視確認においても結構面倒です。<br>以前、マクロの変換ソフトの作成も考えた事もありますが、難易度高くで止めました。<br>今回のように、Aiに展開してもらえれば、手持ちのシミュレータで動作確認できるので、かなり気軽にマクロに取り組めると思います<br>それに、今回使用したAiは、「Gemini 2.5flash」で基本無料で利用できます。<br>ちょっと、間違った回答もありましたが、Fusion API の質問も含めて、制限が出ることはなかったです。「chatGPT」無料版では、制限に引っかかりました。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2025/08/macro-trycut.mp4" length="2284942" type="video/mp4" />

			</item>
		<item>
		<title>カスタムマクロでハイデンハインサイクルを作ってみよう！</title>
		<link>https://www.kazuban.com/blog/heidenhain-from-macro/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 05 May 2022 00:57:35 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ハイデンハイン]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6570</guid>

					<description><![CDATA[最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。忘れられそうなので、５月の連休の空き時間で更新します。ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。<br>忘れられそうなので、５月の連休の空き時間で更新します。<br>ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデンハインサイクルをマクロ化してみたいと思います。<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/heidenhain_cycle/" title="ハイデンハインのサイクル機能" 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="190" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain.png 895w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain-300x284.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain-768x726.png 768w" sizes="(max-width: 190px) 100vw, 190px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ハイデンハインのサイクル機能</div><div class="blogcard-snippet internal-blogcard-snippet">ファナック系では、G73やG81～の固定サイクルと呼ばれている、ドリル加工用サイクルがありますがハイデンハイン制御機には、さらに高機能なサイクルが用意されています。変数で加工形状をカスタマイズできる点は、カスタムマクロに似ていす。多様なカスタムマクロが、標準で用意されているイメージです。さらに、ドリ...</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.12.18</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">カスタムマクロを使う利点</a></li><li><a href="#toc3" tabindex="0">カスタムマクロで変数化</a></li><li><a href="#toc4" tabindex="0">条件判断</a><ol><li><a href="#toc5" tabindex="0">条件分岐</a></li><li><a href="#toc6" tabindex="0">条件式</a></li></ol></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 class="wp-block-paragraph">マクロ言語は、プログラム言語に似ていますが、単独では動作しません。<br>アプリケーションから呼び出される事で動作できます。<br>エクセルのマクロを思い浮かべると理解しやすいと思います。<br>エクセルマクロはかなり複雑な処理をプログラミングできますが、<br>結局、エクセルを起動しなければ単独では実行できません。<br>カスタムマクロも同様で単独では動作しません。<br>ファナック系制御機から呼び出される形で使用されます。</p>



<h2 class="wp-block-heading"><span id="toc2">カスタムマクロを使う利点</span></h2>



<p class="wp-block-paragraph">マクロ言語は、変数や演算、条件判断、分岐など、基本的なプログラム機能を持っています。<br>したがって、類似形状をパラメータ化して定義できたり、単純な計算をやらせたり<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/custom-macro/" title="カスタムマクロで段取り支援" 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="305" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image.png 1283w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-300x177.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-1024x605.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-768x454.png 768w" sizes="(max-width: 305px) 100vw, 305px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">カスタムマクロで段取り支援</div><div class="blogcard-snippet internal-blogcard-snippet">オプション扱いの場合もありますが、CNC制御にはNCデータを操作したり、制御機のデータを読み書きしたりできる、マクロと呼ばれているプログラム機能があります。マクロは、簡易的ですがプログラミング的な言語構造と変数を使用できるため、NCプログラムをパラメータ化して汎用的なプログラムを作成する事ができます...</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.07.27</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph"><br>ハイデンハインのサイクルも、変数を変更するだけで、穴やポケットの加工が可能になっています。<br>ファナックの固定サイクルに比べるとはるかに豊富で単純な形状であればCAMなしで切削加工も可能です。<br>ファナックでもカスタムマクロを駆使すれば、同様のサイクルを作成する事が可能です。<br>今回は、マクロ作成の一例として、ハイデンハインのドリルサイクルを作ってみようと思います。<br>では、一番基本的な、「サイクル２００」を見てみましょう。<br>ハイデンハインの変数は、「Q」+「数値」で設定します。</p>



<div class="wp-block-media-text alignwide has-media-on-the-right is-stacked-on-mobile" style="grid-template-columns:auto 42%"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="744" height="579" src="https://www.kazuban.com/blog/wp-content/uploads/2022/05/CYC200.png" alt="" class="wp-image-6577 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/05/CYC200.png 744w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/CYC200-300x233.png 300w" sizes="(max-width: 744px) 100vw, 744px" /></figure><div class="wp-block-media-text__content">
<p class="wp-block-paragraph">CYCL DEF 200 DRILLING<br>Q200=2 ;SAFETY CLEARANCE　<br>Q201=-15 ;DEPTH<br>Q206=250 ;FEED RATE FOR PLUNGING<br>Q202=5 ;INFEED DEPTH<br>Q210=0 ;DWELL TIME AT TOP<br>Q203=+20 ;SURFACE COORDINATE<br>Q204=100 ;2ND SAFETY CLEARANCE<br>Q211=0.1 ;DWELL TIME AT DEPTH</p>
</div></div>



<p class="wp-block-paragraph">参考図と見比べるとだいたい、わかりますね。</p>



<ul class="wp-block-list"><li>Q200=2 ;SAFETY CLEARANCE　は、ドリル動作が始まる高さ。ファナックの「R点」</li><li>Q201=-15 ;DEPTH　は、最終加工深さ</li><li>Q206=250 ;FEED RATE FOR PLUNGING　は、加工送りスピード</li><li>Q202=5 ;INFEED DEPTH　は、一回の切込み量。ファナックでは「Q5.0」</li><li>Q210=0 ;DWELL TIME AT TOP　は、サイクルに入る前のドウェル時間みたいです。<br>固定サイクルにはない機能です</li><li>Q203=+20 ;SURFACE COORDINATE　は、穴の上面座標です。段差がある場合に有効です。</li><li>Q204=100 ;2ND SAFETY CLEARANCE　は、次の穴への移動高さ。ファナックでは「イニシャル点」</li><li>Q211=0.1 ;DWELL TIME AT DEPTH　は、穴加工底面でのドウェル。ファナックでは「G82」の機能</li></ul>



<p class="wp-block-paragraph">ファナックの、G81、G82、G83　が合体したようなサイクルですね。<br>基本的には、G83に近いですが、Q201とQ202を同じ値にすれば、G81になりますし、<br>Q211を設定すればG82です。<br>ただし、G82の場合注意が必要です。<br>ハイデンハインでは「秒」で指定しますが、「G82」は一般的には「ミリ秒」単位です。<br>小数点指示も受け付ける機種もあると思いますが、今回は「ミリ秒」指示で小数点なしにしたいのですが変数を演算させた場合どうなるのか？<br>わかりません、実機での確認が必要です。<br>したがって、ハイデンハインサイクルを移植する場合では、Q211 の値を×1000する事になります。<br>Q200（SAFETY CLEARANCE）とQ204（2ND SAFETY CLEARANCE）も<br>ファナックのR点とイニシャル点を指定する場合の基準高さが違います。<br>ハイデンハインは、Q203（SURFACE COORDINATE）が基準になりますが<br>ファナックは、ワーク座標系のZ原点が基準になります。<br>Q210は、固定サイクルにはない項目なので、固定サイクルに入る直前にドウェル指令を追加する感じでしょうか・・</p>



<h2 class="wp-block-heading"><span id="toc3">カスタムマクロで変数化</span></h2>



<p class="wp-block-paragraph">カスタムマクロの変数は、「#」+「数値」で設定しますが、変数には数値の範囲により、<br>「ローカル変数」「コモン変数」「システム変数」など種類があるので注意が必要です。<br>今回は、#1～#33の「ローカル変数」を使用ししょうと思います。<br>また、サイクル機能以外に、ワーク座標系番号と工具番号、回転数なども追加しようと思います。</p>



<h2 class="wp-block-heading"><span id="toc4">条件判断</span></h2>



<p class="wp-block-paragraph">ハイデンハインサイクルと固定サイクルでは、設定変数が一対一ではないので、設定値によって条件判断が必要になるので、事前に整理してみます。</p>



<ul class="wp-block-list"><li>Q204はQ200と等しいかそれ以上とする</li><li>Q204とQ200が等しい場合は、「G99」、Q204が大きい場合には、その値をイニシャル点として「G98」モード</li><li>Q202がQ201以上でQ211が「0」の場合は、「G81」</li><li>Q202がQ201以上でQ211が「0」より大きい場合は、「G82」</li><li>Q202がQ201より小さくて、Q211が「0」の場合は、「G83」</li><li>Q202がQ201より小さくて、Q211が「0」より大きい場合には、どうしよう？<br>「G81」と「G82」の二工程にするか？</li></ul>



<p class="wp-block-paragraph">こんな感じで、条件判断させてみましょう。</p>



<h3 class="wp-block-heading"><span id="toc5">条件分岐</span></h3>



<p class="wp-block-paragraph">条件分岐は、「IF」｛条件式｝「GOTO」｛シーケンス番号｝で｛条件式｝が「真」の場合、指定｛シーケンス番号｝へジャンプします。<br>ジャンプではなく、変数処理をさせる事もできます。<br>「IF」｛条件式｝「THEN」｛処理｝<br>この場合は、｛条件式｝が「真」の場合、変数への代入や計算をさせる事ができます。</p>



<h3 class="wp-block-heading"><span id="toc6">条件式</span></h3>



<p class="wp-block-paragraph">条件式では、一般的な記号での比較演算子が使えないので、ちょっと取りつきにくいです。<br>下記の「EQ」「NE」「GT」「GE」「LT」「LE」の演算子を使用します</p>



<figure class="wp-block-table"><table><tbody><tr><td>EQ</td><td>＝</td><td>equal to</td><td>左辺と右辺が等しい</td></tr><tr><td>NE</td><td>≠</td><td>not equal to</td><td>左辺と右辺が等しくない</td></tr><tr><td>GT</td><td>＞</td><td>greater than</td><td>左辺が右辺より大きい</td></tr><tr><td>GE</td><td>≧</td><td>greater than or equal to</td><td>左辺が右辺以上</td></tr><tr><td>LT</td><td>＜</td><td>less than</td><td>左辺が右辺より小さい</td></tr><tr><td>LE</td><td>≦</td><td>less than or equal to</td><td>左辺が右辺以下</td></tr></tbody></table></figure>



<h2 class="wp-block-heading"><span id="toc7">変数定義</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>(+++++++++++++++++++)<br>#1 = 54. (Work coordinate)<br>#2 = 1. (T Number)<br>#3 = #2 (H Number)<br>#4 = 3200. (SP)<br>(+++++++++++++++++++)<br>(CYCL DEF 200 DRILLING)<br>#10 = 7.0 (Q200 SAFETY CLEARANCE)　<br>#11 = -20.0 (Q201 DEPTH)<br>#12 = 350.0 (Q206 FEED RATE FOR PLUNGING)<br>#13 = 3.0 (Q202 INFEED DEPTH)<br>#14 = 10.0 (Q210 DWELL TIME AT TOP)<br>#15 = -2.0 (Q203 SURFACE COORDINATE)<br>#16 = 52.0 (Q204 2ND SAFETY CLEARANCE)<br>#17 = 1.0 (Q211 DWELL TIME AT DEPTH)<br>(+++++++++++++++++++)<br>#10 = #10 + #15<br>#16 = #16 + #15<br>#18 = FIX[#17*1000] ( It may be no good)<br>(+++++++++++++++++++)<br>#20 = 98. (G98 OR G99)<br>#21 = 80. (CYCLE)<br>(+++++++++++++++++++)</p></blockquote>



<p class="wp-block-paragraph">こんな感じでしょうか？<br>ハイデンハインのQパラメータをそのまま、＃変数と置き換えました。<br>R点（#10）とイニシャル点（#16）もZ原点からの指示に変更しています。<br><span style="text-decoration: underline;">#18は「秒」を「ミリ秒」に変換していますが、この方法ではダメかもしれません。<br>記憶では、「P」に小数点で「秒指令」できる機種もありますが、<br>小数点が入るとエラーになる制御機もあったような・・・？<br>FIX 関数を使ってみましたが、これで正解なのかは？？です。<br>たぶん、#18は小数点が入ってしまいそうです。<br>演算はやめて、直接「#18=2000」などどしたほうが、いいかもしれません。</span><br>コメントは、ファナックの場合、漢字が使用できない場合が多いので、英数文字にしました<br>ソディック機は漢字が使えるのですけどね～</p>



<h2 class="wp-block-heading"><span id="toc8">条件設定</span></h2>



<p class="wp-block-paragraph">上記で検討した、条件をマクロ化してみましょう。</p>



<p class="wp-block-paragraph">Q204はQ200と等しいかそれ以上とする<br>IF [#16 LT #10] THEN #16=#10</p>



<p class="wp-block-paragraph">Q204とQ200が等しい場合は、「G99」<br>IF [#16 EQ #10] THEN #20=99.<br>Q204が大きい場合には、その値をイニシャル点として「G98」<br>IF [#16 GT #10] THEN #20=98.</p>



<p class="wp-block-paragraph">Q202がQ201以上でQ211が「0」の場合には、「G81」<br>IF [[#13 GE #11]AND[#17EQ0]] THEN #21=81.</p>



<p class="wp-block-paragraph">Q202がQ201以上でQ211が「0」より大きい場合には、「G82」<br>IF [[#13 GE #11]AND[#17GT0]] THEN #21=82.</p>



<p class="wp-block-paragraph">Q202がQ201より小さくて、Q211が「0」の場合は、「G83」<br>IF [[#13 GE #11]AND[#17EQ0]] THEN #21=83.</p>



<p class="wp-block-paragraph">Q202がQ201より小さくて、Q211が「0」より大きい場合にはどうするか？<br>苦肉の策で、「8382」とし、「G83」後、「G82」もやらせましょう。<br>IF [[#13 LT #11]AND[#17GT0]] THEN #21=8382.</p>



<p class="wp-block-paragraph">こんな感じかな？！<br>固定サイクル「G81」「G82」「G83」の切り替えは、「#21」の数値により<br>条件ジャンプさせようと思います。<br>それから、固定サイクルは、定義した行の位置座標でサイクル加工を始めてしまいます。<br>X、Y軸はモーダルなので、指定しなくてもその場所で加工します。<br>加工させないで、固定サイクルの定義のみしたい場合には、「L」の繰り返し指令を利用し<br>繰り返しなしの意味で「L0」を指令します。<br>ただし、この「L」は制御機によって「K」の場合があります。<br>ＯＫＫの制御機は「K」だったように記憶していますが、お使いの制御機に合わせてください。</p>



<h2 class="wp-block-heading"><span id="toc9">マクロ化</span></h2>



<p class="wp-block-paragraph">%<br>O1000<br>(CYCL DEF 200 DRILLING MACRO BY Kazuban)<br>(+++++++++++++++++++)<br>#1 = 54. (Work coordinate)<br>#2 = 1. (T Number)<br>#3 = #2 (H Number)<br>#4 = 3200. (SP)<br>(+++++++++++++++++++)<br>#10 = 7.0 (Q200 SAFETY CLEARANCE)　<br>#11 = -20.0 (Q201 DEPTH)<br>#12 = 350.0 (Q206 FEED RATE FOR PLUNGING)<br>#13 = 3.0 (Q202 INFEED DEPTH)<br>#14 = 10.0 (Q210 DWELL TIME AT TOP)<br>#15 = -2.0 (Q203 SURFACE COORDINATE)<br>#16 = 52.0 (Q204 2ND SAFETY CLEARANCE)<br>#17 = 1.0 (Q211 DWELL TIME AT DEPTH)<br>(+++++++++++++++++++)<br>#10 = #10 + #15<br>#16 = #16 + #15<br>#18 = FIX[#17*1000]<br>(+++++++++++++++++++)<br>#20 = 98. (G98 OR G99)<br>#21 = 80. (CYCLE)<br>(+++++++++++++++++++)<br>IF [#16 LT #10] THEN #16=#10<br>IF [#16 EQ #10] THEN #20=99.<br>IF [#16 GT #10] THEN #20=98.<br>IF [[#13 GE #11]AND[#17EQ0]] THEN #21=81.<br>IF [[#13 GE #11]AND[#17GT0]] THEN #21=82.<br>IF [[#13 GE #11]AND[#17EQ0]] THEN #21=83.<br>IF [[#13 LT #11]AND[#17GT0]] THEN #21=8182.<br>(++++++++++++++++++++)<br>(++++++++++++++++++++)<br>G90G00G17G40G80G49<br>G#1<br>N0001<br>T#2<br>M06<br>G90G00X0Y0<br>G43Z#16H#3<br>M00<br>(Check Start Point)<br>S#4M03<br>G04X#14<br>IF [#21 EQ 81] GOTO 0001<br>IF [#21 EQ 82] GOTO 0002<br>IF [#21 EQ 83] GOTO 0003<br>IF [#21 EQ 8382] GOTO 0003<br>(++++++++++++++++++++)<br>N0001(G81)<br>G#20 G81 Z#11 R#10 F#11 L0 (L may be K.)<br>GOTO 100<br>(++++++++++++++++++++)<br>N0002(G82)<br>#21 = 82<br>G#20 G82 Z#11 R#10 P#18 F#11 L0 (L may be K.)<br>GOTO 100<br>(++++++++++++++++++++)<br>N0003(G83)<br>G#20 G83 Z#11 R#10 Q#10 F#11 L0 (L may be K.)<br>GOTO 100<br>(++++++++++++++++++++)<br>N100<br>X-40.Y15.<br>X-60.Y15.<br>X-60.Y-15.<br>X-40.Y-15.<br>G80<br>Z#16<br>IF [#21 EQ 8382] GOTO 0002<br>GOTO 9999<br>(++++++++++++++++++++)<br>N9999<br>M09<br>M05<br>G91G28Z0<br>G91G49Z0<br>G90M05<br>M30<br>%</p>



<h2 class="wp-block-heading"><span id="toc10">完成</span></h2>



<p class="wp-block-paragraph">こんな感じで作ってみましたが、機械を触れる環境でないので、まったく検証してません。<br>もし、実際の加工で使用する場合には、十分確認をお願いします。<br>また、どなたか、検証していただければ、助かります。<br>カスタムマクロ作成の参考になれば幸いです。<br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ハイデンハインのサイクル機能</title>
		<link>https://www.kazuban.com/blog/heidenhain_cycle/</link>
					<comments>https://www.kazuban.com/blog/heidenhain_cycle/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 18 Dec 2021 00:07:17 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[Heidenhain]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ハイデンハイン]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[マクロ]]></category>
		<category><![CDATA[固定サイクル]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6236</guid>

					<description><![CDATA[ファナック系では、G73やG81～の固定サイクルと呼ばれている、ドリル加工用サイクルがありますがハイデンハイン制御機には、さらに高機能なサイクルが用意されています。変数で加工形状をカスタマイズできる点は、カスタムマクロに [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">ファナック系では、G73やG81～の固定サイクルと呼ばれている、ドリル加工用サイクルがありますが<br>ハイデンハイン制御機には、さらに高機能なサイクルが用意されています。<br>変数で加工形状をカスタマイズできる点は、カスタムマクロに似ていす。<br>多様なカスタムマクロが、標準で用意されているイメージです。<br>さらに、ドリルサイクルだけでなく、ポケットや測定用のサイクルも用意されています。<br>ファナック機では標準にない追加機能は、<span class="markerYellow">機械メーカーが提供</span>している場合が多いですが、<br>そうなるとどうしてもメーカー仕様になるので<span class="markerPink">互換性はありません。</span><br>工作機械を選択する際、そういった機能も比較する必要がありますね。<br>ハイデンハイン機は制御機に用意されてている事で、互換性は格段に向上します。</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><ol><li><a href="#toc3" tabindex="0">スレッドミル </a></li></ol></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><ol><li><a href="#toc8" tabindex="0">サイクル定義</a></li><li><a href="#toc9" tabindex="0">加工位置</a></li><li><a href="#toc10" tabindex="0">Fusion360 で出力してみた</a></li><li><a href="#toc11" tabindex="0">M12のタップ加工をプログラム化</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ユーザーマニュアル入手</span></h2>



<p class="wp-block-paragraph"><a rel="noopener" href="https://www.heidenhain.com/" target="_blank">ハイデンハインのサイト</a>では、コントローラのマニュアルがダウンロードできます。</p>



<figure class="wp-block-image size-large is-resized"><a rel="noopener" href="https://www.heidenhain.com/" target="_blank"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/image-1024x279.png" alt="" class="wp-image-6240" width="620" height="168" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/12/image-1024x279.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/image-300x82.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/image-768x209.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/image.png 1197w" sizes="(max-width: 620px) 100vw, 620px" /></a></figure>



<p class="wp-block-paragraph">ホームページから、「Service&amp;Support」⇒ 「Downloads」⇒ 「Documentation」と進み<br>下へスクロールして、右側の「Categories」で「CNC Controls」で各言語に対応したマニュアルがダウンロードできます。<br>ただ残念ながら、日本語はないみたいです。<br>私は、<a rel="noopener" href="https://product.heidenhain.de/JPBC/image/FILEBASE_PUBLIC/533_190-22.pdf" target="_blank">こちらをダウンロードしました。</a></p>



<h2 class="wp-block-heading"><span id="toc2">ドリル・タップサイクル</span></h2>



<p class="wp-block-paragraph">ドリルやタップ用のサイクルは、ダウンロードしたマニュアルでは、<br>８．３項目、ページ３３１～　に説明があります。<br>英語ですが、単語とアイコンでだいたいわかると思います</p>



<ul class="wp-block-list"><li>240 CENTERING _______________________________Page 333</li><li>200 DRILLING _________________________________Page 335</li><li>201 REAMING _________________________________Page 337</li><li>202 BORING ___________________________________Page 339</li><li>203 UNIVERSAL DRILLING _____________________Page 341</li><li>204 BACK BORING _____________________________Page 343</li><li>205 UNIVERSAL PECKING ______________________Page 346</li><li>208 BORE MILLING _____________________________Page 349</li><li>206 TAPPING NEW _____________________________Page 351</li><li>207 RIGID TAPPING NEW ______________________Page 353</li><li>209 TAPPING W/ CHIP BRKG __________________Page 355</li><li>262 THREAD MILLING _________________________Page 359</li><li>263 THREAD MLLNG/CNTSNKG _______________Page 361</li><li>264 THREAD DRILLING/MLLNG _______________Page 365</li><li>265 HEL.THREAD DRLG/MLG __________________Page 369</li><li>267 OUTSIDE THREAD MLLNG ________________Page369</li></ul>



<p class="wp-block-paragraph">ファナックの固定サイクルに比べるとかなり豊富なのがわかると思います。</p>



<h3 class="wp-block-heading"><span id="toc3">スレッドミル<br> </span></h3>



<p class="wp-block-paragraph">ねじ切りサイクル。<br>国内では、OSGのプラネットカッターが有名です。<br>加工時間は増加しますが、破損時のリスク軽減や高硬度材へのネジ加工には有効だと思います。<br>特に、超硬材へのネジ加工を切削で行うには、現在ではこの方法しかないように思います！<br>では、NCプログラムはどうやって作成するでしょう。<br>国内機の場合、CAMが対応している場合にはその機能を利用したり、工具メーカーが公開している<br>支援ソフトなどを利用したり、ユーザー側でカスタムマクロを作成したりだと思いますが、ハイデンハインには、ねじ切りサイクルがすでに準備されています。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/threwadmill.png" alt="" class="wp-image-6257" width="526" height="210" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/12/threwadmill.png 592w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/threwadmill-300x120.png 300w" sizes="(max-width: 526px) 100vw, 526px" /></figure>



<p class="wp-block-paragraph">Cycle 262、Page 359 ～に説明があります。<br>サイクルの使用方法は、後ほど説明しますが、「Q」で始まる指令は変数で、Qパラメータと呼ばれています。<br>ファナックの「#」と同様です。<br>この例では、「Q355」で工具の種類、「Q239」でネジピッチ、「Q201」でネジ深さ、<br>「Q200」でＲ点位置などが、この図で分かりますね。<br>これらの変数を設定する事で、ねじ切りを行うことができます。</p>



<h2 class="wp-block-heading"><span id="toc4">ポケットサイクル</span></h2>



<p class="wp-block-paragraph">穴加工だけではありません。<br>円や長方形、スロット形状もサイクルが用意されています。<br>ポケット用のサイクルは、ダウンロードしたマニュアルでは、<br>８．４項目、ページ３８２～　に説明があります。</p>



<ul class="wp-block-list"><li>251 RECTANGULAR POCKET ____________________Page 383</li><li>252 CIRCULAR POCKET _________________________Page 388</li><li>253 SLOT MILLING ______________________________Page 392</li><li>254 CIRCULAR SLOT ____________________________Page 397</li><li>212 POCKET FINISHING ________________________Page 402</li><li>213 STUD FINISHING __________________________Page 404</li><li>214 C. POCKET FINISHING _____________________Page 406</li><li>215 CIRCULAR STUD FINISHING _______________Page 406</li><li>210 SLOT RECIP. PLNG _________________________Page 410</li><li>211 CIRCULAR SLOT ____________________________Page 413</li></ul>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/PocketCycle.png" alt="" class="wp-image-6275" width="400" height="209" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/12/PocketCycle.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/PocketCycle-300x157.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/PocketCycle-768x403.png 768w" sizes="(max-width: 400px) 100vw, 400px" /></figure>



<p class="wp-block-paragraph">かなり豊富なサイクルが用意されています。<br>何種類かのサイクルを組み合わせる事で、ある程度の加工はCAMがなくてもできそうです。</p>



<h2 class="wp-block-heading"><span id="toc5">補正</span></h2>



<p class="wp-block-paragraph">サイクルからは少し外れますが、ハイデンハインは工具を<a rel="noopener" href="https://www.kazuban.com/bbs/heidenhain/heidenhain.cgi?mode=main&amp;no=11" target="_blank">「Tool Table」というテキストファイルで管理しています。</a><br>そのため、任意の<span class="markerPink">工具を交換しただけ</span>で、コントローラは工具情報を「Tool Table」から取得します。<br>内容で必須なのは、「工具長さ」「工具径」ですが、この値は手動で入力してもいいですが<br>工具自動測定仕様であれば、自動的に入力されます。<br>したがって、<span class="markerPink">工具交換しただけで、工具長補正は完成</span>し、工具径補正が必要なNCデータを実行する場合「Tool Table」の値を元に、工具径補正が行われます。<br>これは、上記で説明した、「スレッドミル」や「ポケット」サイクルにも対応されます。<br>D番号を忘れた！などのトラブルはかなり少なくなります。<br>ちょっと面白い仕様に、切込み角度の項目があります。<br>これは、指定工具が切込み可能な場合、切込み角度を設定する項目です。<br>傾斜切込みを行うサイクルを使用する場合、このデータが参照されます。<br>このように、ハイデンハインでは使用工具はどのような工具なのかを登録しておき<br>工具交換する事で、その内容が自動的に反映される仕組みです。<br><span class="markerPink">工具交換しただけでと言うところが、重要なポイント</span>で交換すれば、<br>工具長補正は完了状態なので、ワークの任意のZ点に<strong>手パ</strong>（ハンドル）で簡単に移動できます。<br>これは、タッチプローブでも同じです。</p>



<h2 class="wp-block-heading"><span id="toc6">タッチプローブサイクル</span></h2>



<p class="wp-block-paragraph">プローブ測定用のサイクルも用意されています。<br>ただし、上記で紹介したマニュアルには、載っていませんでした。<br><a rel="noopener" href="https://product.heidenhain.de/JPBC/image/FILEBASE_PUBLIC/670_388-20.pdf" target="_blank">こちらのマニュアルにありました。</a><br>タッチプローブ機能はオプションだからかもしれません。<br>ただ、特にEUではタッチプローブは必須の考えが強いように思います。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/Probe-e1638693336693.png" alt="" class="wp-image-6279" width="317" height="296"/></figure>



<p class="wp-block-paragraph">これは、ワーク測定用のサイクルですが、こちらもかなり充実していますね。<br>最近ファナック機はご無沙汰なので最近の状況は分かりませんが、<br>私が今までで立ち上げた、タッチプローブ仕様のファナック機では、<br>自動ワーク座標系設定やワーク測定は、機械メーカーのサービスマンが提供してくれた<br>マクロプログラムを使用する方法で教わりました。<br>ただどのメーカーも、単純にタッチした底面のワーク原点からの深さを表示するマクロがありませんでした。<br>例えば、ポケットの掘り込み加工後には、底面にタッチして、その深さを測定したくなります。<br>提供していただいたマクロの中には、２点を測定してその段差を出すマクロはありましたが、<br>やはり加工中では単純にタッチしただけで深さが知りたいですね。<br>これは、<span class="markerYellow">タッチプローブには、工具長の概念があまりない</span>のも要因のように思います。<br>しょうがないので、カスタムマクロで自作しましたが、ハイデンハインには上記のような<br>豊富なサイクルが用意されています。<br>サイクルを使うと、加工後自動測定するプログラムも比較的簡単に作成可能ですし<br>制御機提供のサイクルなので、おそらく、違うメーカーの機械や<br>違うメーカーの測定器であっても、同じプログラムで測定できると思います。</p>



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



<h3 class="wp-block-heading"><span id="toc8">サイクル定義</span></h3>



<p class="wp-block-paragraph">サイクルを利用するには、まず「CYCLE DEF サイクル番号」でサイクルの種類を指定し、<br>Qパラメータで条件を設定します。<br>「;」の右側はコメントになります。<br>また行末の「~」は次の行と連続している意味です。<br>先頭の「18」は行番号ですが、すべてが「18行」の一行です。<br>見やすくするための仕様ではないかと思っています。<br>マニュアルではコメントが英語ですがだいたい理解できると思います。</p>



<pre class="wp-block-preformatted has-medium-font-size"><strong>18 CYCL DEF 200 DRILLING ~
   Q200=+5 ;SET-UP CLEARANCE ~
   Q201=-19 ;DEPTH ~
   Q206=400 ;FEED RATE FOR PLUNGING ~
   Q202=+19 ;PLUNGING DEPTH ~
   Q210=0 ;DWELL AT TOP ~
   Q203=+0 ;SURFACE COORDINATE ~
   Q204=+50 ;2ND SET-UP CLEARANCE ~
   Q211=0 ;DWELL AT BOTTOM</strong></pre>



<p class="wp-block-paragraph">この例は、ドリルサイクルですが、ファナックの「G82」と「G83」が合体したようなサイクルです。</p>



<h3 class="wp-block-heading"><span id="toc9">加工位置</span></h3>



<p class="wp-block-paragraph">サイクルへは、「CYCL CALL POS」「M99」「 CYCL CALL PAT」の３種類の方法で加工位置を指定します<br>サイクルは、最後に定義されたものが、「CYCL CALL」により呼び出されます。<br>「CYCL CALL POS」で加工位置を定義します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>12 <strong>CYCL CALL POS X+30 Y+20 Z+0</strong> FMAX M3<br>13 <strong>CYCL CALL POS X+80 Y+50 Z+0</strong> FMAX</p></blockquote>



<p class="wp-block-paragraph">「M99」指令により、移動指令で移動した位置でサイクルを実行する事もできます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>12 L X+30 Y+20 FMAX M3<br>13 CYCL CALL<br>14 L X+80 Y+50 FMAX<strong> M99</strong><br>15 L Z+100 FMAX M2</p></blockquote>



<p class="wp-block-paragraph">「FMAX」は「早送り」の意味です。<br> 「 CYCL CALL PAT」 は事前に、加工位置を書きだしたファイルを用意し、<br>そのファイルを指定する方法です。<br>センターとドリルのような、同じ位置に複数のサイクルを使用する場合に便利です。</p>



<pre class="wp-block-preformatted has-medium-font-size"><strong>6 TOOL CALL 1 Z S5000 
7 L Z+10 RO F5000 
8 SEL PATTERN “TAB1” 
9 CYCL DEF 200 DRILLING ~
  Q200=2 ;SET-UP CLEARANCE ~
  Q201=-2 ;DEPTH ~
  Q206=150 ;FEED RATE FOR PLNGNG ~
  Q202=2 ;PLUNGING DEPTH ~
  Q210=0 ;DWELL TIME AT TOP ~
  Q203=+0 ;SURFACE COORDINATE  ~
  Q204=10 ;2ND SET-UP CLEARANCE  ~
  Q211=0.2 ;DWELL TIME AT DEPTH ~
10 CYCL CALL PAT F5000 M3 ;　<em>Cycle call in connection with point table TAB1.PNT</em>
11 L Z+100 R0 FMAX M6
12 TOOL CALL 2 Z S5000</strong></pre>



<p class="wp-block-paragraph">加工位置ファイル「Point Table」は、「SEL PATTERN」で指定します。<br>呼び出し元と同じディレクトリにない場合には、フルパスで指定できます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><br>SEL PATTERN “TNC:\DIRKT5\NUST35.PNT&#8221;</p></blockquote>



<h3 class="wp-block-heading"><span id="toc10">Fusion360 で出力してみた</span></h3>



<p class="wp-block-paragraph"> Fusion360、ポストライブラリには、「Heidenhain」用ポストも用意されています。<br>プレート素材に、適当な穴を開けたモデルを用意し、CAM処理させてみました。</p>



<pre class="wp-block-preformatted has-medium-font-size"><strong>0 BEGIN PGM 1001 MM
1 BLK FORM 0.1 Z X-150 Y-100 Z-50
2 BLK FORM 0.2 X+150 Y+100 Z+0
3 ;-------------------------------------
4 ;Tools
5 ; #92 D=20 - ZMIN=-51 - ZMAX=+50 - drill
6 ;-------------------------------------
7 ;
8 M5
9 TOOL CALL 92 Z S1590
10 L M140 MB MAX
11 M3
12 L X-110 Y-70 R0 FMAX
13 L Z+50 R0 FMAX
14 M7
15 CYCL DEF 32.0 TOLERANCE
16 CYCL DEF 32.1
17 CYCL DEF 200 DRILLING ~
   Q200=+5 ;SET-UP CLEARANCE ~
   Q201=-51 ;DEPTH ~
   Q206=160 ;FEED RATE FOR PLUNGING ~
   Q202=+20 ;INFEED DEPTH ~
   Q210=0 ;DWELL AT TOP ~
   Q203=+0 ;SURFACE COORDINATE ~
   Q204=+50 ;2ND SET-UP CLEARANCE ~
   Q211=0 ;DWELL AT BOTTOM
18 L FMAX M99
19 L Y+70 FMAX M99
20 L X+110 FMAX M99
21 L Y-70 FMAX M99
22 L Z+50 FMAX
23 M9
24 M5
25 L M140 MB MAX
26 M30
27 END PGM 1001 MM</strong></pre>



<p class="wp-block-paragraph">すごいですね～<br>私がハイデンハイン制御の５軸を立ち上げてた時には、穴あけデータは、<br>サイクルで出力できないCAMもあったと記憶しています。<br>深穴サイクルなど、直線補間「G01」でサイクル動作を置き換えたデータでした。<br>Fusion360のポストは、ハイデンハインサイクルの勉強にも使えそうです。</p>



<h3 class="wp-block-heading"><span id="toc11">M12のタップ加工をプログラム化</span></h3>



<p class="wp-block-paragraph">M12のタップ加工行うＮＣプログラムをサイクルを組み合わせて作ってみました。<br>加工位置用のファイル「P1.pnt」を編集する事で、任意箇所へタップ加工ができます。<br> 「P1.pnt」 は、制御機から作成できます。<br>マニュアルの「Point Tables」を参照してください。<br>たぶん、エディタなどでテキストを作成しても、使用できると思いますが<br>最初は書式がわからないと思うので、まずは制御機で作成すればテキスト化されるので<br>そのテキストファイルを修正する方法が簡単だと思います。<br>ただし、実機に触れる環境ではないので、<span class="markerPink">検証できておりません。<br>万が一、<strong>使用する場合には、十分確認してください。</strong></span></p>



<p class="has-black-color has-light-green-cyan-background-color has-text-color has-background wp-block-paragraph"><strong>もし、実証できる方がいらっしゃれば、不具合点などコメントいただければ、助かります！</strong></p>



<p class="wp-block-paragraph">P1.PNT
</p>



<pre class="wp-block-preformatted has-normal-font-size has-medium-font-size"><strong>BEGIN P1 .pnt MM
NR    X       Y       Z 
0     +31.5   -14     +0 
1     -15     -40     +0 
2     -31.5   +14     +0 
3     +15     +40     +0 
[END]</strong></pre>



<p class="wp-block-paragraph">M12_SKD11.h</p>



<pre class="wp-block-preformatted has-medium-font-size"><strong>0  BEGIN PGM M12_SKD11 MM 
1  BLK FORM 0.1 Z  X+0  Y+0  Z-80
2  BLK FORM 0.2  X+150  Y+25  Z+0
3  * --------------------------------
4  CYCL DEF 247 DATUM SETTING ~
    Q339=+1    ;DATUM NUMBER
5  L  A+0  C+0 F3000 M21
6  ;;;;;;;;;;;;;;;;;;;;;;
7  ;;;; CENTER ;;;;;;;;;;
8  ;;;;;;;;;;;;;;;;;;;;;;
9  Q1 = 45 ;Tool
10 Q2 = 640 ;SP
11 Q3 = 80 ;F_Feed
12 Q4 = -0.6 ;Z_Depth
13 ;;;;;;;;;;;;;;;;;;;;;;
14 ;;;; DRILL D=10.2 ;;;
15 ;;;;;;;;;;;;;;;;;;;;;;
16 Q5 = 101 ;Tool
17 Q6 = 620 ;SP
18 Q7 = 120 ;F_Feed
19 Q8 = -25 ;Z_Depth
20 Q9 = 10 ;Q_Peck
21 ;;;;;;;;;;;;;;;;;;;;;;
22 ;;;; CHAMFER ;;;;;;;;;
23 ;;;;;;;;;;;;;;;;;;;;;;
24 Q30 = 46 ;Tool
25 Q31 = 2200 ;SP
26 Q32 = 240 ;F_Feed
27 Q33 = 0.5 ;Chanfer_Length
28 Q34 = 1.5 ;Distance
29 Q35 = Q33 + Q34 ;Depth
30 Q36 = 8 ;Coolant
31 Q37 = 12 ;Hole DIA
32 ;;;;;;;;;;;;;;;;;;;;;;
33 ;;;; TAPP M12 ;;;;;;;
34 ;;;;;;;;;;;;;;;;;;;;;;
35 Q10 = 104 ;Tool
36 Q11 = 120 ;SP
37 Q12 = -10 ;Z_Depth
38 Q13 = 1.75 ;Pitch
39 Q14 = 8 ;Coolant
40 ;;;;;;;;;;;;;;;;;;;;;;
41 * --------------------------------
42 ;;;; CENTER LBL 1 ;;;;;;;;;;;;;;
43 ;;;; DRILL LBL 2 ;;;;;;;;;;;;;;
44 ;;;; C LBL 3 ;;;;;;;;;;;;;;
45 ;;;; TAPP LBL 4 ;;;;;;;;;;;;;;
46 * --------------------------------
47 FN 9: IF +1 EQU +1 GOTO LBL 1
48 * --------------------------------
49 ;;;; SET POSITION ;;;;;;;;;;;;;;;
50 LBL 11
51 SEL PATTERN "P1.pnt"
52 CYCL CALL PAT F5000
53 M5 M9
54 L M140 MB MAX
55 LBL 0
56 * --- CENTER -----------------------
57 LBL 1
58 * - CENTER
59 TOOL CALL Q1 Z SQ2
60 M9
61 CYCL DEF 200 DRILLING ~
    Q200=+5    ;SET-UP CLEARANCE ~
    Q201=+Q4   ;DEPTH ~
    Q206=+Q3   ;FEED RATE FOR PLNGNG ~
    Q202=+Q4   ;PLUNGING DEPTH ~
    Q210=+0    ;DWELL TIME AT TOP ~
    Q203=+0    ;SURFACE COORDINATE ~
    Q204=+50   ;2ND SET-UP CLEARANCE ~
    Q211=+0    ;DWELL TIME AT DEPTH
62 L M140 MB MAX
63 L  X+0  Y+0 F8000 M3
64 L  Z+50 F8000
65 M0
66 M13
67 CALL LBL 11
68 LBL 0
69 * ---DRILL ----------------------
70 LBL 2
71 TOOL CALL Q5 Z SQ6
72 M9
73 CYCL DEF 200 DRILLING ~
    Q200=+5    ;SET-UP CLEARANCE ~
    Q201=+Q8   ;DEPTH ~
    Q206=+Q7   ;FEED RATE FOR PLNGNG ~
    Q202=+Q9   ;PLUNGING DEPTH ~
    Q210=+0    ;DWELL TIME AT TOP ~
    Q203=+0    ;SURFACE COORDINATE ~
    Q204=+50   ;2ND SET-UP CLEARANCE ~
    Q211=+0    ;DWELL TIME AT DEPTH
74 L M140 MB MAX
75 L  X+0  Y+0 F8000 M3
76 L  Z+50 F8000
77 M0
78 M13
79 CALL LBL 11
80 LBL 0
81 * --- CHAMFER -------------------
82 LBL 3
83 TOOL CALL Q30 Z SQ31 DR+Q34
84 M9
85 L M140 MB MAX
86 L  X+0  Y+0 F8000
87 L  Z+50 F5000
88 CYCL DEF 208 BORE MILLING ~
    Q200=+2    ;SET-UP CLEARANCE ~
    Q201=-Q35  ;DEPTH ~
    Q206=+Q32  ;FEED RATE FOR PLNGNG ~
    Q334=+2    ;PLUNGING DEPTH ~
    Q203=+0    ;SURFACE COORDINATE ~
    Q204=+50   ;2ND SET-UP CLEARANCE ~
    Q335=+Q37  ;NOMINAL DIAMETER ~
    Q342=+Q37  ;ROUGHING DIAMETER
89 M0
90 M3 MQ36
91 CALL LBL 11
92 LBL 0
93 * --- TAPP ----------------------
94 LBL 4
95 TOOL CALL Q10 Z SQ11
96 M9
97 Q15 = Q13 * 1
98 CYCL DEF 209 TAPPING W/ CHIP BRKG ~
    Q200=+5    ;SET-UP CLEARANCE ~
    Q201=+Q12  ;DEPTH OF THREAD ~
    Q239=+Q13  ;THREAD PITCH ~
    Q203=+0    ;SURFACE COORDINATE ~
    Q204=+50   ;2ND SET-UP CLEARANCE ~
    Q257=+Q15  ;DEPTH FOR CHIP BRKNG ~
    Q256=+Q13  ;DIST FOR CHIP BRKNG ~
    Q336=+0    ;ANGLE OF SPINDLE
99 L M140 MB MAX
100 L  X+0  Y+0 F8000 M3
101 L  Z+50 F5000
102 M0
103 MQ14
104 CALL LBL 11
105 LBL 0
106 * --------------------------------
107 L M140 MB MAX
108 M2
109 END PGM M12_SKD11 MM 
</strong></pre>



<p class="wp-block-paragraph">こんなデータをタップ径や材質ごとに用意しておくと、座標を編集するだけで<br>多種類のタップ加工簡単にができます。<br>ファナックでも、マクロを作成すれば同様のデータは作成できますが<br>制御機のサイクルだけで作成できるところが、ユーザーにとってはありがたい所だと思います</p>



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



<p class="wp-block-paragraph">一度、ハイデンハイン機を触ると、ファナック機には戻れないと言う意見をよく聞きます。<br>工具管理方法の違いもそうですが、このようなサイクルを<span class="markerPink">制御機側が提供している点</span>は<br>重要なポイントだと思います。<br>これは、高精度輪郭精度なども同じかもしれません。<br>機械メーカーの味付けで、同じNCデータを流しても、終了時間はかなりかわりますね。<br>機械メーカーにとっては、自由度があり、差別化ができていいのかもしれませんが<br>いろんなメーカーの機械を選択したい、ユーザー側としては、データの互換性は気になります。<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/heidenhain_cycle/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Fanuc と OSP の違い。</title>
		<link>https://www.kazuban.com/blog/fanuc-vs-osp/</link>
					<comments>https://www.kazuban.com/blog/fanuc-vs-osp/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Tue, 09 Nov 2021 12:30:06 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[OSP]]></category>
		<category><![CDATA[オークマ]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6173</guid>

					<description><![CDATA[昔の資料を整理していたところ、違いを書きだしたメモが出てきました。最近はあまり必要としていませんが、とりあえず、残しておこうと思います。もう、１５年以上前の資料なので、現在では変わっている箇所もあるかもしれません。この手 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">昔の資料を整理していたところ、違いを書きだしたメモが出てきました。<br>最近はあまり必要としていませんが、とりあえず、残しておこうと思います。<br>もう、１５年以上前の資料なので、現在では変わっている箇所もあるかもしれません。<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">基本的な、工具の位置移動指令は、ほぼ同じ</a></li><li><a href="#toc2" tabindex="0">ワーク座標系</a><ol><li><a href="#toc3" tabindex="0">Fanuc : G54 ～ G59</a></li><li><a href="#toc4" tabindex="0">Fanuc : G54.1P1 ～</a></li><li><a href="#toc5" tabindex="0">OSP : G15H1 ～</a></li></ol></li><li><a href="#toc6" tabindex="0">工具長補正</a><ol><li><a href="#toc7" tabindex="0"> Fanuc : G43 </a></li><li><a href="#toc8" tabindex="0">OSP : G56</a></li></ol></li><li><a href="#toc9" tabindex="0">工具長補正キャンセル</a><ol><li><a href="#toc10" tabindex="0"> Fanuc : G49</a></li><li><a href="#toc11" tabindex="0">OSP : G53</a></li></ol></li><li><a href="#toc12" tabindex="0">原点復帰</a><ol><li><a href="#toc13" tabindex="0"> Fanuc : G28</a></li><li><a href="#toc14" tabindex="0">OSP : なし</a></li></ol></li><li><a href="#toc15" tabindex="0">固定サイクル</a></li><li><a href="#toc16" tabindex="0">固定サイクル・R点復帰</a><ol><li><a href="#toc17" tabindex="0"> Fanuc : G99</a></li><li><a href="#toc18" tabindex="0"> OSP : M54</a></li></ol></li><li><a href="#toc19" tabindex="0">固定サイクル・イニシャル点復帰</a><ol><li><a href="#toc20" tabindex="0"> Fanuc : G98</a></li><li><a href="#toc21" tabindex="0"> OSP : M53</a></li></ol></li><li><a href="#toc22" tabindex="0">動作なし固定サイクル指令</a><ol><li><a href="#toc23" tabindex="0"> Fanuc : L0 もしくは K0　（ゼロ）</a></li><li><a href="#toc24" tabindex="0"> OSP : NCYL</a></li></ol></li><li><a href="#toc25" tabindex="0">サブプログラム呼び出し</a><ol><li><a href="#toc26" tabindex="0"> Fanuc : M98 もしくは　M198</a></li><li><a href="#toc27" tabindex="0"> OSP : CALL</a></li></ol></li><li><a href="#toc28" tabindex="0">サブプログラムからの戻り</a><ol><li><a href="#toc29" tabindex="0"> Fanuc : M99</a></li><li><a href="#toc30" tabindex="0"> OSP : RTS</a></li></ol></li><li><a href="#toc31" tabindex="0">サブプログラムの始まりと終了</a><ol><li><a href="#toc32" tabindex="0"> Fanuc : %</a></li><li><a href="#toc33" tabindex="0"> OSP : なし</a></li></ol></li><li><a href="#toc34" tabindex="0">工具呼び出し</a></li><li><a href="#toc35" tabindex="0">コメント文</a><ol><li><a href="#toc36" tabindex="0"> Fanuc : (　～　) までを、コメントとする</a></li><li><a href="#toc37" tabindex="0"> OSP : (　だけで閉じられていなくても、改行までがコメントとなる</a></li></ol></li><li><a href="#toc38" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">基本的な、工具の位置移動指令は、ほぼ同じ</span></h2>



<p class="wp-block-paragraph">工具の移動先を指令する、基本的なコードはほぼ同じです。<br>G17、G18、G19：平面指定<br>G90、G91：絶対・相対　座標指定<br>G00、G01、G02、G03 : 位置決め、直線・円弧補間<br>G04 : ドウェル<br>G40、G41、G42 : 工具径補正　<br>G73～、G80～：固定サイクル、完全同じではないが、同じ機能が多い<br>M00、M01、M02、M30：プログラムストップやエンド<br>M02、M03、M04、M05：スピンドル回転</p>



<p class="wp-block-paragraph">工具移動に関する基本的なコードは、だいたい同じです。<br>ただ、固定サイクルは、まったく同じではないので注意が必要です。<br>特に、穴あけ動作後の工具の退避指令や、リジットタップでは違いがあります。<br>（リジットタップは、同じファナック機でも違いがありますね～😠）</p>



<h2 class="wp-block-heading"><span id="toc2">ワーク座標系</span></h2>



<h3 class="wp-block-heading"><span id="toc3">Fanuc : G54 ～ G59</span></h3>



<p class="wp-block-paragraph">標準では、G54 ～　G59　の６個の座標系が使用できます。<br>座標系を使い分けると、一つのテーブルに何個（何種類）か製品を載せて、自動運転が可能になります。<br>ただ、普通の仕様では、６個の製品しか載せられませんね。<br>実は、カスタムマクロを利用すると、増やすことも可能です。<br>機会があれば記事にしようと思います。</p>



<h3 class="wp-block-heading"><span id="toc4">Fanuc : G54.1P1 ～</span></h3>



<p class="wp-block-paragraph">オプションになる機種もあると思いますが、G54.1 P「数値」のコードで設定します。<br>何個使えるかは、仕様により変わりますが、数十個から数百個は使用可能だと思います。</p>



<h3 class="wp-block-heading"><span id="toc5">OSP : G15H1 ～</span></h3>



<p class="wp-block-paragraph">Fanuc の「G54.1P」が「G15H」に変わった感じです。</p>



<p class="wp-block-paragraph"><br>余談ですが、どうしてFanucは「G54.1」などというコードになったのでしょう？<br>私のいい加減な推測ですが、昔は６個の座標で十分だったけど、だんだん足りなくなってきて<br>増やそうにも、G60は既に割り当てられていたので、苦肉の策で小数点を使って拡張したという感じでしょうか？<br>変換ソフトなど作る場合など、ほんと面倒です。</p>



<h2 class="wp-block-heading"><span id="toc6">工具長補正</span></h2>



<h3 class="wp-block-heading"><span id="toc7"> Fanuc : G43 </span></h3>



<p class="wp-block-paragraph">「<strong>G43</strong> Z50.0 H01」のように、指定高さに移動するまでに補正値を完了させる指令です。</p>



<h3 class="wp-block-heading"><span id="toc8">OSP : G56</span></h3>



<p class="wp-block-paragraph">こちらも、番号が変わっただけで、同様に指令します。</p>



<h2 class="wp-block-heading"><span id="toc9">工具長補正キャンセル</span></h2>



<h3 class="wp-block-heading"><span id="toc10"> Fanuc : G49</span></h3>



<p class="wp-block-paragraph">工具長補正をキャンセルするコードですが、ちょっと注意が必要です。<br>機種にもよりますが、<span class="markerPink">キャンセルに動作が伴う</span>場合があります。<br>その場合、補正値によっては、主軸が下がる場合があるので注意です。<br>したがって、直前に「<strong>G91G28Z0</strong>」で主軸をZ原点に退避させた後、キャンセルするのが安全です。</p>



<h3 class="wp-block-heading"><span id="toc11">OSP : G53</span></h3>



<p class="wp-block-paragraph">こちらも番号が変わっただけですが、上のFanuc編で説明した、<br>Ｚ原点へ退避させる<span class="markerPink">原点復帰指令はOSPにはない</span>ので注意です。</p>



<h2 class="wp-block-heading"><span id="toc12">原点復帰</span></h2>



<h3 class="wp-block-heading"><span id="toc13"> Fanuc : G28</span></h3>



<p class="wp-block-paragraph">「G28」は、「移動軸」と共に「<strong>中間点</strong>」を同時に指令します。<br>「G90G28X100.0」とすると、まず「X100.0」の位置へ移動し、その後「X軸原点」へ移動します。<br>この動作を利用して、<span class="markerYellow"><strong>現在の位置から</strong></span>Z軸を原点へ移動させたい場合「<strong>G91G28Z0</strong>」のコードがよく使われます。</p>



<h3 class="wp-block-heading"><span id="toc14">OSP : なし</span></h3>



<p class="wp-block-paragraph">OSPは原点復帰指令はありません。<br>海外の機械もそうですが、<span class="markerPink">必ずしもZ軸機械原点が安全位置（最上面）にあるとは限らない</span>から<br>危険だという事かもしれません。<br>その代わりに、退避させたい軸に、機械仕様よりも大きな数値を入れて移動させます。<br>ファナック機では、オーバートラベルのエラーが出てしまう場合がありますが、<span class="markerYellow">オークマ機はエラーになりません。</span><br>「G00Z1000.0」のようにします。</p>



<h2 class="wp-block-heading"><span id="toc15">固定サイクル</span></h2>



<p class="wp-block-paragraph">ハイデンハインの場合には、いろいろなサイクルが用意されていますが、<br>ファナックの場合にはドリル加工用サイクルがほとんどです。<br>穴加工固定サイクルは「Gコード」で穴の加工モードを指令し、加工位置や深さを指定します。<br>穴加工サイクルのGコードの番号は、FanucとOSPでは、だいたい同じですが<br>違いもあるので、詳細はマニュアルやネット情報で調べてみてください。<br>固定サイクルは一度指令すれば、キャンセルコード「G80」が来るまで、指令位置へ同様の穴加工を行います。</p>



<p class="wp-block-paragraph">穴加工サイクルが指令される、直前のZ軸の高さから、<br>実際の加工がスタートする高さを「R点」といい、「R」アドレスで指令します。<br>「直前の高さ」から「R点」までは、早送りで移動し、「R点」から加工送りスピードになります。<br>穴加工サイクルは、指定座標で加工サイクルが終了し、次へ移動する時のZ軸高さを２種類設定できます。</p>



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



<p class="wp-block-paragraph"><br>一つは、「R点」まで戻り移動する場合で「R点復帰」と呼ばれています。<br>もう一つは、 「直前の高さ」 か「指定高さ」まで戻り、移動する場合になります。<br>この移動高さをFanucでは「イニシャル点」と呼ばれていますが<br>オークマではなんと呼ぶのでしょう？「指定点」とかでしょうか？<br>ここでは。「イニシャル点」に統一し、「R点復帰」に対して「イニシャル点復帰」とします。</p>



<h2 class="wp-block-heading"><span id="toc16">固定サイクル・R点復帰</span></h2>



<h3 class="wp-block-heading"><span id="toc17"> Fanuc : G99</span></h3>



<p class="wp-block-paragraph">Fanuc固定サイクルの、「R点復帰」指令は、「G99」です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>・<br>G90 G00 Z50.0<br>G99 G73 X20.0 Y35.0 Z-30.0 R5.0 Q1.0 F200<br>X-20.0 Y35.0<br>X-20.0 Y-30.0<br>X20.0Y-30.0<br>G80</p></blockquote>



<p class="wp-block-paragraph">この例の場合、Z50.0の高さに位置決め後、「X20.0Y35.0」へ移動、<br>「高速深穴あけサイクルG73」で穴加工後、<br>R点「Z5.0」へ退避し、次の座標「 X-20.0Y35.0 」へ同様の穴加工を行います。<br>この場合「イニシャル点」は「Z50.0」ですが、「G99」なので、「Z5.0」で次の穴位置へ移動します。</p>



<h3 class="wp-block-heading"><span id="toc18"> OSP : M54</span></h3>



<p class="wp-block-paragraph">OSPの「R点復帰」指令は、Gコードでなく「M54」とMコードになります。<br>上の例の「G99」⇒「M54」に変更したデータになります。</p>



<h2 class="wp-block-heading"><span id="toc19">固定サイクル・イニシャル点復帰</span></h2>



<h3 class="wp-block-heading"><span id="toc20"> Fanuc : G98</span></h3>



<p class="wp-block-paragraph">Fanucのイニシャル点は、固定サイクル指令の<span class="markerPink">「直前の高さ」</span>になります。<br>「G98」により、固定サイクル中の移動は、「イニシャル点」の高さになります。</p>



<h3 class="wp-block-heading"><span id="toc21"> OSP : M53</span></h3>



<p class="wp-block-paragraph">OSPのイニシャル点は、直前という縛りはないですが<span class="markerPink">事前に「G71」コードで指定</span>します。<br>「G71 Z50.0」で、イニシャル点は「Z50.0」に設定されます。<br>「M53」により、固定サイクル中の移動は、「イニシャル点」の高さになります。</p>



<p class="wp-block-paragraph"> </p>



<h2 class="wp-block-heading"><span id="toc22">動作なし固定サイクル指令</span></h2>



<p class="wp-block-paragraph">一つのNCプログラムで運用する場合には、あまり必要にはなりませんが、<br>サブプロ的仕様で、穴加工の位置座標のみ、サブプロデータとして呼び出して使用する場合<br><span class="markerYellow"> 固定サイクル指令と位置座標指令は別プログラム</span>としておいたほうが便利です。<br>このような場合、動作を伴わない固定サイクル指令が必要になります。</p>



<h3 class="wp-block-heading"><span id="toc23"> Fanuc : L0 もしくは K0　（ゼロ）</span></h3>



<p class="wp-block-paragraph">機種によって「L」と「K」の場合があるので、注意してください。<br>固定サイクル指令時に、「L0」または「K0」を追加します。<br>次の例では、「L0」や「K0」を指令していません</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>・<br>G90 G00 X0 Y0 Z50.0<br>G98 G73 Z-30.0 R5.0 Q1.0 F200<br>X20.0 Y35.0<br>X-20.0 Y35.0<br>X-20.0 Y-30.0<br>X20.0Y-30.0<br>G80</p></blockquote>



<p class="wp-block-paragraph">この場合、<span class="markerPink">「X0 Y0」位置へも、穴あけ加工をします</span>、<br>G73行に「L0」または「K0」を追加する事で、 「X0 Y0」位置 への穴加工を回避できます。 </p>



<h3 class="wp-block-heading"><span id="toc24"> OSP : NCYL</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>・<br>G90 G00 X0 Y0<br>G71 Z50.0<br>NCYL G73 Z-30.0 R5.0 Q1.0 F200 M53<br>X20.0 Y35.0<br>X-20.0 Y35.0<br>X-20.0 Y-30.0<br>X20.0Y-30.0<br>G80</p></blockquote>



<p class="wp-block-paragraph">OSPでは、「NCYL」という「ニーモニックコード」と呼ばれる英文字単語を使います。<br>ここで注意が必要です。<br>単語なので、「NCYLG73Z-30.0R5.0Q1.0F200」とスペースなしで連続して指令してしまうと<br>「NCLYG」と判断されてしまいます。「NCYL　G71」と「ニーモニックコード」を使用する場合には<br><span class="markerPink">必ず「スペース」が必要</span>です。</p>



<h2 class="wp-block-heading"><span id="toc25">サブプログラム呼び出し</span></h2>



<h3 class="wp-block-heading"><span id="toc26"> Fanuc : M98 もしくは　M198</span></h3>



<p class="wp-block-paragraph">M98とM198は、機種やサブプロの保存箇所によって違ってきます。<br>M98はサブプロがメインプロと同じメモリ内にある場合に使用します。<br>M198はデータサーバなど外部入出力機器内のサブプロを呼び出す場合に使用します。<br>呼び出すには、サブプロのO番号の「O」を「P」に変えて呼び出します<br>M98P1000 の場合、メインと同じメモリ内のO1000　を呼び出します。</p>



<h3 class="wp-block-heading"><span id="toc27"> OSP : CALL</span></h3>



<p class="wp-block-paragraph">OSPは「CALL」というニーモニックコードを使用します。<br>呼び出すプログラム名は「O」を先頭にした英数文字です。<br>CALL OSUB01 のように指令します</p>



<h2 class="wp-block-heading"><span id="toc28">サブプログラムからの戻り</span></h2>



<p class="wp-block-paragraph">NCプログラムの終了は、Fanuc も OSP も「M02」や「M30」です同じですが<br>もし、サブプロの終了にこのコードを使用すると、<span class="markerPink">そこでプログラムは終了してしまいます。</span><br>場合によってはサブプロで終了させたい事例もあるかもしれませんが、<br>通常は呼び出したメインプロの次の行へ戻します。</p>



<h3 class="wp-block-heading"><span id="toc29"> Fanuc : M99</span></h3>



<p class="wp-block-paragraph">サブプログラム実行中に「M99」を読み込むと、呼び出し元の次の行へ制御が移ります。<br>ちなみに、メインプログラムからの呼び出しでなく、直接「M99」で終了するプログラムを実行すると<br><span class="markerPink">永遠に繰り返し</span>ますので、サブプログラムを単独で実行したい場合には注意してください。</p>



<h3 class="wp-block-heading"><span id="toc30"> OSP : RTS</span></h3>



<p class="wp-block-paragraph">OSPも同様ですが、「RTS」がリターンコードになります。</p>



<h2 class="wp-block-heading"><span id="toc31">サブプログラムの始まりと終了</span></h2>



<h3 class="wp-block-heading"><span id="toc32"> Fanuc : %</span></h3>



<p class="wp-block-paragraph">Fanucは「%」を読み込んで初めて、NCプログラムだと認識しNC制御を始めます。<br>また、NC制御が始めり、再度「%」を読み込むと、終了します。<br>「%」～「%」の間を一つのNCプログラムとして処理します。<br>これを、連続して機械へ入力する事も可能です。<br>その場合「%」～「%」の組数により、複数のNCプログラムを一度に機械へ登録できます。<br>機種によっては、「%」と「%」の途中に、「M30」や「M99」がある場合、それをプログラム終了と判断し<br>複数のNCプログラムとして処理する機種もあります。</p>



<h3 class="wp-block-heading"><span id="toc33"> OSP : なし</span></h3>



<p class="wp-block-paragraph">OSPはFanucのような特殊な文字はありません。<br>ただし、「/」で区切る事で、メインプロとサブプロを一度に登録できます。</p>



<p class="wp-block-paragraph">O1000<br>・<br>・<br>M53G81X-150.Y-125.8R5.Z-26.549F255<br>X-150.Y125.8<br>X150.Y-125.8<br>X150.Y125.8<br>X-55.Y-142.<br>X55.Y-142.<br>G80<br>G0Z1000.<br>M9<br>CALL OSUB01<br>・<br>・<br>M2<br>/<br>OSUB01(M206)<br>M132<br>G0Z1000M339<br>M5<br>G4P7<br>M133<br>RTS<br>/<br>OUSB02(M207)<br>M132<br>G0Z1000M121<br>S100M03<br>G4P3<br>M5<br>M9<br>M133<br>RTS</p>



<p class="wp-block-paragraph">このように、よく使うコードは常にサブプロとして登録するようにすると便利です。</p>



<h2 class="wp-block-heading"><span id="toc34">工具呼び出し</span></h2>



<p class="wp-block-paragraph">T「工具番号」のコードで呼び出すのは、FanucもOSPも同じです。<br>しかし、機種によっては、主軸工具をNCプログラムで呼び出すと、無視してくれる場合と<br>エラーで止まってしまう場合があります。<br>これは、Funuc機でも、エラーになる機械もありますが、オークマ機では<br>私の知っている限りでは、全てエラーになりました。<br>基本的には、主軸工具は呼び出さない仕様がよいと思いますが、その時の工具長補正の処理は<br>よく検討しておいたほうが、トラブルは少なくなると思います。<br></p>



<h2 class="wp-block-heading"><span id="toc35">コメント文</span></h2>



<p class="wp-block-paragraph">NCプログラム中には、メモ書きとしてコメント文を挿入できます。<br>コメント文は、FanucもOSPも　(　・・・・　)　のように「 (  ) 」で囲まれた中身は<br>NC的には全く意味を持ちません。人間の参考用です。<br>以前はこの仕様は、同じだと思っていましたが、ある日、下記のような違いに遭遇した事がありました。<br>これが、全てに当てはまるのか？は、確認しておりませんが、体験談です。</p>



<h3 class="wp-block-heading"><span id="toc36"> Fanuc : (　～　) までを、コメントとする</span></h3>



<p class="wp-block-paragraph"> ( ・・・ ) に挟まれた文をコメントと扱います。<br>複数行であっても、<strong>閉じるまで</strong>、コメント扱いとなります。<br><span class="markerPink">改行があっても、コメント中</span>として処理されます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>G90<br>( T02 M06<br>G00 G43 Z50. H02<br>Z5.0 )</p></blockquote>



<p class="wp-block-paragraph">この例では、先頭の「G90」以下はすべてコメント扱いになりますが<br>最後の　)　が省略されると、エラーになる可能性があります。</p>



<h3 class="wp-block-heading"><span id="toc37"> OSP : (　だけで閉じられていなくても、改行までがコメントとなる</span></h3>



<p class="wp-block-paragraph">  ( ・・・ ) に挟まれた場合は、Fanucと同じですが、<span class="markerPink">(　だけでも改行まで</span>がコメントになります</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>G90<br>( T02 M06<br>G00 G56 Z50. H02<br>Z5.0 </p></blockquote>



<p class="wp-block-paragraph">T02 の工具交換を無視にしたい場合、上記のように行の先頭のみに　(　を入れる事で実現できます。<br>この場合は、T02 M06 はコメントとして無視させますが、<br>次の工具長補正 G00 <s>G43</s>G56 Z50. H02 は処理させたいのが、作業者の意図ですが<br>Fanucへの変換ソフトなど作成する場合には、注意が必要ですね！</p>



<p class="wp-block-paragraph">コメントは<span class="markerPink">「必ず閉じる」</span>を必須にしたほうが、安全です。</p>



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



<p class="wp-block-paragraph">まだ違いは沢山あると思います。<br>ねじ切りサイクルや冷却指令なども、違いますが、これらの指令は、同じFanuc のバージョンであっても<br>機械で違う事もあるので、ここでは省略しました。<br>完璧なものは無理だと思いますが、<s>時間を見つけて、Fanuc ⇒OSP の変換ソフトを作ってみようと思っています。</s><br><a href="https://www.kazuban.com/blog/free_soft/#Soft11">Fanuc ⇒ OSP 変換ソフトを公開しました。</a><br>また、今回の記事で間違いなどあったら、コメントいただければ助かります。<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/fanuc-vs-osp/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Fusion360 のアセンブリ機能を使ってみた。</title>
		<link>https://www.kazuban.com/blog/assembly/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 12 Aug 2021 04:54:01 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[アセンブリ]]></category>
		<category><![CDATA[アニメーション]]></category>
		<category><![CDATA[ジョイント]]></category>
		<category><![CDATA[モーションリンク]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=5899</guid>

					<description><![CDATA[筆者は、Fusion360はCAM機能を使用する場合が多いので、今まで「アセンブリ」機能は使っていませんでした。ただ、実際加工には加工素材を固定するのに、治具と呼ばれる装置を利用します。治具を設計する場合、アセンブリ機能 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">筆者は、Fusion360はCAM機能を使用する場合が多いので、今まで「アセンブリ」機能は使っていませんでした。<br>ただ、実際加工には加工素材を固定するのに、治具と呼ばれる装置を利用します。<br>治具を設計する場合、アセンブリ機能が使えると便利そうだと思い使ってみました。<br><a href="https://www.kazuban.com/blog/parameters/">前回紹介した、ボルトテンプレート</a>もインポート後、寸法変更、再利用する方法も説明しています。</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><li><a href="#toc7" tabindex="0">ボルトインポート</a></li></ol></li><li><a href="#toc8" tabindex="0">アッセンブリ／ジョイント</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">モーション</a></li><li><a href="#toc13" tabindex="0">ジョイントの制限</a></li><li><a href="#toc14" tabindex="0">モーションリンク</a></li></ol></li><li><a href="#toc15" tabindex="0">ダウンロード</a></li><li><a href="#toc16" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">バイスを設計してみます。</span></h2>



<p class="wp-block-paragraph">ブロック素材を固定するには、バイスが便利です。<br>いろいろな種類のものが市販されていますが、今回は練習題材として、簡易的なバイスをモデリングしてみます。<br>まずは、各パーツのモデルを作成し、そのパーツをアセンブリしてみようと思います。</p>



<h3 class="wp-block-heading"><span id="toc2">マンガ絵</span></h3>



<p class="wp-block-paragraph">現場で部品を作成する場合、適当なイラストを描いてCAD化する事が多いです。<br>今回もへたくそですが、描いてみました。</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/illustration-1024x510.jpg" alt=""/></figure>



<p class="wp-block-paragraph">こんなイメージ・・・(^^;<br>本体にネジを固定し、中央にはネジを切った可動駒を挿入します。<br>ネジを回す事で、可動駒が移動して、材料を締め込む仕組みです。</p>



<h3 class="wp-block-heading"><span id="toc3">パーツ１、本体</span></h3>



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



<p class="wp-block-paragraph">本体はこんな感じにしてみました。<br>終端の固定部分に座繰り穴を施しその部分に、ボールネジを挿入します。<br>ボールネジを可動軸とし、座繰り穴にネジ頭を挿入。<br>可動駒には可動方向を一方向に拘束できるように、レール溝をつけてみました。<br>本体の背中部分には、口金を装着します。<br>口金は取り換え可能なように、ネジを施しました。</p>



<p class="wp-block-paragraph">ただ、この本体部品は一体での加工は大変ですね～<br>実際には、複数パーツに分割する事になると思いますが、今回はアセンブリの練習なので<br>一部品で進めす。</p>



<h3 class="wp-block-heading"><span id="toc4">パーツ２、可動駒</span></h3>



<p class="wp-block-paragraph">中央の可動部品は、ネジを切り、本体のレールに入るようにします。<br>本体同様、口金の取付ネジ穴も付けました。</p>



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



<h3 class="wp-block-heading"><span id="toc5">パーツ３、ボールねじ</span></h3>



<p class="wp-block-paragraph">駆動系は、ネジです。<br>実際には、左ネジのほうがよさそうです。<br>本体とフロントプレートでこのボールねじを拘束するような構造にします。</p>



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



<h3 class="wp-block-heading"><span id="toc6">その他のパーツ、口金・フロントプレート、レンチ</span></h3>



<p class="wp-block-paragraph">口金は取り換えられるように、ねじ止めとします。<br>本来であればフロントプレートも本体とはネジ止めになると思いますが、今回は手抜きです。</p>



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



<h3 class="wp-block-heading"><span id="toc7">ボルトインポート</span></h3>



<p class="wp-block-paragraph">ボルトは<a href="https://www.kazuban.com/blog/parameters/">前回作成したテンプレートを利用</a>してみようと思います。<br>データパネルから、直接ドロップさせる事が可能です。</p>



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



<p class="wp-block-paragraph">ただし、今回のように同じフォルダからドロップした場合、リンク属性になっています。<br>ボルトテンプレートは、各寸法をパラメータ化したので、対応する変数を変更すればモデルにも反映されます。<br>変数を変更するには、ドロップしたコンポーネントをアクティブにする必要があります。<br>しかし、リンク属性の場合、アクティブにできないようです。<br>リンクを解除するには、対象のコンポーネントの右ボタンから「リンクの解除」を実行します。</p>



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



<p class="wp-block-paragraph">「リンクの解除」が完了すると、対象のコンポーネント名の「鎖」のマークが消え<br>右端の「〇」を選択できるようになります。<br>選択しアクティブになると「修正」⇒「パラメータを変更」から変更が可能になります。</p>



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



<p class="wp-block-paragraph">今回、使用したい寸法に変更しました。<br>変更後、必要な４本に複写します。</p>



<figure class="wp-block-table is-style-stripes"><table><tbody><tr><td><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/bolt_copy.png" alt=""></td><td><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/all_perts.png" alt=""></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">フィレットとネジも追加モデリングしました。<br>これで、バイスを構成するすべてのパーツがそろいました。</p>



<h2 class="wp-block-heading"><span id="toc8">アッセンブリ／ジョイント</span></h2>



<p class="wp-block-paragraph">パーツがそろったら、バラバラの部品を組み立てていきます。<br>ボディ操作であれば、「修正」⇒「移動／コピー」や「位置合わせ」コマンドで組み立てる事は可能ですが、この場合。固定した状態で組み立てる事しかできません。<br>部分的に拘束された状態で、可動状態を再現するには「アセンブリ」機能を使います。</p>



<h3 class="wp-block-heading"><span id="toc9">コンポーネント化</span></h3>



<p class="wp-block-paragraph">「アセンブリ」機能を使用するには、「コンポーネント」にする必要があります。</p>



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



<p class="wp-block-paragraph">必要な「ボディ」を選択し右ボタンから「ボディからコンポーネントを作成」を実行します。<br>さらに、複写した４本のボルトも、コンポーネントにしておきます。<br>「アクティブ」な「コンポーネント」以外は透けた表示になり、下段の「デザイン履歴」はアクティブなコンポーネントだけの履歴になります。<br>全体の履歴に戻すには、一番上部をアクティブにします。</p>



<h3 class="wp-block-heading"><span id="toc10">土台を選択</span></h3>



<p class="wp-block-paragraph">まずは、本体を土台として固定したいので、「固定」モードに設定します。<br>「本体」になるコンポーネントを右クリックから、「固定」に設定します。</p>



<h3 class="wp-block-heading"><span id="toc11">ジョイント</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>・「モーション」では接続後どのように動作（固定、回転、スライドなど）させるのかを定義。<br>・「ジョイント」は、「この面」の「この点」を「あの面」の「あの点」へ順序で合わさる面を定義。</p></blockquote>



<p class="wp-block-paragraph">このような感じで、設定していきますが、言葉では分かりづらいので、動画にしてみました。</p>



<figure class="wp-block-video"><video height="836" style="aspect-ratio: 892 / 836;" width="892" controls src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210811-212136.mp4"></video></figure>



<p class="wp-block-paragraph">まずは、接続させたい「面」にカーソルを持っていき、「Ctrl」を押すと、選択できる原点が強調されるので希望の原点を設定します。</p>



<p class="wp-block-paragraph">正常に設定されると、自動的に接続されます。<br>接続される、「面」を指定するのがポイントです。</p>



<h3 class="wp-block-heading"><span id="toc12">モーション</span></h3>



<p class="wp-block-paragraph">残りのパーツもジョイントしてみましょう！<br>選択されている「モーション」の種類にもよりますが、自動ジョイントされた後、可動されます。<br>ここで可動範囲などは気にせず、可動状態のみを確認し、違っていた場合には変更します。<br>また、「ジョイント」の起点は、「ジョイントの位置合わせ」の「オフセット」で調整できます。<br>それでは、残りの「ジョイント」の動画で確認してみましょう。</p>



<figure class="wp-block-video"><video height="924" style="aspect-ratio: 1160 / 924;" width="1160" controls src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210812-100308.mp4"></video></figure>



<p class="wp-block-paragraph">これで「ジョイント」の設定は完了です。<br>各パーツは、「剛性」モード以外は、マウスドラッグで指定した「モーション」方向のみ可動させる事ができます。<br>ただ、動作制限を設定していないので、他パーツと干渉しても、通り抜けてしまいます。<br>動作の制限は、ブラウザの「ジョイント」から対象のジョイントから「ジョイントの制限を編集」で設定できます。</p>



<h3 class="wp-block-heading"><span id="toc13">ジョイントの制限</span></h3>



<p class="wp-block-paragraph">先ほど説明したように、ジョイントの設定が完了すれば、マウスでドラッグできます。<br>ドラッグ後は、「位置を戻す」アイコンで、戻す事ができます。<br>ジョイント設定時の起点が正確であれば、この位置を「0.00」として制限を設定できます。</p>



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



<p class="wp-block-paragraph">もし起点がずれている場合でも、最大最小として設定できます。<br>事前にモデル上の「検査」⇒「計測」で測定しておくと正確に設定できます。</p>



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



<p class="wp-block-paragraph">ブラウザの「ジョイントの制限を編集」で設定します。<br>今回は、起点を最大値「0.00」として、マイナス方向へ「-46.0」を最小値に設定しました。<br>設定が完了すると、マウスでのドラッグで制限がかかった事がわかります。<br>別の方法として、「ジョイント」⇒「接触セットの有効化」コマンドでも干渉を感知するので<br>干渉位置をキャプチャして参照する事もできます。</p>



<h3 class="wp-block-heading"><span id="toc14">モーションリンク</span></h3>



<p class="wp-block-paragraph">今回のバイスは、ボールネジを回すと、可動駒も可動します。<br>このように、二つの動きが影響しあう場合、「モーションリンク」で設定します。</p>



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



<p class="wp-block-paragraph">「アセンブリ」から「モーションリンク」を実行し、リンクしたい「ジョイント」を選択します。<br>二つのモーションの関係性を設定できます。<br>今回の「回転」と「スライド」の場合、「角度:360deg」「距離:2mm」に設定すると、ネジ一回転で２ｍｍの動作となります。<br>アニメーションで、動作の確認ができますし、ドラッグで可動駒を移動させると、ボールネジも回転します。<br>ブラウザから対象の「ジョイント」右クリックで、「モデルをアニメーション表示」でも動作を確認できます。</p>



<figure class="wp-block-video"><video height="640" style="aspect-ratio: 988 / 640;" width="988" controls src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210812-113007.mp4"></video></figure>



<h2 class="wp-block-heading"><span id="toc15">ダウンロード</span></h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><a href="https://www.kazuban.com/soft/Vise.f3d">ここで紹介したモデルは、こちらからダウンロードできます。</a></p></blockquote>



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



<p class="wp-block-paragraph">今まで、複数の部品を組み合わせる場合、「移動／コピー」や「位置合わせ」で行っていましたが<br>ジョイントを使うと、方向がバラバラな場合でも簡単にできます。<br>さらに、可動する制限も設定できるので、便利ですね。<br>CAM作業においては、あまり必要性を感じていませんでしたが、工作機械の可動範囲を考慮したり、治具設計を行う場合には威力を発揮しそうです。<br>今後積極的に使っていこうと思います。<br>今回は説明していませんが、アニメーション機能も触ってみました。<br>動作制限などは、設けるけとはできませんが、自由に動作を登録できます。<br>マニュアルやプレゼンなどの資料作りには重宝しそうです。</p>



<figure class="wp-block-video"><video height="1080" style="aspect-ratio: 1920 / 1080;" width="1920" controls src="https://www.kazuban.com/blog/wp-content/uploads/2021/08/Vise-1.mp4"></video></figure>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210811-212136.mp4" length="5941042" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210812-100308.mp4" length="35705797" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2021/08/20210812-113007.mp4" length="2096001" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2021/08/Vise-1.mp4" length="5864140" type="video/mp4" />

			</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 class="wp-block-paragraph">このサイトでも、下記記事から連載で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 loading="lazy" decoding="async" width="242" height="180" 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: 242px) 100vw, 242px" /></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>




  <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">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 class="wp-block-paragraph">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 class="wp-block-paragraph">上画像は、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 class="wp-block-paragraph">おそらく、Fusion360 CAMの内部計算レベルでの不具合ではなく、<span class="markerPink"> 
ポストプロセッサでの不具合</span>だと推測できます。</p>



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



<p class="wp-block-paragraph">まずは、食い込んだ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 class="wp-block-paragraph"><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 class="wp-block-paragraph">予想通りです。<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 class="wp-block-paragraph">ポストプロセッサで、円弧補間を出力させている箇所は、<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 class="wp-block-paragraph">ポストプロセッサには、<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 class="wp-block-paragraph">とりあえず、小さいほうが精度がよくなりそうな気がしたので、あまり考えずデフォルトは「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 class="wp-block-paragraph">「minimumChordLength」は、円弧の最小弦の長さ。<br>「minimumCircularRadius」は、円弧の最小半径です。<br>推測するに、ＣＡＭ側からこの数値よりも小さい値の円弧が定義された場合には、円弧指令コード「G02 , G03」コードは出力せずに、直線補間コード「G01」を出力するのだと思います。<br>この変数は、<span class="markerPink"> ポスト処理のプロパティで設定可能</span>です</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 class="wp-block-paragraph">標準ポスト「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 class="wp-block-paragraph">もう一つ重要な変数があります。</p>



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



<p class="wp-block-paragraph">これは、Ｘ，Ｙ，Ｚの出力フォーマットは、「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 class="wp-block-paragraph">食い込み動作は発生しませんでした。</p>



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



<p class="wp-block-paragraph">したがって、<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 class="wp-block-paragraph">これで、デフォルトで使用する場合では今回のような不具合は発生しないと思いますが、<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 class="wp-block-paragraph">ポストプロセッサの「円弧補間」を出力する関数は、<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 class="wp-block-paragraph">この関数の上部では、</p>



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



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



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



<p class="wp-block-paragraph">このブロック以降が対象となります。<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 class="wp-block-paragraph">オリジナルと修正したポストファイル両方でパス出力し比較してみます。<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 class="wp-block-paragraph">予定通り、Ｉ，Ｊのみの、円弧補間の行は出力されていません。<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 class="wp-block-paragraph">今回の不具合は標準ポストでデフォルト設定での使用では出なかった不具合ですが、<br>プロパティでは変更できてしまう設定なので、やはり危険ではあります。<br>また、Fusion360のシミュレータはCAMレベルでのシミュレーションなので<br>ポスト出力も含め、NCデータの不具合は発見できません。<br>特に、ポストプロセッサを自作や編集で使う場合は<br>やはり、実加工前には最終的にNC工作機械へ入力する、<br>NCデータシミュレーターはほしいですね。<br></p>



<p class="wp-block-paragraph"><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 class="wp-block-paragraph">いよいよ最後の締めくくりです。<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-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">現状の状態</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 class="wp-block-paragraph">工程と全体の終了処理です。<br>各工程の終了時には、クーラントや主軸回転停止、退避処理、を行い、機械側で一旦停止ができるように「M01」を出力させます。<br>全体では「M30」と「%」で終了とします。</p>



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



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



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



<p class="wp-block-paragraph">２工程目（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 class="wp-block-paragraph">次に、「M09」を出力させます。<br>これは簡単ですね。<br>onSection( )でも使用した、「setCoolant( )」を利用します。</p>



<p class="wp-block-paragraph">setCoolant(COOLANT_OFF);</p>



<p class="wp-block-paragraph">を追加する事で、「M09」を出力する事ができます。</p>



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



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



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



<p class="wp-block-paragraph">ただし、この関数がまた、複雑です。<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 class="wp-block-paragraph">う～ん、ここまで複雑にする必要があるのだろうか・・・<br>いずれにしても、<br>onCommand(COMMAND_STOP_SPINDLE);<br>のコードで、「M05」が出力できるみたいです。</p>



<p class="wp-block-paragraph">ここで、「<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 class="wp-block-paragraph">これで、同じ回転数の場合でも強制的に主力されると思います。<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 class="wp-block-paragraph">このコードは、<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="320" height="144" 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: 320px) 100vw, 320px" /></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 class="wp-block-paragraph">その時に<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 class="wp-block-paragraph">実際の加工においては、一つの工程が終了した時点で、ストップし加工状況や加工精度を確認したい場合があります。<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 class="wp-block-paragraph">具体的には、２７１６行付近の、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 class="wp-block-paragraph">ポストのプロパティで出力制御が可能なように、「properties.optionalStop」が「true」な場合のみ、「M01」を出力する仕様にしています。<br>ここまでで、「onSectionEnd( )」関数の改造は終了です。</p>



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



<p class="wp-block-paragraph">後は、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 class="wp-block-paragraph">早速ポスト処理させてみましょう！</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 class="wp-block-paragraph">いかがでしょうか？<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 class="wp-block-paragraph">参考までに、完成したポストファイルを公開しようと思いましたが、<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 class="wp-block-paragraph">とあるので、おそらく大丈夫だとは思うのですが、ブログでの公開でなく配布形式にしようと思います。<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 class="wp-block-paragraph">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-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">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 class="wp-block-paragraph">前回までの改造で、一度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 class="wp-block-paragraph">これを基本に、希望の出力に改造していきましょう。</p>



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



<p class="wp-block-paragraph">前回「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 class="wp-block-paragraph">テスト的に何度かドリルを定義したので、「６」は自動的につけられた番号です。<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 class="wp-block-paragraph">改造中の「fanuc_new.cps」の、１２０４行付近の「hasParameter( )」以降のブロック内で、<br>「writeln( )」「writeComment( )」関数で出力させていますので、「／／」でコメント化して無効にしました。</p>



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



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



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



<p class="wp-block-paragraph">これは、定義済みのセクションをマウス右ボタンで表示されるダイアログの「注釈を変更」で定義した文字列を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 class="wp-block-paragraph">デフォルトでは、「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 class="wp-block-paragraph">１２３３行付近の「<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 class="wp-block-paragraph">工具交換指令の前に、このブロックでは、「クーラントOFF」の定義を行っています。<br>今回は「クーラントOFF」に関しては、セクション（工程）の終了時に指令する予定なので、ここでは不要ですが<br><span class="markerYellow"> 事前にOFFに設定されていればモーダルなのでここでは無視されます。</span><br>あえて、無効にする必要はないと思います。</p>



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



<p class="wp-block-paragraph">次に１２３９行付近で「オプショナルストップ」の定義になっています。<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 class="wp-block-paragraph">if (tool.number &gt; 99)　この条件判断で９９番以上の指令では、ワーニングを出力するように定義しています。<br>最近は、３桁指令でも受け入れる制御機も多いので、その場合には、「99」を変更してください。 </p>



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



<p class="wp-block-paragraph">次に、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 class="wp-block-paragraph">１２４８行付近、やっと工具交換指令が出てきました。<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 class="wp-block-paragraph">次の「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 class="wp-block-paragraph">新しい工具であれば・・のブロックを処理し、ない場合でも「／」を付加して工具交換指令を出力するように、追加しています。</p>



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



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



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



<p class="wp-block-paragraph">このブロック内の１３１３付近の「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 class="wp-block-paragraph">今回やりたいのは、⑨回転指令は、⑧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 class="wp-block-paragraph">そうして、１３１３付近の「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 class="wp-block-paragraph">これで、回転指定は書き出されずに、変数「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 class="wp-block-paragraph">次に、工具長補正指令の処理をしている場所を探しますが、その前に、「ワーク座標指令」と「クーラント指令」が見つかりました。<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 class="wp-block-paragraph">１３５７付近の「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 class="wp-block-paragraph">さらに、１３７２付近のクーラント指令もコメントにします</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 class="wp-block-paragraph">さて、工具長補正指令は、１３９８行付近のこのブロック内で定義されています。</p>



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



<p class="wp-block-paragraph">「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 class="wp-block-paragraph"><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 class="wp-block-paragraph">ここまでで、⑧工具長補正指令まで終了しました。<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 class="wp-block-paragraph">やっと、終了しました。<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 class="wp-block-paragraph">だいたい、希望のデータになっていると思いますが、スピンドル回転と冷却指令が、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 class="wp-block-paragraph"></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 class="wp-block-paragraph"><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-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">オリジナルポストの確認</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 class="wp-block-paragraph">前回、オリジナル（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 class="wp-block-paragraph">最初のセクション（工程）の始まりは、<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 class="wp-block-paragraph"><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 class="wp-block-paragraph">上記を考慮して、ＮＣプログラム構成を再検討します。<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 class="wp-block-paragraph">オリジナルと見比べながら改造していきます。<br>ちょっと前置きが長くなってしまったので、実際の編集作業の説明は、今回は①～⑤までとします。</p>



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



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



<p class="wp-block-paragraph">「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 class="wp-block-paragraph">これは主に新しい工具が挿入された場合の条件判断で書かれていますが、今回はセクション（工程）が変われば、同じ工具であっても<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 class="wp-block-paragraph">これで無条件にこのブロックを実行します。<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 class="wp-block-paragraph">この関数が「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 class="wp-block-paragraph">この関数の、２７５８付近に「_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 class="wp-block-paragraph">この部分を、このように編集します。</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 class="wp-block-paragraph">まず、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 class="wp-block-paragraph">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 class="wp-block-paragraph"></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 class="wp-block-paragraph"><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-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></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 class="wp-block-paragraph">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 class="wp-block-paragraph">まずは、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 class="wp-block-paragraph"><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 class="wp-block-paragraph">こんなところですね。</p>



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



<p class="wp-block-paragraph">早速改造していきましょう。</p>



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



<p class="wp-block-paragraph">この二つ「①と②」は、グローバル変数の「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 class="wp-block-paragraph">編集した箇所には、「//」で編集者と日付などをコメントにしておくと、後々編集箇所を検索するのに便利です。<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 class="wp-block-paragraph">これで、①と②の編集は終了です。</p>



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



<p class="wp-block-paragraph">ここからは、「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 class="wp-block-paragraph">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 class="wp-block-paragraph">次に３６０行付近で工具情報リスト情報を取得し、「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 class="wp-block-paragraph">その後、３７７行付近以降の</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 class="wp-block-paragraph">関数、getNumberOfTools()で、ポスト作成時に選択したセクション（工程）で使用した、工具の個数を取得しています。<br>使用する工具の工具情報をその個数だけ繰り返し入手し、コメントとして出力させています。<br>このルーチンは、工具情報を取得する方法として、別の操作でも利用できる可能性があるので、覚えておくと便利です。</p>



<p class="wp-block-paragraph">次の４２３行付近で、ワーク座標系のチェックをしています。</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 class="wp-block-paragraph">ＣＡＭの設定画面のポスト処理画面が参照されます。</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 class="wp-block-paragraph">複数の「設定」を一度にポスト処理する場合で、違うワーク座標系を使用したい場合には、ここでの設定は「0」以外にしなければエラーを出すみたいです。</p>



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



<p class="wp-block-paragraph">４３２行付近で、「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 class="wp-block-paragraph">次の４３５行付近の「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 class="wp-block-paragraph">次では、「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 class="wp-block-paragraph">wcsオフセットが、<br>「0」であれば、「G54」。<br>「1～6」までは、「G54～G59」<br>「7」以上になると、<br>拡張座標系「G54.1 P1～」<br>を使用できる仕様とします。</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div></div>



<p class="wp-block-paragraph">このような仕様で、プログラムを追加します。<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 class="wp-block-paragraph">この部分を簡単に説明すると、</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 class="wp-block-paragraph">ジャンプ指令は、実際の加工時、任意工程を再加工したい場合に使用します。<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 class="wp-block-paragraph">出力は、わずか６行程度のデータですが、結構ボリュームありました。<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 class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
