
マシニングセンタのプログラミングでは、同じ加工動作を繰り返し使用することが多くあります。こうした場合、メインプログラムにすべてのコードを書き込むと、プログラムが長くなり、管理が煩雑になります。
そこで活用するのが サブプログラム です!
サブプログラムを使うことで、共通する加工動作をまとめて効率的にプログラムを組め、プログラムの簡略化やミスの防止につながります。本記事では、サブプログラムの登録方法や呼び出し方法、実行順序について詳しく解説します!
1. メインプログラムとサブプログラムの基本
メインプログラムとサブプログラムとは?
プログラムは、大きく メインプログラム と サブプログラム に分けることができます。
- メインプログラム:基本的な加工工程を指示するプログラム。
- サブプログラム:メインプログラムから呼び出され、繰り返し使用する動作をまとめたプログラム。
例えば、同じ位置への穴あけ加工を何度も行う場合、サブプログラムに開ける穴の座標を記述し、メインプログラムから呼び出すことで、コードの冗長性を減らすことができます。
例えば「センタリング→穴あけ→タッピング」という3つの工程を加工する場合、サブプログラムに座標を入力しておけば、 工程ごとに3回座標を入力することなく、1度入力するだけでプログラムを完結させることができます。
サブプログラムを使うメリット
- プログラムを簡潔にでき、管理がしやすい
- ミスを防ぎ、プログラムの修正が容易になる
- 加工の標準化が可能になり、作業効率が向上する
サブプログラムの登録方法
サブプログラムの基本構造
サブプログラムは、以下の例のような構造で作ります。
O100 (O1000-SUB);
G01 X*** Y*** ;
...
M99 ;
サブプログラム登録時のポイント
- サブプログラムの先頭には O(プログラム番号) を記載します。上の例だと、O100のサブプログラムになります。
- サブプログラムの終了には M99 を指定します。
- メインプログラムに戻る指令として M99 を使用します。
- M30, M02 は使用不可。
登録されたサブプログラムは、メインプログラムから簡単に呼び出すことができます。
3. サブプログラムの呼び出し方法
NC装置に登録されたサブプログラムをメインプログラムから呼び出すには、以下のような指令を使用します。
サブプログラム呼び出しの基本形
メインプログラムからM98を指令することでサブプログラムを呼び出します。
M98 P**** ;
M98:サブプログラムを呼び出す指令
P****:呼び出すサブプログラム番号
例えば、O100のサブプログラムを呼び出す場合、
M98 P100
と指令します。
制御装置による書き方の違い(FANUC 16M / 15M の場合)
同じファナックのプログラムでも、制御装置が16Mか15Mかで、サブプログラム実行の回数指令の仕方が大きく異なります。
以下はO100のサブプログラムを3回呼び出す場合の指令方法です。
制御装置 | 指令方法 |
16M | M98 P30100 ; |
15M | M98 P100 L3; |
FANUC 15Mで使用するコードであるLは繰り返し回数を示しています(省略可能)。L3とすれば、3回サブプログラムを呼び出すということです。
FANUC 16Mでは、回数を指令する場合必ず5ケタの数字を司令し、はじめの番号で回数を指令、後の4桁でサブプログラム番号を指令します。
例えば、O1000 のサブプログラムを3回実行 する場合、以下のように記述します。
M98 P31000 ;
4. サブプログラムの実行順序
繰り返し(ループ)の場合
先述の通り、サブプログラムを 複数回繰り返し実行 する場合、繰り返し回数を5桁目の数字で指定できます。
例:2回ループ実行する場合

【実行の流れ】
- メインの
①
を実行 - サブの
②
を 2回 繰り返す - メインの
N21
に戻り、③
を実行
ネスティング(多重呼び出し)の場合
サブプログラム内から さらに別のサブプログラムを呼び出す ことを「ネスティング」といいます。
最大 4重 のネスティングが可能です。
ネスティングの実行順序(3重の例)

