繰り返しプログラム例でNCマシニング加工を効率化する方法

NCプログラムの繰り返し処理(サブプログラム・WHILE文・固定サイクル)を実例つきで解説。金属加工現場でのプログラミング工数削減とミス防止に直結する知識を、具体的なコード例とともに紹介します。あなたの現場はまだ手動コピーで損していませんか?

繰り返しプログラムの例と使い方:NCマシニング加工で使える3つの手法

繰り返しプログラムを「丸コピー」で使い回していると、1か所の修正漏れが不良品ロット丸ごとにつながります。


この記事でわかること
🔁
繰り返しプログラムの3つの手法

サブプログラム(M98/M99)、WHILE文マクロ、固定サイクル(G81・G83)のそれぞれの違いと使い分けを解説します。

⚠️
コピー&ペースト運用が招くリスク

同じ座標を何度も手入力すると入力ミスが起きやすく、工具衝突や不良品発生につながります。繰り返し構文で根本から解決する方法を紹介します。

現場ですぐ使えるプログラム例

穴あけ・ミーリング・工具交換を含む実践的なコード例を掲載。明日の段取りからそのまま使えます。


繰り返しプログラムの基本:サブプログラム(M98/M99)の例



NCプログラムで最もよく使われる繰り返し手法が、サブプログラムを使ったM98/M99の呼び出し構文です。加工工程の中で「センタリング→穴あけ→タッピング」のように同じ座標への加工を繰り返す場面では、この仕組みが力を発揮します。


サブプログラムとは、メインプログラムから呼び出して使う「部品プログラム」のことです。例えばO100番のサブプログラムに穴座標をまとめておけば、メインから`M98 P100`と1行書くだけで呼び出せます。終了時には`M99`でメインに戻る、というのが基本の流れです。これが原則です。


```
O0001 (メインプログラム);
G54 G90 G17;
T1 M06;
S1000 M03;
M98 P100; ← サブO100を1回呼び出す
M98 P30100; ← サブO100を3回繰り返す(FANUC 16M)
M30;


O0100 (サブプログラム);
G00 X10.0 Y10.0;
G81 R1.0 Z-5.0 F200;
X30.0 Y10.0;
X30.0 Y30.0;
G80;
M99; ← メインに戻る
```


FANUCの制御装置によって繰り返し回数の書き方が異なる点は、現場でよく混乱が起きる部分です。16Mでは`M98 P31000`のように「5桁の数値の頭1〜4桁が繰り返し回数・後4桁がサブ番号」の表記を使います。15Mでは`M98 P1000 L3`と、Lコードで回数を分けて記述します。制御装置の世代を確認してから記述するのが条件です。


さらに踏み込むと、サブプログラムは最大4重のネスティング(入れ子呼び出し)が可能です。例えば複数の長穴をエンドミルで加工する際、「長穴の形状」をサブ1、「各穴の中心座標」をサブ2に分けておくと、穴の位置が変わった場合もサブ2の数値を修正するだけで済みます。つまり変更箇所が1か所に絞れるということです。


工具交換(ATC)の前後動作もサブプログラム化しておくと、プログラム全体の可読性が大きく上がります。以下はATCサブプログラムの定番構造です。


```
O8000 (ATC前処理);
G40 G80 M05;
M09;
G91 G28 Z0 M19;
G49 G28 X0 Y0;
M06;
M99;


O8001 (ATC後処理:アプローチ);
G90 G00 X0 Y0;
G43 Z100.0 M08;
M03;
M99;
```


この構造にしておけば、工具交換の前後処理をメインプログラムで探し回る必要がなくなります。これは使えそうです。


参考:サブプログラムの基本構造・呼び出し方・ネスティングの詳細解説
マシニングセンタのプログラミング基礎講座⑪〜サブプログラム|職人転職


繰り返しプログラムの応用:WHILE文マクロで条件付き繰り返しを作る例

単純な回数指定の繰り返しではなく、「条件が満たされる間だけ繰り返す」という処理が必要なときに使うのがWHILE文(カスタムマクロB)です。変数を組み合わせることで、切込み量を1ステップずつ増やしながらループするような高度な制御が1つのプログラムで完結します。


WHILE文の基本構文はシンプルです。


```
WHILE 条件式 DO 識別番号;
(繰り返したい処理);
END 識別番号;
```


条件式が成立している間はDO〜ENDの間を繰り返し、条件が外れた瞬間にENDの次のブロックへ進みます。識別番号は1〜3まで使え、最大3重のループを組むことができます。


以下は、#1(X座標)が200以下の間、X方向に100ずつ移動しながらY方向の加工位置も変えていく実例です。


