<?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>NCプログラム | じじぃの引出し</title>
	<atom:link href="https://www.kazuban.com/blog/tag/nc-program/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>NCプログラム | じじぃの引出し</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>カスタムマクロの読みやすい書き方を考えてみる</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-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">とりあえず、ローカル変数（#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>カスタムマクロ、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-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">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>カスタムマクロでハイデンハインサイクルを作ってみよう！</title>
		<link>https://www.kazuban.com/blog/heidenhain-from-macro/</link>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 05 May 2022 00:57:35 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[CAM]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ハイデンハイン]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6570</guid>

					<description><![CDATA[最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。忘れられそうなので、５月の連休の空き時間で更新します。ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">最近、機械の立ち上げ作業でバタバタしていて、すっかり更新がご無沙汰しています。<br>忘れられそうなので、５月の連休の空き時間で更新します。<br>ネタとしては、以前から考えていたもので、ファナックカスタムマクロの使用例として、ハイデンハインサイクルをマクロ化してみたいと思います。<br>ハイデンハインサイクルについては、下記で記事にしています。<br>ご興味あれば、覗いてみてください。</p>



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

<a href="https://www.kazuban.com/blog/heidenhain_cycle/" title="ハイデンハインのサイクル機能" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="190" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain.png 895w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain-300x284.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2021/12/Heidenhain-768x726.png 768w" sizes="(max-width: 190px) 100vw, 190px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">ハイデンハインのサイクル機能</div><div class="blogcard-snippet internal-blogcard-snippet">ファナック系では、G73やG81～の固定サイクルと呼ばれている、ドリル加工用サイクルがありますがハイデンハイン制御機には、さらに高機能なサイクルが用意されています。変数で加工形状をカスタマイズできる点は、カスタムマクロに似ていす。多様なカスタムマクロが、標準で用意されているイメージです。さらに、ドリ...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2021.12.18</div></div></div></div></a>
</div></figure>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-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">カスタムマクロで変数化</a></li><li><a href="#toc4" tabindex="0">条件判断</a><ol><li><a href="#toc5" tabindex="0">条件分岐</a></li><li><a href="#toc6" tabindex="0">条件式</a></li></ol></li><li><a href="#toc7" tabindex="0">変数定義</a></li><li><a href="#toc8" tabindex="0">条件設定</a></li><li><a href="#toc9" tabindex="0">マクロ化</a></li><li><a href="#toc10" tabindex="0">完成</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">マクロとは？</span></h2>



<p class="wp-block-paragraph">マクロ言語は、プログラム言語に似ていますが、単独では動作しません。<br>アプリケーションから呼び出される事で動作できます。<br>エクセルのマクロを思い浮かべると理解しやすいと思います。<br>エクセルマクロはかなり複雑な処理をプログラミングできますが、<br>結局、エクセルを起動しなければ単独では実行できません。<br>カスタムマクロも同様で単独では動作しません。<br>ファナック系制御機から呼び出される形で使用されます。</p>



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



<p class="wp-block-paragraph">マクロ言語は、変数や演算、条件判断、分岐など、基本的なプログラム機能を持っています。<br>したがって、類似形状をパラメータ化して定義できたり、単純な計算をやらせたり<br>対話的に操作させたりすることができます。<br>カスタムマクロについては、下記記事で少し書いてあるので、参考にしてください。</p>



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

<a href="https://www.kazuban.com/blog/custom-macro/" title="カスタムマクロで段取り支援" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="305" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image.png 1283w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-300x177.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-1024x605.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/07/Image-768x454.png 768w" sizes="(max-width: 305px) 100vw, 305px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">カスタムマクロで段取り支援</div><div class="blogcard-snippet internal-blogcard-snippet">オプション扱いの場合もありますが、CNC制御にはNCデータを操作したり、制御機のデータを読み書きしたりできる、マクロと呼ばれているプログラム機能があります。マクロは、簡易的ですがプログラミング的な言語構造と変数を使用できるため、NCプログラムをパラメータ化して汎用的なプログラムを作成する事ができます...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2020.07.27</div></div></div></div></a>
</div></figure>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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

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




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-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></li><li><a href="#toc2" tabindex="0">ドリル・タップサイクル</a><ol><li><a href="#toc3" tabindex="0">スレッドミル </a></li></ol></li><li><a href="#toc4" tabindex="0">ポケットサイクル</a></li><li><a href="#toc5" tabindex="0">補正</a></li><li><a href="#toc6" tabindex="0">タッチプローブサイクル</a></li><li><a href="#toc7" tabindex="0">プログラム例</a><ol><li><a href="#toc8" tabindex="0">サイクル定義</a></li><li><a href="#toc9" tabindex="0">加工位置</a></li><li><a href="#toc10" tabindex="0">Fusion360 で出力してみた</a></li><li><a href="#toc11" tabindex="0">M12のタップ加工をプログラム化</a></li></ol></li><li><a href="#toc12" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">一度、ハイデンハイン機を触ると、ファナック機には戻れないと言う意見をよく聞きます。<br>工具管理方法の違いもそうですが、このようなサイクルを<span class="markerPink">制御機側が提供している点</span>は<br>重要なポイントだと思います。<br>これは、高精度輪郭精度なども同じかもしれません。<br>機械メーカーの味付けで、同じNCデータを流しても、終了時間はかなりかわりますね。<br>機械メーカーにとっては、自由度があり、差別化ができていいのかもしれませんが<br>いろんなメーカーの機械を選択したい、ユーザー側としては、データの互換性は気になります。<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/heidenhain_cycle/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title>Fusion360、更新でポスト処理が変わった？デフォルトになった「NCプログラム」機能を説明します</title>
		<link>https://www.kazuban.com/blog/post-setting/</link>
					<comments>https://www.kazuban.com/blog/post-setting/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 29 Aug 2021 12:23:03 +0000</pubDate>
				<category><![CDATA[Fusion360]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[ポストプロセッサ]]></category>
		<category><![CDATA[共有フォルダ]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=6002</guid>

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




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

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



<p class="wp-block-paragraph">以前はこんなダイアログでした。</p>



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



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



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">設定は、「設定」と「操作」タブで行います。</p>



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



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



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



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



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



<p class="wp-block-paragraph">「NCプログラム」を作成するには、「設定」⇒「NCプログラムを作成」で作成できます。</p>



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">プログラムの「名前／番号」も変更します。</p>



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">にチェックすると、以前の「ポスト処理」にもどります</p>



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">なぜか、エラーが発生してしまいました。</p>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p class="wp-block-paragraph">2021/08/24日あたりの、更新でFusion360 CAMの「ポスト処理」の動作が変更になったようです。<br>以前の「ポスト処理」ダイアログが表示される代わりに、「ＮＣプログラム」の機能に登録する形式になりました。<br>「ＮＣプログラム」自体は以前からありましたが、複数のポストを使用しない方には無縁だったかもしれません。<br>以前のダイアログに戻す事も可能ですが、意外と便利な機能でもあるので興味ある方は試してみてください。<br>また、ネットワークの共有フォルダの利用方法も解説しました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/post-setting/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
		<item>
		<title>NCデータをＤＸＦ変換するためのDXFフォーマットを解説します</title>
		<link>https://www.kazuban.com/blog/nc-check-to-dxf/</link>
					<comments>https://www.kazuban.com/blog/nc-check-to-dxf/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sat, 31 Oct 2020 05:49:21 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[DXF]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=3570</guid>

					<description><![CDATA[前回公開した、ＮＣデータ確認ソフトに、少し名前を変更しＤＸＦ変換機能を追加しました。 「NcCheck2Dxf Ver3.41」こちらからダウンロードできます。 機能追加にあたり、ＤＸＦファイルの情報を集めなおしたので、 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/nc-check-ver2/" target="_blank">前回公開した、ＮＣデータ確認ソフト</a>に、少し名前を変更しＤＸＦ変換機能を追加しました。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><br><a href="#DownLoad"><strong>「NcCheck2Dxf Ver3.41」こちらからダウンロードできます。</strong></a></p></blockquote>



<p class="wp-block-paragraph"><br>機能追加にあたり、ＤＸＦファイルの情報を集めなおしたので、今回はＤＸＦについての記事を書いてみます。<br><br>以前の記事で、ＤＸＦには少し触れていますので、興味ある方は下記もご覧ください。</p>



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

<a href="https://www.kazuban.com/blog/get-circle/" title="DXFから、穴情報を取出す" 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="180" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2020/05/256.bmp" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">DXFから、穴情報を取出す</div><div class="blogcard-snippet internal-blogcard-snippet">外出自粛のなか、DXFデータの円要素を読み込み、穴情報を取り出すソフトを作成してみました。CADなどで描いた「円要素」を穴と捉え、位置や直径などを取り出します。取り出した情報ファイルはテキストやエクセルの他に、簡易的なＮＣデータも自動作成する仕様としました。DXFファイル「DXF」は「Autodes...</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.05.03</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">こちらは、ＤＸＦファイルから、円要素のみを穴情報として取り出し、簡易的な穴加工用ＮＣデータを作成するソフトでした。<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">ＤＸＦファイルフォーマット</a></li><li><a href="#toc2" tabindex="0">ＤＸＦを構成するグループ</a></li><li><a href="#toc3" tabindex="0">DXFの構成</a></li><li><a href="#toc4" tabindex="0">HEADER（ヘッダ） セクション</a></li><li><a href="#toc5" tabindex="0">TABLES（テーブル）セクション</a><ol><li><a href="#toc6" tabindex="0">LTYPE（線種）テーブル</a><ol><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">LAYER（画層）テーブル</a></li><li><a href="#toc12" tabindex="0">STYLE（文字スタイル）テーブル</a></li></ol></li><li><a href="#toc13" tabindex="0">ENTITIES（図形）セクション</a><ol><li><a href="#toc14" tabindex="0">共通のグループコード</a></li><li><a href="#toc15" tabindex="0">LINE（線分）</a></li><li><a href="#toc16" tabindex="0">ARC（円弧）</a></li><li><a href="#toc17" tabindex="0">CIRCLE（円）</a></li></ol></li><li><a href="#toc18" tabindex="0">EOF（ファイルの終了）</a></li><li><a href="#toc19" tabindex="0">NcCheck に ＤＸＦ変換機能追加しました。</a><ol><ol><li><a href="#toc20" tabindex="0">ダウンロード</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ＤＸＦファイルフォーマット</span></h2>



<p class="wp-block-paragraph">DXFはAutodesk社のAutoCADの図面情報が記述されているテキストファイルで、他ＣＡＤとの互換性を重視して規定しているフォーマットです。<br>そのため多くのＣＡＤがサポートしているので、事実上の標準フォーマットと言えるデータ構造です。</p>



<h2 class="wp-block-heading"><span id="toc2">ＤＸＦを構成するグループ</span></h2>



<p class="wp-block-paragraph">ＤＸＦはグループの集まりです。<br>２行で１グループの構成で、最初がグループコード、次がグループ値です。<br>グループコードは、右寄せで３文字になるように左をスペースで埋めた正の整数です。<br>グループ値は、グループコードによりその変数の型が異なります。<br>古い情報ですが、下記のように決められています。</p>



<pre class="wp-block-preformatted">グループ・コード　　グループ値
++++++++++++++++++++++++++++++++++++++++++++++++
0 ～ 9   　　　　文字列
　　　　0　　　　ファイルの分離符号、データの開始
　　　　1　　　　一つのデータに対する最初の文字の値
　　　　2　　　　名前（属性名称、複合図形名など）
　　　3-5　　　　その他の文字の値あるいは名前の値
　　　　6　　　　線種名
　　　　7　　　　字体名
　　　　8　　　　画層名
　　　　9　　　　変数名を特定（HEADERセクションのみ）
--------------------------------------------------
10～59　　  　　浮動小数点
　　　　10　　　最初のＸ座標（線分、円中心、文字始点など）
　　11-18　　　その他のＸ座標
　　　　20　　　最初のＹ座標
　　21-28　　　その他のＸ座標
　　　　30　　　最初のＺ座標
　　31-36　　　その他のＸ座標
　　　　38　　　0でなければ、この図形の高度
　　　　39　　　0でなければ、この図形の厚さ
　　40～48　　　浮動小数点値（文字高さ、尺度など）
　　　　49　　　反復される値（LTYPE ダッシュの長さなど）
　　50～58　　　角度
-----------------------------------------------------
60～79　    　　整数 
　　　　62　　　色番号 
　　　　66　　　後続図面ありフラグ
　　70～78　　　反復数、フラグ、ビット、モードなど整数値 
-------------------------------------------------------  </pre>



<p class="wp-block-paragraph"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a64.htm" target="_blank">AutoCAD 2011の情報は、こちらに公開されています。</a><br>各データテーブルの記入項目、ファイル分離符号は、常にグループコード「  0」で始まり、次の行に項目を説明する名前が続きます。</p>



<h2 class="wp-block-heading"><span id="toc3">DXFの構成</span></h2>



<p class="wp-block-paragraph">一般的なDXFファイルの構成は、以下のようなイメージです。<br>DXFバージョンによっては、他にもいくつかのセクションがあるようですが変換ソフトでは、下記から「BLOCKS」を除いた、３つのセクションで構成しようと思います。</p>



<pre class="wp-block-preformatted">----------------------------------------
HEADER　セクション
　　図面の情報データ、空間など
----------------------------------------
TABLES　セクション
　　線種、色、レイヤー、スタイルなど
----------------------------------------
BLOCKS　セクション
　　ブロック図形のデータ
----------------------------------------
ENTITIES　セクション
　　線・円弧など、図面データ
----------------------------------------
END OF FILE
　　ファイルの終わり
----------------------------------------</pre>



<p class="wp-block-paragraph" id="block-eeab9481-5247-470b-b1bb-31b65ee5a492">一つのセクションは、<br>　0<br>SECTION<br>で始まり。<br>　0<br>ENDSEC<br>で終わります。</p>



<h2 class="wp-block-heading"><span id="toc4"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5f05.htm" target="_blank"><span class="has-inline-color has-black-color"><span style="text-decoration: underline;">HEADER（ヘッダ） セクション</span></span></a></span></h2>



<p class="wp-block-paragraph">HEADERセクションは、図面に関する変数設定が記述されます。<br><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a6f.htm" data-type="URL" data-id="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a6f.htm" target="_blank">AutoCAD 2011 の情報がこちらにあります</a>が、別のＣＡＤで吐き出したＤＸＦファイルのヘッダー部分をそのまま使用しても問題ないと思いますが、<br><a href="#DownLoad">公開の変換ソフト</a>では、図形要素が主な目的なので、このセクションは省略しても手持ちのＣＡＤでの読み込みは問題ありませんでした。<br>私は、「$ACADVER」のAutoCAD のバージョン番号のみ定義する事にします。<br>なるべく古いDXF形式のほうが互換性はありそうなので、新しい機能は使用せず「AC1006」バージョン程度の指令とします。</p>



<pre class="wp-block-preformatted">  0
SECTION
  2
HEADER
  9
$ACADVER
  1
AC1006
  0
ENDSEC</pre>



<h2 class="wp-block-heading"><span id="toc5"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5e1a.htm" target="_blank"><span class="has-inline-color has-black-color"><span style="text-decoration: underline;">TABLES（テーブル）セクション</span></span></a></span></h2>



<p class="wp-block-paragraph">TABLESセクションには、いくつかのTABLEが含まれます。<br><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5e1a.htm" target="_blank">AutoCAD 2011 のTABLEセクション</a><br>ここでは、「LTYPE（線種）」「LAYER（画層）」のみを設定します。<br>各TABLE の順番は変化するかもしれませんが、「LTYPE」は常に「LAYER」より先に定義します。</p>



<h3 class="wp-block-heading"><span id="toc6"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a4f.htm" target="_blank">LTYPE（線種）テーブル</a></span></h3>



<p class="wp-block-paragraph">LTYPEテーブルは、グループ「  2」に続いて「LTYPE」が指示され、続いて「 70」の後に、「LTYPE（線種）」の最大数を指定します。</p>



<pre class="wp-block-preformatted">  0
SECTION
  2
TABLES
  0
TABLE
  2
LTYPE
 70
     6</pre>



<p class="wp-block-paragraph">次に「  0」に続いて具体的な「線種」を定義していきます。<br>他ＣＡＤが吐き出したＤＸＦファイルを参考にしました。<br>種類は一般的な「CONTINUOS：実線」「DOT：点線」「HIDDEN：隠れ線」「DASHED：破線」「CENTER：一点鎖線」「PHANTOM：二点鎖線」の６種類とします。<br>種類は「  2」に続いて、線種名「CONTINUOS」などを設定し<br>次に「 70」に続いては標準フラグ値の設定ですが、<a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a4f.htm" target="_blank">AutoCADコマンド用みたいで無視してよいとの事</a>なので「0」にしました。<br>次に「  3」に続いて、線種の説明「Solid line」などを定義します。<br>次に「 72」に続いては、位置合わせコードとなっていますが、常に「65」のようです。<br>次は「 73」に続いて、線種パターンの要素数です。<br>要素数は、プロッタで描く場合を想像し「ペンダウン」の場合と「ペンアップ」の場合をそれぞれ１と数えます。<br>ただし、「実線」の場合は少し特殊で「0」となるようです。<br>続いて、「 40」でパターンの全長、「 49」で「ペンアップ・ダウン」の長さを指定します。<br>ペンダウンはプラス符号、ペンアップはマイナス符号になります。<br>ここも、「実線」の場合は、「0.0」になるようです。</p>



<h4 class="wp-block-heading"><span id="toc7">実線の定義</span></h4>



<pre class="wp-block-preformatted">  0
LTYPE
  2
CONTINUOUS
 70
      0
  3
Solid line __________
 72
     65
 73
      0
 40
0.0</pre>



<h4 class="wp-block-heading"><span id="toc8">点線の定義</span></h4>



<p class="wp-block-paragraph">点線は、「ペンダウン：0.1」「ペンアップ：1.0」としてみます。</p>



<pre class="wp-block-preformatted">  0
LTYPE
  2
DOT
 70
0
  3
Dot line ..........
 72
     65
 73
      2
 40
1.1
 49
0.1
 49
-1.0</pre>



<h4 class="wp-block-heading"><span id="toc9">一点鎖線（センターライン）の定義</span></h4>



<p class="wp-block-paragraph">一点鎖線は、「ペンダウン：5.0」「ペンアップ：1.0」「ペンダウン：1.0」「ペンアップ：1.0」とします。</p>



<pre class="wp-block-preformatted">  0
LTYPE
  2
CENTER
 70
     64
  3
Center line ___ _ ___
 72
     65
 73
      4
 40
8.0
 49
5.0
 49
-1.0
 49
1.0
 49
-1.0</pre>



<h4 class="wp-block-heading"><span id="toc10">ＬＴＹＰＥテーブルの終了</span></h4>



<p class="wp-block-paragraph">各テーブルの終了は「  0」に続き「ENDTAB」を定義します。</p>



<pre class="wp-block-preformatted">  0
ENDTAB</pre>



<h3 class="wp-block-heading"><span id="toc11"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a51.htm" target="_blank">LAYER（画層）テーブル</a></span></h3>



<p class="wp-block-paragraph">LAYERテーブルも、まずはグループ「  2」に続いて「LAYER」が指示され、続いて「 70」の後に、「LAYER（画層）」の最大数を指定します。</p>



<pre class="wp-block-preformatted">  0
TABLE
  2
LAYER
 70
     20</pre>



<p class="wp-block-paragraph">続いて、レイヤーの名前や色、事前に設定されている線種を定義します。<br>「  2」に続いて適当なレイヤー名、次に「 70」に続いては「LTYPE」と同様に「  0」でよさそうです。<br>次に「 62」に続いて色番号を定義します。<br>基本的な色番号は</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>１：赤<br>２：黄<br>３：緑<br>４：水<br>５：青<br>６：紫<br>７：白</p></blockquote>



<p class="wp-block-paragraph">となります。<br>次は「  6」に続いて、「LTYPE」で定義された線種名を指定します。<br>テーブル終了は同様に「  0」「ENDTAB」で終了します。</p>



<pre class="wp-block-preformatted">  0
LAYER
  2
Move
 70
      0
 62
      1
  6
DOT
  0
LAYER
  2
Center
 70
      0
 62
      7
  6
CENTER
  0
ENDTAB</pre>



<h3 class="wp-block-heading"><span id="toc12"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a4d.htm" target="_blank">STYLE（文字スタイル）テーブル</a></span></h3>



<p class="wp-block-paragraph">ここも最初のSTYLEテーブルの宣言は同様で、「  2」に続いてスタイル名を定義するのも同じです。<br>作成するＤＸＦデータに「文字」を使用しない場合には、このテーブルは不要かもしれませんが、とりあえず１つだけ「STANDARD」の名前で定義しておこうと思います。</p>



<pre class="wp-block-preformatted">  0
TABLE
  2
STYLE
 70
      1
  0
STYLE
  2
STANDARD
 70
      0
 40
0.0
 41
1.0
 50
0.0
 71
      0
 42
1.0
  3
TXT
  4
BIGFONT
  0
ENDTAB
</pre>



<h2 class="wp-block-heading"><span id="toc13"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WSfacf1429558a55de185c428100849a0ab7-5df0.htm" target="_blank"><span class="has-inline-color has-black-color"><span style="text-decoration: underline;">ENTITIES（図形）セクション</span></span></a></span></h2>



<p class="wp-block-paragraph">ここからようやく図形要素を定義していきます。<br>前述の線種やレイヤーなどの属性が必要なければ、「ENTITIES」セクションだけでもいいということになります。<br>「ENTITIES」は、かなり多数の図形要素を定義できますが、２Ｄレベルの図形をＤＸＦに変換する目的であれば、<br>直線（LINE）、円（CIRCLE）、円弧（ARC）、点(POINT)、程度でいいと思いますが、図形の最大最小や加工時間など、コメントなどもＤＸＦ内に含めたい場合には、文字列（TEXT）もあると便利ですね。<br>また、AC1012（R13）のバージョンあたりから、サブクラスマーカーと呼ばれるグループコードが標準化されたようですが、ここではそれ以前の単純な方法を使っていきたいと思います。</p>



<h3 class="wp-block-heading"><span id="toc14">共通のグループコード</span></h3>



<p class="wp-block-paragraph">まずは、上述のセクションと同様に、<br>「  0」「SECTION」「  2」「ENTITIES」として図形セクションの定義が始まる事を宣言します。<br>その後、「  0」に続いて「図形タイプ」（LINE など）、<br>「  8」に続いて「レイヤー名」<br>その次から、図形の座標値が定義されていきます。<br>座標は、「10」「20」「30」それぞれに続いて始点や中心の「X,Y,Z」座標。<br>「11」「21」「31」は終点の「X,Y,Z」座標。<br>「40」は円弧半径。「50」「51」は円弧の「開始・終点角度」となります。</p>



<h3 class="wp-block-heading"><span id="toc15"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-79fe.htm" target="_blank">LINE（線分）</a></span></h3>



<p class="wp-block-paragraph">「ENTITIES」セクション宣言後、「  0」に続いて、図形タイプ「LINE」を指示します。<br>次に「  8」の次で「LAYER」で定義済みのレイヤー名を指定する事で、この線分を任意のレイヤーに含める事ができます。<br>「 62」や「  6」のグループコードを使用して、この線分のみの「色番号」や「線種」を指定する事もできます。<br>設定しなくても、問題はありません。<br>次の「 10」「 20」「 30」で線分の開始点の「X , Y , Z」座標を設定します。<br>Ｚ軸が必要ない場合は、省略できます。<br>続けて、「 11」「 21」「 31」で線分の終点を指示します。</p>



<pre class="wp-block-preformatted">  0
ENDSEC
  0
SECTION
  2
ENTITIES
  0
LINE
  8
Center
 10
-20.1230
 20
0.0000
 11
20.7890
 21
0.0000
  0
LINE
  8
Center
 10
0.0000
 20
-20.5670
 11
0.0000
 21
20.8960
  0
ENDSEC</pre>



<h3 class="wp-block-heading"><span id="toc16"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a35.htm" target="_blank">ARC（円弧）</a></span></h3>



<p class="wp-block-paragraph">円弧も線分と基本的には定義の方法は同様ですが、<br>図形タイプが「ARC」になり、「 10」「 20」「 30」のグループコードは円弧の中心座標となります。<br>次に「 40」で円弧半径を定義し、「 50」「 51」で円弧の開始角度、終了角度を指示します。<br>真円の場合には、次に説明する「CIRCLE」を使用するのが基本ですが、「ARC」でも「50」「51」を「0.0 , 0.0」や「0.0 , 360.0」とする事で真円と認識してくれるＣＡＤもありましたが、図形を描いてくれないＣＡＤもありました。<br>やはり、円と円弧は別に定義したほうがよさそうですね。</p>



<pre class="wp-block-preformatted">  0
ARC
  8
Nomal
 10
0.0000
 20
0.0000
 40
50.0000
 50
15.1230
51
260.5670</pre>



<h3 class="wp-block-heading"><span id="toc17"><a rel="noopener" href="http://docs.autodesk.com/ACD/2011/JPN/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a2d.htm" target="_blank">CIRCLE（円）</a></span></h3>



<p class="wp-block-paragraph">円は、円弧に比べると図形タイプを「CIRCLE」とし、「 50」「 51」のグループコードが省略された形になっています。</p>



<pre class="wp-block-preformatted">  0
CIRCLE
  8
Nomal
 10
0.0000
 20
0.0000
 40
50.0000</pre>



<h2 class="wp-block-heading"><span id="toc18">EOF（ファイルの終了）</span></h2>



<p class="wp-block-paragraph">最後に、「End Of File」ファイル終了コードを挿入して終了となります。</p>



<pre class="wp-block-preformatted">  0
EOF</pre>



<p class="wp-block-paragraph">ＮＣデータからＤＸＦファイルを作成するには、この程度の仕様でいいと思います。</p>



<a id="DownLoad"></a><h2><span id="toc19">NcCheck に ＤＸＦ変換機能追加しました。</span></h2>



<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/nc-check-ver2/" data-type="URL" data-id="https://www.kazuban.com/blog/nc-check-ver2/">前回公開した、「NcCheck.exe Ver2.6」</a>にＤＸＦ変換機能を追加し<br><s>「NcCheck2Dxf.exe Ver3.2」として公開します。</s><br>ウィンドウサイズとフォント状態を記憶する仕様としました。<br><s>「NcCheck2Dxf.exe Ver3.4」として公開します。</s><br>「NcCheck2Dxf.exe Ver3.41」として公開します。<br></p>



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



<p class="wp-block-paragraph">Vector には登録申請中です。<br>登録終了しましたら、こちらにアドレスをリンクします</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="449" height="263" src="https://www.kazuban.com/blog/wp-content/uploads/2020/11/NcCheck2Dxf_032.png" alt="" class="wp-image-3698 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/11/NcCheck2Dxf_032.png 449w, https://www.kazuban.com/blog/wp-content/uploads/2020/11/NcCheck2Dxf_032-300x176.png 300w" sizes="(max-width: 449px) 100vw, 449px" /></figure><div class="wp-block-media-text__content">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<ul class="wp-block-list" id="block-4ac3bcb2-17f8-48c6-928e-3f5172f0b6d2"><li><a href="https://www.kazuban.com/blog/free_soft/#Soft06">こちらからダウンロードできます</a></li><li>始めて実行する時には、セキュリティのメッセージが出ると思います。</li><li>「詳細情報」から「実行」をクリックしてください。</li></ul>
</div></div>
</div></div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/nc-check-to-dxf/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title>Ｇコード確認ソフトが進化しました。改造に利用した、C++BuilderのCancasを説明しています。</title>
		<link>https://www.kazuban.com/blog/nc-check-ver2/</link>
					<comments>https://www.kazuban.com/blog/nc-check-ver2/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Sun, 11 Oct 2020 07:14:40 +0000</pubDate>
				<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[IT]]></category>
		<category><![CDATA[G-Code]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=3426</guid>

					<description><![CDATA[前回公開したソフト、進化させました。変更点の一番の目玉は、キャンパスのサイズ変更と、図形の拡大・縮小です。この機能追加は、自分自身でもかなりC++Builder の勉強になりましたのでC++Builderでの図形描画方法 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/nc-check/">前回公開したソフト</a>、進化させました。<br>変更点の一番の目玉は、キャンパスのサイズ変更と、図形の拡大・縮小です。<br>この機能追加は、自分自身でもかなりC++Builder の勉強になりましたので<br>C++Builderでの図形描画方法なども記事にしてみようと思います。<br>簡単な図形描画のC++Builder のサンプルソースも添付します。<br>他は、レイアウト変更や、真円への対応。<br>G９０・G９１モードの表示。<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-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><li><a href="#toc3" tabindex="0">拡大・縮小</a></li><li><a href="#toc4" tabindex="0">移動</a></li><li><a href="#toc5" tabindex="0">真円</a></li><li><a href="#toc6" tabindex="0">ダウンロード</a></li></ol></li><li><a href="#toc7" tabindex="0">C++BuilderでＧコード図形化の方法</a><ol><li><a href="#toc8" tabindex="0">NCファイル読み込みの高速化</a></li><li><a href="#toc9" tabindex="0">エディタや図形領域のリサイズ</a></li><li><a href="#toc10" tabindex="0">C++Builderに図形を描かせる</a><ol><li><a href="#toc11" tabindex="0">Canvas 座標系</a></li><li><a href="#toc12" tabindex="0">数学座標系</a></li></ol></li><li><a href="#toc13" tabindex="0">図形のリサイズ</a></li><li><a href="#toc14" tabindex="0">マウスホイールの利用</a></li><li><a href="#toc15" tabindex="0">C++Builderのサンプルソース添付</a></li></ol></li><li><a href="#toc16" tabindex="0">C++Builder は最高！</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>



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



<p class="wp-block-paragraph">ウィンドウサイズを変更する事で、図形描画領域を変更できるようになりました。<br>エディタ領域も変更できます。</p>



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



<p class="wp-block-paragraph">この機能の実現は、なかなかできませんでした。<br>イメージとしての拡大・縮小は簡単ですが、そうすると、図形が変形されてしまいます。<br>図形としての、拡大縮小の方法が見つかりませんでしたが<br>やっと見つけた、<a rel="noopener" href="https://birdhouse.hateblo.jp/entry/2016/01/13/212108" target="_blank">こちらサイトの記事が参考になりました。</a><br>インターネット様様ですねぇ～<br>詳細は後ほど覚書として、書き残しておきます。</p>



<h3 class="wp-block-heading"><span id="toc3">拡大・縮小</span></h3>



<p class="wp-block-paragraph">マウスの「MouseWheel」イベントを利用して実現しました。<br>ただし、描画レスポンスが悪いため、データ量が多いとホイール操作への追従が即座に反映されません。<br>下段の「SetScale」横で、拡大率を入力したほうが速く描画できます。<br>「MouseWheel」イベントはC++Builderで は大元の「Form」しか、このイベントがありません。<br>図形を描くキャンパス上でのみマウスホイールに対応したい場合には、マウスの位置がキャンパス上がどうかの監視が必要になります。<br>この方法も、後ほど書いておこうと思います。</p>



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



<h3 class="wp-block-heading"><span id="toc4">移動</span></h3>



<p class="wp-block-paragraph">「移動」は、マウスクリック位置をキャンパス中心に移動するような操作になります。<br>通常のCADのような、マウス右でのドラッグのような操作は実現できませんでした。</p>



<h3 class="wp-block-heading"><span id="toc5">真円</span></h3>



<p class="wp-block-paragraph">始点・終点が同一の円弧補間指令の真円指令に対応しました。</p>



<figure class="wp-block-gallery columns-1 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex"><ul class="blocks-gallery-grid"><li class="blocks-gallery-item"><figure><img loading="lazy" decoding="async" width="1024" height="615" src="https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle-1024x615.png" alt="" data-id="3437" data-full-url="https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle.png" data-link="https://www.kazuban.com/blog/?attachment_id=3437" class="wp-image-3437" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle-1024x615.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle-300x180.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle-768x461.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2020/10/circle.png 1152w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure></li></ul></figure>



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



<p class="wp-block-paragraph"><s>Vector へは、現在登録申請中です。<br>登録完了しましたら、お知らせします</s>。<br><a href="https://www.vector.co.jp/soft/dl/winnt/business/se521853.html">登録されました、こちらからもダウンロード</a>できます</p>



<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="451" height="262" src="https://www.kazuban.com/blog/wp-content/uploads/2020/10/NcCheck2_6.png" alt="" class="wp-image-3549 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/10/NcCheck2_6.png 451w, https://www.kazuban.com/blog/wp-content/uploads/2020/10/NcCheck2_6-300x174.png 300w" sizes="(max-width: 451px) 100vw, 451px" /></figure><div class="wp-block-media-text__content">
<ul class="wp-block-list"><li><a href="https://www.kazuban.com/blog/free_soft/#Soft05">こちらからダウンロードできます(Ver2.6)</a></li><li>始めて実行する時には、セキュリティのメッセージが出ると思います。</li><li>「詳細情報」から「実行」をクリックしてください。</li></ul>
</div></div>



<h2 class="wp-block-heading"><span id="toc7">C++BuilderでＧコード図形化の方法</span></h2>



<h3 class="wp-block-heading"><span id="toc8">NCファイル読み込みの高速化</span></h3>



<p class="wp-block-paragraph">このソフトの全体の流れとしては、<br>・ドロップされた、NCファイルを読み込み<br>・一ブロックごとに、座標やGコードを分析し<br>・図形データへ変換<br>・Image Canvasで描画<br>の流れで、処理しています。<br>そんな事もあり、NCファイルは一度「TStringList」へ登録し、その「TStringList」から、一行ずつ、「TRichEdit」へ追加後<br>さらに「TStringList」から、一行ずつ、NCデータ分析処理を行っていました。</p>



<pre class="wp-block-preformatted">TStringList *list = new TStringList;
reditNcFile-&gt;Lines-&gt;Clear();
list-&gt;LoadFromFile(FilePath);
for(int i=0; i &lt; list-&gt;Count; i++){
  reditNcFile-&gt;Lines-&gt;Add(list-&gt;Strings[i]);
}</pre>



<p class="wp-block-paragraph">「TRichEdit」への読み込みは、こんな感じです。<br>「TStringList」は便利なので、結構よく使います。<br>ところが、大きめのファイルを読み込んでみると、結構時間がかかります。<br>読込み後のNCデータの分析ルーチンは、私が書いたコードなので、ここが遅いのは私のレベルの問題でしょうがないとしても、「TRichEdit」への読み込み時点で結構時間がかかっていました。<br>いろいろ検索しても、前回の公開時には見つからず、このまま公開しましたが、なんの事はない、「TRichEdit」から直接ファイルを読み込めば、瞬時に読み込みは完了し、「TRichEdit」の「Lines」を「TStrings *」で参照するほうがはるかに高速なのに気が付きました。<br></p>



<pre class="wp-block-preformatted">reditNcFile-&gt;Lines-&gt;Clear();
reditNcFile-&gt;Lines-&gt;LoadFromFile(FilePath) ;　//直接読込む
TStrings *list;
list = reditNcFile-&gt;Lines;
</pre>



<p class="wp-block-paragraph" id="block-a7d09c5e-3487-4045-95fe-04449ad874cb">さらに、NCデータファイルから一行ずつ文字列として取り出す場合<br>TStringList の、Strings[i]　で取り出していましたが、<br>Ｃ言語標準の、FILE * でfopen し、fgets で取り出したほうがデータによっては高速でした<br><br>私の環境では、1MBのデータで、前バージョンでは<br>読込み：56秒 + 図形分析：76秒 = 132秒でしたが<br>今回のバージョンでは、<br>読込みは瞬時に終了し分析完了まで、約77秒ぐらいでした。<br>さらに、データの最後をクリックして、全体表示させてみると<br>前バージョンでは、5分以上でしたが、今回バージョンでは、２秒程度でした。<br>図形表示に関しては、前回はNCの一ブロックずつ描画処理していましたが<br>今回からは、処理した図形データを保存しておいて、一気に描画するような仕様に変更したのでクリック描画はかなり高速になりました。<br>分析処理ももう少し速くしたいのですが、この部分の改善には最初からの見直が必要で、継ぎ足し継ぎ足しでかなり肥大化してしまっているので、今更難しいかなぁと思っているところです。</p>



<h3 class="wp-block-heading"><span id="toc9">エディタや図形領域のリサイズ</span></h3>



<p class="wp-block-paragraph">「Form」に「Memo」や「Image」を配置する際、まず土台として「TPanel」コンポーネントでレイアウトし、その上にImageコンポーネントを配置するようにします。<br>土台の「TPanel」は、「Align」プロパティで、「alTop」「alLeft」「alClient」などに設定しておくと、ウィンドウのリサイズ時に追従していきます。</p>



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



<h3 class="wp-block-heading"><span id="toc10">C++Builderに図形を描かせる</span></h3>



<p class="wp-block-paragraph"><a rel="noopener" href="http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%90%E3%82%B9%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF_%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B" data-type="URL" data-id="http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%90%E3%82%B9%E3%81%AE%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF_%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B" target="_blank">C++Builder には、TCanvasオブジェクトが用意されている</a>ので、これを使用すれば簡単に図形を描く事ができます。<br>TCanvasは、TFormやTImage などのプロパティとして用意されているので、まずは対象のオブジェクトを配置して、そこに描く事になります。<br>例えば、上でPanelを２個配置しましたが、TPanelにはCanvasプロパティはないので、その上にTImage を配置して、そこに図形を描いてみます。<br>Panel2の上に、Image1を配置して、「Align」プロパティを「alClient」に設定します。<br>その後、Form1のFormCreateイベントに、線を描く指令を追加すると起動した時に図形が描画されます。</p>



<pre class="wp-block-preformatted">void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Image1-&gt;Canvas-&gt;MoveTo(100,100);
  Image1-&gt;Canvas-&gt;LineTo(200,200);
  Image1-&gt;Canvas-&gt;AngleArc(200,200,60,10,300);
  Image1-&gt;Canvas-&gt;LineTo(300,300);
}</pre>



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



<p class="wp-block-paragraph">こんな感じで、簡単に図形を描くことができます。<br>ただし、Canvas の座標系は一般的な数学の座標系と方向が違いますので<br>ＮＣデータの図形化のような、数学座標系で図形を描きたい場合には、数学座標をCanvas座標系への変換が必要になります。<br></p>



<h4 class="wp-block-heading"><span id="toc11">Canvas 座標系</span></h4>



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



<h4 class="wp-block-heading"><span id="toc12">数学座標系</span></h4>



<div class="wp-block-media-text alignwide is-stacked-on-mobile" style="grid-template-columns:60% auto"><figure class="wp-block-media-text__media"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/10/Coordinate.png" alt=""/></figure><div class="wp-block-media-text__content">
<p class="wp-block-paragraph">一般的にＮＣ機械のＸＹ平面の<br>座標系は数学座標系と同じなので<br>（最近では稀ですが違う機械も存在します）<br>ＮＣデータを描画させる時には、NC座標からCanvas座標への変換が必要になります。<br>これ単純にY軸の符号を変換だけでなく、原点をキャンパスのどこへもっていくかなど、ちょっと面倒です。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc13">図形のリサイズ</span></h3>



<p class="wp-block-paragraph">図形を描いた、ウィンドウをリサイズしてみます。</p>



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



<p class="wp-block-paragraph">あれぇ～<br>Panelはリサイズに追従しているのに、Image1上の図形は追従しません。<br>「Align」プロパティも「alClient」に設定しているのに何でだろう？<br>ここで結構悩みました。<br>実は、TImage のStretchプロパティをtrue に設定すれば追従するようになります。</p>



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



<p class="wp-block-paragraph">ところが、画像としての追従なので、形状が歪になったり、線の太さが変わってしまったり、図形としては成り立たなくなります。<br>じゃぁどうすればいいのか？<br>やっと見つけたのが、<a rel="noopener" href="https://birdhouse.hateblo.jp/entry/2016/01/13/212108" data-type="URL" data-id="https://birdhouse.hateblo.jp/entry/2016/01/13/212108" target="_blank">こちらのブログ</a>でした。<br>「Delphi言語」の記事だったので、なかなか検索できなかったのでしょう。<br>言語の構文は違いますが、クラス名やプロパティはC++Builder も大差ないので参考にさせていただきました。</p>



<pre class="wp-block-preformatted">TBitmap *ImageA = new TBitmap;
ImageA-&gt;Width = Panel2-&gt;Width;
ImageA-&gt;Height = Panel2-&gt;Height;
Image1-&gt;Picture-&gt;Bitmap = ImageA;
delete ImageA;</pre>



<p class="wp-block-paragraph">こんな感じで、Image1 の土台であるPanel2 の現状サイズを取得して<br>新規に生成した、ImageAのサイズを合わせ<br>そのImageAを、Image1-&gt;Picture-&gt;Bitmap へ代入する事で実現できました。</p>



<h3 class="wp-block-heading"><span id="toc14">マウスホイールの利用</span></h3>



<p class="wp-block-paragraph">マウスホイールで拡大・縮小をさせたいと思います。<br>マウスホイールは、TForm のMouseWheelイベントでは処理できますが<br>図形キャンパスの、TImageにはこのイベントがありません。<br>したがって、図形キャンパス内での、マウスホイール動作を処理したい場合には<br>マウスがTImage内かどうかの判定をする必要があります。<br>コントロール内でマウスを移動させたか？は<br>TImageの、onMouseMoveイベントで処理できます。<br>コントロール外へ移動したか？は<br>onMouseLeaveイベントで処理できます。<br>これを利用して、グローバル変数でマウス位置の状態を記録しておいて<br>コントロール内でのマウスホイール操作の場合のみ、拡大・縮小処理を行いました。</p>



<h3 class="wp-block-heading"><span id="toc15">C++Builderのサンプルソース添付</span></h3>



<p class="wp-block-paragraph">以上の機能を盛り込んだ、サンプルソースファイルを添付します<br>数学座標系指令をキャンパス座標系へ変換し、リサイズやマウスでの拡大・縮小ができます。</p>



<div class="wp-block-group is-layout-flow wp-block-group-is-layout-flow">
<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><a href="https://www.kazuban.com/soft/CanvasSample.zip"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/10/Sample.png" alt=""/></a></figure><div class="wp-block-media-text__content">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>C++Builder のサンプルソースファイルは、左よりダウンロードできます</p></blockquote>
</div></div>
</div>



<h2 class="wp-block-heading"><span id="toc16">C++Builder は最高！</span></h2>



<p class="wp-block-paragraph">プログラミングに興味がある方で、とりあえず簡単にビジュアル的なプログラムを作成してみたいと思っている人にとっては、最適なツールだと思います。<br>少し複雑な処理をさせようと思うと、C++の知識は必要になってきますが、<br>ちょっとした計算をさせたい場合は、エクセルマクロ的な操作で実行ファイル「EXE」を作成できます。<br>ＤＬＬのいらない、ネイティブな実行ファイルが作成できるので、エクセルを立ち上げないと動作しないエクセルマクロよりも簡単に利用できます。<br>こんな素晴らしいツールが個人使用なら無料で使用できますから、プログラムに興味あるかたは是非体験してみてください。<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/nc-check-ver2/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title>ＧコードNCデータの確認と学習支援ソフトを作ってみた</title>
		<link>https://www.kazuban.com/blog/nc-check/</link>
					<comments>https://www.kazuban.com/blog/nc-check/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Thu, 17 Sep 2020 08:30:16 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[C++Builder]]></category>
		<category><![CDATA[ＮＣデータ]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[フリーソフト]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=3314</guid>

					<description><![CDATA[こちらで、ファナック系ＮＣデータで図形を定義する方法を説明しました。 NCプログラム／Gコード　工具経路指令前回は、NCプログラムの概要を説明しました。今回は工具経路の図形を定義する指令に使用されるＧコードについて説明し [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">こちらで、ファナック系ＮＣデータで図形を定義する方法を説明しました。</p>



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

<a href="https://www.kazuban.com/blog/nc-gcode-02/" title="NCプログラム／Gコード　工具経路指令" 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="231" height="180" src="https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData.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.png 2048w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-300x233.png 300w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1024x797.png 1024w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-768x597.png 768w, https://www.kazuban.com/blog/wp-content/uploads/2019/11/NcData-1536x1195.png 1536w" sizes="(max-width: 231px) 100vw, 231px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">NCプログラム／Gコード　工具経路指令</div><div class="blogcard-snippet internal-blogcard-snippet">前回は、NCプログラムの概要を説明しました。今回は工具経路の図形を定義する指令に使用されるＧコードについて説明します。ここまで理解できれば、二次元の図形をＧコードで定義できるようになります。 絶対座標系と相対座標系 経路指令なので、「どこへ行け！」が基本になりますが「どこへ」の指令に２種類の指令方法...</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">www.kazuban.com</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2019.12.07</div></div></div></div></a>
</div></figure>



<p class="wp-block-paragraph">絶対座標系(G90)の場合には、原点基準からのＸ軸やＹ軸の移動位置は、比較的イメージできますが、相対座標系(G91)モードの場合は、次の移動位置はわかりますが、全体的な図形形状はなかなかイメージできません。<br>さらに、「I」「J」円弧の場合はその中心と半径も、電卓を叩かないとわかりませんね。<br>NCデータの最終確認用として、加工輪郭の図形情報を表示するソフトを作ってみました。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-18" checked><label class="toc-title" for="toc-checkbox-18">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ＮＣデータから、図形輪郭確認</a><ol><li><a href="#toc2" tabindex="0">図形要素</a></li><li><a href="#toc3" tabindex="0">円弧の中心・半径の求め方</a></li><li><a href="#toc4" tabindex="0">電卓による確認</a></li></ol></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></ol></li><li><a href="#toc8" tabindex="0">NCプログラムの学習にも使用できそう！</a><ol><li><a href="#toc9" tabindex="0">エディタ機能</a></li><li><a href="#toc10" tabindex="0">例題</a></li><li><a href="#toc11" tabindex="0">エディタモード</a></li></ol></li><li><a href="#toc12" tabindex="0">ダウンロード</a></li><li><a href="#toc13" tabindex="0">開発環境</a></li><li><a href="#toc14" tabindex="0">まとめ</a><ol><ol><li><a href="#toc15" tabindex="0">注意点</a></li></ol></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ＮＣデータから、図形輪郭確認</span></h2>



<p class="wp-block-paragraph">最近は、ＣＡＤ／ＣＡＭを使用して、ＮＣデータを作成する場合がほとんどだと思いますが、２Ｄ輪郭形状で、工具径補正を利用して形状精度を加工する場合、最終的には、使用ＮＣデータと図面寸法を比較して確認したくなります。<br>確かに、ＣＡＤ上で輪郭スケッチと図面寸法を確認する事はできますが、ＮＣ機械はＣＡＤデータから直接動作するわけではありません。<br>ＣＡＤで輪郭を描いた後、ＣＡＭで工具径や補正、仕上げ代などを設定後、ポストプロセッサを経由して、最終的なＮＣデータが作成されます。<br>３Ｄ加工は、ＣＡＤ／ＣＡＭに任せるしかありませんが、精度が必要な２Ｄ輪郭は、ＮＣデータで確認したいと言うのが、このソフトの目的です。</p>



<h3 class="wp-block-heading"><span id="toc2">図形要素</span></h3>



<p class="wp-block-paragraph">基本的に、２Ｄ輪郭は、直線と円弧の連続です。<br>直線は、絶対座標(G90)であれば、ＮＣ指示の数値で始点終点が簡単にわかるので、その形状も簡単に理解できます。<br>ところが、円弧補間はちょっと面倒です。<br>Ｇコードでの円弧指示は、「I」「J」方式と「R」方式があります。<br>「R」方式であれば、その半径はすぐにわかりますが、「I」「J」方式の場合は簡単にはわかりません。<br>ただ、円弧の中心位置は、「I」「J」方式のほうが簡単だと思いますし、制御機などによっては、「R」方式には対応していないものもあります。<br>今回は、「I」「J」方式のみで検討しています。</p>



<h3 class="wp-block-heading"><span id="toc3">円弧の中心・半径の求め方</span></h3>



<p class="wp-block-paragraph"><a href="https://www.kazuban.com/blog/nc-gcode-02/" data-type="URL" data-id="https://www.kazuban.com/blog/nc-gcode-02/">詳細はこちらに書きましたが</a>、円弧の半径は</p>



<figure class="wp-block-image is-resized size-large"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2019/12/半径.png" alt="" width="338" height="134"/></figure>



<p class="wp-block-paragraph">で求めることができます。<br>また、円弧中心と「I」「J」の関係は</p>



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



<p class="wp-block-paragraph">円弧の始点から見た、中心座標までの、相対位置です。<br>「I」はX軸、「J」はY軸になります。<br>逆算すると、円弧の中心座標を（Xｃ、Yｃ）とすると</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><br>Xc = 始点のX座標 + I<br>Yc = 始点のY座標 + J</p></blockquote>



<p class="wp-block-paragraph"><br>となります。<br>ただしこれは、日本国内では始点から見た「相対座標」が一般的なのでこうなりますが<br>海外の制御機の場合には、「絶対座標」の場合もあるので、注意が必要です。<br>このソフトは、「相対方式」の「I」「J」のみに対応しています。</p>



<h3 class="wp-block-heading"><span id="toc4">電卓による確認</span></h3>



<p class="wp-block-paragraph">上記の計算式がわかれば、NCデータの一行（一ブロック）ごとに、計算する事で図形データと照合する事ができます。<br>部分的でも、この方法で確認する事で、ミスを見つける確率があがります。</p>



<h2 class="wp-block-heading"><span id="toc5">ソフトを作ろう！</span></h2>



<p class="wp-block-paragraph">でもやっぱり、電卓は面倒。<br><a href="https://www.kazuban.com/blog/category/c-builder/">C++Builder を利用して</a>、輪郭の情報を表示するソフトを作成する事にします。<br>図面と照合する時に一番ほしいのは、円弧の中心と半径です<br>こんな仕様とします。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>この情報は、リアルタイムに表示するようにして、工具径補正モードかどうかも<br>分かるようにします。<br>相対座標系、絶対座標系、両方に対応できるようにします。<br>ただし、半径指示は、「I」「J」のみとします。<br>「R」指示は、１８０°以上とか以下とかいろいろ面倒そうなので、<br>非対応とします<br>そして、やっぱり、図形が描画できるようにしたいと思います<br>私のレベル的に、２D表示までです。<br>３Dはちょっと敷居が高いです。<br>次期バージョンでは対応したいと思っていますが<br>キャンパスサイズの変更や拡大縮小にも現バージョンでは未対応。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc6">こんなイメージ</span></h3>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/soft-image.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/soft-image-1024x690.png" alt=""/></a></figure>



<p class="wp-block-paragraph">ソフトのウィンドウ上に、NCデータをドロップすれば、解析を始めます<br>キーボードの矢印キーで、一行づつ、表示していきます。<br>マウスでNCデータをクリックすると、そこまで連続で移動します。</p>



<h3 class="wp-block-heading"><span id="toc7">小容量のデータが対象です。</span></h3>



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



<p class="wp-block-paragraph">大容量のデータでも表示できますが、私のソフト開発のレベルの問題でかなりレスポンスが悪いです。<br>私の環境で試したところ、600KB 30000行ぐらいのデータで、<br>読込みに、約30秒。全行描画に約1分　かかります。<br>基本的なポリシーは、NCデータの図形要素の確認なので、２D輪郭の確認用と言うことで了承ください。</p>



<h2 class="wp-block-heading"><span id="toc8">NCプログラムの学習にも使用できそう！</span></h2>



<p class="wp-block-paragraph">新人さんが入社して来たとき、NCプログラムを指導した事がありました。<br>その時に、適当な図形の例題を出して、NCデータで図形を定義させたのですが<br>その確認が面倒でした。<br>その時は、別のシミュレーションソフトで、新人さんが作成したデータを確認したのですが、そういった用途にも使用できそうです。</p>



<h3 class="wp-block-heading"><span id="toc9">エディタ機能</span></h3>



<p class="wp-block-paragraph">他のエディタで、NCプログラムを手入力して保存し、そのファイルをドロップすれば、一行づづ確認できますが、せっかくなのでこのソフトにも簡易エディタ機能を追加してみました。</p>



<h3 class="wp-block-heading"><span id="toc10">例題</span></h3>



<p class="wp-block-paragraph">試しに、この図形を手打ちで定義してみましょう！<br></p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Sample.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Sample-1024x631.png" alt=""/></a></figure>



<h3 class="wp-block-heading"><span id="toc11">エディタモード</span></h3>



<p class="wp-block-paragraph">ソフトが立ち上がったら、「Edit」を選択すると、入力モードになります</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/edit-mode-start.png" alt=""/></figure>



<p class="wp-block-paragraph">最近手打ちなんてやってませんが、久しぶりに、例題の図形の輪郭を手打ちでＮＣプログラムしてみましょう！</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Read.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Read.png" alt=""/></a></figure>



<p class="wp-block-paragraph">入力途中でも、「読込み」ボタンで、確認モードに戻ります。<br>「確認モード」では、矢印キーで、一行づつ確認できます。<br>「Check」と「Edit」を行き来しながら、確認しながら手打ち作業ができます。</p>



<figure class="wp-block-image size-large"><a href="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Error-1.png" target="_blank"><img decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/Error-1.png" alt=""/></a></figure>



<p class="wp-block-paragraph">円弧補間で入力ミスや定義がおかしいと、中心や半径が黄色の表示になります。<br>再度、「Edit」モードに移り、修正します。</p>



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



<div class="wp-block-media-text alignwide is-stacked-on-mobile"><figure class="wp-block-media-text__media"><img loading="lazy" decoding="async" width="410" height="275" src="https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad.png" alt="" class="wp-image-3399 size-full" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad.png 410w, https://www.kazuban.com/blog/wp-content/uploads/2020/09/DownLoad-300x201.png 300w" sizes="(max-width: 410px) 100vw, 410px" /></figure><div class="wp-block-media-text__content">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><a href="https://www.kazuban.com/blog/free_soft/#Soft04">こちらから、ダウンロードできます。</a><br><a href="https://www.vector.co.jp/soft/winnt/business/se521853.html">Vector へは新バージョンの登録が完了しました</a></p></blockquote>
</div></div>



<h2 class="wp-block-heading"><span id="toc13">開発環境</span></h2>



<p class="wp-block-paragraph"><a href="https://www.embarcadero.com/jp/products/cbuilder/starter" data-type="URL" data-id="https://www.embarcadero.com/jp/products/cbuilder/starter">C++Builder Community Edition を使用しています</a><br>このような、ソフトウェア開発環境を無料で提供していただいて<br>感謝！です。</p>



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



<p class="wp-block-paragraph">NCデータの座標確認を簡単にできないか？<br>の目的でこのソフトを作成しました。<br>おまけとして、エディタ機能も追加したので、手打ちでのNCプログミングやＧコードの学習にも使用できると思います。</p>



<h4 class="wp-block-heading"><span id="toc15">注意点</span></h4>



<ul class="wp-block-list"><li>XY平面（G17）のみの対応です。<br>Z軸も情報としては表示しますが、描画は、XYのみとなります。</li><li>始点と終点が同じ、３６０°真円には対応していません。<br>半円に分割して定義してください。</li><li>ファナック系の場合、座標値指令の小数点の「有り」「無し」で<br>単位が変わる場合がありますが、このソフトは対応していません。<br>互換性のためには、基本的に小数点使用をお勧めします。</li><li>等高線などの、３Dパスも読み込み可能ですが、データ容量が多くなるとレスポンスはかなり悪くなります。<br>待てない場合には、「強制終了」で終了してください。</li><li>拡大・縮小や、キャンパスのサイズがデフォルトよりも大きくできません<br>プログラムミング方法を検索中です。<br>できそうであれば、次回バージョンで対応予定です。</li></ul>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/nc-check/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>カスタムマクロで段取り支援</title>
		<link>https://www.kazuban.com/blog/custom-macro/</link>
					<comments>https://www.kazuban.com/blog/custom-macro/#comments</comments>
		
		<dc:creator><![CDATA[kazuban]]></dc:creator>
		<pubDate>Mon, 27 Jul 2020 07:45:11 +0000</pubDate>
				<category><![CDATA[NC]]></category>
		<category><![CDATA[Fanuc]]></category>
		<category><![CDATA[NCプログラム]]></category>
		<category><![CDATA[カスタムマクロ]]></category>
		<category><![CDATA[ファナック]]></category>
		<guid isPermaLink="false">https://www.kazuban.com/blog/?p=3109</guid>

					<description><![CDATA[オプション扱いの場合もありますが、CNC制御にはNCデータを操作したり、制御機のデータを読み書きしたりできる、マクロと呼ばれているプログラム機能があります。マクロは、簡易的ですがプログラミング的な言語構造と変数を使用でき [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">オプション扱いの場合もありますが、CNC制御にはNCデータを操作したり、制御機のデータを読み書きしたりできる、マクロと呼ばれているプログラム機能があります。<br>マクロは、簡易的ですがプログラミング的な言語構造と変数を使用できるため、NCプログラムをパラメータ化して汎用的なプログラムを作成する事ができます。<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-20" checked><label class="toc-title" for="toc-checkbox-20">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ファナック・カスタムマクロ</a><ol><li><a href="#toc2" tabindex="0">変数</a></li><li><a href="#toc3" tabindex="0">カスタムマクロの変数</a></li><li><a href="#toc4" tabindex="0">変数への代入と使用方法</a></li><li><a href="#toc5" tabindex="0">演算</a></li></ol></li><li><a href="#toc6" tabindex="0">システム変数</a><ol><li><a href="#toc7" tabindex="0">工具補正量</a></li><li><a href="#toc8" tabindex="0">位置情報</a></li><li><a href="#toc9" tabindex="0">ワーク座標系の機械座標系からのオフセット量</a></li></ol></li><li><a href="#toc10" tabindex="0">ワーク上面をワーク座標系Z座標に登録するマクロを作成してみましょう！</a><ol><li><a href="#toc11" tabindex="0">工具長既知のマスター工具を用意する</a></li><li><a href="#toc12" tabindex="0">マスター工具先端とワーク上面（素材）を合わせる</a></li><li><a href="#toc13" tabindex="0">工具の長さを工具長補正へ登録する</a></li></ol></li><li><a href="#toc14" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ファナック・カスタムマクロ</span></h2>



<p class="wp-block-paragraph">一例としてワーク原点や工具情報の設定など、段取り支援プログラムを作成してみようと思います。<br>カスタムマクロはプログラムの一種なので言語的規則がありますが、ここでは基本的な構造や文法など掘り下げて説明はしていません。<br>また今回の例では、変数以外の構文はそれほど使用しません。<br>変数への代入・読み込み程度で作成するので、プログラミング的な知識はそれほど必要ありません。<br>言語的トレーニングは、工作機メーカーさんのセミナーやネット上にも沢山情報があると思うので、興味ある方はそちらを参照してみてください。</p>



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



<p class="wp-block-paragraph">カスタムマクロに限らず、プログラム言語には「変数」という、ある期間データを記憶してく識別名があります。<br>この「変数」にデータを代入する事で、パラメータとして汎用的に使用する事ができるプログラムを作成する事ができます。<br>通常のプログラム言語では「変数」には、「数値」や「文字」などいろいろな「データ型」を代入する事ができますが、ファナックのカスタムマクロは「数値」しか代入できません。<br>このことからも、複雑なプログラムを行う言語ではなく、NCデータをパラメータ化して、汎用的なＮＣに進化させる言語だといえます。</p>



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



<p class="wp-block-paragraph">ファナックの変数は、「#」+「数字」の形しか使用できません。<br>さらに、数字の範囲により、「ローカル変数」「コモン変数」「システム変数」と分類されています。<br>さらに、マクロ呼び出しで数値を引数で渡す場合、非常にわかりづらい仕様になっています。<br>こういった制限のため、コメントをうまくつけないと、他人のマクロや自分作でも時間がたつと、理解できないプログラムになってしまいます。<br>ＣＡＭがまだ普及していなかった時代には、その使いづらさにも負けず、マクロを駆使して穴あけやポケット加工を汎用化して生産性をあげている削り屋さんがいましたね～<br>興味あるかたは、ネットなどで検索してください。<br>便利なマクロが落っこちているかも？しれませんよん！<br>ここでは、主に「ローカル変数：#1～#33」と「システム変数：#1000以上」のみでプログラムしてみようと思います。</p>



<h3 class="wp-block-heading"><span id="toc4">変数への代入と使用方法</span></h3>



<p class="wp-block-paragraph">代入方法は、「# 数字」=「数値」となります。</p>



<pre class="wp-block-preformatted">#1 = 100.123
#2 = -50.987
と定義する事で、#1 と　#2 に右辺のデータが記憶されます。
この変数を通常のＮＣプログラムに使用すると、通常の定数指示と同様に使用する事ができます
G01 X#1 Y#2 F2000　→　G01 X100.123 Y-50.987 F2000 と同様</pre>



<h3 class="wp-block-heading"><span id="toc5">演算</span></h3>



<p class="wp-block-paragraph">「変数」は四則演算や三角関数など、ある程度の演算機能ももっています<br>うまくマクロで演算させる事で、マクロ内で面倒な計算をさせる事ができます。<br>例えば、主軸の回転数は、切削速度（Vc）と工具径（D）から次の計算式で求める事ができます。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="230" height="212" src="https://www.kazuban.com/blog/wp-content/uploads/2020/07/Rpm.png" alt="" class="wp-image-3118"/></figure>



<p class="wp-block-paragraph">この計算式を使い、工具径と切削速度を変数に代入する事で、主軸回転数を自動的に計算するマクロを作成してみます。</p>



<pre class="wp-block-preformatted">%
O1000
G90G00G17G40G80G49
(++++++++++++++++++++)
<strong>#1=1.   (Tool)
#2=10.3 (Dia)
#3=20.  (Vc)</strong>
(+++++++++++++++++++)
<strong>#10=[ #3 * 1000. / 3.14 / #2 ] (SP)</strong>
(+++++++++++++++++++)
G54
N0001
<strong>T#1</strong>
M06
G90G00X0Y0
G43Z100.<strong>H#1</strong>
Z50.0
<strong>S#10</strong> M03
M08
G98G83R5.0Z-20.0Q10.0F120L0
X10.0 Y0
X20.0 Y0
X30.0 Y0
G80
M09
G91G28Z0
G91G49Z0
G90M05
M30
%</pre>



<p class="wp-block-paragraph">こんな感じですね。<br>上部の、#2,#3 の工具径と切削速度の変数を編集する事で、自動的に回転数を決定できます。<br>また、#1に工具番号を設定しますが、工具番号と工具長補正番号に一定のルール（この例題の場合では、T番号＝H番号）がある場合には、H番号も変数化できます。<br>このように、変数を利用してパラメータ化する事で、汎用的なプログラムを作成する事ができます。<br>今回は、３つの変数しか使用していませんが、変数が「#」+「数値」の形なので変数が多くなると、変数が何を示しているのかわからなくなってきます。<br>そんな意味でも変数はなるべく利用者が分かりやすいように、上部にまとめて、コメントを入れておくことをお勧めします。<br>マクロプログラムに慣れてくると、ポケット加工やヘリカル穴あけなどよく使う形状はCAMなしでも利用できるようになります。<br>具体例は、ネット上でも公開されていますので、検索してみてください。</p>



<h2 class="wp-block-heading"><span id="toc6">システム変数</span></h2>



<p class="wp-block-paragraph"><span class="markerPink">「<strong>システム変数</strong>」は、<strong>工具情報や現在位置</strong>、<strong>ワーク座標系位置</strong>など制御機の内部データが記録されている、特殊な変数</span>です。<br>この変数を操作する事で、段取り時に必要な、工具長補正値設定、ワーク座標系設定などをプログラム化する事ができます。<br>下記、手元の資料を抜粋しますが、制御機のバージョンやオプションの状況により変数番号が変わる場合があります。<br> もし、実際に使用する場合には、お使いの制御機の取説でご確認ください。</p>



<h3 class="wp-block-heading"><span id="toc7">工具補正量</span></h3>



<ul class="wp-block-list"><li>変数番号の範囲は、補正番号<br>（例）D01 : #2001　　D02 : #2002<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>工具補正メモリA<br>#2001 ～  #2200<br>#10001 ～ #10999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>工具補正メモリB：パラメータNo.6000#3=0<br>#2001 ～ #2200　：　工具補正量（摩耗）<br>#10001 ～ #10999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2201 ～ #2400　：　工具補正量（Hコード・形状）<br>#11001 ～ #11999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>工具補正メモリB：パラメータNo.6000#3=1<br>#2001 ～ #2200　：　工具補正量（形状）<br>#10001 ～ #10999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2201 ～ #2400　：　工具補正量（Hコード・摩耗）<br>#11001 ～ #11999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>工具補正メモリC：パラメータNo.6000#3=0<br>#2001 ～ #2200　：　工具補正量（Hコード・摩耗）<br>10001 ～ #10999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2201 ～ #2400　：　工具補正量（Hコード・形状）<br>#11001 ～ #11999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#12001 ～ #12999　：　工具補正量（Dコード・摩耗）<br>#13001 ～ #13999　：　工具補正量（Dコード・形状）<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>工具補正メモリC：パラメータNo.6000#3=1<br>#2001 ～ #2200　：　工具補正量（Hコード・形状）<br>10001 ～ #10999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2201 ～ #2400　：　工具補正量（Hコード・摩耗）<br>#11001 ～ #11999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2401 ～ #2600　：　工具補正量（Dコード・形状）<br>#12001 ～ #12999<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br>#2601 ～ #2800　：　工具補正量（Dコード・摩耗）<br>#13001 ～ #13999</li></ul>



<h3 class="wp-block-heading"><span id="toc8">位置情報</span></h3>



<ul class="wp-block-list"><li>変数番号の範囲は、軸番号<br>（例）X軸の現在位置：#5021　Y軸の現在位置：#5022　Z軸の現在位置：#5023<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>直前の終点位置（ワーク座標系）<br>#5001 ～ #5020<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>現在位置（機械座標系）<br>#5021 ～ #5040<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>現在位置（ワーク座標系）<br>#5041 ～ #5060</li></ul>



<h3 class="wp-block-heading"><span id="toc9">ワーク座標系の機械座標系からのオフセット量</span></h3>



<ul class="wp-block-list"><li>変数番号の範囲は、軸番号<br>（例）G54のX軸の機械座標系位置：#5221　Y軸の現在位置：#5222　Z軸の現在位置：#5223<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>G54ワーク原点オフセット量<br>#5221 ～ #5240<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>G55ワーク原点オフセット量<br>#5241 ～ #5260<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</li><li>G56ワーク原点オフセット量<br>#5261 ～ #5280<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G57ワーク原点オフセット量<br>#5281 ～ #5300<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G58ワーク原点オフセット量<br>#5301 ～ #5320<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G59ワーク原点オフセット量<br>#5321 ～ #5340<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G54.1P1　拡張ワーク原点オフセット量<br>#7001 ～ #7020<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G54.1P2　拡張ワーク原点オフセット量<br>#7021 ～ #7040<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li><li>G54.1P3 ～<br>#7041 ～ <br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</li></ul>



<h2 class="wp-block-heading"><span id="toc10">ワーク上面をワーク座標系Z座標に登録するマクロを作成してみましょう！</span></h2>



<p class="wp-block-paragraph">加工段取りで、素材（ワーク）を機械テーブルへ載せた後は、その素材の位置関係を機械へ教えてあげる必要があります。<br>最近では、座標系はワーク座標系を使用する方法が一般的だと思いますので、ワーク座標系のシステム変数を操作してみようと思います。<br>これから作成するマクロは、主軸端面が素材上面へ接触する位置を、ワーク座標系の「Z0.000」として登録するマクロを作成してみます。</p>



<h3 class="wp-block-heading"><span id="toc11">工具長既知のマスター工具を用意する</span></h3>



<p class="wp-block-paragraph">これから作成するマクロは、すでに工具長がわかっている工具（マスター工具）を利用します。<br>必ずしも専用マスター工具を用意する必要はなく、すでに工具長が制御機の工具長補正項目に登録されている工具でOKです。<br>工具長補正値は、主軸端面からマスター工具先端までの長さがプラス値で入っている仕様だとします。<br>専用マスター工具は必須ではありませんが、基準工具として、マスター工具を用意しておいたほうが便利な場面もあるで、ATCに余裕があれば準備しておくことをお勧めします。<br>もし、工具長既知の工具がない場合、手動による、工具長補正データの登録方法を以前に説明してありますので、下記を参考にしてみてください。</p>



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

<a href="https://www.kazuban.com/blog/lenrth-compensation/" title="ＮＣプログラム／工具長補正" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://www.kazuban.com/blog/wp-content/uploads/cocoon-resources/blog-card-cache/5730f7288869ebd513ed8153faf3e19c.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">ＮＣプログラム／工具長補正</div><div class="blogcard-snippet external-blogcard-snippet">前回は「工具径補正」について説明しました。これは、定義されている輪郭（工具経路）を制御機に再定義（オフセット）させる指令です。この機能により、使用工具径や加工状況に合わせて「輪郭」を再定義し直す処理が省略できます。ただし、あくまでも定義輪郭...</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.kazuban.com/blog/length-compensation/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.kazuban.com</div></div></div></div></a>
</div></figure>



<h3 class="wp-block-heading"><span id="toc12">マスター工具先端とワーク上面（素材）を合わせる</span></h3>



<p class="wp-block-paragraph">まずは手動で主軸端面とワーク上面を合わせる場合を考えてみます。<br>マスター工具を主軸へ呼び出し、ワーク上面へ置いた長さ既知のゲージへ接触する直前位置まで工具をおろします。<br>強く接触させてしまうと、マスター工具が破損してしまうので、十分注意いて、ブロックゲージを動かしながら接触位置を確認してください。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="718" height="568" src="https://www.kazuban.com/blog/wp-content/uploads/2020/01/工具長１.png" alt="" class="wp-image-1634" srcset="https://www.kazuban.com/blog/wp-content/uploads/2020/01/工具長１.png 718w, https://www.kazuban.com/blog/wp-content/uploads/2020/01/工具長１-300x237.png 300w" sizes="(max-width: 718px) 100vw, 718px" /></figure>



<p class="wp-block-paragraph">この時点での、<span class="markerPink"><strong>機械座標系</strong></span>を読み取ります。<br>主軸端面がワーク上面へ接触する位置は、現高さから<br>「ブロックゲージ高さ（50.000)」+「マスター工具長」だけ下がった位置となります。<br>「Zワーク座標」＝「現機械座標値」-「ゲージ厚」-「マスター工具長」<br>になります。<br>この値を、使用するワーク座標系Z値へ登録すればOKですが、この作業をマクロにやらせてみようと思います。<br>X、Yの原点は、すでに使用ワーク座標系に登録済みとします。</p>



<pre class="wp-block-preformatted">%
O8001(SET TO WORK Z)
(--------------------)
#1=54. (WORK COORDINATE)
#2=50. (GAUGE)
#3=29. (MASTER T-NO)
#4=29. (MASTER H-NO)
(--------------------)
#11=#0
#12=#0
#13=#0
(--------------------)
G17G00G90
T[#3]M6
G#1X0Y0
#3006=1(Z MEASURE)
M00
#11=#[11000+#4] (LENGTH OF MASTER TOOL)
#12=#5023-#2 (CURRENT_MACHINE_Z - GAUGE)
#13=[#1*20+4143] (Z OF WORK COORDINATE NUMBER)
#[#13]=#12-#11
G91G28Z0
M30
%</pre>



<p class="wp-block-paragraph">こんな感じでしょうか？<br>一つ、#3006=1(****)という特殊な変数を使用しています。<br>これは、(****)の文字列を画面に表示して停止する変数です。<br>ここでは、画面に「Z MEASURE」を表示して停止するので、<strong>ハンドルモード</strong>でマスター工具先端を、ブロックゲージ上面に合わせる操作を促しています。<br> #11=#[11000+#4]  は、#11=<strong>#11029</strong> となりますね。<br>#11029 は上記のシステム変数リストで確認してください。<br>今回は「工具補正メモリB：パラメータNo.6000#3=1」の機械の場合を想定しています。<br>H<strong>29</strong> の補正に登録されているデータを、#11に代入するの意味となります。<br>次の、#12=#5023-#2 は、#5023が現在のZ機械座標ですから、<br>「現機械座標値」-「ゲージ厚」を#12に代入する意味となります。<br>つまり、T<strong>29</strong>（マスター工具）の先端が、ワーク上面と接触する位置となります。<br>#13=[#1×20+4143] がちょっとポイントでしょうか？<br>上記のシステム変数のリストから、ワーク座標系・G54の<strong>Z値</strong>は、<strong>#5223</strong>です。<br>G55の<strong>Z値</strong>は、<strong>#5243</strong>ですね。<br><span class="markerYellow">ワーク座標系番号が増えると、システム変数値は、<strong>20</strong> 増えています。</span><br>したがって、ワーク座標番号からシステム変数を求める方法は、<br>システム変数＝「ワーク座標系番号」× 20 + 4143 で求められますね。<br>G54の場合、#13 = 54×20+4143 = 5223　となります<br><span class="markerPink">#[#13] は、#5223 と同じ意味です。</span><br> 整理すると、<br>#11 が、マスター工具長<br>#12がマスター工具がワーク上面と接触する位置なので<br>主軸端面が、ワーク上面と接触する位置は、#12-#11　となります。<br>この値を、使用する<strong>G54のZ値：#5223</strong>へ<strong>代入</strong>する事で、G54ワーク座標系のZ値を設定できます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>実際の操作は、マスター工具に交換して停止したのち、ハンドルモードへ切換、マスター工具先端を、ブロックゲージ上面に合わせ、再度メモリモードでサイクルスタートすれば、ワーク（素材）上面の機械座標系Z値が、ワーク座標系へ登録されます。</p></blockquote>



<h3 class="wp-block-heading"><span id="toc13">工具の長さを工具長補正へ登録する</span></h3>



<p class="wp-block-paragraph">次に、使用する工具の長さを測定し、工具長補正番号へ登録するマクロを作成してみましょう。<br>方法の概略は</p>



<ul class="wp-block-list"><li>事前にワーク（素材）原点・上面のワーク座標系を設定しておく</li><li>長さ既知の工具（マスター工具）を使用する</li><li>測定したい工具と工具交換し、<strong>ハンドルモード</strong>で、ブロックゲージと接触するZ位置へ移動する。</li><li>その時の、Z軸機械座標位置とマスター工具の接触位置との差により、対象の工具の長さを求める</li><li>求めた長さを、工具長補正番号へ入力する</li></ul>



<p class="wp-block-paragraph">こんな感じのマクロを作成してます。</p>



<pre class="wp-block-preformatted">%
O8002(MEASURE TOOL LENGTH)
(--------------------)
#1=54. (WORK COORDINATE)
#2=50. (GAUGE)
#3=1. (T-NO)
#4=1. (H-NO)
#5=29.(MASTER_TOOL_H-NUMBER)
(--------------------)
#11=#0
#12=#0
#13=#0
#14=#0
(--------------------)
#11=[#1*20+4143] (Z of work coordinate)
#12=#[#11]+#[11000+#5]+#2 (MASTER_TOOL_GAUGE_HIGHT)
G17G00G90
T[#3]
M06
G[#1]G00X0Y0
G90
#3006=1(Z MEASURE ON HANDLE_MODE)
M00
#13=#12-#5023 (Difference from MASTER-TOOL)
#14=#[11000+#5]-#13 (Length of TOOL)
#[11000+#4]=#14 (Saving Tool-Length-Offset.)
G91G28Z0
M30
%</pre>



<p class="wp-block-paragraph">#11 で指定ワーク座標系のZ軸情報のシステム変数番号を求めます<br>#12 でワーク座標系Z値とマスター工具長とブロックゲージ高さから、マスター工具がブロックゲージへ接触する機械座標を求めます<br>対象工具と工具交換後、#3006 で機械が停止するので、ハンドルモードへ切換、ブロックゲージと接触させます。<br>#13で、その時の機械座標値とマスター工具が接触する機械座標値（#12）の差を求めます。<br>#14で、マスター工具長と対象工具長とマスター工具長の差（#13）から、対象工具長を求めています。<br>#[11000+#4]=#14　で、対象工具長補正番号へ書き込みます </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>実際の操作は、ワーク（素材）のXYZ原点のワーク座標系への登録は終了していて、マスター工具の工具長も工具長補正へ登録済みが条件となります。<br>プログラムをスタートすると、測定する工具へ工具交換後、停止します。<br>ハンドルモードへ切換、ブロックゲージ上面へ工具先端を合わせます。<br>再度、メモリモードへ戻し、サイクルスタートで、工具長補正番号へ工具長さが登録されます。</p></blockquote>



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



<p class="wp-block-paragraph">今回は、マスター工具を利用して、ワーク（素材）Z軸のワーク座標値の設定と、任意工具の工具長補正値設定をカスタムマクロで作成してみました。<br>カスタムマクロは、マクロ呼び出し機能により、固定サイクル的な機能をユーザー側でも作成するのが、もともとの目的のような気がしていますが、<br>単純な変数を使用するだけでも、便利な場合があります。<br>例えばシステム変数を利用すれば、工具長補正だけでなく、工具径補正へもプログラムから書き込み可能ですから、<br>工具径補正を使用する場合、プログラムの最初に、デフォルトの工具径補正値を設定しておくと、機械側での入力忘れなどの対策にもなると思います。<br>また、今回説明のシステム変数を利用する事で、機械の現時点の情報をプログラム側へ取り込む事ができます。<br>そのことを利用して、さまざまな処理をさせることも可能となります。<br>その一例として、簡単なシステム変数の操作を紹介しました。<br>ただし、今回のプログラムは実機では検証しておりませんので、実際に利用する場合には十分に確認の上、自己責任で使用してください。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kazuban.com/blog/custom-macro/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		
			</item>
	</channel>
</rss>
