カスタムマクロの読みやすい書き方を考えてみる

カスタムマクロ

サイトへのコメントで記事ネタをいただきました。
確かに、ネットなどで調べても、変数や分岐などの構文の書き方を説明している記事は
よく見かけますが、読みやすさや保守を題材にした記事はあまり見つかりません。
筆者自身ほとんど独学なので、はたして的を射た記事になるのかは、「?」ですが、
自分の経験から、考えてみようと思います。
ご意見やアドバイスなどいただければ、うれしいです。

変数

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

とりあえず、ローカル変数(#1~#33)を使おう

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

変数宣言

C言語などは、これから「使う変数名」を必ず変数宣言をする必要がありますが
必須でない言語も多くあります。
カスタムマクロも

#1=50.0
G00 X#1

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

(—————————)
#10=#0 (Tool Length)
#11=#0 (T)
#12=#0 (V)
#13=#0 (f)
#14=#0 (SP)
#15=#0 (F)
(————————–)

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

コメント

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

ユーザー設定パラメータ

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

ユーザー定義変数

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

G90G00G17G40G80G49
(++++++++++++++++++++)
#1=54. (WORK ORIGIN)
#2=5.7 (Hole Dia)
#3=-16.0 (Drill Shoulder Heigth)
#4=0.0 (Surface Coordinat)
#5=50.0 (Initial Point)
#6=5.0 (R Point)
#7=3.0 (Q )
#8=8. (Coolant )
(+++++++++++++++++++)

・ 

このように、上部にまとめておき、利用者の編集部分は、コメント文で区切りをいれ
分かりやすくしておきます。

マクロ仕様の説明

プログラム最上部には、そのマクロの説明や、バージョン、作成日、作成者など
記入しておくと、管理しやすくなります。

%
O1234
(+++++++++++++++++++++++++++++++)
( Drill Program Ver1.0 )
( 2023-02-18 By Kazuban)
(++++++++++++++++++++++++++++++)

ファイル名仕様

コントローラによっては、「O番号」でなく、ファイル名が使用できる機械もあります。

%
O1234

%
<DRILL.NC>

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

M98<DRILL.NC>

G65<DRILL.NC>A5.7B2

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

マクロ呼び出し(G65、G66)の引き数

マクロ呼び出しでマクロプログラムを呼び出す場合、引数を指定して変数を渡す事ができます。
したがって、上の例のように、プログラムを開いて変数を編集するのではなく
呼び出しの引き数で変数を設定する事ができます。
これは、便利なようですが、引数のワードに対応している変数番号がバラバラ
非常に分かりづらく間違いやすいです。

引数対応変数のコメントの活用

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

G90G00G17G40G80G49
(++++++++++++++++++++)
#1=54. (WORK ORIGIN)
#2=5.7 (Drill Dia)
#3=-16.0 (Drill Shoulder Heigth)
#4=0.0 (Surface Coordinat)
#5=50.0 (Initial Point)
#6=5.0 (R Point)
#7=3.0 (Q )
#8=8. (Coolant )
(+++++++++++++++++++)


(++++ Drill +++++++++)
(A:#1=#2_Drill Dia)
(B:#2=#3_Drill Shoulder Depth)
(C:#3=#4_Surface Coordinat)
(I:#4=#5_Initial Point)
(Q:#17=#7_Q)
(R:#18=#6_R Point)
(—- argument table ——)
(A:#1 B:#2 C:#3 I:#4 J:#5 K:#6 D:#7 E:#8 F:#9 H:#11 M:#13)
(Q:#17 R:#18 S:#19 T:#20 U:#21 V:#22 W:#23 X:#24 Y:#25 Z:#26)
(—— Drill Macro Read ——)
G65 P1234 A[#2] B[#3] C[#4] I[#5] Q[#7] R[#6]

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

モーダル情報変更の注意点

「G91は意外と便利」という記事で少しふれましたが、
複数個所に輪郭加工させるマクロを作成する場合、「G91」と「G66」を使うと結構便利です。
こちらで紹介しているサブプログラムをマクロ化すれば、真円切削するサイクルが作れます。
ところが、このようなモーダル情報をメインから呼び出されるマクロ内で
変更する場合には注意が必要です。

マクロ内でのG90,G91指令は注意

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

モーダル情報を得るシステム変数

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

★モーダル情報
 #4001~#4030
  下二桁はGコードグループ番号
  グループ01 : G00,G01,G02,G03,G04
  グループ03 : G90,G91
  グループ14 : G54,G55,G56,G57,G58,G59

 #4107 : Dコード
 #4109 : Fコード
 #4111 : Hコード
 #4113 : Mコード
 #4114 : シーケンス番号
 #4119 : Sコード
 #4120 : Tコード

★現在位置情報
 #5021~#5024 (X、Y、Z、4軸:機械座標系)
 #5041~#5044 (X、Y、Z、4軸:ワーク座標系)

G90、G91 の情報は、「#4003」
現在のワーク座標系での、Z軸座標は「#5043」
T番号は、「#4120」 から取り出せます。

マクロの最初で取り出し、終了前で戻す

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

#1=#4003 (G91orG90)
#2=#4120 (T No)
・・
T03 M06
G91
・・
・・
G[#1]
T[#2] M06
M99
%

サンプルデータ

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

メインプログラム

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

マクロ・サブプログラム

%
O0101
(++++++++++++++++++++)
( Circle Milling Macro Ver1.0 )
( 2023-02-18 By Kazuban)
(++++++++++++++++++++)
(————————)
(A:#1=#2_Ciecle Dia)
(B:#2=#3_Depth)
(C:#3=#4_Feed)
(I:#4=#5_Depth-Feed)
(J:#5=#6_Initial-Point)
(K:#6=#7_R-Point)
(D:#7=#8_D)
(————————)
#10=[#1/2](Circle_Radius)
#11=[#6-#5](To R-Point)
#12=[#2-#6](To Depth)
(————————)
#27=#4003
(————————)
G90 G00
Z[#5]
G91
Z[#11]
G01 Z[#12] F[#4]
G01 G41 X[#10] Y0.0 D[#7] F[#3]
G03 X[-#1] Y0.0 I[-#10]
G03 X[#1] Y0.0 I[#10]
G01 G40 X[-#10] Y0.0
G90 G00 Z[#5]
G[#27]
M99
%

加工位置データ

%
O1000
(++++++++++++++++++++)
( Hole Position )
(++++++++++++++++++++)
X50.Y50.
X50.Y-50.
X-50.Y-50.
X-50.Y50.
M99
%

まとめ

カスタムマクロを書く上においての、注意点や気にしたほうがいい点などまとめてみました。
メインプロだけの場合には、メインだけ確認すればいいですが、サブプロを呼び出す形式の場合
サブプロ内でのモーダル値の変更は、十分気を付ける必要があります。
マクロプログラムは、変数によりパラメータ化できるので、便利ではありますが「#」の羅列で
より分かりづらくなります。
使用する変数をまとめたり、コメント文をうまく使い、わかりやすくする工夫が必要です。

コメント

  1. おーの より:

    以前コメントさせて頂いた者です。
    カスタムマクロの書き方についてまとめて頂きありがとうございます。
    ファイル名仕様はうちでは使っていない機能だったので今度うちでもできるか試してみようと思います。
    うちの会社だとG91は極力使わず、コモンワーク原点オフセット量を弄ってG91のような多数個取りをやっていたような気がします。
    どれが正解とかはないですが、GitHubのように誰かが書いたコードを読んだりする機会がなかなかないので勉強になってよかったです。

    • kazuban kazuban より:

      こんにちは。
      マクロも言語の一種ですから、正解はないですね。
      ただ私が気にかけているのは、後々の自分も含めて、使用者が分かりやすく
      を考えて書くようにしています。
      自分のコードでも、すぐに忘れてしまいます・・

  2. ヤスノン より:

    初めまして
    縁あってマニアックな工作機械メーカーで働き始め機械の中の人です。
    カスタムマクロをゴリゴリ使って工作機械を作っています。
     マクロも世代からするとBASICあたりを理解していれば難しくないですが、
    NC文は慣れないですね...。
     そんな中こちらのサイトでNcCheckで手軽に試せて理解が進みます。

  3. kazuban kazuban より:

    ヤスノンさん、初めまして。
    コメントありがとうございます。
    実際の機械メーカーの方ですか・・頼もしいです
    私は、現在はあまり実機に触れなくなってきたので、投稿におかしいところなどありましたら
    是非、指摘してください。
    今後ともよろしくお願いします

タイトルとURLをコピーしました