- メインの
①
を実行 - サブ1の
②
を実行 - サブ2の
③
を実行 - サブ3の
④
を実行 - サブ2の
N21
に戻り⑤
を実行 - サブ1の
N21
に戻り⑥
を実行 - メインの
N21
に戻り⑦
を実行
サブプログラムの中にサブプログラムを入れたいタイミングなんてあるの?と思われるかもしれませんが、意外とあるんです。
例えば複数の長穴をエンドミルで加工したい場合。長穴の中心の座標をサブプログラム2に、そして長穴のミーリング開始点の座標をサブプログラム1にすることで、長穴の位置が変わっても、サブプログラム2の中心座標を変えるだけで加工を行うことができるようになります。繰り返し形状のプログラムの編集が非常に楽になるということです。
工具交換を含んだサブプログラムの活用
マシニングセンタでは、工具交換の前後で決まった動作を行うことが多い ため、これらをサブプログラムにしておくと、プログラムの確認がしやすくなります。
例えば、以下のように ATC(自動工具交換) の動作をサブプログラムにまとめておくと、プログラムの可読性が向上します。
ATCサブプログラムの例(O8000 / O8001)
O8000 (ATC-SUB);
G40 G80 M05 ;
M09 ;
G91 G28 Z0 M19 ;
G49 G28 (G30) X0 Y0 ;
M06 ;
M99 ;
アプローチ動作のサブプログラム例
O8001 (APPROACH);
G90 G00 X0 Y0 ;
G43 Z100.0 M08 ;
M03 ;
M99 ;
このように、工具交換の前後でサブプログラムを活用することで、
✅ プログラムの整理がしやすくなる ✅ 確認作業がスムーズになる ✅ ミスの防止につながる
といったメリットが出てきます。
サブプログラムの運用に当たってのポイント
•サブプログラムの基本的な考え方
初めはサブプログラムを意識せずにメインプログラムだけで作成し、全体の構造が見えてからサブプログラムを導入すると理解しやすい。
• メインとサブの使い分けを意識する
工具径補正(Dコード)、Z軸の切り込み、送り(Fコード)などをメインに入れるか、サブプログラムに分けるかを考える。チェック時や変更時の手間を考慮して決定すると良い。
• モーダル情報に注意する
G90(絶対座標)やG91(相対座標)などのモーダル情報をサブプログラム内で変更する際は、意図しない動作を防ぐために必要な場合以外は元に戻す。
• 工具補正後のサブプログラム呼び出しに注意
工具補正を適用した直後にサブプログラムを呼び出す場合、移動のないブロックが2つ以上続かないようにする。
• 座標設定や補正値の標準化
Dコード、Hコード、座標系設定(G54〜G59)など、加工に重要な情報はルールを決めて統一しておくことで、他の人がプログラムを確認しやすくなる。
• NCプログラムの最適化を意識する
加工内容を正しく理解し、プログラムを単純化することで管理しやすくなる。共通部分を定型化し、複雑な処理は極力減らすことで、より効率的なプログラミングが可能になる。
まとめ:サブプログラムを活用して効率的にNCプログラムを組もう!
サブプログラムを活用することで、NCプログラムをシンプルに整理し、作業効率を飛躍的に向上させることができます。
繰り返し作業や工具交換の場面でも、サブプログラムを活用することでプログラムの見やすさ・管理のしやすさが格段に向上します。
サブプログラム活用のメリット
✅ 繰り返し作業を効率化 → 同じ動作を何度も記述する必要がなく、プログラムがスッキリ
✅ M98 P***を使えば簡単に呼び出し可能 → メインプログラムからの呼び出しも簡単
✅ ネスティング(多重呼び出し)で複雑な工程も管理しやすい → 複雑な繰り返し加工でもプログラムが整理され、ミスを防げる
✅ 工具交換の前後にサブプログラムを使うと可読性UP → どこで工具が変わるかが明確になり、コピーミス防止できる
応用的な論点かと思われがちですが、NCプログラミングにおいては基本事項です。
まずは繰り返し入力することが多い、センタリング、穴あけ、タッピング、リーマなどの穴あけ座標をサブプログラム化するところから始めてみましょう。
サブプログラムを上手に活用することで、NCプログラムの可読性・保守性を向上させ、より効率的な加工が実現できます。ぜひ活用して、プログラミングの最適化を進めましょう!
コメント