<?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>G-Code | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/g-code/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kazuban.com/blog</link>
	<description>なにかしら、皆さんの参考になれば幸いです！</description>
	<lastBuildDate>Thu, 05 Feb 2026 00:40:01 +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>G-Code | じじぃの引出し</title>
	<link>https://www.kazuban.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Python正規表現に挑戦 ― Fanuc系NCブロックをNCワードに分解させる</title>
		<link>https://www.kazuban.com/blog/python-regex/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 05 Feb 2026 00:40:01 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[NC]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ＮＣデータ]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[正規表現]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=12021</guid>

					<description><![CDATA[このサイトでは、NCデータの解析・変換などの自作アプリを公開しています。これまでは C++Builder で自作ライブラリを作成し開発してきました。独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなり [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">このサイトでは、<a href="https://www.kazuban.com/blog/free_soft/">NCデータの解析・変換などの自作アプリを公開</a>しています。<br>これまでは C++Builder で自作ライブラリを作成し開発してきました。<br>独学ゆえに効率や可読性など課題は沢山ありますが、いまさら見直す気にもなりません。<br>最近は Python の学習もかねてNCデータ解析ライブラリのpythonへの移行を考えています。<br>AI の登場で、素人でも高度なコードを得られる時代になりましたが、意味を理解せずに使うのはやはり危険ですし、プログラミングスキルは向上しません。<br>この記事を書くきっかけは<br>「Fanuc系NCブロックをNCワードに分割させる、pythonスクリプトをだして」<br>へのAIの回答に正規表現が使われていた事から始まりました<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">1. 文字列とリテラル</a></li><li><a href="#toc4" tabindex="0">2. メタ文字（特別な意味を持つ記号）</a><ol><li><a href="#toc5" tabindex="0">具体例</a></li></ol></li><li><a href="#toc6" tabindex="0">3. 繰り返し回数の指定（量指定子）</a><ol><li><a href="#toc7" tabindex="0">具体例</a></li></ol></li><li><a href="#toc8" tabindex="0">4. 文字クラス</a></li><li><a href="#toc9" tabindex="0">5. 代表的なエスケープシーケンス</a></li><li><a href="#toc10" tabindex="0">6. エスケープが必要な記号</a></li><li><a href="#toc11" tabindex="0">補足</a></li></ol></li><li><a href="#toc12" tabindex="0">ファナック系、NCデータ構造</a><ol><li><a href="#toc13" tabindex="0">
「ワード」＝「アドレス」+「数字・数値」
「ブロック」＝「ワード」の集まり
「NCデータ」＝「ブロック」の集まり
</a></li></ol></li><li><a href="#toc14" tabindex="0">ブロックから正規表現でワードに分解する</a><ol><li><a href="#toc15" tabindex="0">アドレスと数字抽出</a></li><li><a href="#toc16" tabindex="0">さらに、アドレスと数字を分けて抽出したい場合</a></li><li><a href="#toc17" tabindex="0">軸（X,Y,Z・・）の小数点にも対応させる</a></li><li><a href="#toc18" tabindex="0">複雑な正規表現の可読性を高める</a></li><li><a href="#toc19" tabindex="0">さらにちょっと特殊な、G や M　コードにも対応させてみます</a></li><li><a href="#toc20" tabindex="0">正規表現のraw文字列の変数化</a></li></ol></li><li><a href="#toc21" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">正規表現</span></h2>



<p class="wp-block-paragraph">正規表現の情報は、ネット上に豊富にあると思うので、詳細は検索してみてください。<br>下記は「正規表現」の説明をAIに聞いてみた回答です</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<h3 class="wp-block-heading"><span id="toc2"><a>概要</a></span></h3>



<p class="wp-block-paragraph">本チャットログでは、「正規表現（Regular Expression）」の基本要素について、最小限かつ代表的な機能に絞って説明している。主な用途は文字列の検索・置換・抽出であり、「文字列パターンを表現する小さな言語」として位置付けている。</p>



<h3 class="wp-block-heading"><span id="toc3"><a>1. </a>文字列とリテラル</span></h3>



<ul class="wp-block-list">
<li>abc
<ul class="wp-block-list">
<li>文字列「abc」にそのままマッチするパターン。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc4"><a>2. </a>メタ文字（特別な意味を持つ記号）</span></h3>



<ul class="wp-block-list">
<li>. : 任意の1文字</li>



<li>^ : 行頭</li>



<li>$ : 行末</li>



<li>* : 直前要素の0回以上の繰り返し</li>



<li>+ : 直前要素の1回以上の繰り返し</li>



<li>? : 直前要素の0回または1回</li>



<li>| : OR（または）</li>



<li>() : グループ化・キャプチャ</li>
</ul>



<h4 class="wp-block-heading"><span id="toc5"><a>具体例</a></span></h4>



<ul class="wp-block-list">
<li>a.*b
<ul class="wp-block-list">
<li>「a」で始まり「b」で終わる行全体にマッチ（間の文字列は任意長）</li>
</ul>
</li>



<li>colou?r
<ul class="wp-block-list">
<li>color または colour にマッチ（u がある/ない両方に対応）。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6"><a>3. </a>繰り返し回数の指定（量指定子）</span></h3>



<ul class="wp-block-list">
<li>{n} : ちょうど n 回</li>



<li>{n,} : n 回以上</li>



<li>{n,m} : n〜m 回</li>
</ul>



<h4 class="wp-block-heading"><span id="toc7"><a>具体例</a></span></h4>



<ul class="wp-block-list">
<li>\d{3}-\d{4}
<ul class="wp-block-list">
<li>123-4567 のような「数字3桁-数字4桁」形式にマッチ。</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc8"><a>4. </a>文字クラス</span></h3>



<ul class="wp-block-list">
<li>[abc] : a か b か c のいずれか1文字</li>



<li>[^abc] : a,b,c 以外の1文字</li>



<li>[0-9] : 数字</li>



<li>[A-Za-z] : 英字（大文字・小文字）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9"><a>5. </a>代表的なエスケープシーケンス</span></h3>



<p class="wp-block-paragraph">多くの処理系で共通して使われるもの。</p>



<ul class="wp-block-list">
<li>\d : 数字 [0-9]</li>



<li>\w : 単語構成文字（英数字 + _）</li>



<li>\s : 空白文字（スペース・タブ・改行など）</li>



<li>\D : 非数字（\d 以外）</li>



<li>\W : 非単語構成文字（\w 以外）</li>



<li>\S : 非空白文字（\s 以外）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10"><a>6. </a>エスケープが必要な記号</span></h3>



<p class="wp-block-paragraph">次の文字はメタ文字として特別な意味を持つため、そのままの記号として扱うにはバックスラッシュでエスケープする必要がある。</p>



<ul class="wp-block-list">
<li>対象文字
<ul class="wp-block-list">
<li>. * + ? ^ $ ( ) [ ] { } | \</li>
</ul>
</li>



<li>使用例<ul><li>\. : ドットそのものにマッチ</li></ul>
<ul class="wp-block-list">
<li>\? : 疑問符そのものにマッチ</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading"><span id="toc11"><a>補足</a></span></h3>



<p class="wp-block-paragraph">ここまでが「基本の道具」としての正規表現の要素一式であり、今後はこれらを組み合わせて「メールアドレスの簡易チェック」など、実用的なパターン作成にも応用できると示唆している。</p>
</blockquote>



<p class="wp-block-paragraph">個別でみれば、なんとなくわかる気もしますが、これが組み合わさると、まったく呪文です<br>ただ、いろんなパターンの質問とAIの回答を照らし合わせると、なんとなく理解できてくるので、正規表現にかぎらず、AIは言語学習資料としても本当に役立ちます。</p>



<h2 class="wp-block-heading"><span id="toc12">ファナック系、NCデータ構造</span></h2>



<p class="wp-block-paragraph">NCデータの分析ソフトを検討する場合、NCデータ構造の知識は必須です<br>NCデータの知識がないまま、AIの回答だけで進めると、間違いなく後々苦労します<br>ファナック系のプログラム構造は、下記記事でも紹介しています</p>



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

<a href="https://www.kazuban.com/blog/nc-gcode-01/#toc2" title="NCプログラム／プログラム構造" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img decoding="async" width="203" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1.png 879w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-300x266.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1-768x681.png 768w" sizes="(max-width: 203px) 100vw, 203px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／プログラム構造</div><div class="blogcard-snippet internal-blogcard-snippet">最近の投稿は、覚書きとしても残しておきたかったので、素人ながらLinux系の投稿が連続していましたが、今回は気分を変えて、今まで携わってきたＮＣ関連の記事を書こうと思います。ＮＣプログラムとは？ＮＣ工作機械のコントローラへの指令の集まりです。プログラムとありますが、ファナック系は基本的には命令コード...</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">2019.11.30</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading has-text-align-left"><span id="toc13">
「ワード」＝「アドレス」+「数字・数値」<br>
「ブロック」＝「ワード」の集まり<br>
「NCデータ」＝「ブロック」の集まり
</span></h3>



<p class="wp-block-paragraph">NCブロックからNCアドレスを抽出する課題なので、NCコードを少し復習しておきます</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="262" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png" alt="" class="wp-image-1338" srcset="https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-1024x262.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-300x77.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1-768x197.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/図1.png 1385w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">ブロックの末尾は制御器では「EOB」ですが、PC側では改行コードになります<br>改行コードはOSにより変わりますが、基本的にアスキー形式での転送で大丈夫だと思います<br>NCデータの最小単位は、「ワード」と呼ばれていて、<br>「アルファベット一文字」+「数字、符号、小数点」が一塊になっている要素です<br>例えば「G02」とか「X-12.345」の構成です。<br>先頭のアドレス文字で機械への指令の種類を表し、ワードで具体的な指令になります<br>この「ワード」が集まり、一行の構成になった文字列が「ブロック」と呼ばれます<br>さらに、「ブロック」が複数行あつまって、NCデータになります<br>CAM利用の場合、作成したNCデータファイルをNC機械へ転送し加工動作を制御します<br>分析ソフトを検討する場合、まずはNCデータをブロックに、ブロックをワードに分解したほうが整理しやすいです<br>今回の課題では、<span class="marker-under-red">正規表現</span>を利用して<span class="marker-under">「ブロック」を「ワード」に分解する</span>コードを作成します<br>やりたい事をAIに投げかけると、それなりの回答をもらえます。<br>ただ、ＮＣコードのように、機種依存や複雑な表現がある場合、AIへすべて完ぺきなコードを期待してもなかなか思うような回答は得られません。<br>また、最初は良くても開発を進めていくうちに、改造したくなる場合もあります<br>やはり、ある程度の理解は必要です。</p>



<h2 class="wp-block-heading"><span id="toc14">ブロックから正規表現でワードに分解する</span></h2>



<p class="wp-block-paragraph">具体的に正規表現を書き、「ワード」に分解した結果と照らし合わせながら理解を進めようと思います<br>「ワード」＝「大文字アルファベット一文字」+「数字」なので、一番単純な正規表現のパターンは、&#8221;[A-Z]\d&#8221;になります<br>また、正規表現パターンで、文字列から部分文字列を抽出するのに、AIは「re.findall関数」を教えてくれました<br>（findall関数についての詳細は、ネット検索やAIに聞いてみてください）<br>サンプル文字列は複数のパターンを織り交ぜた、&#8221;G0G1G00 G03M3 T102M30&#8243;　でやってみます<br>（文字列並びのみのサンプルで、NCデータとしては意味ありません）</p>



<h3 class="wp-block-heading"><span id="toc15">アドレスと数字抽出</span></h3>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G0', 'G0', 'M3', 'T1', 'M3']</code></pre>



<p class="wp-block-paragraph">ちょっと期待とは違いますが、とりあえずは、アドレスと数字がリストで取り出せました<br>たった一行で分解された文字列リストが作成されました、すごいですね～<br>一文字づつ文字列操作で処理させたら、結構なコード量になっていると思います<br>ただ、「\d」としたため、「数字は<strong>一文字</strong>」しか抽出してくれませんでした<br>ここで「\d{2}」としてみると、「数字二文字」のみ取り出してくれます<br>今回の例ですべて取り出すには「\d{1,3}」とすればすべてヒットします<br>「\d+」でも同様の結果になりますが、こちらの方は文字数制限はなくなります<br>今回のサンプルでは、&#8221;[A-Z]\d+&#8221;で行こうと思います<br>ちなみに、「\d{0}」とすると、アドレスのみ取り出せます。</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G0', 'G1', 'G00', 'G03', 'M3', 'T102', 'M30']</code></pre>



<h3 class="wp-block-heading"><span id="toc16">さらに、アドレスと数字を分けて抽出したい場合</span></h3>



<p class="wp-block-paragraph">グループ化と呼ばれる（丸括弧）でパターンを囲むと「tuple」として分離してくれます<br>抽出した後の処理内容によっては、こちらが便利かもしれません</p>



<pre class="wp-block-code"><code>import re

block = "G0G1G00 G03M3 T102M30" # サンプルNCブロック文字列
words = re.findall(r"<strong>(&#91;A-Z])(\d+)</strong>", block)
print(f"{words}")
for addr, val in words:
    print(f"addr={addr}:val={val}")

#---------- 結果 --------------
#&#91;('G', '0'), ('G', '1'), ('G', '00'), ('G', '03'), ('M', '3'), ('T', '102'), ('M', '30')]
#addr=G:val=0
#addr=G:val=1
#addr=G:val=00
#addr=G:val=03
#addr=M:val=3
#addr=T:val=102
#addr=M:val=30</code></pre>



<h3 class="wp-block-heading"><span id="toc17">軸（X,Y,Z・・）の小数点にも対応させる</span></h3>



<p class="wp-block-paragraph">ここまでは、GやMコードでしたが、軸指令に対応するには、<span class="marker-under">符号や小数点</span>も考慮する必要があります<br>余談ですがプログラミング初心者の場合勘違いしやすいのが、<span class="marker-under-red"><strong>数字</strong>と<strong>数値</strong>の違い</span>です。<br>「12.23」の場合、<strong>数値</strong>としては「12 + 0.23」のように演算ができますが、<br><strong>数字</strong>の場合は、「1」「2」「.」「2」「3」と途中に「.」があるだけのただの数字文字の連続です<br>正規表現の場合も、数字・符号・小数点の<strong>文字の集まり</strong>として処理するので、数値で考えてしまうと期待と違う結果になり、悩む事になります<br>さて、文字を意識してサンプル文字列データに軸指令を追加して、上記のコードで実行してみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 <strong>X12.5Y+20.3Z-5.63</strong>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'F1000']</code></pre>



<p class="wp-block-paragraph">やはりこのコードでは、±符号と小数点が入るとマッチしないので、省かれてしまいますね<br>まず符号に対応するためにはアドレス「A-Z」の後に[+-]を追加します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'Y+20', 'Z-5']</code></pre>



<p class="wp-block-paragraph">これでは、符号「+-」が必須に判断され符号付の文字列しかヒットしませんでした<br>符号文字は<span class="marker-under">「無くてもいい」</span>の意味で<span class="marker-under"><strong>[+-]?</strong></span>としてみます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12', 'Y+20', 'Z-5', 'F1000']</code></pre>



<p class="wp-block-paragraph">符号部分を<span class="marker">[+-]?</span> とすることで、符号がなくてもマッチするようになりました<br>次に小数点とそれ以下にも対応させてみましょう<br>NC制御器は、数値として扱いますが、文字としての小数点の扱いは結構面倒です。<br>小数点がある場合、ない場合、小数点から始まる場合、小数点で終わる場合・・など<br>まずは、小数点の有無に対応させるため、「<strong>\d+\.\d+</strong>」を考えましたが、<br>この場合、小数点がないとマッチしなくなります<br>そこで「？を付加」すれば「無くてもいい」にも対応できます</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.5Y+20.3Z-5.63F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+</strong>", block)
print(f"{words}")

#---------- 結果 --------------
&#91;'G90', 'G01', 'X12.5', 'Y+20.3', 'Z-5.63', 'F1000']
</code></pre>



<p class="wp-block-paragraph">だいぶ理想に近づいてきましたが、「X.124」や「23.」など、小数点での始まりや終わりには対応できません<br>サンプル文字列に追加して確かめてみましょう</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"<strong>&#91;A-Z]&#91;+-]?\d+\.?\d+"</strong>, block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker-red">J22</span>', 'F1000</code></pre>



<p class="wp-block-paragraph">やはり、「I.5」にはマッチせず「J22.」の「.」は省かれていますね<br>ここも余談ですが、NCで「<strong>22.</strong>」を「<strong>22</strong>」に変換してしまった場合、制御器によってはとんでもない事になりかねないので十分意識しておく必要があります。<br><br>整理してみると</p>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>\d+：複数個の数字<br>ここまでで、「Gコード」「Mコード」には対応できている</li>



<li>\.?：小数点は必須でない</li>



<li>\d+：複数個の数字</li>
</ul>



<p class="wp-block-paragraph">やはり、「小数点で終わる」場合「\.?」なので、省略されてしまいますね<br>ではどうすればいのか？<br>AIに聞いたところ、グループ化と言う方法があり、&#8221;( )&#8221;で囲む事で、一塊としてでマッチングのルール設定できるようです<br>ただし、&#8221;( )&#8221;では、囲みごとに分割されタプルのリストとして抽出されます<br>グループごとに分割させたくない場合には<span class="marker-under"><strong>&#8220;(?: )</strong>&#8220;で囲む</span>仕様があり<span class="marker-under">非キャプチャグループ</span>と呼ばれマッチングのルールには使用するが分割はされないようです。<br>今回の例では、分割させたくないので、&#8221;<strong>(?: )</strong>&#8220;を使ってみます<br>最後の「\d+：複数個の数字」をグループ化して、必須ではない複数個の数字として設定します</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?\d+\.?<strong>(?:\d+)?</strong>", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', '<span class="marker"><strong>J22.</strong></span>', 'F1000']</code></pre>



<p class="wp-block-paragraph">これで、「22.」には対応できました。次は、小数点で始まる「.5」の場合です。<br>ここまででも、結構な呪文になっているのに、さらに複雑になりそうです。<br>ここもAIに相談すると、グループの中で（A | B）の書式で「AまたはB」とマッチング範囲の選択ができるようで、この書式での書き方を教えてくました</p>



<pre class="wp-block-code"><code>import re

block = "G90G01 X12.50Y+20.3Z-5.63 <span class="marker"><strong>I.5 J22.</strong></span>F1000" # サンプルNCブロック文字列
words = re.findall(r"&#91;A-Z]&#91;+-]?(?:<span class="marker-under-blue">\d+\.\d+</span><strong>|</strong><span class="marker-under">\d+\.</span><strong>|</strong><span class="marker-under-red">\.\d+</span><strong>|</strong>\d+)", block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', <span class="marker"><strong>'I.5'</strong>, <strong>'J22.'</strong></span>, 'F1000']</code></pre>



<ul class="wp-block-list">
<li>[A-Z]：NCコードのアドレス</li>



<li>[+-]?：必須ではない、符号</li>



<li>&#8212; ここからグループ化 &#8212;</li>



<li>\d+\.\d+：数字+小数点+数字<br>または</li>



<li>\d+\.：数字+小数点<br>または</li>



<li>\.\d+:小数点+数字<br>または</li>



<li>\d+：複数個の数字のみ</li>
</ul>



<p class="wp-block-paragraph">書き方は他にもあると思いますが、グループ化して、マッチさせたいパターンを一つ一つORで区切るこの方法は私には理解しやすかったです</p>



<h3 class="wp-block-heading"><span id="toc18">複雑な正規表現の可読性を高める</span></h3>



<p class="wp-block-paragraph">いちおう動作はしましたが、ここまでくると、読みにくいですね～<br>可読性を高める方法として、さらにAIが「re.VERBOSE」を提案してくれました<br>具体的に、上記のコードを書き替えてみます<br>パターンを一行づつに分割できて、行ごとにコメントも追記できるので、複雑になってもわかりやすくなります</p>



<pre class="wp-block-code"><code>pattern = re.compile(
    r"""
    &#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    (?:           # 小数点処理、非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000']</code></pre>



<h3 class="wp-block-heading"><span id="toc19">さらにちょっと特殊な、G や M　コードにも対応させてみます</span></h3>



<p class="wp-block-paragraph">通常、NCワードは「アドレス＋数字」ですが、拡張されたワーク座標系指令やサブプロ呼び出しなどちょっと特殊な構成のコードもあります<br>全てに対応は難しいと思いますが、「G54.1P1」や「M98P100」などにも対応してみようと思います。<br>これら対応するためには、上記のパターンでは処理できないのでパターンを追加します<br>やはり、可読性が上がる、re.VERBOSE を利用します</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
pattern = re.compile(
    r"""
    # --- 特殊構成、G54.1P12 / M98P1234　など---
    &#91;GM]          # G や M アドレス
    \d+(?:\.\d+)? # 54　や　54.1 
    \s*P\d+       # スペースとP文字と数字
    # --- 通常のアドレス+数字 ----
    |&#91;A-Z]        # A-Zアドレス
    &#91;+-]?         # 符号
    # --- 小数点対応 ----
    (?:           # 非キャプチャグループ
      \d+\.\d+      # 数字、小数点、数字
      |\d+\.        # または、数字、小数点
      |\.\d+        # または、小数点、数字
      |\d+          # または、数字のみ
    )
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
print(f"{words}")

#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p class="wp-block-paragraph">どうにかできました。<br>次の課題は「G04X10.」とかにも対応したいと思っていますが、これ以上条件が増えると大変です<br>正規表現パターンを変数化できれば、もう少しわかりやすいと思います</p>



<h3 class="wp-block-heading"><span id="toc20">正規表現のraw文字列の変数化</span></h3>



<p class="wp-block-paragraph">AIに聞いてみました。さすがAI、できますよ！との回答をもらいました<br>AIの回答を参考に上記コードを書き直してみました。</p>



<pre class="wp-block-code"><code>block = (
    "G05P10000 G90G01 X12.50Y+20.3Z-5.63 I.5 J22.F1000 G54 G54.1P12 M98P1100 M198 P2299"
)
num = r"&#91;+-]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)"  # +12.123|-24.|.56|30
g54_1 = r"&#91;GM]\d+(?:\.\d+)?\s*P\d+\.?"      # G54.1P1 M98P1122
nomal = r"&#91;A-Z]"  # 通常のアドレス
pattern = re.compile(
    rf"""     
    {g54_1}         # G54.1P1 , M98P1122
    #----------------------
    |{nomal}{num}   # G01 , X-12.356
    """,
    re.VERBOSE,
)
words = pattern.findall(block)
#---------- 結果 --------------
#&#91;'G05P10000', 'G90', 'G01', 'X12.50', 'Y+20.3', 'Z-5.63', 'I.5', 'J22.', 'F1000', 'G54', 'G54.1P12', 'M98P1100', 'M198 P2299']</code></pre>



<p class="wp-block-paragraph">なるほど、だいぶ見やすくなりました<br>今後の仕様変更にも対応しやすくなったと思います<br>興味ある方は是非、「G04X10.」への対応もやってみてください。</p>



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



<p class="wp-block-paragraph">これまでも単純な正規表現に触れる機会はありましたが、複雑な記述はまるで「呪文」のようで、敬遠していました。 <br>しかし、正規表現は文字列操作において非常に強力な武器になります。<br>独学ではやる気なしでしたが、AIと対話する事で、ある程度は理解できてきました。<br> 今後もAIと対話しながら一歩ずつ分析していくことで、正規表現だけでなく、プログラミング言語全体の理解力も深めていけると感じています。</p>



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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>リニアライゼーション・「Gコード」円弧補間を微小直線化（フリーソフト公開）</title>
		<link>https://www.kazuban.com/blog/linearization/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 04 Nov 2024 06:13:58 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[リニアライゼーション]]></category>
		<category><![CDATA[円弧補間]]></category>
		<category><![CDATA[微小直線化]]></category>
		<category><![CDATA[直線分割]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=9214</guid>

					<description><![CDATA[円弧補間を微小直線化するアプリの作成しました。まずは今回の記事の内容とはちょっと外れますが、リニアライゼーションと言う言葉を聞いたのは、５軸機を始めたころで、かなり昔でした。筆者が５軸加工機を触り始めた２００６年は先端点 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">円弧補間を微小直線化するアプリの作成しました。<br>まずは今回の記事の内容とはちょっと外れますが、リニアライゼーションと言う言葉を聞いたのは、５軸機を始めたころで、かなり昔でした。<br>筆者が５軸加工機を触り始めた２００６年は先端点制御機能が一般的になり始めた時期でした。<br>先端点制御は、直行軸と回転軸を同時に動かしても、工具の切削点が維持される機能です。<br>当時触っていた５軸機は、EUメーカーのハイデンハイン制御機でしたが、EU機を選択したのは、ファナックの制御機ではまだ未完成とのウワサもあり、一例では、先端点制御機能と<em>高精度輪郭制御</em>機能を同時に使用すると、機械がガクガクした動作になる言っている加工屋さんもいました。<br>そんな感じで、国内ではまだ完全に先端点制御が完成されていない時期だと判断したからです。<br>先端点制御機能がない5軸機も多くありましたから、回転動作での加工誤差をカバーするため、５軸CAMには、微小直線に分割する機能が備わっていて、CAM屋さんはリニアライゼーションと呼んでいました。<br>今回は、５軸ではなく、２軸が対象で、Gコードの円弧補間を微小直線化しようと言う試みです。</p>




  <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><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">直線補間と円弧補間</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">２軸加工での、X,Y軸の比率を変えたい</a></li><li><a href="#toc9" tabindex="0">円弧補間を直線分解する方法</a><ol><li><a href="#toc10" tabindex="0">トレランス以内で円弧を直線分割</a></li><li><a href="#toc11" tabindex="0">プログラム構成</a></li><li><a href="#toc12" tabindex="0">プログラム制限</a></li></ol></li><li><a href="#toc13" tabindex="0">ソフト公開</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">リニアライゼーション・微小直線化</span></h2>



<h3 class="wp-block-heading"><span id="toc2">同時５軸加工</span></h3>



<p class="wp-block-paragraph">もう少し、５軸の話をします。<br>イメージしやすいように、主軸側に回転軸がある構成で考えてます。<br>先端点制御機能を使用しないで、直行軸(X,Y,Z)と回転軸を同時に動かしての同時５軸加工の場合、<br>主軸はXYZ指令の位置（P1→P2→P3）へ直接向かいますが、回転軸も回転するため、工具先端では削り残りや削りすぎが発生してしまいます。<br>先端点制御機能は、この誤差が出ないように、主軸切込み軸を調整してくれますが、先端点制御機能がない場合には、この誤差はそのまま加工してしまいます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="515" src="https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization-800x515.png" alt="" class="wp-image-9224" srcset="https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization-800x515.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization-500x322.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization-300x193.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization-768x494.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/Linearization.png 1397w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">この誤差は、一行の指令での移動距離が長いほど大きくなります。<br>したがって、当時の５軸CAMは、回転が発生する移動指令を、微小直線に分解する処理を行っていてリニアライゼーションと呼ばれていました。<br>この一回の移動距離を微小にする事で、先端点制御を使用しない同時５軸制御でも、誤差を少なくして加工しようと言う事です。<br>ところが、微小指令になる事で、NCデータサイズは格段に大きくなり、読み込みの遅い制御機では太刀打ちできません。<br>読み込み機能も、ハイデンハインやレダースなどの、EU制御機は、１０００行や１００００行先読みと言われていましたから、読み込みスピードもヨーロッパに軍配が上がっていた時期だったと思います。<br>現在では、ほぼ解消されていると思います。<br></p>



<h3 class="wp-block-heading"><span id="toc3">２軸・３軸加工パスの直線化</span></h3>



<p class="wp-block-paragraph">回転軸を同時に動かさない場合、上述の誤差は起きません。<br>むしろ、微小直線化する事で、データ容量が増え、制御機の読み込み能力によっては機械動作は不安定になります。<br>ただ、制御機能力も急上昇していて新しい制御機では、３D加工でも浅切込み高速切削の加工方法が推奨されるようになると、CAMの内部計算の問題なのか、微小直線補間（G01）での出力が普通でした。<br>ところが古い制御機では、読み込み能力や容量の問題で、微小直線での動作は不向きでした。<br>そこで今度は微小直線補間を円弧に近似するCAMも出てきました。<br>当時紙テープやDNC運転の古いマシンを動作させる場合には、結構重宝した記憶があります。<br>現在では、円弧近似データのほうが、一般的になっていると思います。<br>そんなわけで、今考えている、円弧補間の直線化は、逆戻りな発想かもしれません。</p>



<h2 class="wp-block-heading"><span id="toc4">直線補間と円弧補間</span></h2>



<p class="wp-block-paragraph">Gコードで、２軸での輪郭動作定義をする場合、直線（G01）、円弧（G02,G03)のコードで定義していきます。<br>同時３軸の場合でも、ヘリカルオプションが有効な機械の場合、円弧補間で定義できます。<br>上でも書きましたが、円弧補間を使ったほうが、データサイズも小さく、NCデータを確認する場合でも動きを想像しやすいデータになります。<br>ところが、これを受け取った制御機はどうでしょう？<br>筆者はNCの制御方法には、まったくのド素人ですが、円弧補間の場合でも結局は各軸に分解され直線的な指令をしているのではないでしょうか？？<br>もし、私が制御機だったら、円弧補間での指令より、直線補間での指令が楽なように思います。<br>最近は制御機は、送受信や処理能力も高速になったので、全て直線補間でもいいのでは？との考えもあります。<br>ただ、問題もあります。<br>制御機によっては、工具径補間（G41,G42)させる場合、エラーになる可能性のあります。<br>ここが解決できれば、制御機的には、すべて直線のほうがいいのではないでしょうか？</p>



<h2 class="wp-block-heading"><span id="toc5">事前に直線化する制御機がもある？</span></h2>



<p class="wp-block-paragraph">筆者の想像ですが、あるメーカーの高速ミリングマシンは受け取ったGコードを円弧補間であっても、事前に微小直線化してCNCへ送っている予感がしています。<br>この制御機は、NCデータを読み込むとシミュレーション機能で動作の確認ができますが、シミュレーション時の、Gコードがすべて直線補間に変換されていました。<br>上で問題にした円弧補間の工具径補正の場合でも、補正が適応されたデータがシミュレーションされています。<br>つまり、制御機内部に円弧動作や補正を任せるのではなく、事前にソフト的に補正経路を直線化したデータを制御機へ送っているイメージです。<br>実際にこのシミュレーション用に変換されたコードで機械が動作するのかは、検証できていませんが、筆者の推測では、制御機は全て直線補間で動作していると思っています。<br></p>



<h2 class="wp-block-heading"><span id="toc6">２，３軸でのリニアライゼーションの効果は？</span></h2>



<p class="wp-block-paragraph">同時５軸でない場合、リニアライゼーションは効果はあるのでしょうか？<br>Ai「Google Gemini」 に聞いてみました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">NCコードのリニアライゼーションは、主に以下の目的で行われます。<br>・円弧補間を直線補間に置き換える:<br>・円弧補間の計算負荷を軽減し、加工時間を短縮できる。<br>・一部のNC装置では円弧補間がサポートされていない場合がある。<br>・シンプルな直線運動の方が制御が容易である。<br>・非線形な動きを直線的に近似する:<br>・複雑な形状を複数の直線で近似することで、プログラムを作成しやすくなる。<br>・加工精度が厳しくない場合、直線近似で十分な場合もある。</p>



<p class="wp-block-paragraph">注意点<br>・精度: リニアライゼーションによって加工精度が低下する場合がある。<br>・計算負荷: 分割数や多項式の次数が増えると、計算負荷が増大する。<br>・工具の寿命: リニアライゼーションによって工具の摩耗が促進される場合がある。</p>
</blockquote>



<p class="wp-block-paragraph">なんとなく、私の思っていた事とだいたい一致してます。<br>ただ、加工精度や工具寿命の件はちょっと疑問です。</p>



<h2 class="wp-block-heading"><span id="toc7">微小直線動作での加工精度検証</span></h2>



<p class="wp-block-paragraph">会社の３軸マシン用のCAMでは、等高線などの３D加工でも、円弧近似してくれますが、パラメータにより直線補間でも出力可能です。<br>このCAMを使用して、円弧補間モードと直線補間モードでNCデータを出力し加工テストしてみました。<br>結果的には、それほど差はありませんでしたが、すべりガイド機とLMガイド機で若干の差がでました。<br>すべりの方は、円弧補間のほうが加工時間も加工面も良好でしたが、逆にLMガイド機は直線補間のほうが勝っていました。<br>ただ、すべりガイド機のほうが、年式も古いので、製造年数の影響も出たかもしれません。<br>今回のテストでは、大きな差はみられませんでしたが、新しい機械で高速加工機であれば、効果がでるかもしれません。</p>



<h2 class="wp-block-heading"><span id="toc8">２軸加工での、X,Y軸の比率を変えたい</span></h2>



<p class="wp-block-paragraph">前置きが長くなってしまいましたが、ここからが本題です。<br>今回作成ソフトの本来の目的は、X、Yの加工輪郭の比率をCADを使用せず、生のNCデータで調整できないか？と言う事です。<br>筆者の知る限りでは、円弧補間が含まれるGコード全軸同じスケールリングしか対応していないと思っていましたが、「GEMINI」に聞いた所、ファナックのGコードG51では可能だとの回答をもらいましたが、検証はできていません。<br>ただ下記は、「HEIDENHAIN iTNC530」の取説の抜粋ですが、円弧以外では各軸違う値でスケーリングはできるが、円弧補間では同じ比率が条件になるとありますから、制御機によってはできない場合もあると思います。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="749" height="258" src="https://www.kazuban.com/blog/wp-content/uploads/2024/10/itc530_scaling.png" alt="" class="wp-image-9259" srcset="https://www.kazuban.com/blog/wp-content/uploads/2024/10/itc530_scaling.png 749w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/itc530_scaling-500x172.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/itc530_scaling-300x103.png 300w" sizes="(max-width: 749px) 100vw, 749px" /></figure>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">プログラミングの前に、次の点に注意してください。<br><strong>円弧の座標を共有する座標軸は、同じ係数で拡大または縮小する必要があります。</strong><br>各座標軸を、独自の軸固有のスケーリング係数でプログラミングできます。<br>さらに、すべてのスケーリング係数の中心の座標を入力できます。<br>輪郭のサイズは、中心を基準にして拡大または縮小され、必ずしも (サイクル 11 のスケーリング係数のように) アクティブなデータムを基準にして拡大または縮小されるわけではありません。<br>（Google 翻訳）</p>
</blockquote>



<p class="wp-block-paragraph">したがって、円弧補間を使用せず、全て直線補間であれば、各軸で違うスケーリングができそうです。<br>今回作成した、ソフトは、ここが目的になります。<br><strong>直線補間のみのデータにすれば、Gコード指令を使って各軸違う比率にスケーリングできそうだと言う事です。</strong><br>さらに、部分的とか特殊な変形させるソフトを開発する場合でも、直線（G01）コードは、次の行先の座標があるだけなので、円弧（G02,G03）に比べると、はるかに単純で楽です。<br>機械も年季が入ってくると、XYの加工精度比率に誤差が出てくる場合があります。<br>現状、XYの比率がよくない機械で精度を保つには、加工結果を基にCAD上で輪郭を描き直し、パスを出し直す事になりますね。<br>ところが直線補間のみのNCデータであれば制御機のスケーリングで対応できる可能性がありますし、専用にソフト開発する場合でも簡単になります<br>直線補間のみであれば、終点の座標値を誤差分だけ足し算引き算でいけそうです。<br>そんな訳で、あまり利用価値はないかもしれませんが、円弧補間が含まれるNCデータを、直線補間化するソフトを作成してみました。</p>



<h2 class="wp-block-heading"><span id="toc9">円弧補間を直線分解する方法</span></h2>



<h3 class="wp-block-heading"><span id="toc10">トレランス以内で円弧を直線分割</span></h3>



<p class="wp-block-paragraph">直線化により円弧軌跡が変換でトレランス以上の誤差になると意味がありません。<br>指定トレランス以内に収まるように、直線分割する角度を求める計算式を求めます。</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full is-style-default"><img loading="lazy" decoding="async" width="691" height="651" data-id="9239" src="https://www.kazuban.com/blog/wp-content/uploads/2024/10/split-angle-e1728720513381.png" alt="" class="wp-image-9239" srcset="https://www.kazuban.com/blog/wp-content/uploads/2024/10/split-angle-e1728720513381.png 691w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/split-angle-e1728720513381-500x471.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2024/10/split-angle-e1728720513381-300x283.png 300w" sizes="(max-width: 691px) 100vw, 691px" /></figure>
</figure>



<p class="wp-block-paragraph">トレランス以内で、分割する角度は、「（円弧半径ートレランス）/円弧半径」のアークコサインで求められ、この角度の二倍で一分割の角度が求まります。<br>Gコードを読み取り、円弧補間の場合、円弧中心から円弧の始まり座標び向かう直線の角度から、分割角度ごとに円弧終点まで分割するような処理をさせます。</p>



<p class="wp-block-paragraph">ソフト的には、対象円弧を、円弧の中心点から円弧始点への直線と、中心点から終点までの直線の範囲を、分割角度で分割した弦を直線に変換させています。</p>



<h3 class="wp-block-heading"><span id="toc11">プログラム構成</span></h3>



<ul class="wp-block-list">
<li>NCデータファイルを読み込む</li>



<li>円弧補間以外はそのまま出力</li>



<li>円弧補間の場合、上記計算式に伴いトレランス内で直線分割する</li>



<li>変換したデータをファイルとして保存する</li>



<li>確認用としてオリジナルデータと直線化データをそれぞれDXFファイルにも出力可能</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">プログラム制限</span></h3>



<ul class="wp-block-list">
<li>筆者のプログラミングスキルの問題で長いデータの場合に計算時間がかかりそうです<br>一応、途中強制終了できるような仕様にしていますが、必要なデータのみサブプログラム的に、必要な輪郭だけのファイルにしておくほうが無難です。</li>



<li>今回は、「I」「J」仕様の円弧補間のみの対応です。<br>「R」方式には、対応していません。<br>また、「I」「J」方式の場合、国内ではほとんど、「I」「J」値は、相対指令ですが、EUでは、アブソリュート指令も多いです。<br>今回は、国内で一般的な相対指令仕様でのみ対応しています。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc13">ソフト公開</span></h2>



<p class="wp-block-paragraph">「LinearizationOfArc.zip」のファイル名で公開しました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">こちらの、<a href="https://www.kazuban.com/blog/free_soft/#Soft19">「自作ソフト公開」のページ</a>から、ダウンロードできます</p>
</blockquote>



<p class="wp-block-paragraph">展開後「README.TXT」に使用方法など書いてあります。<br>今後の展開としては、直線のみになった輪郭データを利用して、輪郭の一部分のみ変形できたらいいな～と思っています。<br>輪郭精度が重要な場合、主に輪郭の凸凹のフィレットが、削り過ぎたり、削り残ったり、する場合があります。<br>そのような場合、その部分のみ、NCデータを変形させる事で、輪郭加工精度を向上できないか？<br>とういう事です。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Adventurer3の精度調整</title>
		<link>https://www.kazuban.com/blog/adventurer3-accuracy-check/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 26 Jun 2023 03:44:18 +0000</pubDate>
				<category><![CDATA[3Dプリンタ]]></category>
		<category><![CDATA[Adventurer3]]></category>
		<category><![CDATA[FlashForge]]></category>
		<category><![CDATA[FlashPrint]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[精度確認]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=8110</guid>

					<description><![CDATA[Adventurer3Proを購入して約１年たちました。 その時も、精度確認しましたが、購入から約１年たちましたし、最近「eSUN」のフィラメントを使い始めた事もあり、再度精度確認してみます。また、「FlashPrint [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Adventurer3Proを購入して約１年たちました。</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/adventurer3-pro/#toc6" title="3Dプリンタ、Adventurer3 Pro　キタぁ～" 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="165" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-scaled.jpg" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-scaled.jpg 2344w, https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-275x300.jpg 275w, https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-937x1024.jpg 937w, https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-768x839.jpg 768w, https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-1406x1536.jpg 1406w, https://www.kazuban.com/blog/wp-content/uploads/2022/08/Adventurer3Pro-1875x2048.jpg 1875w" sizes="(max-width: 165px) 100vw, 165px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">3Dプリンタ、Adventurer3 Pro　キタぁ～</div><div class="blogcard-snippet internal-blogcard-snippet">約５年前に購入した３Dプリンタ「FlashForge Finder」が壊れました。最近動かす機会も減って数か月ぶりのプリント。一個目は正常に終了しましたが、二個目の途中でフィラメント詰まり。詰まりを解消しノズル掃除して、再度スタートでもまた詰まり。予備のノズルに交換したけど、また詰まり・・・今度はま...</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">2022.08.23</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">その時も、精度確認しましたが、購入から約１年たちましたし、<br>最近「eSUN」のフィラメントを使い始めた事もあり、再度精度確認してみます。<br>また、「FlashPrint5」の調整方法もよく理解していなかったので、こちらも検証してみます。</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">確認モデル1</a><ol><li><a href="#toc2" tabindex="0">スライサー、デフォルトでテスト印刷</a></li><li><a href="#toc3" tabindex="0">プリント補正</a><ol><li><a href="#toc4" tabindex="0">補正なし</a></li><li><a href="#toc5" tabindex="0">Y Compensation = 1%</a></li><li><a href="#toc6" tabindex="0">内側のみ補正：「内部補償＝0.1mm」</a></li><li><a href="#toc7" tabindex="0">プリント結果に合わせた補正</a></li></ol></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></ol></li><li><a href="#toc11" tabindex="0">CAD/CAMにもほしい機能</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">確認モデル1</span></h2>



<p class="wp-block-paragraph">まずは、確認用として非常に単純なモデルを用意しました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="512" height="490" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model01.png" alt="" class="wp-image-8114" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model01.png 512w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model01-500x479.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model01-300x287.png 300w" sizes="(max-width: 512px) 100vw, 512px" /></figure>



<p class="wp-block-paragraph">□２０mmのブロックに、□10mmの□孔が開いている形状で、厚さは5mmの簡単なモデルです。</p>



<h3 class="wp-block-heading"><span id="toc2">スライサー、デフォルトでテスト印刷</span></h3>



<p class="wp-block-paragraph">スライサーは「FlashPrint 5」を使用して、「樹脂の種類」を「Flashforge-PLA」のデフォルト設定で<br>ラフトのみ「無効」にしてプリントしてみましたが、ちょっと反りがでたので、<br>最初の一層目のみ、最大スピードを30mm/sに変更し再度プリント。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">外径X方向：20.0mm<br>外径Y方向：20.2mm<br>内径X方向：9.8mm<br>内径Y方向：10.0mm<br>厚さ：　5.0mm</p>
</blockquote>



<p class="wp-block-paragraph">ホームセンターで購入のアナログノギスでの測定なのと、積層ピッチが「0.18」で、<br>側面は積層痕でガタガタしてるので、その程度の測定精度ですが、これを基に調整してみます</p>



<h3 class="wp-block-heading"><span id="toc3">プリント補正</span></h3>



<p class="wp-block-paragraph">「FlashPrint 5」の「エキスパートモード」では、「その他」の項目でプリント精度をある程度調整する事ができます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="560" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation-800x560.png" alt="" class="wp-image-8118" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation-800x560.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation-500x350.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation-300x210.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation-768x537.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation.png 882w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">「Material Shrinkage Compensation」では、仕上がり寸法の「縦横」の誤差を比率で調整する機能のようです。<br>「容量を調整する」を「はい」にすると、凸形状、凹形状の調整ができます。<br>設定値は、片側入力なのか両側入力なのか？<br>また、はたしてきちんと補正してくれるのか？<br>スライス後、G-Codeで確認してみます。<br>上の確認モデル１：外径□２０mm、内径□10mmをスライスして確認してみます。</p>



<h4 class="wp-block-heading"><span id="toc4">補正なし</span></h4>



<p class="wp-block-paragraph">まずは、パス幅0.4mm、補正なしで、スライしてみます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="346" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal-800x346.png" alt="" class="wp-image-8120" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal-800x346.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal-500x216.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal-300x130.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal-768x332.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/nomal.png 1125w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">内径は□10mmなので、パス幅0.4mmを半分を考慮して、X,Yとも「5.2mm」になってます。<br>外径は□20ｍｍ、なので、パス幅半分を考慮して、やはり同様にX,Y共に「9.8」になってます。<br>パス幅の中心をノズルが通り、パス幅の半分が仕上がり側面になるようなパス計算のようです。</p>



<h4 class="wp-block-heading"><span id="toc5">Y Compensation = 1%</span></h4>



<p class="wp-block-paragraph">次に、Yのみ「1%」補正してみます。<br>「1%」なので、内径□10mmは、Yのみ10.1mm、外径□20mmは、Yのみ、20.2mmになるはずです</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="342" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation-800x342.png" alt="" class="wp-image-8122" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation-800x342.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation-500x214.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation-300x128.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation-768x328.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Y-Compensation.png 1140w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">ちゃんと、補正されているのがわかります。</p>



<h4 class="wp-block-heading"><span id="toc6">内側のみ補正：「内部補償＝0.1mm」</span></h4>



<p class="wp-block-paragraph">内部補償と言う言葉がちょっとへんですが、凹側面の補正の事だと思います。<br>設定値0.1mmが半径補正値なのか？両側補正値なのか？も確認してみます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="323" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation-800x323.png" alt="" class="wp-image-8124" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation-800x323.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation-500x202.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation-300x121.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation-768x310.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/inside-compensation.png 1149w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">内側のみ、±5.25になっていますから、両側で0.1mm補正されているのがわかります。<br>外側は、補正されていなくて、正常ですね。</p>



<h4 class="wp-block-heading"><span id="toc7">プリント結果に合わせた補正</span></h4>



<p class="wp-block-paragraph">これで、「Material Shrinkage Compensation」と「容量を調整」の補正値の入れ方がわかりました<br>テスト印刷結果から、内側がネライより径で0.2mm小さく、X,Yの比率では、Y方向を1%小さくしてみます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="558" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2-800x558.png" alt="" class="wp-image-8128" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2-800x558.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2-500x349.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2-300x209.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2-768x536.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Compensation2.png 893w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">補正後のプリント結果は、補正が効いているを確認できました。</p>



<h2 class="wp-block-heading"><span id="toc8">確認モデル２</span></h2>



<p class="wp-block-paragraph">補正値を設定し、もう少し複雑なモデルを印刷してみます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="800" height="558" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02-800x558.png" alt="" class="wp-image-8129" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02-800x558.png 800w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02-500x349.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02-300x209.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02-768x536.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/Model02.png 884w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">測定した結果は、まあまあでした。<br>測定機器がノギスと言う事もありますし、面精度がガタガタなので、正確な測定はできません<br>まぁ、幅で0.1ｍｍには、入っていると思います。<br>ただ、形状の製作精度の検証は、幅だけでは不十分で、位置関係の測定も必要ですが、自宅ではできません。<br>そこで、反対側を作成し、ある程度のクリアランス（隙間）を設けて、組み付けてみようと思います。</p>



<h3 class="wp-block-heading"><span id="toc9">相手側をモデリング</span></h3>



<p class="wp-block-paragraph">相手側は、ブロック素材から、ブーリアン演算で引き算させる事で簡単にできます<br>さらに、クリアランス（隙間）を付けるため、Fusion360では「プレスプル」と呼ばれている機能で幅を修正します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="792" height="499" src="https://www.kazuban.com/blog/wp-content/uploads/2023/06/clearance.png" alt="" class="wp-image-8131" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/06/clearance.png 792w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/clearance-500x315.png 500w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/clearance-300x189.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/06/clearance-768x484.png 768w" sizes="(max-width: 792px) 100vw, 792px" /></figure>



<p class="wp-block-paragraph">片側0.1mmのクリアランスに設定しました。<br>この２つのパーツが組み合わされれば、クリアランス片側0.1mmと言っても、<br>数か所の凸凹形状や各部分の位置関係がすべてその範囲以内で出来ていると言うことなので<br>それ以上の精度だと言えます。</p>



<h3 class="wp-block-heading"><span id="toc10">二部品結合</span></h3>



<p class="wp-block-paragraph">さて、二つの部品を結合してみましょう！</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/2023/06/adjust.mp4"></video></figure>



<p class="wp-block-paragraph">最初ちょっと硬かったですが、いい感じに結合できました。<br>はずすのも結構大変です、スクレーパーで少しずつ広げていって、どうにか外れました。<br>この積層痕の悪い面精度でも、入ったので、面精度が良ければ、もう少し簡単に挿入できると思います。<br>片側0.1mmよりも、確実にいい精度でプリント出来ていると思います。<br>今回の積層条件では、硬い締結の場合には、「片側0.10」のクリアランス。<br>もう少しゆるく取り外ししたい場合には、「片側0.15」ぐらいが、いいように思います。</p>



<h2 class="wp-block-heading"><span id="toc11">CAD/CAMにもほしい機能</span></h2>



<p class="wp-block-paragraph">工作機械でも、メカ的にミクロン精度に保つ事は非常に大変でコストもかかります。<br>最終的には制御機内でソフト的に補正を行っている工作機械がほとんどだと思います。<br>ただ今回おこなった補正は、「FlashPrint 5」スライサーの機能を使いました。<br>工作機械的には、CAMの部分での補正です。<br>輪郭全周の一定補正であれば、工具径補正で調整可能ですが、X軸、Y軸の比率が公差を超える可能性がある場合、<br>現状ではCADで加工モデル形状を編集・調整するしかありません。<br>特に２D輪郭の場合は結構やっかいです。<br>CAMにもこのような、X軸、Y軸の比率を自動調整してくれる機能があれば、便利ですね。<br></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2023/06/adjust.mp4" length="0" type="video/mp4" />

			</item>
		<item>
		<title>FlashPrint 5「.GX」 ファイル編集ソフトを更新しました。</title>
		<link>https://www.kazuban.com/blog/editorforflashprint5-v1-7/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 11 Jun 2023 09:12:13 +0000</pubDate>
				<category><![CDATA[3Dプリンタ]]></category>
		<category><![CDATA[Adventurer3]]></category>
		<category><![CDATA[FlashForge]]></category>
		<category><![CDATA[FlashPrint]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=8083</guid>

					<description><![CDATA[FlashPrint 「.GX」 ファイル編集ソフトを公開しましたが、 データによってはエディタ領域にうまく読み込めない現象が起きていました。 目次 ヘッダー部分、切り分け方法ミスヘッダのデータ容量が大きい場合の処置G- [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">FlashPrint 「.GX」 ファイル編集ソフトを公開しましたが、</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/editorforflashprint5/" title="FLASHFORGE ３Dプリンタスライサー FlashPrint の 「.GX」 ファイル編集ソフト" 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="259" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5.png 597w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5-300x209.png 300w" sizes="(max-width: 259px) 100vw, 259px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">FLASHFORGE ３Dプリンタスライサー FlashPrint の 「.GX」 ファイル編集ソフト</div><div class="blogcard-snippet internal-blogcard-snippet">FlashForge製３Dプリンタ専用スライサー「FlashPrint」は「.GX」拡張子のG-Code を生成します。G-Codeファイルはメモ帳やエディタなどで読めるように、アスキー（テキスト）形式が一般的ですがFlashPrintの「.GX」は、ファイル上部に、バイナリ文字が含まれていて正常な...</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">2022.12.04</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">データによってはエディタ領域にうまく読み込めない現象が起きていました。</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></li><li><a href="#toc3" tabindex="0">G-Codeデータ容量が大きい場合の読み込み進捗表示</a></li><li><a href="#toc4" tabindex="0">G-Codeデータ容量が大きい場合の検索や編集</a></li><li><a href="#toc5" tabindex="0">EditorForFlashPrint5 Ver1.7 公開</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>今回の更新では、ヘッダー終了後のG-Codeデータは先頭が、下記コードを想定しています</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">;machine_type:</p>
</blockquote>



<p class="wp-block-paragraph">したがって、このコードが先頭にない場合は、「Header Error」になります。<br>「EditorForFlashPrint5.exe」では、データ作成する時に、必ずこの先頭コードは確認しています。<br>現状では、手持ちの「.GX」データで、検証して問題は起きていませんが、<br>環境によっては今後も同じような現象がおきるかもしれません。</p>



<h2 class="wp-block-heading"><span id="toc2">ヘッダのデータ容量が大きい場合の処置</span></h2>



<p class="wp-block-paragraph">ヘッダ部分には、画像データが挿入されていそうなので、画像によってはかなり大きくなる場合があるようです。<br>ヘッダ部分は、プログラム的に、静的文字配列を使っているため、予想よりも大きな文字数になった場合、うまく動作しなくなってしまいます。<br>現状では、想定文字数よりも、大きくなった場合には、メッセージを出し、強制終了させています。</p>



<h2 class="wp-block-heading"><span id="toc3">G-Codeデータ容量が大きい場合の読み込み進捗表示</span></h2>



<p class="wp-block-paragraph">Adventurer3での使用で開発したので、それほどデータ容量は気にしていませんでしたが<br>私の環境では、１０MBぐらいのデータになると、かなり読み込みが遅くなります。<br>読み込み時には、G-CodeデータのZ指令（高さ）なども一行ずつ確認していますが<br>筆者のレベルでは、そういった処理方法のプログラムがあまり高速にできていません<br>遅い場合のストレスとなるべく解消するため、読み込み状態を表示するようにしました。</p>



<h2 class="wp-block-heading"><span id="toc4">G-Codeデータ容量が大きい場合の検索や編集</span></h2>



<p class="wp-block-paragraph">読み込みが終わると、任意文字や高さの検索やG-Code編集を行うと思いますが<br>この処理もデータが大きい場合、異様に遅くなる場合があります。<br>こちらも、C++Builderの「memoコンポーネント」を使っていますが、その処理方法がへたくそなのかもしれません。<br></p>



<h2 class="wp-block-heading"><span id="toc5">EditorForFlashPrint5 Ver1.7 公開</span></h2>



<p class="wp-block-paragraph">いくつかのデータで検証した結果では、５Mb程度のデータであれば、それほど気にならないと思います。<br>それ以上になってくると、レスポンスがきになるかもしれません。<br>ただし、筆者が検証した限りでは、遅いだけで、データ的には正常です。</p>



<p class="wp-block-paragraph">フリーソフトページから、ダウンロードできます。<br>ver1.7 になります。</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-black-color has-orange-background-color has-text-color has-background wp-element-button" href="https://www.kazuban.com/blog/free_soft/#Soft17" style="border-radius:33px">ダウンロード</a></div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>カスタムマクロの読みやすい書き方を考えてみる</title>
		<link>https://www.kazuban.com/blog/custom-macro-2/</link>
					<comments>https://www.kazuban.com/blog/custom-macro-2/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Tue, 21 Feb 2023 21:38:00 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=7445</guid>

					<description><![CDATA[サイトへのコメントで記事ネタをいただきました。確かに、ネットなどで調べても、変数や分岐などの構文の書き方を説明している記事はよく見かけますが、読みやすさや保守を題材にした記事はあまり見つかりません。筆者自身ほとんど独学な [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/custom-macro/#comment-782">サイトへのコメントで記事ネタをいただきました。</a><br>確かに、ネットなどで調べても、変数や分岐などの構文の書き方を説明している記事は<br>よく見かけますが、読みやすさや保守を題材にした記事はあまり見つかりません。<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-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">とりあえず、ローカル変数（#1～#33）を使おう</a></li><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><ol><li><a href="#toc6" tabindex="0">ユーザー定義変数</a></li><li><a href="#toc7" tabindex="0">マクロ仕様の説明</a></li><li><a href="#toc8" tabindex="0">ファイル名仕様</a></li></ol></li><li><a href="#toc9" tabindex="0">マクロ呼び出し（G65、G66）の引き数</a><ol><li><a href="#toc10" tabindex="0">引数対応変数のコメントの活用</a></li></ol></li><li><a href="#toc11" tabindex="0">モーダル情報変更の注意点</a><ol><li><a href="#toc12" tabindex="0">マクロ内でのG90,G91指令は注意</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><ol><li><a href="#toc16" tabindex="0">メインプログラム</a></li><li><a href="#toc17" tabindex="0">マクロ・サブプログラム</a></li><li><a href="#toc18" tabindex="0">加工位置データ</a></li></ol></li><li><a href="#toc19" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">変数</span></h2>



<p class="wp-block-paragraph">C言語など、プログラミング言語でコードを書く場合、悩ましいのが「変数の名前」です。<br>変数名は、後日読み直す時など、あまり単純な名前だけにすると、この変数は何だったっケ？<br>と、変数の分析からから始める必要があり、分かりづらいコードになってしまいます。<br>プログラミングの変数名は、使える文字（言語によっては漢字も）や文字数の制限も少なく<br>自由度があるので悩んでしまいます。<br>しかしカスタムマクロは「#」+「数字」なので、悩みは少ないかもしれませんが<br>逆に変数名が単純なこの言語仕様から、結局分かりづらいコードになってしまいます。<br>さらに数字の範囲で、ローカル変数、コモン変数、システム変数と性質が変わるので<br>ゴチャゴチャです。<br></p>



<h3 class="wp-block-heading"><span id="toc2">とりあえず、ローカル変数（#1～#33）を使おう</span></h3>



<p class="wp-block-paragraph">ローカル変数は、プログラムが異なる場合、同じ変数でも、それぞれ別の意味として作用しますが<br>コモン変数「#100～」は同じ変数として扱われます、<br>したがって、マクロプログラムのなかで、別マクロを呼び出した場合、そのマクロによって<br>書き換えられてしまう危険性があります。<br>特に必要性がない場合には、ローカル変数を使用した方が無難です。</p>



<h3 class="wp-block-heading"><span id="toc3">変数宣言</span></h3>



<p class="wp-block-paragraph">C言語などは、これから「使う変数名」を必ず変数宣言をする必要がありますが<br>必須でない言語も多くあります。<br>カスタムマクロも</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">#1=50.0<br>G00 X#1</p>
</blockquote>



<p class="wp-block-paragraph">このように、いきなり変数を使用する事ができます。<br>ただし、長く複雑になるにつれて、変数の役目が分からなくなってきます。<br>プログラム上部で、使用する変数を初期化しておいたりコメントとして、<br>明示しておく事でこのマクロではどんな目的で、どの変数を使っているのか、<br>分かりやすくなります</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;)<br>#10=#0 (Tool Length)<br>#11=#0 (T)<br>#12=#0 (V)<br>#13=#0 (f)<br>#14=#0 (SP)<br>#15=#0 (F)<br>(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;)</p>
</blockquote>



<p class="wp-block-paragraph">こんな感じです。ここでは、使用する変数を「#0」で初期化しています。<br>「#0」は「0（ゼロ）」ではありません。「空」です。<br>コントローラ側でマクロ参照すると、何も入っていない状態になります。<br>特に必須ではないですが、使う予定の番号が分かり、逆に使っていない番号もわかります。<br>さらに「空」にしておいたほうが、思わぬミスの防止になるかもしれません。</p>



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



<p class="wp-block-paragraph">（　）で囲む事で、制御機が無視する文字を入力できます。<br>一般的には、その変数や箇所の用途が分かりやすいように「コメント」を付加します。<br>制御機は無視するので、コメントの有無は機械動作に影響ありませんが<br>他人のマクロや自作のものでも、後日読み直す場合に、理解しやすくなります。<br>重要な変数には、必ずコメントを付加しましょう！<br>ただ、制御機によっては、「漢字」を受け付けません。<br>英語にするか？、ローマ字にするか？読む人が分かりやすいコメントを考えてください。<br>ちなみに、ソディックは漢字が使えるので、かなり分かりやすいです。</p>



<h2 class="wp-block-heading"><span id="toc5">ユーザー設定パラメータ</span></h2>



<p class="wp-block-paragraph">カスタムマクロは、ユーザーがパラメータを変更する事で、類似形状定義や面倒な計算を<br>自動的に定義させCAMを使用しなくても汎用的な加工データを作成する事ができます。</p>



<h3 class="wp-block-heading"><span id="toc6">ユーザー定義変数</span></h3>



<p class="wp-block-paragraph">利用するユーザーが定義するパラメータは、変数を利用しますから、<br>この変数は分かりやすいように、プログラム上部にコメント付きで書くようにします。<br>利用ユーザーは、この変数を変更するだけで、希望の加工データが作成できるようにしておきます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">G90G00G17G40G80G49<br>(++++++++++++++++++++)<br>#1=54. (WORK ORIGIN)<br>#2=5.7 (Hole Dia)<br>#3=-16.0 (Drill Shoulder Heigth)<br>#4=0.0 (Surface Coordinat)<br>#5=50.0 (Initial Point)<br>#6=5.0 (R Point)<br>#7=3.0 (Q )<br>#8=8. (Coolant )<br>(+++++++++++++++++++)</p>
<cite>・　<br>・</cite></blockquote>



<p class="wp-block-paragraph">このように、上部にまとめておき、利用者の編集部分は、コメント文で区切りをいれ<br>分かりやすくしておきます。</p>



<h3 class="wp-block-heading"><span id="toc7">マクロ仕様の説明</span></h3>



<p class="wp-block-paragraph">プログラム最上部には、そのマクロの説明や、バージョン、作成日、作成者など<br>記入しておくと、管理しやすくなります。</p>



<blockquote class="wp-block-quote is-style-default is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O1234<br>(+++++++++++++++++++++++++++++++)<br>( Drill Program Ver1.0 )<br>( 2023-02-18 By Kazuban)<br>(++++++++++++++++++++++++++++++)</p>
</blockquote>



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



<h3 class="wp-block-heading"><span id="toc8">ファイル名仕様</span></h3>



<p class="wp-block-paragraph">コントローラによっては、「O番号」でなく、ファイル名が使用できる機械もあります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O1234<br>・<br>・</p>



<p class="has-large-font-size wp-block-paragraph"><strong>↓</strong></p>



<p class="wp-block-paragraph">%<br>&lt;DRILL.NC&gt;<br>・<br>・</p>
</blockquote>



<p class="wp-block-paragraph">このように、O番号でなく、「 &lt;　&gt; 」　でファイル名を囲みます。<br>呼び出しは、P「番号」でなく同様に「 &lt;　&gt;」で呼び出します。<br>あまり一般的ではないので、もしかすると、調べてみるとあなたの機種も可能かもしれません。<br>ちなみに、ソディックは「 (　) 」になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">M98&lt;DRILL.NC&gt;</p>



<p class="wp-block-paragraph">G65&lt;DRILL.NC&gt;A5.7B2</p>
</blockquote>



<p class="wp-block-paragraph">例えば、「センター」「下穴」「面取り」「タップ」と複数のマクロを呼び出すプログラムの場合<br>O番号で呼び出すよりも、分かりやすく、管理も楽になります。</p>



<h2 class="wp-block-heading"><span id="toc9">マクロ呼び出し（G65、G66）の引き数</span></h2>



<p class="wp-block-paragraph">マクロ呼び出しでマクロプログラムを呼び出す場合、引数を指定して変数を渡す事ができます。<br>したがって、上の例のように、プログラムを開いて変数を編集するのではなく<br>呼び出しの引き数で変数を設定する事ができます。<br>これは、便利なようですが、<a href="https://www.kazuban.com/blog/chamfering-with-g66/#outline__2_1">引数のワードに対応している変数番号がバラバラ</a>で<br>非常に分かりづらく間違いやすいです。</p>



<h3 class="wp-block-heading"><span id="toc10">引数対応変数のコメントの活用</span></h3>



<p class="wp-block-paragraph">G65などマクロ呼び出しの前に、引数対応変数をコメントにしておくと、<br>プログラムする場合も、編集する場合も、わかりやすくミスも防げます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">G90G00G17G40G80G49<br>(++++++++++++++++++++)<br>#1=54. (WORK ORIGIN)<br>#2=5.7 (Drill Dia)<br>#3=-16.0 (Drill Shoulder Heigth)<br>#4=0.0 (Surface Coordinat)<br>#5=50.0 (Initial Point)<br>#6=5.0 (R Point)<br>#7=3.0 (Q )<br>#8=8. (Coolant )<br>(+++++++++++++++++++)<br>・<br>・<br>(++++ Drill +++++++++)<br>(A:#1=#2_Drill Dia)<br>(B:#2=#3_Drill Shoulder Depth)<br>(C:#3=#4_Surface Coordinat)<br>(I:#4=#5_Initial Point)<br>(Q:#17=#7_Q)<br>(R:#18=#6_R Point)<br><font color="RED"><strong>(&#8212;- argument table &#8212;&#8212;)</strong></font><br>(<strong>A:#1 B:#2 C:#3 I:#4</strong> J:#5 K:#6 D:#7 E:#8 F:#9 H:#11 M:#13)<br>(<strong>Q:#17</strong> <strong>R:#18</strong> S:#19 T:#20 U:#21 V:#22 W:#23 X:#24 Y:#25 Z:#26)<br>(&#8212;&#8212; Drill Macro Read &#8212;&#8212;)<br>G65 P1234 <strong>A</strong>[#2] <strong>B</strong>[#3] <strong>C</strong>[#4] <strong>I</strong>[#5] <strong>Q</strong>[#7] <strong>R</strong>[#6]</p>
</blockquote>



<p class="wp-block-paragraph">マクロで使用するメインのユーザー定義の変数は、「#2」～「#7」なのに対して、<br>呼び出されるドリルマクロ「O1234」は、「#1、#2、#3、#4、#17、#18」<br>の変数を使い、プログラムします。<br>間違えろと言わんばかりですが、コメント付加で少しはミスも防げます。<br>Q、Rアドレスは、一例として固定サイクルに似せただけで、特に必須ではありません。</p>



<h2 class="wp-block-heading"><span id="toc11">モーダル情報変更の注意点</span></h2>



<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/nc-program-g91/">「G91は意外と便利」</a>という記事で少しふれましたが、<br>複数個所に輪郭加工させるマクロを作成する場合、「G91」と「G66」を使うと結構便利です。<br><a href="https://www.kazuban.com/blog/nc-program-g91/#outline__1_3">こちらで紹介しているサブプログラム</a>をマクロ化すれば、真円切削するサイクルが作れます。<br>ところが、このようなモーダル情報をメインから呼び出されるマクロ内で<br>変更する場合には注意が必要です。</p>



<h3 class="wp-block-heading"><span id="toc12">マクロ内でのG90,G91指令は注意</span></h3>



<p class="wp-block-paragraph">メインプロの座標系指令（G90、G91）をマクロ内で変更した場合には注意が必要です。<br>マクロから戻った時点で、座標指令が変わってしまっていると、<br>メインプロだけ見ると、マクロ読み込み前の指令が目立つので、マクロ後の状態も<br>その状態（モーダル）だと思い込みやすいので大変危険です。<br>マクロでは、必ず元に戻すようなコードを書きましょう。<br>これは、座標系指令だけでなく、加工条件や主軸工具などのモーダル情報も同様です。<br>例えば、タッチプローブで測定させるマクロを利用する場合で、<br>そのマクロが内部でプローブと交換する仕様で測定後元の工具に戻さなかった場合、<br>マクロの呼び出し前と後で主軸工具が違う事になります。<br>モーダル情報は、マクロ終了時には、元に戻しておくほうが思わぬミスを回避できます。<br>X、Yなども、モーダルなので、前の行から動作のない軸は省略する場合もよくあります<br>これが、マクロを挟んだ場合、思わぬ位置誤動作になる事もあります。<br>X、Y、Z、など軸指令は、省略しないほうが安全ですし<br>マクロプログラムでは終了時に、主軸を安全位置へ退避させておくとより安全です。</p>



<h3 class="wp-block-heading"><span id="toc13">モーダル情報を得るシステム変数</span></h3>



<p class="wp-block-paragraph">モーダル情報は、システム変数の「#4001～」「#4100～」で取り出す事ができます。<br>制御機によっても違うと思うので、使用機械の取説の確認は必要ですが、<br>マクロ作成で利用できそうなシステム変数は下記になります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">★モーダル情報<br>　#4001～#4030<br>　　下二桁はＧコードグループ番号<br>　　グループ01 : G00,G01,G02,G03,G04<br>　　グループ03 : G90,G91<br>　　グループ14 : G54,G55,G56,G57,G58,G59</p>



<p class="wp-block-paragraph">　#4107 : Ｄコード<br>　#4109 : Ｆコード<br>　#4111 : Ｈコード<br>　#4113 : Ｍコード<br>　#4114 : シーケンス番号<br>　#4119 : Ｓコード<br>　#4120 : Ｔコード</p>
<cite>★現在位置情報<br>　#5021～#5024 （X、Y、Z、４軸：機械座標系）<br>　#5041～#5044 （X、Y、Z、４軸：ワーク座標系）</cite></blockquote>



<p class="wp-block-paragraph">G90、G91 の情報は、「#4003」<br>現在のワーク座標系での、Ｚ軸座標は「#5043」<br>T番号は、「#4120」 から取り出せます。</p>



<h3 class="wp-block-heading"><span id="toc14">マクロの最初で取り出し、終了前で戻す</span></h3>



<p class="wp-block-paragraph">まったく、モーダル情報を扱わないマクロの場合とか、メインプロ側から呼び出す前後で<br>確実に処理する場合には不要だと思いますが、余裕があればやっておいたほうが安心です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">#1=#4003 (G91orG90)<br>#2=#4120 (T No)<br>・・<br>T03 M06<br>G91 <br>・・<br>・・<br>G[#1]<br>T[#2] M06<br>M99<br>%</p>
</blockquote>



<h2 class="wp-block-heading"><span id="toc15">サンプルデータ</span></h2>



<p class="wp-block-paragraph">上記の事を考慮して、簡単なマクロサンプルを作ってみます。<br>このマクロは、単純にZ方向に切込み、径補正で真円加工し、<br>イニシャル点に戻るだけのマクロです。<br>ただし、段差等は考慮せず、加工上面がZ=0としています。<br>G66モーダル呼び出しを使用する事で、加工位置データも別サブプログラムにできます。<br>位置データを別プログラムにしておくと、同じ位置で別工程加工を行う場合に便利です。<br>例えば、同じ箇所に「ドリル」「穴荒加工」「穴仕上」「面取り」の工程がある場合<br>穴加工位置指令は、すべて同じデータを指定できます。</p>



<h3 class="wp-block-heading"><span id="toc16">メインプログラム</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O1234<br>(++++++++++++++++++++)<br>( Circle Milling Main Ver1.0 )<br>( 2023-02-18 By Kazuban)<br>(++++++++++++++++++++)<br>#1=54.(WORK ORIGIN)<br>#2=10.0(Ciecle Dia)<br>#3=-5.0(Depth)<br>#4=300.(Feed)<br>#5=100.(Depth-Feed)<br>#6=30.0(Initial-Point)<br>#7=5.0(R-Point)<br>#8=1.(D)<br>(++++++++++++++++++++)<br>#10=3.(T)<br>#11=#10(H)<br>#12=3500.(SP)<br>(++++++++++++++++++++)<br>G90G00G17G40G80G49<br>(++++++++++++++++++++)<br>N0001<br>G#1<br>T#10<br>M06<br>G90G00X0Y0<br>G43Z#6H#11<br>M01<br>( START )<br>G90G00<br>Z[#6]<br>S#12M03<br>M08<br>(++++++++++++++++++)<br>(A:#1 B:#2 C:#3 I:#4 J:#5 K:#6 D:#7 E:#8 F:#9 H:#11 M:#13)<br>(Q:#17 R:#18 S:#19 T:#20 U:#21 V:#22 W:#23 X:#24 Y:#25 Z:#26)<br>(++++++++++++++++++)<br>(A:#1=#2_Ciecle Dia)<br>(B:#2=#3_Depth)<br>(C:#3=#4_Feed)<br>(I:#4=#5_Depth-Feed)<br>(J:#5=#6_Initial-Point)<br>(K:#6=#7_R-Point)<br>(D:#7=#8_D)<br>(++++++++++++++++++)<br>G66P0101A[#2]B[#3]C[#4]I[#5]J[#6]K[#7]D[#8]<br>M98P1000(Position data)<br>G67<br>G90G00Z[#6]<br>M09<br>G91G28Z0<br>G91G49Z0<br>G90M05<br>( END )<br>M30<br>%</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc17">マクロ・サブプログラム</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O0101<br>(++++++++++++++++++++)<br>( Circle Milling Macro Ver1.0 )<br>( 2023-02-18 By Kazuban)<br>(++++++++++++++++++++)<br>(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;)<br>(A:#1=#2_Ciecle Dia)<br>(B:#2=#3_Depth)<br>(C:#3=#4_Feed)<br>(I:#4=#5_Depth-Feed)<br>(J:#5=#6_Initial-Point)<br>(K:#6=#7_R-Point)<br>(D:#7=#8_D)<br>(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;)<br>#10=[#1/2](Circle_Radius)<br>#11=[#6-#5](To R-Point)<br>#12=[#2-#6](To Depth)<br>(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;)<br>#27=#4003<br>(&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;)<br>G90 G00<br>Z[#5]<br>G91<br>Z[#11]<br>G01 Z[#12] F[#4]<br>G01 G41 X[#10] Y0.0 D[#7] F[#3]<br>G03 X[-#1] Y0.0 I[-#10]<br>G03 X[#1] Y0.0 I[#10]<br>G01 G40 X[-#10] Y0.0<br>G90 G00 Z[#5]<br>G[#27]<br>M99<br>%</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc18">加工位置データ</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">%<br>O1000<br>(++++++++++++++++++++)<br>( Hole Position )<br>(++++++++++++++++++++)<br>X50.Y50.<br>X50.Y-50.<br>X-50.Y-50.<br>X-50.Y50.<br>M99<br>%</p>
</blockquote>



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



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



<p class="wp-block-paragraph">カスタムマクロを書く上においての、注意点や気にしたほうがいい点などまとめてみました。<br>メインプロだけの場合には、メインだけ確認すればいいですが、サブプロを呼び出す形式の場合<br>サブプロ内でのモーダル値の変更は、十分気を付ける必要があります。<br>マクロプログラムは、変数によりパラメータ化できるので、便利ではありますが「#」の羅列で<br>より分かりづらくなります。<br>使用する変数をまとめたり、コメント文をうまく使い、わかりやすくする工夫が必要です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/custom-macro-2/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Flashforge Adventurer3用の、「ランニング運転」と「ビルドプレートレベル確認」のG-Codeデータを手打ちで作ってみた</title>
		<link>https://www.kazuban.com/blog/adventurer3-gcode/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 05 Feb 2023 09:14:44 +0000</pubDate>
				<category><![CDATA[3Dプリンタ]]></category>
		<category><![CDATA[Adventurer3]]></category>
		<category><![CDATA[FlashForge]]></category>
		<category><![CDATA[FlashPrint]]></category>
		<category><![CDATA[G-Code]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=7390</guid>

					<description><![CDATA[前回、Adventurer3用のG-Code の内容と、FlashPrint5出力の「.gx」ファイルを編集するソフト紹介しました。 今回は、実際にG-Code を手打ちしてみたいと、思います。 目次 ランニング運転用G [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前回、Adventurer3用のG-Code の内容と、FlashPrint5出力の「.gx」ファイルを編集するソフト<br>紹介しました。</p>



<div class="wp-block-group is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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/flashforge-gcode/" title="FlashForge のG-Codeを覗いてみる" 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="278" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2023/01/FlashForge-GCode.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2023/01/FlashForge-GCode.png 1197w, https://www.kazuban.com/blog/wp-content/uploads/2023/01/FlashForge-GCode-300x194.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2023/01/FlashForge-GCode-1024x662.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2023/01/FlashForge-GCode-768x497.png 768w" sizes="(max-width: 278px) 100vw, 278px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">FlashForge のG-Codeを覗いてみる</div><div class="blogcard-snippet internal-blogcard-snippet">NC屋としては、３DプリンタのG-Codeにも興味があるので、FlashPrint5が吐き出した、Adventurer3用データを覗いてみました。前回、FlashPrint5 の「.GX」拡張子のG-Codeを編集できるソフトを公開しました。このソフトで、閲覧や編集が可能になります。一般的なエディタ...</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">2023.01.16</div></div></div></div></a>
</div></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<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/editorforflashprint5/" title="FLASHFORGE ３Dプリンタスライサー FlashPrint の 「.GX」 ファイル編集ソフト" 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="259" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5.png 597w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/FlashPrint5-300x209.png 300w" sizes="(max-width: 259px) 100vw, 259px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">FLASHFORGE ３Dプリンタスライサー FlashPrint の 「.GX」 ファイル編集ソフト</div><div class="blogcard-snippet internal-blogcard-snippet">FlashForge製３Dプリンタ専用スライサー「FlashPrint」は「.GX」拡張子のG-Code を生成します。G-Codeファイルはメモ帳やエディタなどで読めるように、アスキー（テキスト）形式が一般的ですがFlashPrintの「.GX」は、ファイル上部に、バイナリ文字が含まれていて正常な...</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">2022.12.04</div></div></div></div></a>
</div></figure>
</div>
</div>
</div>



<p class="wp-block-paragraph">今回は、実際にG-Code を手打ちしてみたいと、思います。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-12" checked><label class="toc-title" for="toc-checkbox-12">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ランニング運転用G-Code</a><ol><li><a href="#toc2" tabindex="0">Adventurer3用のG-Code</a></li><li><a href="#toc3" tabindex="0">作成方法</a></li><li><a href="#toc4" tabindex="0">動作風景（倍速です）</a></li></ol></li><li><a href="#toc5" tabindex="0">ビルドプレートのレベル（水平）確認用G-Code</a><ol><li><a href="#toc6" tabindex="0">プレ押し出し</a></li><li><a href="#toc7" tabindex="0">インナーシェル</a></li><li><a href="#toc8" tabindex="0">「E」押し出し量の求め方</a></li><li><a href="#toc9" tabindex="0">ポイント</a></li><li><a href="#toc10" tabindex="0">動作風景（×４倍速です）</a></li></ol></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ランニング運転用G-Code</span></h2>



<p class="wp-block-paragraph">一般的に機械は、ランニング（暖気）運転を行ったほうが良いとされています。<br>特に、工作機械の場合には、暖機運転で加工精度が変化しますから必須です。<br>家庭用３Dプリンタの場合には、その重要性は少ないと思いますが、<br>メンテナンスなどで、掃除やグリスアップした時など、可動範囲全体で動作させたほうが<br>いいと思います。<br>手動操作で移動させる事は可能ですが、G-Codeで自動ランニング運転データを<br>作成してみたいと思います。</p>



<h3 class="wp-block-heading"><span id="toc2">Adventurer3用のG-Code</span></h3>



<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/flashforge-gcode/#outline__2_3">前回、FlashPrint5が出力した、G-Code を分析してみました。</a><br>ヘッダー部分では、ヘッドの選択や温度設定、ファンの可動などの指令が書かれています。<br>ランニング運転には、ほとんど必要なさそうです。<br>可動範囲は、150×150×150mmなので、この範囲で動作するような「G1（直線移動）」コード<br>を羅列すればよさそうです。<br>ただし、「.g」ファイルの場合には問題ありませんでしたが、「.gx」ファイルの場合には、<br>「M118」でこのプログラムの動作範囲を指定しないとエラーになりました。</p>



<h3 class="wp-block-heading"><span id="toc3">作成方法</span></h3>



<p class="wp-block-paragraph">１．まず適当なモデル「20mm_Box」などで、FlashPrint5でG-Codeを作成します。<br><a href="https://www.kazuban.com/blog/free_soft/#Soft12">２．「EditorForFlashPrint5」</a>に読み込みと、編集が可能になります。<br>３．不要なコードを削除し、必要なコードを追加します。<br>４．「.g」の場合なら、通常のエディタで作成可能ですが、プリンタ本体のタッチパネルの<br>　ファイルリストにアイコンが表示されません。<br>　「１．の適当なモデル」をデータのイメージしやすいモデルでダミーのデータを作成すれば、<br>　アイコンは表示できますが、ちょっと面倒ですね。<br>５．ランニング運転用のコードは下記のようにしました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">M118 X75.0 Y75.0 Z150.0 T0<br>G90<br>G1 Z50.000 F1000<br>G1 X75.0 Y-75.0 Z150.0 F4800<br>G1 X-75.0 Y75.0 Z10.0<br>G1 X-75.0 Y-75.0 Z150.0<br>G1 X75.0 Y75.0 Z10.0<br>G1 X75.0 Y-75.0 Z150.0<br>G1 X-75.0 Y-75.0 Z10.0<br>G1 X-75.0 Y75.0 Z150.0<br>G1 X0 Y0 Z50.0<br>G1 X75.0 Y-75.0 Z150.0<br>;end gcode<br>G91<br>M18</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc4">動作風景（倍速です）</span></h3>



<figure class="wp-block-video"><video height="720" style="aspect-ratio: 1280 / 720;" width="1280" controls muted src="https://www.kazuban.com/blog/wp-content/uploads/2023/02/Running.mp4"></video></figure>



<h2 class="wp-block-heading"><span id="toc5">ビルドプレートのレベル（水平）確認用G-Code</span></h2>



<p class="wp-block-paragraph">ビルドプレートに、線をプリントする事で、水平を確認するデータを作成してみます。<br>今回はランニング運転と違い、プリントさせるので、ヘッド温度や、フィラメント押し出し<br>などのコードも必要となります。<br>温度設定などは、「20mm_Box」などのデータを参考にすればいいと思いますが<br>押し出し量「E」の設定を算出しなければいけません。<br>FlashPrint5 でサンプルの「20mm_Box」でデータを作成し、分析してみます。<br>プレ押し出しは「有り」、積層ピッチ「0.2」、モデル一層目の厚み「0.2」の設定で<br>スライスしてみます。</p>



<h3 class="wp-block-heading"><span id="toc6">プレ押し出し</span></h3>



<p class="wp-block-paragraph">FlashPrintに、プレ押し出しの厚みなどの設定項目は見当たらないので、<br>詳細はわかりませんがG-Code を見る限りでは、「Z0.2」で動いています。<br>ただ、プレ押し出し幅や厚みは、通常プリントよりも大きめになりますね。<br>通常印刷よりも、押し出し量は、多く設定されていると思われます。<br>G-Codeの「:pre-extrude」の部分を覗いてみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">・<br>M108 T0<br>G1 X15.00 Y-15.00 F4800<br>;preExtrude:0.20<br>M106<br>G1 Z.200 F420<br>;structure:pre-extrude<br>G1 X15.00 Y-15.00 F4800<br>G1 X15.00 Y15.00 E4.3504 F1200<br>G1 X-15.00 Y15.00 E8.7009<br>G1 X-15.00 Y-15.00 E13.0513<br>G1 X15.00 Y-15.00 E17.4017<br>・<br>・</p>
</blockquote>



<p class="wp-block-paragraph">このデータから、「E」押し出し量を求めてみます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">移動量　押し出し量<br>Y30.0 …&#8230; E4.3504<br>X30.0 …&#8230; E8.7009 &#8211; E4.3504 = 4.3505<br>Y30.0 …&#8230; E13.0513 &#8211; E8.7009 = 4.3504<br>X30.0 …&#8230; E17.4017 &#8211; E13.0513 = 4.3504</p>



<p class="wp-block-paragraph">全て軸移動量　30mm で、E4.35mmの押し出しになってます。<br>1mmで換算すると、0.145mm</p>
</blockquote>



<p class="wp-block-paragraph">この結果から、プレ押し出し量は、「1mm」の長さで「0.145mm」押し出しているようです。</p>



<h3 class="wp-block-heading"><span id="toc7">インナーシェル</span></h3>



<p class="wp-block-paragraph">次にインナーシェルの部分になります。高さは、「Z0.2」です。<br>このデータが、通常プリントの押し出し量になるかと思います<br></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">・<br>・<br>;layer:0.20<br>G1 E12.4017 F1500<br>G1 Z.200 F420<br>G1 X9.40 Y-9.40 F4200<br>G1 E17.4017 F1500<br>;structure:shell-inner<br>G1 X9.40 Y-9.40 F4200<br>G1 X9.40 Y.60 E17.7642 F600<br>G1 X9.40 Y9.40 E18.0833<br>G1 X8.20 Y9.40 E18.1268<br>・<br>・</p>
</blockquote>



<p class="wp-block-paragraph">同様に、このデータから、「E」押し出し量を求めてみます</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Y9.40+0.60=10 … E17.7642-E17.4017=0.3625<br>Y9.40-0.60=8.80 … E18.0833-E17.7642=0.3191<br>X9.40-8.20=1.2 … E18.1268-E18.0833=0.0435</p>



<p class="wp-block-paragraph">10mmで0.3625、8.8mmで0.3191、1.2mmで0.0435<br>1mmで換算すると、0.036mm　になります。</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc8">「E」押し出し量の求め方</span></h3>



<p class="wp-block-paragraph">さて、「E」はどうやって求めるんだろう？<br>と、<a href="https://fabterrace.site/2022/09/21/202009_3dprinter_2/">検索してみたら、ありました。やっぱりネットの時代はすごいです。</a><br>このサイトの計算式で計算すると、「0.2mm」の積層高さで「1mm」プリントする場合<br>E = 0.033mm　になります。<br>上記FlashPrint5 のデータとほぼ同じです。誤差は若干の調整と考えます。<br>これで、「0.2mm」の積層高さで「1mm」引っ張る場合「E=0.036」の裏付けが取れました。<br>この値をもとに、G-Codeを書いて行こうと思います。</p>



<h3 class="wp-block-heading"><span id="toc9">ポイント</span></h3>



<p class="wp-block-paragraph">・温度設定などの、開始停止コードは、サンプルデータを参考にしますが、<br>　ビルドプレートの温度は、レスポンスを考慮して「30°」にします。<br>・ヘッドに残っているフィラメントの状態が分からないので、プレ押し出しする事にします。<br>・確認プリントの積層高さは、「0.2mm」にします。<br>・次の輪郭への移動時は、フィラメントは「5mm」巻き戻し、「Z0.5mm」で移動させます。<br>・移動後、戻したフィラメントは、もとへ戻します。<br>・プレ押し出し直後の最初のみ、気持ち（1mm）巻き戻った状態に設定しています。<br>・動作輪郭は、最大幅「150mm」ではじめて、内側へ「5mm～10mm」づつオフセットした<br>　四角形の輪郭にします。<br>・「E値」は、絶対値での定義では、面倒なので「G92」でリセットしながらとします。<br>　NC機械では、最近は「G92」の使用は少なくなってきましたが、この場合には便利です。<br>・最後は、垂れ流し防止で、「2.5mm」巻き戻して終了とします。</p>



<p class="wp-block-paragraph">こんな感じで、G-Code 書きます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">M118 X75.00 Y75.00 Z0.30 T0<br>M140 S30 T0<br>M104 S210 T0<br>M104 S0 T1<br>M107<br>G90<br>G28<br>M132 X Y Z A B<br>G1 Z50.000 F420<br>G161 X Y F3300<br>M7 T0<br>M6 T0<br>M651 S255<br>;layer_count: 1<br>M108 T0<br>G1 X-10.00 Y-10.00 F4800<br>;preExtrude:0.20<br>M106<br>G1 Z.200 F420<br>;structure:pre-extrude<br>G92 E0<br>G1 X10.00 Y-10.00 E2.9 F600<br>G92 E0<br>G1 X10.00 Y10.00 E2.9<br>G92 E0<br>G1 X-10.00 Y10.00 E2.9<br>G92 E0<br>G1 X-10.00 Y-10.00 E2.9<br>;&#8212;&#8211; Move<br>G92 E0<br>G1 E-5.0 F1500<br>G1 Z0.5<br>G1 X-75.00 Y75.00 F4200<br>G1 E-1.0 F1500<br>G1 Z0.2 F420<br>;&#8212;&#8211; Width150.0<br>G1 X-75.00 Y75.00 F4200<br>G92 E0<br>G1 X75.00 Y75.00 E5.4 F600<br>G92 E0<br>G1 X75.00 Y-75.00 E5.4<br>G92 E0<br>G1 X-75.00 Y-75.00 E5.4<br>G92 E0<br>G1 X-75.00 Y75.00 E5.4<br>;&#8212;&#8211; Move<br>G92 E0<br>G1 E-5.0 F1500<br>G1 Z0.5 F500<br>G1 X-70.00 Y70.00 F4200<br>G1 E0 F1500<br>G1 Z0.2 F420<br>;&#8212;&#8211; Width140.0<br>G1 X-70.00 Y70.00 F4200<br>G92 E0<br>G1 X70.00 Y70.00 E5.04 F600<br>G92 E0<br>G1 X70.00 Y-70.00 E5.04<br>G92 E0<br>G1 X-70.00 Y-70.00 E5.04<br>G92 E0<br>G1 X-70.00 Y70.00 E5.04<br>;&#8212;&#8211; Move<br>G92 E0<br>G1 E-5.0 F1500<br>G1 Z0.5 F500<br>G1 X-65.00 Y65.00 F4200<br>G1 E0 F1500<br>G1 Z0.2 F420<br>・<br>・<br>・<br>;&#8212;&#8211; Move<br>G92 E0<br>G1 E-5.0 F1500<br>G1 Z0.5 F500<br>G1 X-20.00 Y20.00 F4200<br>G1 E0 F1500<br>G1 Z0.2 F420<br>;&#8212;&#8211; Width40.0<br>G1 X-20.00 Y20.00 F4200<br>G92 E0<br>G1 X20.00 Y20.00 E1.44 F600<br>G92 E0<br>G1 X20.00 Y-20.00 E1.44<br>G92 E0<br>G1 X-20.00 Y-20.00 E1.44<br>G92 E0<br>G1 X-20.00 Y20.00 E1.44<br>;&#8212;- End<br>M107<br>G1 Z0.5 F1500<br>G92 E0<br>G1 E-5.0<br>G1 Z10.0 F500<br>G1 Z50.0 F4000<br>G1 X0 Y0<br>G1 E-2.5 F1500<br>;end gcode<br>M104 S0 T0<br>M140 S0 T0<br>G162 Z F1800<br>G28 X Y<br>M132 X Y A B<br>M652<br>G91<br>M18</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc10">動作風景（×４倍速です）</span></h3>



<figure class="wp-block-video"><video height="720" style="aspect-ratio: 1280 / 720;" width="1280" controls src="https://www.kazuban.com/blog/wp-content/uploads/2023/02/TableLevelCheck.mp4"></video></figure>



<p class="wp-block-paragraph">うちのガラスプレートには、張り付きが弱いため、マスキングテープを張ってます。<br>また、四角輪郭の始まり付近で、剥がれる事もありました。<br>場合によっては、送り速度の調整や、「スティックのり」などを試してみてください。</p>



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



<p class="wp-block-paragraph">NC工作機械では、G-Code手打ちで機械を動かす事はよくありますが、３Ｄプリンタの場合は<br>ほとんどないと思います。<br>カスタムマクロのような、変数（＃）などが使用できると、少しは使い道があるかもしれませんね<br>まぁ、手打ちで機械が動くと言うのは、楽しいものです。</p>



<p class="wp-block-paragraph">今回紹介のG-Code「.gx」ファイル、「Running.gx」と「TableLevelCheck.gx」は<br>下記からダウンロードできますので興味あれば、使ってみてください。</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-black-color has-luminous-vivid-orange-background-color has-text-color has-background wp-element-button" href="https://www.kazuban.com/blog/free_soft/#Soft13">ダウンロード</a></div>
</div>



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



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2023/02/Running.mp4" length="25799336" type="video/mp4" />
<enclosure url="https://www.kazuban.com/blog/wp-content/uploads/2023/02/TableLevelCheck.mp4" length="69697182" type="video/mp4" />

			</item>
		<item>
		<title>FlashForge のG-Codeを覗いてみる</title>
		<link>https://www.kazuban.com/blog/flashforge-gcode/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 16 Jan 2023 05:27:45 +0000</pubDate>
				<category><![CDATA[3Dプリンタ]]></category>
		<category><![CDATA[Adventurer3]]></category>
		<category><![CDATA[FlashForge]]></category>
		<category><![CDATA[FlashPrint]]></category>
		<category><![CDATA[G-Code]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=7272</guid>

					<description><![CDATA[NC屋としては、３DプリンタのG-Codeにも興味があるので、FlashPrint5が吐き出した、Adventurer3用データを覗いてみました。前回、FlashPrint5 の「.GX」拡張子のG-Codeを編集できる [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">NC屋としては、３DプリンタのG-Codeにも興味があるので、<br>FlashPrint5が吐き出した、Adventurer3用データを覗いてみました。<br>前回、<a href="https://www.kazuban.com/blog/editorforflashprint5/">FlashPrint5 の「.GX」拡張子のG-Codeを編集できるソフトを公開しました。</a><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-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">３Dプリンタ、G-Code 資料</a></li><li><a href="#toc2" tabindex="0">FlashPrint5 が作成したG-Code</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">M118</a></li><li><a href="#toc7" tabindex="0">FlashPrint が苦手な書式</a></li></ol></li><li><a href="#toc8" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">３Dプリンタ、G-Code 資料</span></h2>



<p class="wp-block-paragraph">とりあえず、ググってみました。<br>一般的な「Gコード」「Mコード」は下記で参考になりそうです</p>



<p class="wp-block-paragraph"><a href="http://replicat.org/gcodes">http://replicat.org/gcodes</a><br><a href="http://replicat.org/mcodes">http://replicat.org/mcodes</a></p>



<p class="wp-block-paragraph">基本的なGコードは、工作機械と若干の互換もあるみたいですね</p>



<ul class="wp-block-list">
<li>G0 &#8211; Rapid Motion</li>



<li>G1 &#8211; Coordinated Motion</li>



<li>G2 &#8211; Arc &#8211; Clockwise</li>



<li>G3 &#8211; Arc &#8211; Counter Clockwise</li>



<li>G4 &#8211; Dwell</li>



<li>G20 &#8211; Inches as units</li>



<li>G21 &#8211; Millimeters as units</li>



<li>G28 &#8211; Home given Axes to maximum</li>



<li>G30 &#8211; Go Home via Intermediate Point (not implemented)</li>



<li>G53 &#8211; Set absolute coordinate system</li>



<li>G90 &#8211; Absolute Positioning</li>



<li>G91 &#8211; Relative Positioning</li>



<li>G92 &#8211; Define current position on axes</li>
</ul>



<p class="wp-block-paragraph">Mコードは、工作機械もそうですが互換性は少ないです<br>終了や工具（ヘッド）交換ぐらいでしょうかね？<br>ただ、FlashPrint5 では、終了コードは、「M18」のようです。</p>



<ul class="wp-block-list">
<li>M2 End program</li>



<li>M6 Tool change. This code waits until the toolhead is ready before proceeding. This is often used to wait for a toolhead to reach the its set temperature before beginning a print. ReplicatorG also supports giving a timeout with M6 P&lt;secs&gt;.</li>



<li>M30 program rewind</li>
</ul>



<p class="wp-block-paragraph"><a href="https://reprap.org/wiki/G-code/ja">こんなページもありましたが</a>、やはり内容はだいぶ違いますね。<br>FlashForge 用の資料も見つけました<br><a href="https://github.com/minsk-hackerspace/slic3r-configs/blob/master/docs/Flashforge%20Gcode%20protocol(open).md">slic3r-configs/Flashforge Gcode protocol(open).md at master · minsk-hackerspace/slic3r-configs · GitHub</a><br><a href="https://googlegroups.com/group/flashforge/attach/46dc32d7dc6079ae/FlashForge%20Gcode%20Protocol(open).pdf?part=0.1">https://googlegroups.com/group/flashforge/attach/46dc32d7dc6079ae/FlashForge%20Gcode%20Protocol(open).pdf?part=0.1</a></p>



<p class="wp-block-paragraph">参考にしやすいように、ここに書かれているFlashForge仕様をまとめてみました。</p>



<ul class="wp-block-list">
<li>G1　：直線補間｜X軸｜Y軸｜Z軸｜E押出し長｜F送り</li>



<li>G4　：一時停止時間設定｜P（ms）｜S（s）</li>



<li>G28　：ホーム位置｜X軸｜Y軸｜Z軸｜なし：全軸</li>



<li>G90　：絶対座標指令</li>



<li>G91　：相対座標指示</li>



<li>G92　：現在位置座標系設定</li>



<li>M6　：ヘッド選択｜T0（右ヘッド）｜T1（左ヘッド）｜S（待ち時間：初期値600s）</li>



<li>M7 　：プラットフォーム温度待ち｜S（待ち時間：初期値600s）</li>



<li>M17　：ステッピングモータを有効｜X軸｜Y軸｜Z軸｜A軸｜B軸｜E（A&amp;B）｜なし：全軸</li>



<li>M18　：ステッピングモータ無効｜X軸｜Y軸｜Z軸｜A軸｜B軸｜E（A&amp;B）｜なし：全軸</li>



<li>M104　：ヘッド温度設定｜S（°C）｜T0 or T1（右・左ヘッド）</li>



<li>M105：エクストルーダーとプラットフォーム温度確認</li>



<li>M106　：冷却ファン有効</li>



<li>M107　：冷却ファン無効</li>



<li>M108　：ヘッド交換｜T0 or T1（右・左ヘッド）</li>



<li>M112：緊急停止</li>



<li>M114：現在位置取得</li>



<li>M115：機械情報取得</li>



<li>M119：マシンの状態確認</li>



<li>M140　：プラットフォーム温度設定｜S（°C）</li>



<li>M132　：メモリからホームポジション位置を読み込む｜X軸｜Y軸｜Z軸｜A軸｜B軸</li>



<li>M907　：ステッパー電流値を設定｜X軸｜Y軸｜Z軸｜A軸｜B軸</li>
</ul>



<h2 class="wp-block-heading"><span id="toc2">FlashPrint5 が作成したG-Code</span></h2>



<p class="wp-block-paragraph">FlashPrint5に標準で用意されている、サンプルの「20mm_Box」をスライスさせてみます。<br>作成された、「20mm_Box.gx」の内容をみてみましょう。<br>通常のエディタでも、最上部部分が文字化けしますが、読めない事はないです。<br>前回公開した、<a href="https://www.kazuban.com/blog/free_soft/#Soft12">「EditorForFlashPrint5.exe」</a>では、閲覧、編集、保存が可能です。<br>もし、興味あれば、ダウンロードしてみてください。</p>



<h3 class="wp-block-heading"><span id="toc3">全体の構造</span></h3>



<p class="wp-block-paragraph">先頭の「;」はコメント文です。<br>まず最初の数行で、スライス条件が、コメント文でまとめられています。</p>



<p class="wp-block-paragraph">スライス条件情報の後、ヘッダー部分で機械をプリント可能状態へ準備運転させています。<br>その後、実際のプリント部分ですが、動作指示は全て「G1：直線補間」で定義されていますね<br>工作機械と違い、G2,G3 の円弧補間は、あまり必要ないのかもしれませんね。<br>最後に、初期状態へ戻して終了です。</p>



<h3 class="wp-block-heading"><span id="toc4">コメント文でスライス条件掲示</span></h3>



<p class="wp-block-paragraph">データの最初に、スライス条件が、まとめられています。<br>参照する人は少ないかもしれませんが、後日条件を確認したい場合など<br>G-Codeデータだけで確認できそうです。<br>条件を突き詰めている人には、重宝するかもしれません。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">;machine_type: Adventurer 3 Series<br>;right_extruder_material: PLA<br>;right_extruder_material_density: 1.24<br>;filament_diameter0: 1.75<br>;right_extruder_temperature: 210<br>;layer_height: 0.18<br>・<br>・</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc5">データ構造を分析</span></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">M118 　：　正確にはわかっていません。<a href="https://www.kazuban.com/blog/flashforge-gcode/#outline__2_4">後ほどわかる範囲で説明します。</a><br>M140 S50 T0　：　プラットフォーム温度設定　S（°C）<br>M104 S215 T0　：　右（T0）ヘッド温度設定　S（°C）<br>M104 S0 T1　：　左ヘッド温度設定ですが、シングルヘッドの場合不要<br>M107　：　冷却ファンＯＦＦ<br>G90　：　絶対座標指令<br>G28　：　全軸ホーム位置へ移動<br>M132 X Y Z A B 　：　メモリから原点位置を読み込む<br>G1 Z50.000 F420　：　Z50.000 へ420mm/sのスピードで移動<br>G161 X Y F3300　：　X、Y軸の最小点へ移動<br>M7 T0　：　プラットフォーム温度待ち<br>M6 T0　：　右ヘッド（T0）ヘッド選択<br>M651 S255　：　筐体ファンON<br>;layer_count: 60<br>M108 T0　：　ヘッド交換<br>G1 X11.85 Y-16.35 F4800　：　X11.85 Y-16.35 へF4800で移動<br>;preExtrude:0.20<br>M106　：　冷却ファンＯＮ<br>G1 Z.200 F420　：　Z0.200 へF420で移動<br>;structure:pre-extrude　&#8212;&#8212;&#8212;&#8211; プリント開始 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>G1 X11.85 Y-16.35 F4800 <br>G1 X13.55 Y-15.58 E.2706 F1200　：　E指令：フィラメント押し出し量mm<br>G1 X14.97 Y-14.37 E.5412<br>・<br>・<br>G1 X-9.06 Y8.48 E211.5981<br>G1 X-8.48 Y9.06 E211.6248<br>G1 X-9.06 Y9.05 E211.6438<br>M107　：　冷却ファンＯＦＦ<br>G1 E209.1438 F1500　：　フィラメント引き戻し「211.6438 &#8211; 209.1438 = 2.5mm」<br>G1 Z11.650 F420<br>G1 X10.94 Y9.05 F6000<br>;end gcode　&#8212;&#8212;&#8212;&#8211; プリント終了 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>M104 S0 T0　：　右（T0）ヘッド温度キャンセル<br>M140 S0 T0　：　プラットフォーム温度キャンセル<br>G162 Z F1800　：　Z軸の最大点に移動<br>G28 X Y　：　X、Y軸ホーム位置へ移動<br>M132 X Y A B 　：　メモリから原点位置を読み込む<br>M652　：　筐体ファンOＦＦ<br>G91　：相対座標指示<br>M18　：ステッピングモータ無効</p>
</blockquote>



<h3 class="wp-block-heading"><span id="toc6">M118</span></h3>



<p class="wp-block-paragraph">「M118」はよくわかりません。検索しても適格な説明はみつかりませんでしたが<br>ラフトなども含めた造形範囲を定義しているような感じです。<br>なんとなく分かったのは、プラットフォーム中心からの、上下（Y軸）左右（X軸）高さ（Z軸）<br>の最大値のようです。<br>一軸に対して、「＋－」の座標的な意味はないようで、数値的に大きい方で定義するようです。<br>検証として、標準サンプルの「20mm-Box」を「センターに配置」して、<br>「ラフトなし、プレ押し出しなし」の他は標準条件でスライスしてみました。</p>



<p class="wp-block-paragraph">M118 X10.94 Y10.00 Z10.10 T0</p>



<p class="wp-block-paragraph">となりました、「X10.00」を予想していましたが、「X10.94」でした。<br>ただこれは、プリントのスタート位置をスライサーが若干調整しているのでは？<br>と勝手に解釈し無視する事にします。<br>次に、モデルを「X+10.0」「Y+10.0」に移動して、同様にスライスします。</p>



<p class="wp-block-paragraph">M118 X20.94 Y20.00 Z10.10 T0</p>



<p class="wp-block-paragraph">X軸、Y軸とも10mmシフトしたので、中心からの距離も10ｍｍ長くなります。<br>モデルの幅は変わりませんが、M118の値は、「10mm」プラスされています。<br>次に、一旦センターに戻し、センターから「X-10.0」「Y-10.0」に移動して、<br>同様にスライスします。</p>



<p class="wp-block-paragraph">M118 X20.00 Y20.00 Z10.10 T0</p>



<p class="wp-block-paragraph">このように、「0.94」を無視すれば、上記と同様の値になりました<br>座標の方向性は関係なく、大きな値になるようですね。<br>まぁ、通常はこの設定はスライサーに任せればいいと思いますが、<br>プリンタの最大値に設定したい場合には、Adventurer3の造形範囲「150×150×150mm」の場合</p>



<p class="wp-block-paragraph">M118 X75.0 Y75.0 Z150.0 T0</p>



<p class="wp-block-paragraph">でよさそうです。</p>



<h3 class="wp-block-heading"><span id="toc7">FlashPrint が苦手な書式</span></h3>



<p class="wp-block-paragraph">コードを確かめていて、FlashPrint のプレビューがおかしくなるコードが見つかりました</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">１．工作機械のISOコードの場合、「G1 」と「G01」は同等ですが、「G01」の指令では<br>　　FlashPrint で 正常に描画できません。</p>



<p class="wp-block-paragraph">２．また、ISOコードでは、NCワードとワードの区切りは無くても問題ありませんが<br>　　FlashPrint は「スペース」で区切らないと、同様に正常に描画できませんでした。</p>



<p class="wp-block-paragraph">ただし、単純に移動するだけのコードで試してみたところ、FlashPrintでは異常でしたが<br>実際にAdventurer3に送って動作させると、正常に動作しました。<br>FlashPrint5の問題かもしれませんが、「G1」のように、コードの数値はそのまま書き<br>ワードとワードは、「スペース」を間に入れた方がFlashPrintで動作確認できます。</p>
</blockquote>



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



<p class="wp-block-paragraph">機械のウォームアップ（ヘッダー）とクールダウン（フッター）指令が分かりました<br>ヘッダーとフッターの間に、実際のプリント指令が定義されます。<br>NC工作機械と違って、手打ちのG-Codeで３Dプリンタを動かす事は少ないと思いますが<br>次回、マシンをランニング運転させるデータを作成してみようと思います。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>FLASHFORGE ３Dプリンタスライサー FlashPrint の 「.GX」 ファイル編集ソフト</title>
		<link>https://www.kazuban.com/blog/editorforflashprint5/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 04 Dec 2022 01:18:15 +0000</pubDate>
				<category><![CDATA[3Dプリンタ]]></category>
		<category><![CDATA[Adventurer3]]></category>
		<category><![CDATA[FlashForge]]></category>
		<category><![CDATA[FlashPrint]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=7179</guid>

					<description><![CDATA[FlashForge製３Dプリンタ専用スライサー「FlashPrint」は「.GX」拡張子のG-Code を生成します。G-Codeファイルはメモ帳やエディタなどで読めるように、アスキー（テキスト）形式が一般的ですがFl [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">FlashForge製３Dプリンタ専用スライサー「FlashPrint」は「.GX」拡張子のG-Code を生成します。<br>G-Codeファイルはメモ帳やエディタなどで読めるように、アスキー（テキスト）形式が一般的ですが<br>FlashPrintの「.GX」は、ファイル上部に、バイナリ文字が含まれていて正常な編集作業ができません。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-16" checked><label class="toc-title" for="toc-checkbox-16">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">バイナリ形式ヘッダー</a><ol><li><a href="#toc2" tabindex="0">エディタ上書き保存で、ヘッダー部は、どう変化したのか？</a></li></ol></li><li><a href="#toc3" tabindex="0">「.G」拡張子ファイル</a></li><li><a href="#toc4" tabindex="0">FlashPrint Editor ソフト</a></li><li><a href="#toc5" tabindex="0">EditorForFlashPrint5.exe　使用方法</a><ol><li><a href="#toc6" tabindex="0">追加機能</a></li><li><a href="#toc7" tabindex="0">インストールとアンインストール</a></li><li><a href="#toc8" tabindex="0">起動</a></li><li><a href="#toc9" tabindex="0">使用方法</a></li><li><a href="#toc10" tabindex="0">テストプリント</a></li></ol></li><li><a href="#toc11" 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>



<p class="wp-block-paragraph">「.GX」ファイルは、メモ帳や秀丸エディタでは、ヘッダー部が文字化けしていますが<br>ヘッダー以外は、通常のテキストファイルと同じように編集が可能でした。<br>ただ、編集後保存すると、ヘッダー部分のコードが書き換えてられてしまい、<br>「FlashPrint」では正常に読み込めないデータになってしまいました。</p>



<h3 class="wp-block-heading"><span id="toc2">エディタ上書き保存で、ヘッダー部は、どう変化したのか？</span></h3>



<p class="wp-block-paragraph">私がメインで使っている秀丸エディタには、バイナリ（１６進数）で表示する機能があります。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="860" height="644" src="https://www.kazuban.com/blog/wp-content/uploads/2022/11/Binary-mode.png" alt="" class="wp-image-7184" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/11/Binary-mode.png 860w, https://www.kazuban.com/blog/wp-content/uploads/2022/11/Binary-mode-300x225.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/11/Binary-mode-768x575.png 768w" sizes="(max-width: 860px) 100vw, 860px" /></figure>



<p class="wp-block-paragraph">この機能を使用して、オリジナルの「.gx」ファイルと、メモ帳で編集後保存したファイルを比較してみます。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="518" height="542" src="https://www.kazuban.com/blog/wp-content/uploads/2022/11/Notepad.png" alt="" class="wp-image-7185" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/11/Notepad.png 518w, https://www.kazuban.com/blog/wp-content/uploads/2022/11/Notepad-287x300.png 287w" sizes="(max-width: 518px) 100vw, 518px" /></figure>



<p class="wp-block-paragraph">「00」コードが「20」に変換されているのがわかりますね。</p>



<p class="wp-block-paragraph">プログラム言語では、「00」コードは、文字列の最後を表すコードとして扱われます<br>主に文字列を扱うテキストエディタは、「00」コードは扱いにくいのかもしれませんね。<br>それで、メモ帳は勝手に「20」に変更したのかもしれません。<br>ちなみに、１６進数の「20」コードは、「スペース」を表します。<br>結局、FlashPrintはヘッダーを読んだ時点で、正常に処理する事ができない事になります。</p>



<h2 class="wp-block-heading"><span id="toc3">「.G」拡張子ファイル</span></h2>



<p class="wp-block-paragraph">「FalshPrint 」は、一般的なアスキー（テキスト）ファイルも拡張子を「.g」にする事で<br>読込み事ができます。<br>したがって、他のスライサーで出力したG-Codeもアスキー形式であれば、<br>「.g」拡張子にする事で読み込む事はできると思います。<br>実は「.gx」ファイルも、バイナリヘッダー部分を削除し純粋なアスキーだけにし<br>「.g」拡張子で保存し直せば、編集可能になります。</p>



<h2 class="wp-block-heading"><span id="toc4">FlashPrint Editor ソフト</span></h2>



<p class="wp-block-paragraph">実は５年ほど前、「.g」拡張子のテクニックを知らなかったので、<br>「.gx」ファイルを直接編集できる今回紹介ソフトの前身を作成していました。<br>このソフト久しぶりに先日試した所、「FlashPrint 5」が出力した「.gx」ファイルが<br>処理できませんでした。<br>おそらく、ヘッダー部分の形式が「FlashPrint 5」になり変更になったと思います。<br>まぁ、あまり必要としている人は少ないかもしれませんが、今回「FlashPrint 5」にも対応し<br>一時停止と温度設定のコードを追加する機能を追加した、<br><a href="https://www.kazuban.com/blog/editorforflashprint5/#outline__5">FlashPrint 編集ソフト「EditorForFlashPrint5.exe 」を作成したので、紹介します。</a></p>



<h2 class="wp-block-heading"><span id="toc5">EditorForFlashPrint5.exe　使用方法</span></h2>



<p class="wp-block-paragraph">最初このソフトを作ったのは、もともと筆者はNCが専門なので、３DプリンタのG-Code に興味があり<br>手打ちのG-Code で動かないかなぁ～と思ったのがきっかけでした。<br>興味があった当時は、<a href="https://kazuban.hatenablog.com/entry/2017/06/01/215934">手打ちG-Codeで３Dプリンタにプリントさせてみました</a>が<br>最近は、３Dプリンタのメンテナンスの時に、空運転する、ランニングデータを<br>手打ちした程度ですが、打ち込んだデータで機械が動くのは楽しいものです。</p>



<h3 class="wp-block-heading"><span id="toc6">追加機能</span></h3>



<p class="wp-block-paragraph">FlashPrint5はFlashForge専用スライサーなので、通常編集する必要性はほとんどないと思いますが<br>一時停止の設定が使いにくいと感じているので、一時停止と温度設定のコマンドを挿入する<br>機能を付けました。<br>一時停止と温度設定は、以前のFlashPrintは積層高さで指定できましたが、FlashPrint5では、<br>レイヤー指定に変更になってしまいました。<br>なぜレイヤー指示になったのか分かりませんが、筆者は積層高さで設定するほうが<br>設定しやすいので積層高さで設定する機能を追加しました。<br>他の用途としては、FlashPrint出力のG-Codeを調べたい場合などには使えると思います。</p>



<h3 class="wp-block-heading"><span id="toc7">インストールとアンインストール</span></h3>



<p class="wp-block-paragraph">インストールは特に必要ありません。<br>ダウンロードした圧縮ファイル（ZIP）を適当なフォルダへ展開し、EditorForFlashPrint5.exeを起動するだけです。<br>アンインストールも、展開したフォルダを削除すれば完了です。</p>



<h3 class="wp-block-heading"><span id="toc8">起動</span></h3>



<p class="wp-block-paragraph">このような画面で起動します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="875" height="696" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-boot.png" alt="" class="wp-image-7222" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-boot.png 875w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-boot-300x239.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-boot-768x611.png 768w" sizes="(max-width: 875px) 100vw, 875px" /></figure>



<h3 class="wp-block-heading"><span id="toc9">使用方法</span></h3>



<p class="wp-block-paragraph">まずは、画面上に、「.gx」ファイルをドロップ<br>データを解析し、右側にエディタが起動します。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="875" height="694" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-set.png" alt="" class="wp-image-7225" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-set.png 875w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-set-300x238.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/EditorForFlashPrint5-set-768x609.png 768w" sizes="(max-width: 875px) 100vw, 875px" /></figure>



<p class="wp-block-paragraph">①　ドロップしたファイルのフォルダです。<br>　　ここに、編集されたファイルが作成されます。<br>②　作成されるファイル名。必要あれば、変更してください。<br>③　ラフト高さを除いた、造形品積層の始まり高さです。<br>④　全体の高さです。「造形品高さ」+「ラフト高さ」＝「全体高さ」<br>⑤　コマンドを追加したい、造形品積層高さを指定。<br>⑥　「Search」ボタンで、データから指定高さを検索します。<br>　　指定高さと同じ高さがない場合には、一層低い位置を検索します<br>　　基本は検索位置に挿入ですが、マウスクリックで自由に変更できます。<br>⑦　検索位置に、「M25」一時停止指令を挿入します。<br>⑧　温度指定指令を挿入します。<br>　「T0」ヘッド右、「T1」ヘッド左、「Bed」プラットフォームに温度指定できます<br>⑨　編集された、ファイルが作成されます。</p>



<p class="wp-block-paragraph">一時停止と温度調整だけでなく、通常のエディタ的に編集できるので、自信がある方は自分でG-Codeを挿入する事も可能です。</p>



<h3 class="wp-block-heading"><span id="toc10">テストプリント</span></h3>



<p class="wp-block-paragraph">各ステップの高さを、3mm　としたモデルを準備しました。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-Model.png" alt="" class="wp-image-7231" width="527" height="404" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-Model.png 751w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-Model-300x230.png 300w" sizes="(max-width: 527px) 100vw, 527px" /></figure>



<p class="wp-block-paragraph">このモデルから、「FlashPrint5」でG-Codeを作成し、「EditorForFlashPrint5.exe」を使用し<br>「3.0mm」「6.0mm」位置へ、一時停止「M25」を挿入したデータで印刷しました。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="730" src="https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-print-1024x730.jpg" alt="" class="wp-image-7234" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-print-1024x730.jpg 1024w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-print-300x214.jpg 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-print-768x547.jpg 768w, https://www.kazuban.com/blog/wp-content/uploads/2022/12/Test-print.jpg 1393w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">一時停止高さの確認のため、一時停止ごとに、フィラメントの交換を行いました。<br>一層程度、ヅレている感じもしますが、まぁこんなもんでしょう。<br>このように、一時停止させる事で、途中で色を変えたり、内部にナットなど別のパーツを挿入したりできるので、プリントの幅が広がります。<br>今回は温度設定も、「一時停止」の前に挿入してみました。<br>ヘッド温度は、指定温度へ変更されましたが、プラットフォーム温度は変化しませんでした。<br>ウチのAdventure3 が対応していないのかもしれません。</p>



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



<p class="wp-block-paragraph">「FlashPrint」で作成した「.gx」ファイルを、編集するソフトを作成してみました。<br>必要性は・・・少ないかもしれませんが、G-Codeが触れるのは楽しいものです。<br>ただし、筆者の環境では、実機はAdventure3しか確認できませんのでご了承ください。 </p>



<p class="wp-block-paragraph">フリーソフトページから、ダウンロードできます。<br>　2023/01 オリジナルデータの上部のコメント文「;」を全て削除して作成すると<br>　再度そのデータを読み込んだ場合、正常に読み込めない症状を修正しました<br>　ver1.6 になります。</p>



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



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link has-black-color has-luminous-vivid-orange-background-color has-text-color has-background wp-element-button" href="https://www.kazuban.com/blog/free_soft/#Soft12">ダウンロード</a></div>
</div>



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



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



<hr class="wp-block-separator has-alpha-channel-opacity"/>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>カスタムマクロ、G66モーダル呼び出しで固定サイクルを自作してみる。</title>
		<link>https://www.kazuban.com/blog/chamfering-with-g66/</link>
					<comments>https://www.kazuban.com/blog/chamfering-with-g66/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 30 May 2022 10:40:16 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6649</guid>

					<description><![CDATA[前回、カスタムマクロプログラムの例として、ハイデンハインサイクルをマクロ化する例を紹介しました。 ハイデンハインサイクルに比べると、ファナック固定サイクルの機能は非常に貧弱ですが、カスタムマクロを自作する事で、無限に拡張 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">前回、カスタムマクロプログラムの例として、ハイデンハインサイクルをマクロ化する例を紹介しました。</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-from-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="221" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Driling.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Driling.png 828w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Driling-300x245.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Driling-768x626.png 768w" sizes="(max-width: 221px) 100vw, 221px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">カスタムマクロでハイデンハインサイクルを作ってみよう！</div><div class="blogcard-snippet internal-blogcard-snippet">最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。忘れられそうなので、５月の連休の空き時間で更新します。ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデンハインサイクルをマクロ化してみたいと思います。ハイデンハインサイクルについては、...</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">2022.05.05</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">ハイデンハインサイクルに比べると、ファナック固定サイクルの機能は非常に貧弱ですが、<br>カスタムマクロを自作する事で、無限に拡張する事が可能です。<br>今回は、カスタムマクロのモーダル呼び出し「G66」を利用して、穴を面取りするサイクルを作成してみようと思います。</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">G66：マクロモーダル呼び出し</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><ol><li><a href="#toc5" tabindex="0">真円をGコード化</a></li><li><a href="#toc6" tabindex="0">G91（相対座標系）に変換</a></li><li><a href="#toc7" tabindex="0">マクロ化</a></li><li><a href="#toc8" tabindex="0">面取りをプログラム化</a></li></ol></li><li><a href="#toc9" tabindex="0">メインプロ作成</a><ol><li><a href="#toc10" tabindex="0">変数化</a></li><li><a href="#toc11" tabindex="0">メイン内変数とマクロ内変数</a></li><li><a href="#toc12" tabindex="0">穴座標位置ファイル</a></li></ol></li><li><a href="#toc13" tabindex="0">G66 モーダル呼び出し　メインプロ</a></li><li><a href="#toc14" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">G66：マクロモーダル呼び出し</span></h2>



<p class="wp-block-paragraph"><strong>固定サイクル</strong>を呼び出すには、「G83 R5.0 Q2.0」のように引数により値を渡す事ができます。<br>単純な<strong>サブプログラム呼び出し</strong>「M98」は、引数により値を渡す事はできません。<br>しかし<strong>マクロ呼び出し</strong>は引数を渡す事ができますから、固定サイクルが自作できます。<br>マクロ呼び出しには「G65」という一行のみの単純呼び出し指令もありますが、<br>「G66」を使用すると、定義したサイクルを「X」「Y」座標指示のみで、モーダルで動作させる固定サイクル的な機能を実現できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>G66</strong> P1234 A10.2 B5.0 C3.56<br>X0 Y10.0<br>X10.0 Y25.6<br>X-20.3 Y-56.2<br><strong>G67</strong></p></blockquote>



<p class="wp-block-paragraph">この例のように、「G67」でキャンセルされるまで、指定座標で「G66」の呼び出しを実行する事ができます。</p>



<h2 class="wp-block-heading"><span id="toc2">引数と変数</span></h2>



<p class="wp-block-paragraph">カスタムマクロでプログラミングする時に厄介なのが、変数です。<br>カスタムマクロの変数は「#」+「数値」で定義しますが、識別は「数値」のみなので、<br>他のプログラム言語に比べると後で読み返した時に、非常に分かりづらいです。<br>さらに、変数の種類は「ローカル」や「コモン」「システム」などありますが<br>その種類も「数値」の範囲を意識する必要もあります。<br>さらにさらにです、カスタムマクロに引数を渡す場合には、「#」ではなく、<br>「アルファベット」+「数値」で渡します。<br>例えば、「A10.5」と指令した場合には、マクロ内では、「#1=10.5」と扱われます。<br>なんとも、分かりづらい仕様です。<br>さらにさらにさらに、渡された、この「アルファベット」の引き数値と「#」変数番号が連続でなく、制限があったりします。<br>ほんと、他人が作成したマクロや、昔作ったマクロなど、解読するのに苦労します。<br>もしかすると、ユーザーに簡単に使用させないための、言語仕様かもしれませんね～。</p>



<h3 class="wp-block-heading"><span id="toc3">引数</span></h3>



<p class="wp-block-paragraph">カスタムマクロの引き数は、「アルファベット」+「数値」で指令しますが、その指令方法には２種類あります。<br>１・「G」「L」「N」「O」「P」以外のアルファベット</p>



<pre class="wp-block-preformatted" style="font-size:18px">A:#1　B:#2　C:#3　D:#7　E:#8　F:#9　H:#11　I:#4　J:#5　K:#6 　M:#13
Q:#17　R:#18　S:#19　T:#20　U:#21　V:#22　W:#23　X:#24　Y:#25　Z:#26</pre>



<p class="wp-block-paragraph">２・「A」「B」「C」と「I」「J」「K」の多重指令</p>



<pre class="wp-block-preformatted" style="font-size:18px">A:#1　B:#2　C:#3　I:#4　J:#5　K:#6　I:#7　J:#8　K:#9　I:#10　J:#11　K:#12 ～　　K:#33</pre>



<p class="wp-block-paragraph">１．は、マクロを使う立場からは、２１種類のアルファベットを使えるので、識別しやすいと思いますが、アルファベットに対応する「#」番号が連続していないので、作る立場からは面倒です。<br>２．は、「#」番号は連続しますが、「I」「J」「K」が連続するので、使用する側からは間違いやすいかもしれません。</p>



<p class="wp-block-paragraph">ここでは、１．の方法で作成したいと思います。</p>



<h2 class="wp-block-heading"><span id="toc4">面取りの動作をマクロ化</span></h2>



<h3 class="wp-block-heading"><span id="toc5">真円をGコード化</span></h3>



<p class="wp-block-paragraph">まずは、Φ２０真円輪郭をGコード化してみます。<br>分かりやすいように、G90（絶対座標系）モードで作成します。</p>



<pre class="wp-block-preformatted has-medium-font-size">G90G00G17
G00X0Y0Z30.
G00Z5.
G01Z-10.F500
G01X10.
G03X-10.I-10.
G03X10.I10.
G01X0
G00Z30.</pre>



<p class="wp-block-paragraph">こんな感じでしょうか？進入Ｒは省略しています。<br>円の定義は１行で定義可能ですが、一定義で一周させると、昔うまく処理できない制御機や<br>CAMがあったので、２分割しています。</p>



<h3 class="wp-block-heading"><span id="toc6">G91（相対座標系）に変換</span></h3>



<p class="wp-block-paragraph">今回は自作固定サイクルを目指していますが、通常固定サイクルは<br>・サイクル動作の定義<br>・加工位置指令で、その位置へ移動しサイクル加工<br>・サイクル動作のキャンセル<br>こんな動作ですね。<br>このように、位置決めした後、同じ動作をさせたい場合には、「G91」が便利です。<br>G91に関してはこちらでも紹介してあるので、興味ある方は参考にしてください</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/nc-program-g91/" title="NCプログラム／G91は意外と便利" 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="166" src="https://www.kazuban.com/blog/wp-content/uploads/2020/03/G90G91ConvertAbout.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/03/G90G91ConvertAbout.png 687w, https://www.kazuban.com/blog/wp-content/uploads/2020/03/G90G91ConvertAbout-300x156.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／G91は意外と便利</div><div class="blogcard-snippet internal-blogcard-snippet">下記で説明しましたが、ファナック言語で位置を司令するには「G90:絶対座標系」と「G91:相対座標系」の２種類の方法があります。通常は、図面を見ながらプログラムする場合など、「G90:絶対座標系」のほうが分かりやすいので、こちらを使用する場合が多いと思いますが、同じ形状が並んでいる場合や、穴やポケッ...</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.03.08</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">G90をG91に変換するには、上記または<a href="https://www.kazuban.com/blog/free_soft/">フリーソフト紹介</a>ページでも公開している、<br>変換ソフトを利用して変換する事ができます。</p>



<pre class="wp-block-preformatted has-medium-font-size">G90G00G17
G00X0Y0Z30.
G91
G00Z-25.000
G01Z-15.000F500
G01X10.000
G03X-20.000I-10.
G03X20.000I10.
G01X-10.000
G00Z40.000</pre>



<p class="wp-block-paragraph">変換させると、こんなコードにしてくれました。<br>３行目からG91モードで指令しているので、２行目「G00X0Y0Z30.」の<br>Ｘ，Ｙ座標を変更すれば、任意位置で円加工できます。</p>



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



<p class="wp-block-paragraph">では、マクロ化してみましょう。<br>変換された「G91」プログラムは、若干手直しします。<br>そのままでも使用できますが、ポイントは、Z方向だけは「G90」にしようと思います。<br>加工動作は、位置決め後「G91」にしますが、Z方向のみの指令は、退避位置やＲ点など、<br>「G90」のほうが分かりやすいです。<br>上の例では、加工Zまで下りるコードと、最後の「G00Z40.000」は「G91」モードでの指令値ですが、<br>「G90G00Z30.000」の方が分かりやすいと思います。</p>



<pre class="wp-block-preformatted has-medium-font-size">(+++++++++++++++++++)
#1=20     (DIA)
#2=[#1/2] (R)
#3=30.0   (Initial Point)
#4=5.0    (R Point)
#5=-10.0  (Z)
#6=500    (F)
(+++++++++++++++++++)
<strong>G90</strong>G00G17
Z[#3] 
Z[#4] 
G01Z[#5]F#6
<strong>G91</strong>X[#2]
G03X-[#1]I-[#2]J0. 
X[#1]I[#2]J0.
G01X-[#2] 
<strong>G90</strong>G00Z[#3] 
</pre>



<p class="wp-block-paragraph">このようにしてみました。<br>変数化したので、上部の「#1」～「#6」の数値を変更する事で、加工径や条件を変更する事ができます。<br>これは、この変数を変更する仕様として、通常のＮＣプログラム的に使用する事も可能ですが、マクロ化する事で固定サイクルのように、引数で呼び出す事ができるようになります。</p>



<p class="wp-block-paragraph">ここで使用する変数を確認すると、「#1」～「#6」を使用しています。<br>このマクロを「G66」で呼び出すには、<a href="https://www.kazuban.com/blog/chamfering-with-g66/#outline__2_1">上記のルールにより</a>、引数アドレスと<br>「＃」番号を確認する必要があります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>A=#1　B=#2　C=#3　I=#4　J=#5　K=#6 　</p></blockquote>



<p class="wp-block-paragraph">ですね。<br>マクロファイルは、上記プログラムの変数定義以下の部分（９行目以降）を、<br>「O番号」を付け、「M99」で終了させるNCファイルを作成します。<br>このマクロファイルを、「O6000」とした場合、上の定義で呼び出す指令は<br>「G66 P6000 A20. C30.0 I5.0 J-10.0 K500.」となります。</p>



<h3 class="wp-block-heading"><span id="toc8">面取りをプログラム化</span></h3>



<p class="wp-block-paragraph">これで、円動作させる事はできましたが、狙いの面取りをさせるためには、<br>使用工具径や面取り量、オフセット量などから、加工径や深さを求める必要があります。<br>動作は単純な円加工ですが、円要素を求めるのは意外と面倒です。<br>電卓で加工径を求めて、「#1=」で設定してもいいですが、せっかくなので、<br>工具径と加工穴径と面取り量から、自動計算させましょう。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="696" src="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer02-1024x696.png" alt="" class="wp-image-6688" srcset="https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer02-1024x696.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer02-300x204.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer02-768x522.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2022/05/Chamfer02.png 1168w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">今回の面取りは、４５°のみを想定しています。<br>工具も４５°の円錐工具を使用します。<br>加工動作の円弧径は、工具径補正を使用しない場合、工具（主軸）中心になります。<br>したがって、「加工半径＝穴半径ー（工具半径+オフセット量）」になります。<br>加工深さは、「面取り量+オフセット量」ですね。</p>



<p class="wp-block-paragraph">これを考慮すると、<a href="https://www.kazuban.com/blog/chamfering-with-g66/#outline__3_3">上記のマクロ変数</a>に「面取り量」「オフセット」「工具径」「穴径」を追加する事になります。<br>「加工径」と「加工深さ」は自動計算させましょう。<br>ついでに、加工面深さも追加して、マクロを作成してみました。</p>



<pre class="wp-block-preformatted has-medium-font-size">%
O6000
( Chamfering Macro Ver1.0 By kazuban ) 
(+++++++++++++++++++)
#1=[#8/2-[#6+#7/2]] (circle radius)
(+++++++++++++++++++)
(B:#2 : Surface Coordinat) 
(C:#3 : Initial Point) 
(I:#4 : R Point) 
(J:#5 : Chamfer) 
(K:#6 : Offset)
(D:#7 : Tool Dia)
(E:#8 : Hole Dia)
(F:#9 : Feed)
(+++++++++++++++++++)
G90G00G17
Z[#2+#3] 
Z[#2+#4] 
G01Z[#2-[#6+#5]]F[#9] 
G91X[#1]
G03X-[#1*2]I-[#1]J0. 
X[#1*2]I[#1]J0.
G01X-[#1] 
G90G00Z[#2+#3] 
M99
%</pre>



<p class="wp-block-paragraph">こんなマクロプログラムになりました。<br>これを呼び出すには、「G66」と共に「P」+「O番号」「引数」を付加して呼び出します。<br>続いて、加工位置を追加して、最後に「G67」で終了です。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>G66 P6000 B0.0 C30.0 I5.0 J2.0 K1.0 D0.5 E12.0 F200<br>X10.0 Y12.0<br>X-10.0 Y-10.0<br>G67</p></blockquote>



<h2 class="wp-block-heading"><span id="toc9">メインプロ作成</span></h2>



<p class="wp-block-paragraph">次に、実際の加工に使用できるように、工具交換や加工条件などを定義できるメインププログラムを作成します。<br>このメインプロから、ここまでで作ってきた、面取りマクロプログラムを呼び出すようにします。</p>



<h3 class="wp-block-heading"><span id="toc10">変数化</span></h3>



<p class="wp-block-paragraph">やはり汎用化を考えて、メインプロも変数化しましょう！<br>パラメータは、「ワーク座標系」「工具番号」「回転数」など実際の加工に必要な項目をプログラム上部にまとめます。<br>使用者はこの項目だけの変更で、加工できるようになるので便利です。</p>



<pre class="wp-block-preformatted has-medium-font-size">(++++++++++++++++++++) 
#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) 
#10=5.0 (R Point)
(++++++++++++++++++++) 
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++) 
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++) </pre>



<h3 class="wp-block-heading"><span id="toc11">メイン内変数とマクロ内変数</span></h3>



<p class="wp-block-paragraph">上記のように、必要な項目を変数化してみましたが、ここで定義した変数番号「#番号」とマクロ内で定義している変数番号「#番号」は数値的には同じでも、違うものとして扱われますから注意が必要です。<br>ただ、逆に同じに扱われるとかなり面倒で、変数の値が他のマクロで変更されていまう事も起こってしまいますね。<br>ほとんどのプログラミング言語に、ローカル変数とグローバル変数がありますが、<br>よく理解して使い分けしないと思わぬミスにつながります。<br>一塊のプログラム内だけでリセットされる、ローカル変数のほうがトラブルは少ないです。</p>



<p class="wp-block-paragraph">メインプロからマクロを呼び出す場合、マクロで使われている変数番号と引数のアドレスを把握し、<br>メインにおいてその要素を示す変数番号をマクロ引数に渡します。<br>なんだか、よくわからない説明になってしまいましたが、例えば上記の例で<br>メインで定義している「Initial Point」は「#9=50.0」です。<br>マクロで使用する「Initial Point」は「#3 」です。<br>そうして、引数で渡す「#3」は「C」アドレスですから、「C#9」を渡します。<br>分かりづらいので、整理してみると</p>



<pre class="wp-block-preformatted has-medium-font-size">    マクロ変数            メイン変数
(B:#2:SurfaceCoordinat)  ←  #8
(C:#3:InitialPoint)      ←  #9
(I:#4:RPoint)             ←  #10
(J:#5:Chamfer)           ←  #12
(K:#6:Offset)             ←  #13
(D:#7:ToolDia)           ←  #4
(E:#8:HoleDia)           ←  #11
(F:#9:Feed)               ←  #6
</pre>



<p class="wp-block-paragraph">具体的なマクロ呼び出し指令は、マクロの「O番号」をたとえば「O6000」とすると</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>G66 P6000 B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]</p></blockquote>



<p class="wp-block-paragraph">となります。</p>



<h3 class="wp-block-heading"><span id="toc12">穴座標位置ファイル</span></h3>



<p class="wp-block-paragraph">マクロ呼び出しの次は、穴位置のＸ，Ｙの列挙になりすが、この穴位置指令もサブプログラムとして別のファイルにする事ができます。</p>



<pre class="wp-block-preformatted has-medium-font-size">%
O6100
( Hole Position )
X-35.Y55.
X-50.Y55.
X10.Y10. 
M99
%</pre>



<p class="wp-block-paragraph">この位置ファイルは、今回作成中のマクロだけでなく、通常の固定サイクルにも使用できるので<br>同じ位置で複数の加工を行う場合には、非常に便利です。<br>タップ加工をイメージしてください、<br>センター穴　⇒　下穴加工　⇒　面取り　⇒　タップ　となりますが<br>この一連の工程をメインプロから固定サイクルやマクロで呼び出すように作成しておけば<br>穴座標ファイルは一つのみの編集で、大きさの違う同等の加工が可能になります。<br>M6用、M8用、M10用、M12用　などのように、用意しておくと便利だと思います。</p>



<pre class="wp-block-preformatted has-medium-font-size">( CENTER DRILL )
・
・
G98 G81 Z-1.0 R5.0 F100 L0(K0)
<strong>M98P6100</strong>
G80
・
・
( DRILL )
・
・
G98 G83 Z-20.0 R5.0　Q3.0 F200 L0(K0)
<strong>M98P6100</strong>
G80 
・
・
( CHAMFER  )
・
G66 P6000 B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]
<strong>M98P6100</strong>
G67
・
・
( TAP )
・
・
S100
G98 G84 Z-15.0 R5.0 Q2.5 F125 L0(K0)
<strong>M98P6100</strong>
G80 
・
・
M30</pre>



<h2 class="wp-block-heading"><span id="toc13">G66 モーダル呼び出し　メインプロ</span></h2>



<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/chamfering-with-g66/#outline__3_4">上記で作成した、マクロ</a>を呼び出すメインプロを作成してみました。<br>マクロと位置座標ファイルの番号も変数化しています。</p>



<pre class="wp-block-preformatted has-medium-font-size">%
O1000
( Chamfering Program Ver1.0 By kazuban ) 
G90G00G17G40G80G49 
(++++++++++++++++++++) 
#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) 
#10=5.0 (R Point)
(++++++++++++++++++++) 
#11=12.0 (Hole Diameter)
#12=1.0 (Chamfer)
#13=0.5 (Offset)
(++++++++++++++++++++) 
#30=6000 (Macro program No)
#31=6100 (Position program No)
(++++++++++++++++++++) 
N0001
G#1
T#2
M06
G90G00X0Y0 
<s>(G43Z#8H#3)</s>
G43Z[#8+#9]H#3
( Chamfer Process )
S#5M03 
M#7
(----------------------------)
(B:#2=#8 : Surface Coordinat) 
(C:#3=#9 : Initial Point) 
(I:#4=#10 : R Point) 
(J:#5=#12 : Chamfer) 
(K:#6=#13 : Offset)
(D:#7=#4 : Tool Dia)
(E:#8=#11 : Hole Dia)
(F:#9=#6 : Feed)
(++++++++++++++++++++) 
G66 P[#30] B[#8] C[#9] I[#10] J[#12] K[#13] D[#4] E[#11] F[#6]
M98P[#31]
G67
<s>(G90G00Z#9)</s>
G90G00Z[#8+#9]
M09
M05
G91G28Z0 
G91G49Z0 
G90M05 
( End of Process )
M30
%
</pre>



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



<p class="wp-block-paragraph">固定サイクル的な機能を自作する方法を説明しました。<br><a href="https://www.kazuban.com/soft/ChamferCycle01.zip">こちらから、ダウンロードできます。</a><br>一例として、穴面取り用のマクロを作成しましたが、机上で検討したのみで<br><font color="RED"><strong>実機での検証・確認はやっておりません</strong></font>。<br>もし、実際に使用する場合には、十分な確認をお願いします。<br>また、不具合、気になる点などありましたら、コメントいただけるとたすかります。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/chamfering-with-g66/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Fusion360  ポストプロセッサ危険な設定</title>
		<link>https://www.kazuban.com/blog/fusion360-collision/</link>
					<comments>https://www.kazuban.com/blog/fusion360-collision/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 09 May 2021 01:00:27 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[ファナック]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=5321</guid>

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