オプション扱いの場合もありますが、CNC制御にはNCデータを操作したり、制御機のデータを読み書きしたりできる、マクロと呼ばれているプログラム機能があります。
マクロは、簡易的ですがプログラミング的な言語構造と変数を使用できるため、NCプログラムをパラメータ化して汎用的なプログラムを作成する事ができます。
ただし、制御機によってプログラム構文は違うため、違う制御機での互換性はありません。
今回はマクロの使用例として、ファナック系カスタムマクロのシステム変数から、座標系設定など段取りに利用できそうなマクロプログラムを作成してみます。
ファナック・カスタムマクロ
一例としてワーク原点や工具情報の設定など、段取り支援プログラムを作成してみようと思います。
カスタムマクロはプログラムの一種なので言語的規則がありますが、ここでは基本的な構造や文法など掘り下げて説明はしていません。
また今回の例では、変数以外の構文はそれほど使用しません。
変数への代入・読み込み程度で作成するので、プログラミング的な知識はそれほど必要ありません。
言語的トレーニングは、工作機メーカーさんのセミナーやネット上にも沢山情報があると思うので、興味ある方はそちらを参照してみてください。
変数
カスタムマクロに限らず、プログラム言語には「変数」という、ある期間データを記憶してく識別名があります。
この「変数」にデータを代入する事で、パラメータとして汎用的に使用する事ができるプログラムを作成する事ができます。
通常のプログラム言語では「変数」には、「数値」や「文字」などいろいろな「データ型」を代入する事ができますが、ファナックのカスタムマクロは「数値」しか代入できません。
このことからも、複雑なプログラムを行う言語ではなく、NCデータをパラメータ化して、汎用的なNCに進化させる言語だといえます。
カスタムマクロの変数
ファナックの変数は、「#」+「数字」の形しか使用できません。
さらに、数字の範囲により、「ローカル変数」「コモン変数」「システム変数」と分類されています。
さらに、マクロ呼び出しで数値を引数で渡す場合、非常にわかりづらい仕様になっています。
こういった制限のため、コメントをうまくつけないと、他人のマクロや自分作でも時間がたつと、理解できないプログラムになってしまいます。
CAMがまだ普及していなかった時代には、その使いづらさにも負けず、マクロを駆使して穴あけやポケット加工を汎用化して生産性をあげている削り屋さんがいましたね~
興味あるかたは、ネットなどで検索してください。
便利なマクロが落っこちているかも?しれませんよん!
ここでは、主に「ローカル変数:#1~#33」と「システム変数:#1000以上」のみでプログラムしてみようと思います。
変数への代入と使用方法
代入方法は、「# 数字」=「数値」となります。
#1 = 100.123 #2 = -50.987 と定義する事で、#1 と #2 に右辺のデータが記憶されます。 この変数を通常のNCプログラムに使用すると、通常の定数指示と同様に使用する事ができます G01 X#1 Y#2 F2000 → G01 X100.123 Y-50.987 F2000 と同様
演算
「変数」は四則演算や三角関数など、ある程度の演算機能ももっています
うまくマクロで演算させる事で、マクロ内で面倒な計算をさせる事ができます。
例えば、主軸の回転数は、切削速度(Vc)と工具径(D)から次の計算式で求める事ができます。
この計算式を使い、工具径と切削速度を変数に代入する事で、主軸回転数を自動的に計算するマクロを作成してみます。
% O1000 G90G00G17G40G80G49 (++++++++++++++++++++) #1=1. (Tool) #2=10.3 (Dia) #3=20. (Vc) (+++++++++++++++++++) #10=[ #3 * 1000. / 3.14 / #2 ] (SP) (+++++++++++++++++++) G54 N0001 T#1 M06 G90G00X0Y0 G43Z100.H#1 Z50.0 S#10 M03 M08 G98G83R5.0Z-20.0Q10.0F120L0 X10.0 Y0 X20.0 Y0 X30.0 Y0 G80 M09 G91G28Z0 G91G49Z0 G90M05 M30 %
こんな感じですね。
上部の、#2,#3 の工具径と切削速度の変数を編集する事で、自動的に回転数を決定できます。
また、#1に工具番号を設定しますが、工具番号と工具長補正番号に一定のルール(この例題の場合では、T番号=H番号)がある場合には、H番号も変数化できます。
このように、変数を利用してパラメータ化する事で、汎用的なプログラムを作成する事ができます。
今回は、3つの変数しか使用していませんが、変数が「#」+「数値」の形なので変数が多くなると、変数が何を示しているのかわからなくなってきます。
そんな意味でも変数はなるべく利用者が分かりやすいように、上部にまとめて、コメントを入れておくことをお勧めします。
マクロプログラムに慣れてくると、ポケット加工やヘリカル穴あけなどよく使う形状はCAMなしでも利用できるようになります。
具体例は、ネット上でも公開されていますので、検索してみてください。
システム変数
「システム変数」は、工具情報や現在位置、ワーク座標系位置など制御機の内部データが記録されている、特殊な変数です。
この変数を操作する事で、段取り時に必要な、工具長補正値設定、ワーク座標系設定などをプログラム化する事ができます。
下記、手元の資料を抜粋しますが、制御機のバージョンやオプションの状況により変数番号が変わる場合があります。
もし、実際に使用する場合には、お使いの制御機の取説でご確認ください。
工具補正量
- 変数番号の範囲は、補正番号
(例)D01 : #2001 D02 : #2002
—————————————————————— - 工具補正メモリA
#2001 ~ #2200
#10001 ~ #10999
—————————————————————— - 工具補正メモリB:パラメータNo.6000#3=0
#2001 ~ #2200 : 工具補正量(摩耗)
#10001 ~ #10999
——————————————————————
#2201 ~ #2400 : 工具補正量(Hコード・形状)
#11001 ~ #11999
—————————————————————— - 工具補正メモリB:パラメータNo.6000#3=1
#2001 ~ #2200 : 工具補正量(形状)
#10001 ~ #10999
——————————————————————
#2201 ~ #2400 : 工具補正量(Hコード・摩耗)
#11001 ~ #11999
—————————————————————— - 工具補正メモリC:パラメータNo.6000#3=0
#2001 ~ #2200 : 工具補正量(Hコード・摩耗)
10001 ~ #10999
——————————————————————
#2201 ~ #2400 : 工具補正量(Hコード・形状)
#11001 ~ #11999
——————————————————————
#12001 ~ #12999 : 工具補正量(Dコード・摩耗)
#13001 ~ #13999 : 工具補正量(Dコード・形状)
—————————————————————— - 工具補正メモリC:パラメータNo.6000#3=1
#2001 ~ #2200 : 工具補正量(Hコード・形状)
10001 ~ #10999
——————————————————————
#2201 ~ #2400 : 工具補正量(Hコード・摩耗)
#11001 ~ #11999
——————————————————————
#2401 ~ #2600 : 工具補正量(Dコード・形状)
#12001 ~ #12999
——————————————————————
#2601 ~ #2800 : 工具補正量(Dコード・摩耗)
#13001 ~ #13999
位置情報
- 変数番号の範囲は、軸番号
(例)X軸の現在位置:#5021 Y軸の現在位置:#5022 Z軸の現在位置:#5023
—————————————————————— - 直前の終点位置(ワーク座標系)
#5001 ~ #5020
—————————————————————— - 現在位置(機械座標系)
#5021 ~ #5040
—————————————————————— - 現在位置(ワーク座標系)
#5041 ~ #5060
ワーク座標系の機械座標系からのオフセット量
- 変数番号の範囲は、軸番号
(例)G54のX軸の機械座標系位置:#5221 Y軸の現在位置:#5222 Z軸の現在位置:#5223
—————————————————————— - G54ワーク原点オフセット量
#5221 ~ #5240
—————————————————————— - G55ワーク原点オフセット量
#5241 ~ #5260
—————————————————————— - G56ワーク原点オフセット量
#5261 ~ #5280
—————————————————————– - G57ワーク原点オフセット量
#5281 ~ #5300
—————————————————————– - G58ワーク原点オフセット量
#5301 ~ #5320
—————————————————————– - G59ワーク原点オフセット量
#5321 ~ #5340
—————————————————————–
—————————————————————– - G54.1P1 拡張ワーク原点オフセット量
#7001 ~ #7020
—————————————————————– - G54.1P2 拡張ワーク原点オフセット量
#7021 ~ #7040
—————————————————————– - G54.1P3 ~
#7041 ~
—————————————————————–
—————————————————————–
ワーク上面をワーク座標系Z座標に登録するマクロを作成してみましょう!
加工段取りで、素材(ワーク)を機械テーブルへ載せた後は、その素材の位置関係を機械へ教えてあげる必要があります。
最近では、座標系はワーク座標系を使用する方法が一般的だと思いますので、ワーク座標系のシステム変数を操作してみようと思います。
これから作成するマクロは、主軸端面が素材上面へ接触する位置を、ワーク座標系の「Z0.000」として登録するマクロを作成してみます。
工具長既知のマスター工具を用意する
これから作成するマクロは、すでに工具長がわかっている工具(マスター工具)を利用します。
必ずしも専用マスター工具を用意する必要はなく、すでに工具長が制御機の工具長補正項目に登録されている工具でOKです。
工具長補正値は、主軸端面からマスター工具先端までの長さがプラス値で入っている仕様だとします。
専用マスター工具は必須ではありませんが、基準工具として、マスター工具を用意しておいたほうが便利な場面もあるで、ATCに余裕があれば準備しておくことをお勧めします。
もし、工具長既知の工具がない場合、手動による、工具長補正データの登録方法を以前に説明してありますので、下記を参考にしてみてください。
マスター工具先端とワーク上面(素材)を合わせる
まずは手動で主軸端面とワーク上面を合わせる場合を考えてみます。
マスター工具を主軸へ呼び出し、ワーク上面へ置いた長さ既知のゲージへ接触する直前位置まで工具をおろします。
強く接触させてしまうと、マスター工具が破損してしまうので、十分注意いて、ブロックゲージを動かしながら接触位置を確認してください。
この時点での、機械座標系を読み取ります。
主軸端面がワーク上面へ接触する位置は、現高さから
「ブロックゲージ高さ(50.000)」+「マスター工具長」だけ下がった位置となります。
「Zワーク座標」=「現機械座標値」-「ゲージ厚」-「マスター工具長」
になります。
この値を、使用するワーク座標系Z値へ登録すればOKですが、この作業をマクロにやらせてみようと思います。
X、Yの原点は、すでに使用ワーク座標系に登録済みとします。
% 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 %
こんな感じでしょうか?
一つ、#3006=1(****)という特殊な変数を使用しています。
これは、(****)の文字列を画面に表示して停止する変数です。
ここでは、画面に「Z MEASURE」を表示して停止するので、ハンドルモードでマスター工具先端を、ブロックゲージ上面に合わせる操作を促しています。
#11=#[11000+#4] は、#11=#11029 となりますね。
#11029 は上記のシステム変数リストで確認してください。
今回は「工具補正メモリB:パラメータNo.6000#3=1」の機械の場合を想定しています。
H29 の補正に登録されているデータを、#11に代入するの意味となります。
次の、#12=#5023-#2 は、#5023が現在のZ機械座標ですから、
「現機械座標値」-「ゲージ厚」を#12に代入する意味となります。
つまり、T29(マスター工具)の先端が、ワーク上面と接触する位置となります。
#13=[#1×20+4143] がちょっとポイントでしょうか?
上記のシステム変数のリストから、ワーク座標系・G54のZ値は、#5223です。
G55のZ値は、#5243ですね。
ワーク座標系番号が増えると、システム変数値は、20 増えています。
したがって、ワーク座標番号からシステム変数を求める方法は、
システム変数=「ワーク座標系番号」× 20 + 4143 で求められますね。
G54の場合、#13 = 54×20+4143 = 5223 となります
#[#13] は、#5223 と同じ意味です。
整理すると、
#11 が、マスター工具長
#12がマスター工具がワーク上面と接触する位置なので
主軸端面が、ワーク上面と接触する位置は、#12-#11 となります。
この値を、使用するG54のZ値:#5223へ代入する事で、G54ワーク座標系のZ値を設定できます。
実際の操作は、マスター工具に交換して停止したのち、ハンドルモードへ切換、マスター工具先端を、ブロックゲージ上面に合わせ、再度メモリモードでサイクルスタートすれば、ワーク(素材)上面の機械座標系Z値が、ワーク座標系へ登録されます。
工具の長さを工具長補正へ登録する
次に、使用する工具の長さを測定し、工具長補正番号へ登録するマクロを作成してみましょう。
方法の概略は
- 事前にワーク(素材)原点・上面のワーク座標系を設定しておく
- 長さ既知の工具(マスター工具)を使用する
- 測定したい工具と工具交換し、ハンドルモードで、ブロックゲージと接触するZ位置へ移動する。
- その時の、Z軸機械座標位置とマスター工具の接触位置との差により、対象の工具の長さを求める
- 求めた長さを、工具長補正番号へ入力する
こんな感じのマクロを作成してます。
% 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 %
#11 で指定ワーク座標系のZ軸情報のシステム変数番号を求めます
#12 でワーク座標系Z値とマスター工具長とブロックゲージ高さから、マスター工具がブロックゲージへ接触する機械座標を求めます
対象工具と工具交換後、#3006 で機械が停止するので、ハンドルモードへ切換、ブロックゲージと接触させます。
#13で、その時の機械座標値とマスター工具が接触する機械座標値(#12)の差を求めます。
#14で、マスター工具長と対象工具長とマスター工具長の差(#13)から、対象工具長を求めています。
#[11000+#4]=#14 で、対象工具長補正番号へ書き込みます
実際の操作は、ワーク(素材)のXYZ原点のワーク座標系への登録は終了していて、マスター工具の工具長も工具長補正へ登録済みが条件となります。
プログラムをスタートすると、測定する工具へ工具交換後、停止します。
ハンドルモードへ切換、ブロックゲージ上面へ工具先端を合わせます。
再度、メモリモードへ戻し、サイクルスタートで、工具長補正番号へ工具長さが登録されます。
まとめ
今回は、マスター工具を利用して、ワーク(素材)Z軸のワーク座標値の設定と、任意工具の工具長補正値設定をカスタムマクロで作成してみました。
カスタムマクロは、マクロ呼び出し機能により、固定サイクル的な機能をユーザー側でも作成するのが、もともとの目的のような気がしていますが、
単純な変数を使用するだけでも、便利な場合があります。
例えばシステム変数を利用すれば、工具長補正だけでなく、工具径補正へもプログラムから書き込み可能ですから、
工具径補正を使用する場合、プログラムの最初に、デフォルトの工具径補正値を設定しておくと、機械側での入力忘れなどの対策にもなると思います。
また、今回説明のシステム変数を利用する事で、機械の現時点の情報をプログラム側へ取り込む事ができます。
そのことを利用して、さまざまな処理をさせることも可能となります。
その一例として、簡単なシステム変数の操作を紹介しました。
ただし、今回のプログラムは実機では検証しておりませんので、実際に利用する場合には十分に確認の上、自己責任で使用してください。
コメント
カスタムマクロの話で盛り上がるといいね(^_^)
懐かしがっていてはいかんのだけど…懐かしい...
CAMがまだ高価でそれほど普及していなかった時期は、マニアックなマクロ使いの削り屋さんがネット上にもたくさんいましたね~
3DCAMが簡単に手に入る今となっては、だんだん触る人も少なくなっているかもしれません
私としては、単純な穴あけやポケットなど、ハイデンハインが標準でもっているサイクルなどはマクロ化しておくと便利かなと思っています。
そんなところを今後とりあげてもいいかな?と思ってはいますが、
どうも、あの「#」変数と、「GOTO」を多用する言語構造は好きになれません。
それに、シミュレーションがもう少し簡単にならないと、動かすもの怖いです。
シミュレートできる機械にわざわざもっていったりしたことありましたが
フリーソフトでないですかね?
ぼくは MC-T というのを使わせてもらっています(作者の飯塚様に感謝)
ですがDOS時代、16bit環境のソフトですので最近のPC環境では動作できません。
なのでいまだにXP環境を持っています。
ごく基本的はマクロ文であれば解析できますが
最新のマクロ構文はエラーになってしまいます。
11M が使われていた頃のシステム変数でないと認識できませんので
あとで変数番号をエディタや文字置換ソフトで一括置換して使ったりします。
重要な部分でもあるので会社を去る前には NCVIEW あたりを導入しておきたいです。
がずばんさんなら自分でも作れちゃうのでは?
DOSですか・・
ウチにも、XP環境は残ってはいますが、もうほとんど立ち上げていませんね
自作も考えた事ありますが、変数の代入程度ならどうにかなりますが
言語形態をプログラム化するのはちょっと大変ですね
かといって、会社にはお金を出すほど必要性を求めている人も少ないです
ぼくはおしゃかをたくさん作ってきましたので
NCデータで描画確認しないととても心配なんですけど
若い後輩は(今私は担当してない)CAMのシミュレーションを
信用してるのかNCデータのチェックはあまりしていないように思います。
でも2~3年前、ソリッドシミュレーションやCLデータには異常がないのに
ポストしたNCデータがおかしかったという事もあったんですよ。
G02 G03 の円弧動作の時に変な動きをする事がありますね。
始点終点の座標に対してこの I,J の値はおかしいだろって時に
同じFANUCでも制御装置によって動きが違うことも経験してます。
もちろんこれは理屈に合ってないデータの場合です。
あるNCシミュレーションによってはエラーになるけど、ならないソフトもある。
なのでシミュレーションソフトではデータの不正を厳密にしていないとだめですね。
自動計測の乗っている機械をつかったことがないのですけど
あれはNCマクロでやってるのですか?
それとも独自のアプリケーションが乗ってるんでしょうか
ワイヤーカットでは計測のマクロを作ってやってました
ワイヤがセンサーになるんで壊れることがないのがいいです
まあ精度はそれなりですけど
私が知っているファナック系(sodick、OSPもかな?)の機械は、全てメーカー作成のマクロですね
O9000番台で提供されています。
メーカー提供なので、O番号など互換性がありません。
それを呼び出すマクロを作成してカプセル化すれば少しは互換性がでてくるかもしれませんが、引数なども違うので結構面倒です
ハイデンハインマシンは、制御機がサイクルとして提供しているので、互換性はかなり高いと思います。
もうだいぶ前になりますがMCで自動計測のオプションを付けた時
たくさんの計測パターンがありましたがすべてそれぞれ単独の
プログラム番号でした。それも半端なO6000番台でした。
対話画面は無かったのでマニュアルを開いて作業しないとならなかった。
とにかく計測パターンの選択と、引数をわかりやすく指示することが出来なかったので
導入講習の時にこのままでは使えんなと思ったものでした。
プログラムの中は常にミリとインチの状態を判断する処理が入っていて見づらかった。
Windowsがのっていて対話画面を持っているような機械であれば
すべてをマクロだけで処理する必要も無いかもしれませんね。
最近の機械の詳細はよく知りません。
O6000番ですか・・
確かに、ちょっと微妙な番号ですね。
プロテクトかけられないじゃないでしょうか?
いずれにしても、制御機は出しゃばらず動作以外は、機械メーカーへおまかせ!
な感じですね。
機械メーカーは独自性が出せていいかもしれませんが、いろんな機械を使いたいユーザー側としては、互換性がほしいですね
かずばんさん、やっと暑くなってきましたね。
ちょっと話の筋がそれてしまいますが
この投稿の冒頭に黄色い文字で表示されているマクロ文がありますよね。この中で
N20#529=#19*16+[#529AND15]
の文で #529AND15 というのは論理積ですよね。
これは2進数を理解していないと使えないですね。ぼくにはワケワカメです~
N21 から #19 の値が 0~3 に限定されるようにして #529 の値を決めているのはわかりますが
これは何を求めているのでしょうか。さしさわりがなければ教えて頂けませんか。
また説明するのがめんどくさいよ~という時は無視してくださいね。
むむ!
ZENKYUさんの探求心はすごいですね。
実はブログを作成する時には、「アイキャッチ画像」と言う、イメージ画像を登録します
登録しないと、そのの部分が「No Image」とかになってかっこ悪いです
イラストのセンスがあれば、自分で描くのですが、私には絵のセンスはまったくないので
エディタが表示された一部分を、取り込んでイメージにしています
それで、このイメージのマクロは、適当に機械のなかに入っていたマクロを
適当なところのみ抜粋した画像なんです。
なので、私もなんなのかわかりません(^^ゞ
私の感覚としたら、パラメータかなにか?で下4桁のどこかのビットが
「1」の場合の事ではないかなぁ~
すみせん、論理演算はほとんど使用したことないので、わかりませ~ん!
すみません、
かずばんさん、ありがとう。
関数なんかでも BCD[#j] ,BIN[#j] などの変換とか
LN[#j] , EXP[#j] などの対数や指数に関する使用解説は見かけたことがないですね。
FANUCのスクールではこういうところまで教えてくれるんでしょうかね。
数学の知識が必要になると思うのでカスタムスクールになるのかな。
ま、ちょっと気になっただけですので。
BCDやBINは、PMCインターフェースで使用するみたいです
自然対数なども、私は使用した事ありません。
演算指令で使用するのは、加減乗除、三角関数や、平方根(SQRT)、四捨五入(ROUND)、絶対値(ABS)、切り捨て(FIX)程度ですかね?
実際に、電卓でさえ、使用していない(理解していない)関数がたくさんあります!
はじめまして!
いつもカスタムマクロについての記事を参考にさせてもらっております。
私は今年で社会人2年目なのですが、去年にFANUCのカスタムマクロの講座の講座を受けさせてもらったときには他の参加者はいませんでした。牧野の研削盤でも同様のようです。
カスタムマクロ自体、ラダーほど書籍が出ている訳でもないので、この先、組むノウハウも工場からはなくなるのではないかと考えています。
そこでお願いなのですが、カスタムマクロを組むときの作法や保守しやすい組み方について記事といてまとめていただけないでしょうか?
この部分は講座で学べない部分なので、先人方の経験に基づく知恵やノウハウを残しておいていただけるととてもありがたいです。
こんにちは、コメントありがとうございます。
カスタムマクロは、昔はかなりの猛者がいらっしゃいましたが、
CAD/CAMの普及で、通常加工ではあまり作る機会も少なくなっていると感じます。
私自身も、最近は、マクロはほとんど作っていないので、かなり忘れてしまっています。
マクロの難点は、事前シミュレーションが簡単にできない事だと思います
コントローラに付属の場合もありますが、そのために機械を立ち上げるのも面倒ですし
専用ソフトを用意するほどの頻度はないのが、現状です。
そんなレベルなので、参考になる記事が書けるかは??です。(^^ゞ
また、「作法や保守しやすい組み方」については、カスタムマクロにかぎらず
C言語などの、プログラミングにも共通するところもありそうです。
このあたりも、独学なので、私個人のスタイルになってしまっています。
そんな程度であれば、機会をみて、検討してみます。
気長にお待ちください。
生意気言ってすみません。よろしくお願いいたします。
とんでもないですよ~
コメントいただけると、励みになります。
ただ、気ままな個人運営サイトなので、その点はご了承ください。