サブプログラム 呼び出し 失敗ゼロで加工時間短縮術

サブプログラム 呼び出しで金属加工の段取り時間とミス削減を両立させつつ、現場で見落としがちな例外パターンも押さえてトラブルを防ぐにはどうすれば良いのでしょうか?

サブプログラム 呼び出し 基本と落とし穴

「同じサブプログラムを多用すると、逆に1年で残業100時間増えることがあります。」


サブプログラム呼び出しでムダ削減
⏱️
呼び出し回数で時間と精度が変わる

M98・M99やG66などサブプログラム 呼び出しの仕組みを理解すると、段取り時間やデバッグ時間を1案件あたり30分以上短縮しやすくなります。

shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
💸
呼び出しミスは一発で高額ロス

M99やM30の位置を誤ると、高価なワークや工具を一瞬でダメにし、1回のクラッシュで数万円規模の損失につながることがあります。

nc-program.s-projects(https://nc-program.s-projects.net/m-code/m98-99.html)
🧩
ループ構造と多段サブで現場が変わる

多段サブやローカルサブを適切に組み合わせれば、複雑な穴あけパターンや繰り返し加工をシンプルに保ちつつ、不良率の低減にも直結します。

want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)


サブプログラム 呼び出しの基本構造とM98・M99の正しいセット

