M98・M99サブプログラム:繰り返す形状を1回だけ書いて何度も呼び出す
M98でサブプログラムを呼び出しM99で戻る構造、P番号と繰り返し回数L、インクリメンタルのサブプログラムで同じ溝を複数の位置に加工する方法、呼び出しエラーの種類を例で説明します。
なぜサブプログラムを使うのか
同じ溝を5か所に削ったり、同じ輪郭を深さだけ変えて何度も削ったりすることはよくあります。そのたびに同じブロックをコピーして貼り付けるとプログラムが長くなり、寸法を1つ直すときに5か所すべてを直さなければなりません。1つでも漏れると、5つのうち1つだけ寸法の違う不良になります。
サブプログラムは、繰り返す部分を別のプログラムに切り出しておき、メインプログラムから必要なときに呼び出して使う構造です。形状は1か所だけで管理され、メインプログラムは「どこで、何回」だけを指示すればよくなります。
呼び出しと復帰
| 指令 | 意味 | 例 |
|---|---|---|
M98 P_ | P番号(O番号)のプログラムを呼び出す | M98 P3100 |
L_またはPの上位桁 | 繰り返し回数 | L3 → 3回 |
M99 | 呼び出したブロックの次の行へ戻る | O3100の最後の行 |
M99 P_ | 戻るが、指定したシーケンス番号へ移る | 分岐・繰り返し構造に使う |
例:インクリメンタルのサブプログラムで溝を3本
サブプログラムO3100はG91のインクリメンタルで書かれています。現在位置から6mm下がってXに30mmの溝を削り、6mm上がってから始点のXへ戻りながらYに10mm移動します。終わった位置が次の繰り返しの始点になるので、同じ呼び出しを3回繰り返すだけで10mm間隔の溝が3本できます。
サブプログラムO3100をL3で3回呼び出し、10mm間隔の溝を3本加工
O3007
T1 M6
G21 G90 G17 G94
G54
S3000 M03
G00 X0. Y0. Z5.
M98 P3100 L3
G90 G00 Z50.
M30
O3100
G91 G01 Z-6. F100
X30. F300
G00 Z6.
X-30. Y10.
M99上図はこのプログラムをCNC Path Analyzerで解析した結果です (早送り 8 区間, 直線切削 6 区間).
メインプログラムで守るルール
- モードを戻す:サブプログラムはG91の状態で終わるので、復帰直後にメインで
G90を指令し直します。例のG90 G00 Z50.がその役割です。G90なしでZ50.だけを書くと、「高さ50」ではなく「現在より50mm上」と解釈されます。今回は上へ向かう移動なので大きな問題はありませんが、次の工具のアプローチブロックだったら干渉につながる可能性があります。 - 開始位置:インクリメンタルのサブプログラムは、呼び出したときの位置によって結果が変わります。呼び出しの直前にアブソリュート座標で開始位置をはっきり指令します。
- 補正とサイクルの状態:工具径補正や固定サイクルが有効なまま呼び出すと、サブプログラム内の移動が予想と違って解釈されることがあります。呼び出しの前後でモーダル状態を意識して整理します。
- M30の位置:同じファイルにサブプログラムを置くときは、メインプログラムの
M30の後ろに置きます。メインはM30で終わるので、サブプログラムが誤って実行されることはありません。
繰り返し回数とサイクルタイムの計算
サブプログラム1回分の切削移動は、Z 6mm(F100)とX 30mm(F300)です。それぞれ3.6秒と6秒で、1回に9.6秒、3回なら約29秒が正味の切削時間です。繰り返し回数をL5に変えれば、メインプログラムの1文字を直すだけで溝が5本、切削は約48秒になります。繰り返し構造がプログラムの修正と時間の見積もりをともに単純にすることが分かります。計算方法は加工時間の計算でさらに詳しく扱います。
呼び出しエラーの種類
ツールでは、メインプログラムと別ファイルの呼び出しプログラムを一緒に読み込むことができ、P番号はファイル名ではなくファイル内のO番号に結び付けられます。
| エラー | 原因 | CNC Path Analyzerの表示 |
|---|---|---|
| 呼び出し先がない | P番号と同じO番号のプログラムがない | 呼び出し行と見つからなかった番号 |
| O番号の重複 | 同じ番号のプログラムが2つ以上 | どちらを使うか確定できないという警告 |
| M99の欠落 | サブプログラムが終わらずに次のプログラムへ続く | 復帰欠落の警告 |
| 無限呼び出し | 互いに呼び出し続ける、または自分自身を呼び出す | 再帰・実行上限の超過で計算を中断 |
よくある質問
サブプログラムの中からさらにサブプログラムを呼び出せますか?
M98とG65のマクロ呼び出しは何が違いますか?
G65は引数(A、B、C…)を変数として渡して呼び出すマクロ呼び出しです。同じ形状を寸法だけ変えて呼び出すときに使い、M98は引数なしで同じ動作を繰り返します。