相変わらずの需要がよく分からないNCマクロネタです。
機械の段取り時に使う様なプログラムは、それを単体で直接動かしたい時もあれば、別のプログラムからサブプログラムとして呼び出したい時もあったりしますよね?無いですか?
単体で動かすプログラムは最後M30かM2で終了させますが、サブプロとして利用する場合にはM99で終わらせないとメインプログラムに戻ってくれません。
従ってそのようなメインプログラムにもサブプログラムにも成り得るプログラムでは、どちらの状態で実行されているか判断して終了のMコードを切り替えてやる必要があります。
今回はそんな処理をするマクロの例を紹介します。
サンプル1
%
O1234 (SAMPLE PROGRAM 1)
#30 =99. (M99)
IF[#4000 NE #4115] GOTO9900
#30 =30. (M30)
N9900 (END OF PROGRAM)
M#30
%
解説1
システム変数 #4000 はメインプログラム番号、#4115 はそのプログラム自体のプログラム番号が格納されている変数です。サブプロ実行中は #4115 にサブプログラム番号が入ります。従って #4000 と #4115 が同一か否かで、そのプログラムがメインプログラムとして実行されているのか、それともサブプログラムとして呼ばれているのかが判別出来ます。
因みにMDIで動かした場合には #4000 は“空”(#0)です。
M99/M30 はわざわざ変数を介さなくても直接指令すれば良さそうなもんですが、これにはちょっとした理由があります。機械のパラメータ設定によりますが、外部機器からプログラムを読み込む際にM99やM30があるとそこで読み込みが止まってしまう機械があります。その様な機械でプログラムの後半が欠落するのを防ぐため、直接指令するのを避けました。
サンプル2
動作確認しておkと思ったら、世の中には #4000 が無い制御装置もあるみたいなので別の方法を考えました。
(SAMPLE PROGRAM 2)
#13 =#4113 (MODAL M CODE)
#30 =99. (M99)
IF[#13 EQ 98.] GOTO9900
#30 =30. (M30)
N9900 (END OF PROGRAM)
M#30
解説2
システム変数 #4113 には直前に指令されたMコード番号が格納されています。
プログラム先頭で #4113 を調べた場合、もしこのプログラムが別のプログラムから M98 にてサブプロ呼び出されていた場合には #4113 には 98 が入っている筈です。一方メインプログラムとして実行された場合には #4113 には 0 か 2 か 30 の何れかが入っていると思います(処理系依存)。
この方法ではサブプログラム呼び出しではなく、G65 のマクロ呼び出しされた場合にそれを判別出来ません。FANUCなら #4012 (G65,G66,G67) のシステム変数にてマクロ呼出しされたかどうかを調べる事が出来ますが、ブラザーのNC (CNC-C00) では #4012 は G66,G67 しか返さないようで、G65で呼ばれたかどうかが判別出来ません。
おわり
そんなのM98Pするだけのプログラム1個置いときゃ良いじゃん、なんて事は決して口にしてはいけません。