NC工作機械でのサブプログラム 呼び出しの基本は、メイン側でM98、サブ側でM99を使う構造です。 shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
M98 P100のように、Pアドレスで呼び出すサブプログラム番号を指定し、サブ側の末尾にM99を書いて呼び出し元へ戻します。 nc-program.s-projects(https://nc-program.s-projects.net/m-code/m98-99.html)
このとき、Lアドレスを付けると、同じサブプログラムを繰り返し実行でき、Lを省略すれば1回だけの実行になります。 nc-program.s-projects(https://nc-program.s-projects.net/m-code/m98-99.html)
ここが基本です。


例えば、同じ穴あけを10か所行う場合、メインプログラムでM98 P100 L10と書けば、サブプログラムO0100の内容が10回連続で実行されます。 shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
ハガキの横幅(約10cm)程度のピッチで列を並べた穴あけなら、サブ内ではG81の固定サイクルと相対座標を組み合わせるだけで済みます。 want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
一方で、サブプログラムの末尾を誤ってM30にしてしまうと、その時点でプログラム全体が終了し、メイン側へ戻らなくなります。 kazuban(https://www.kazuban.com/blog/main-sub-pro/)
つまりM99が原則です。


FANUC系ではM98とM198という二種類のサブプロ呼び出しがあり、M198は外部メモリにあるプログラムを呼び出せるため、工場内でUSBメモリやカードを使って標準サブを共有するケースも多くなっています。 kazuban(https://www.kazuban.com/blog/main-sub-pro/)
このとき、うっかりメインとして使うべきプログラムの末尾をM99のままにしておくと、サブとして呼び出された際に永遠ループに入り、機械が止まらないという事故にも直結します。 kazuban(https://www.kazuban.com/blog/main-sub-pro/)
一度ループ状態になると、非常停止後に原点復帰やワークの検査などで30分以上のロスになることも珍しくありません。
痛いですね。


より詳しいM98とM99の仕様やL指定の挙動を確認したい場合は、下記のような解説ページが参考になります。 nc-program.s-projects(https://nc-program.s-projects.net/m-code/m98-99.html)
サブプログラムの呼出しと終了コードを、図入りで解説しているので、新人教育用の資料にも使いやすいです。
M98, M99(サブプログラム呼出し、サブプログラム終了)解説ページ


サブプログラム 呼び出しとG66マクロモーダル呼び出しの違いを理解する

Gコードの世界では、サブプログラム 呼び出しと似た概念としてマクロプログラムの呼び出しがあります。 nc-program.s-projects(https://nc-program.s-projects.net/g-code.html)
代表的なのがG66とG67で、G66 P○○でモーダルにマクロを呼び出し、G67でキャンセルする仕組みです。 nc-program.s-projects(https://nc-program.s-projects.net/g-code.html)
このモーダルマクロは、座標を変えながら何度も同じ処理を繰り返したい場合に非常に有効ですが、サブプログラムとは振る舞いが大きく違う点に注意が必要です。 nc-program.s-projects(https://nc-program.s-projects.net/g-code.html)
ここに注意すれば大丈夫です。


サブプログラム 呼び出し(M98)は、書いた行で一度だけ処理を呼び出し、その後はメインプログラムに処理が戻ります。 shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
一方G66によるマクロ呼び出しは、「キャンセルされるまで」同じ処理を繰り返すため、G67を書き忘れると、後続の全ての座標移動でマクロが動いてしまう危険があります。 nc-program.s-projects(https://nc-program.s-projects.net/g-code.html)
例えば、G66 P9000で穴あけマクロを呼び出したまま、ワーク交換位置への退避移動までマクロが効いてしまえば、治具やチャックに工具を突っ込む事故にもつながります。
これは使えそうです。


Want.netなどの精密CNC加工向け解説では、Gコードをグループ化し、サブやマクロを組み合わせて使うことで、段取り時間や加工時間を最適化する具体例が紹介されています。 want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
ここで紹介されているように、マクロは条件分岐や計算を含められるため、「径ごとに切削条件を自動切り替え」「列数やピッチを変えても同じマクロで対応」といった応用が可能です。 want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
しかし、マクロの誤呼び出しは不具合の原因を特定しにくく、デバッグ時間が倍になることもあります。
結論は挙動の違いを使い分けることです。


サブプログラム 呼び出しを乱用すると逆にサイクルタイムが悪化する理由

現場では「共通処理は全てサブプログラム化した方が良い」という考え方が広まりがちですが、呼び出し回数が多すぎると、今度はサイクルタイムが悪化することがあります。 docs.oracle(https://docs.oracle.com/cd/E19205-01/820-1203/aeuia/index.html)
コンピュータの世界でも、副プログラムをループの深いところから何千回も呼び出すと、呼び出しごとのオーバーヘッドが蓄積し、処理全体の最適化を妨げると指摘されています。 docs.oracle(https://docs.oracle.com/cd/E19205-01/820-1203/aeuhy/index.html)
CNC装置でも事情は似ており、細かく分割しすぎたサブプログラムを、1サイクルで数千回も呼び出すと、加工時間が数%レベルで伸びるケースがあります。
つまり呼び出し回数の設計が重要です。


例えば、1個あたり5分の加工で、1日100個を量産するラインを考えます。
サブ呼び出しのオーバーヘッドで1個につき3秒のロスが積み重なると、1日あたり約300秒、つまり5分の遅れになります。
1か月(20日稼働)で考えれば、5分×20日=100分と、オペレーターの残業約1.5時間分に相当します。
痛いですね。


このリスクを抑えるには、「共通部分をサブ化しつつ、1サイクルあたりの呼び出し回数を10~50回程度に抑える」「ループの一番内側には可能な限り生コードを展開する」というバランスがポイントになります。 docs.oracle(https://docs.oracle.com/cd/E19205-01/820-1203/aeuia/index.html)
また、複数の同形状ワークを一度に加工する場合は、「ワーク1個分のサブ」を作るのか、「穴パターン1列分のサブ」を作るのかを、呼び出し回数を試算しながら決めます。
シンプルなExcelや社内の計算シートを用意しておくと、段取り前に最適なサブ構造を検討しやすくなります。
結論は事前に回数を数えることです。


サブルーチンの呼び出しがパフォーマンスを抑制するという観点は、Fortranなどの数値計算分野の資料が参考になります。 docs.oracle(https://docs.oracle.com/cd/E19205-01/820-1203/aeuhy/index.html)
CNCとは用途が違いますが、「深いループからの呼び出しは減らす」「まとめて計算できる部分は一体化する」といった考え方は、NCプログラムの設計にも応用できます。 docs.oracle(https://docs.oracle.com/cd/E19205-01/820-1203/aeuia/index.html)
副プログラム呼び出しを減らすことで性能を高める技術資料


サブプログラム 呼び出しミスで起こりがちなクラッシュと高額ロスを防ぐコツ

サブプログラム 呼び出しで怖いのは、間違ったプログラムを呼んでしまったり、戻り先が想定と違っていて機械が予期せぬ動きをするケースです。 ja.mfgrobots(https://ja.mfgrobots.com/equipment/cnc/1007046225.html)
ファナック系では、メインとして作ったプログラムを別のプログラムからM98で呼ぶと、末尾のM30の影響で呼び出し元に戻らず、そのまま終了してしまいます。 kazuban(https://www.kazuban.com/blog/main-sub-pro/)
逆に、サブプログラムだけで加工が完結するように書いたものをメインとして使うと、末尾のM99のせいで永遠にループしてしまい、非常停止を押すまで止まらないことがあります。 kazuban(https://www.kazuban.com/blog/main-sub-pro/)
厳しいところですね。


こうしたミスがクラッシュにつながると、高価なワークや治具、工具の破損で1回あたり数万円~数十万円の損失になることもあります。
例えば、単価5万円の精密部品を4個チャックしている状態で、Z方向に10mm食い込みすぎた場合、全数廃棄とチャック爪の再製作が必要になり、トータルで20万円を超える損失になることも現実的です。
さらに、段取り直しや再測定などで1~2時間のライン停止が発生すれば、納期遅れのペナルティが重なる可能性もあります。
結論は「メインとサブの役割を明示する」ことです。


そのための対策としては、次のようなものが考えられます。
・プログラム番号のルールを決める(例:メインはO1~O999、サブはO1000番台以降) shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
・プログラム先頭のコメントに「MAIN」「SUB」「LOCAL」など役割を明記する ja.mfgrobots(https://ja.mfgrobots.com/equipment/cnc/1007046225.html)
・サブで使うワーク座標系や工具補正の状態を、冒頭で明示しておく want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
こうしたルールを1社で徹底するだけで、サブ関連のトラブルは半分以下になると言われています。
結論はルール化が基本です。


Haas系のように、M97でローカルサブルーチン、M98で別プログラムのサブを呼び分ける機種では、特に「同じ番号でもM97とM98で意味が違う」という点を新人にしっかり教えることが重要です。 ja.mfgrobots(https://ja.mfgrobots.com/equipment/cnc/1007046225.html)
Haasの公式解説では、O番号の管理方法やM97・M98のサンプルコードが多数掲載されているため、機種固有の挙動を確認するのに役立ちます。 ja.mfgrobots(https://ja.mfgrobots.com/equipment/cnc/1007046225.html)
Haas M98・M97サブプログラム呼び出しサンプルコード解説


サブプログラム 呼び出しを活かした独自テンプレート化と教育コスト削減

検索上位ではあまり語られていませんが、サブプログラム 呼び出しを「社内テンプレート」として設計すると、教育コストや品質バラつきを大きく減らすことができます。 shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
例えば、「四隅面取り」「M6ボルト穴一式」「基準ピン穴」など、工場でよく使う加工パターンをサブプログラム化し、新人には「メイン側で座標と回数だけ指定させる」運用です。 want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
これにより、1人前レベルのプログラミングスキルを持たないオペレーターでも、安全な標準加工をこなせるようになり、現場の属人化を抑えられます。
いいことですね。


テンプレート化を進める際のポイントは、次の通りです。
・サブプログラム名と番号に加工内容を反映させる(例:O1100 DRILL_M8_PATTERN) shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
・サブの入口で使用工具やワーク座標系をコメントで明示し、メイン側の条件を限定する want(https://www.want.net/ja/precision-cnc-machining-optimizing-g-code-grouping-and-application/)
・サブ内部で固定サイクル(G81~G89)を活用し、行数をできるだけコンパクトに保つ shokunin-tenshoku(https://shokunin-tenshoku.com/13143)
これだけ覚えておけばOKです。


また、教育用途としては、「サブプログラムだけを使った加工」と「メイン+サブ構成の加工」を並べて比較する教材が有効です。 anm7242(https://anm7242.net/pingye.sakura.ne.jp/g-code-machining-basics/)
例えば、同じワークを加工するのに、サブなしプログラムでは300行、サブありでは100行に削減できるとすれば、プログラムの見通しやすさが一目で伝わります。 anm7242(https://anm7242.net/pingye.sakura.ne.jp/g-code-machining-basics/)
行数が3分の1になれば、新人がコード全体を読む時間も3分の1になり、レビューやチェックに必要な時間も大幅に短縮できます。
結論は見える化して教えることです。


特に、基本構造と実例コード、図解がそろっているページをストックしておくと、新人への説明や社内マニュアル作りがかなり楽になります。 anm7242(https://anm7242.net/pingye.sakura.ne.jp/g-code-machining-basics/)
マシニングセンタのサブプログラム基礎講座
Gコードとサブプログラム活用の基礎解説


この記事を踏まえて、あなたの現場ではまずどの加工パターンからサブプログラム化とテンプレート整備を進めたいでしょうか?