```
#1 = 100.; ← X方向の初期値
#2 = 20.; ← Y方向の初期値
G00 X-20. Y20.;
G00 Z240.;
WHILE #1 LE 200 DO 1;
G01 X#1;
#3 = 50.;
IF #1 GT 100 THEN #3 = -#3;
#2 = #2 + #3;
G01 Y#2;
#1 = #1 + 100.;
END 1;
G01 X#1;
```


これをIF文とGOTO文だけで書くと行数が増え、ループの「始点」と「終点」が一目でわかりません。WHILE文なら`DO 1`と`END 1`で囲まれた範囲がループ区間だとひと目でわかります。つまり読みやすさが断然違うということです。


ただし、WHILE文にはいくつかの絶対に守るべきルールがあります。


- 識別番号の交差はアラーム停止につながる:`DO 1`の中に`DO 2`を入れるのはOKですが、`DO 1`〜`END 2`〜`END 1`のように交差させるとアラームで止まります。


- GOTO文でループ内に入ることはできない:ループ外からGOTO文でDO〜ENDの中に飛び込もうとするとエラーになります。ループから抜け出す方向のGOTOは使用可能です。


- 同じ識別番号は一度抜け出せば再利用できる:ループを完全に終了したあとに同じ番号でWHILEを書き直すことはできます。


WHILE文とIF文・GOTO文のどちらを使うべきかという問いへの答えは、「繰り返し区間を明確にしたい場合はWHILE、単純な分岐ジャンプにはGOTO」というのが現場の定石です。プログラムを後から読む人が理解できるかどうかが判断基準になります。


参考:WHILE文の構文・ネスト・GOTO文との組み合わせ詳細
繰り返し - WHILE | NCプログラム基礎知識


繰り返しプログラムの例として押さえる固定サイクル(G81・G83)の基礎

穴あけ加工において、最も実用的な繰り返し構文が固定サイクルです。通常であれば「位置決め→切削送り→引き抜き」の3動作をブロックごとに書く必要があるところを、G81やG83の1行で指示できます。固定サイクルが基本です。


主な固定サイクルの一覧は次のとおりです。


| コード | 用途 |
|--------|------|
| G81 | 単純穴あけ(浅い穴・薄板) |
| G83 | ペック深穴加工切りくず排出しながら段階的に切削) |
| G84 | タッピング |
| G82 | カウンターボア(底面でドウェル) |
| G80 | 固定サイクル解除 |


G81による浅穴4か所の加工プログラム例は次のようになります。


```
N1 G21 G17 G90; (ミリ単位・XY平面・絶対座標)
N2 T1 M06; (工具交換:ドリル)
N3 G54; (ワーク座標系設定)
N4 S1000 M03; (主軸正転・1000rpm)
N5 G00 X10.0 Y10.0 Z5.0;(1穴目へ移動)
N6 G81 R1.0 Z-5.0 F200; (穴あけ・深さ5mm・送り200)
N7 X30.0 Y10.0; (2穴目)
N8 X30.0 Y30.0; (3穴目)
N9 X10.0 Y30.0; (4穴目)
N10 G80; (固定サイクル解除)
N11 M30;
```


たった11行で4か所の穴が開けられます。G83を使う深穴加工では、`Q`値で1回の切込み量を指定できます。


```
G83 R1.0 Z-20.0 Q5.0 F150;
```


これはZ方向に5mmずつ切削して引き戻し、切りくずを排出しながら合計深さ20mmまで掘り下げる指示です。深さ20mmといえば、一般的なドリルでいうと「鉛筆1本の約半分の長さ」のイメージです。この5mm刻みの切込みが工具への負荷を分散させ、折損リスクを大幅に下げる効果があります。


固定サイクルを使う際の注意点が3つあります。第一に、R値(工具が安全位置まで戻る高さ)は必ずワークや治具から十分な距離を取ること。第二に、G83のQ値が大きすぎると工具への負荷が集中して折損につながること。第三に、加工後は必ずG80で固定サイクルを解除することです。G80の入れ忘れは次のブロックでも穴あけ動作が続いてしまうという、典型的なトラブルの原因になります。G80は必須です。


参考:G81・G83の構文と穴あけ加工プログラムのサンプル例
【第2回】固定サイクルを使った穴あけ加工|76works


繰り返しプログラムのミスを減らす:現場で実践できる4つのルール

繰り返しプログラムを正しく組んでいても、運用のルールが甘いとミスはげません。金属加工の現場では、プログラムの「内容の正しさ」と「設定の正しさ」の両方がそろって初めて安全な加工が成立します。


厚生労働省の災害事例データベースには、NC正面旋盤でプログラム誤入力により切削工具が加工物に衝突した事故が記録されています。事故の原因は座標値の小数点位置の1桁ミスでした。1桁のズレが工具交換損失・工作物廃棄・最悪の場合は設備損傷という損害に直結します。入力ミスは金銭リスクです。


現場で実践できる具体的な4つのルールを以下に整理します。


① 加工前に平面・座標系・アブソリュートを必ず指令する
G17(XY平面)、G54(ワーク座標系)、G90(アブソリュート指令)の3つは毎回プログラム冒頭に記述する習慣をつけます。設備側が前回の設定のままになっているケースで工具軌道が狂う事故が起きており、これら3行を冒頭に入れるだけでリスクを大幅に下げられます。


② アブソリュートとインクレメンタルをひとつのプログラムで混在させない
G90(アブソリュート)とG91(インクレメンタル)が1本のプログラムの中で混在すると、読み返すたびに頭の中で「今どちらの基準か」を切り替えなければなりません。どちらかに統一するのが原則です。機械原点復帰(G28)のときのみ例外的にG91を使うというルールが現場標準として広く採用されています。


③ 変数はプログラム先頭に集約する
マクロプログラムで変数を使う場合、変更が必要な変数をプログラム先頭部にまとめて宣言します。加工内容が変わるたびにプログラムの中をスクロールしてパラメーターを探す手間がなくなり、変えてはいけない変数を誤って書き換えるリスクも下がります。


④ コピーするならマクロ化する(「丸コピー貼り付け」禁止)
似た形状の加工ごとに既存プログラムをコピーして微修正する運用は、変数の使い回しや長大なプログラムによって確認コストが爆発的に増えます。類似形状が複数あるならマクロ1本で変数を差し替えるほうが、修正時の作業は1か所で済みます。コピー貼り付け運用は確認ミスを必ず生むと思ってください。


参考:NCプログラムのミスを未然に防ぐための実践ルール
ミスを減らすためにすること | NCプログラム基礎知識


繰り返しプログラムの例で見落とされがちな「モーダル情報」の管理

サブプログラムやWHILE文を使いこなしていても、モーダル情報の扱いを軽視したまま運用している現場は少なくありません。これは他の解説サイトがほとんど深掘りしない、しかし実務上で事故やトラブルに直結する盲点です。意外ですね。


モーダル情報とは、一度指令するとキャンセルするまで有効であり続けるGコードやMコードのことです。代表例として、G90(アブソリュート指令)、G91(インクレメンタル指令)、G41/G42(工具径補正)、G81〜G89(固定サイクル)などがあります。


トラブルが起きやすい典型的なパターンを見ていきます。


パターン①:サブプログラム内でG91に変えてM99で戻る
サブプログラム内でインクレメンタル指令(G91)に切り替え、M99でメインに戻った場合、メインプログラムはG91のまま続行されます。メインの次のブロックがアブソリュート値として書かれていると、意図しない位置への移動が発生します。サブ内でモーダルを変更した場合は、M99の手前で必ず元に戻すのが原則です。


パターン②:工具径補正(G41/G42)が有効なまま呼び出す
工具径補正が有効な状態でサブプログラムを呼び出すと、サブの中の移動ブロックすべてに補正がかかります。これが意図通りの場合はよいのですが、意図していない場合は寸法外れの原因になります。補正の開始・終了をどこで行うかをメインとサブで明確に決めておく必要があります。


パターン③:固定サイクル(G81等)が有効なままサブを呼び出す
G80で固定サイクルを解除する前にサブプログラムを呼び出すと、サブ内の軸移動ブロックが穴あけ動作を伴って実行される場合があります。これも「G80は必ずサブ呼び出し前に入れる」というルールで防げます。


これらのモーダル管理の問題は、ドライランや試し加工の段階では気づかず、量産に入ってから表面化することがあります。FANUCのパラメーター設定によってはサブプログラム呼び出し時にモーダルをリセットする設定も存在しますが、それに頼りきると他の制御装置では動作が変わるリスクもあります。プログラム側でモーダルを明示管理するのが最も確実な対策です。


繰り返し処理の組み方だけを学んで満足しがちですが、「入口と出口のコード状態を揃える」という設計思想がNCプログラムの品質を根本的に左右します。結論はモーダルの出口管理が安全運用の鍵です。


参考:マクロプログラムを作るときの考え方とモーダル情報の扱い
マクロプログラムを作るときの考え方 | NCプログラム基礎知識






HiKOKI(ハイコーキ) 18V インパクトドライバー FWH18DA 2.0Ah バッテリー1個・充電器・ケース付 充電式 電動ドライバー FWH18DA(BG)