M98·M99 서브프로그램: 반복 형상을 한 번만 쓰고 여러 번 호출하기
M98로 서브프로그램을 호출하고 M99로 돌아오는 구조, P 번호와 반복 횟수 L, 증분 서브프로그램으로 같은 홈을 여러 위치에 가공하는 방법, 호출 오류 유형을 예제로 설명합니다.
왜 서브프로그램을 쓰나
같은 홈을 다섯 군데 파거나, 같은 윤곽을 깊이만 바꿔 여러 번 깎는 일은 흔합니다. 매번 같은 블록을 복사해 붙이면 프로그램이 길어지고, 치수 하나를 고칠 때 다섯 군데를 모두 고쳐야 합니다. 하나라도 빠뜨리면 다섯 개 중 하나만 치수가 다른 불량이 됩니다.
서브프로그램은 반복되는 부분을 별도 프로그램으로 떼어 두고, 메인 프로그램에서 필요할 때 불러 쓰는 구조입니다. 형상은 한 곳에서만 관리되고 메인 프로그램은 “어디서, 몇 번”만 말하면 됩니다.
호출과 복귀
| 지령 | 의미 | 예제 |
|---|---|---|
M98 P_ | P 번호(O번호)의 프로그램을 호출 | M98 P3100 |
L_ 또는 P 앞자리 | 반복 횟수 | L3 → 3회 |
M99 | 호출한 블록 다음 줄로 복귀 | O3100 마지막 줄 |
M99 P_ | 복귀하되 지정한 시퀀스 번호로 이동 | 분기·반복 구조에 사용 |
예제: 증분 서브프로그램으로 홈 세 개
서브프로그램 O3100은 G91 증분으로 적혀 있습니다. 현재 위치에서 6mm 내려가 X로 30mm 홈을 파고, 6mm 올라온 뒤 시작 X로 돌아가면서 Y로 10mm 옮겨 갑니다. 끝난 위치가 다음 반복의 시작 위치가 되므로, 같은 호출을 세 번 반복하는 것만으로 10mm 간격의 홈 세 개가 생깁니다.
O3100 서브프로그램을 L3으로 세 번 호출해 10mm 간격 홈 세 개를 가공
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에서 끝나므로 서브프로그램이 실수로 실행되지 않습니다.
반복 횟수와 사이클 시간 계산
서브프로그램 한 번의 절삭 이동은 Z 6mm(F100)와 X 30mm(F300)입니다. 각각 3.6초와 6초로, 한 번에 9.6초, 세 번이면 약 29초가 순수 절삭 시간입니다. 반복 횟수를 L5로 바꾸면 메인 프로그램 한 글자만 고쳐서 홈 다섯 개, 절삭 약 48초가 됩니다. 반복 구조가 프로그램 수정과 시간 견적을 함께 단순하게 만든다는 점을 보여 줍니다. 계산 방법은 가공 시간 계산에서 더 자세히 다룹니다.
호출 오류의 종류
도구에서는 메인 프로그램과 별도 파일로 된 호출 프로그램을 함께 불러올 수 있으며, P 번호는 파일 이름이 아니라 파일 안의 O번호로 연결됩니다.
| 오류 | 원인 | CNC Path Analyzer 표시 |
|---|---|---|
| 호출 대상 없음 | P 번호와 같은 O번호 프로그램이 없음 | 호출 행과 찾지 못한 번호 |
| O번호 중복 | 같은 번호의 프로그램이 둘 이상 | 어느 쪽을 쓸지 확정할 수 없다는 경고 |
| M99 누락 | 서브프로그램이 끝나지 않고 다음 프로그램으로 이어짐 | 복귀 누락 경고 |
| 무한 호출 | 서로를 계속 호출하거나 자기 자신을 호출 | 재귀·실행 한도 초과로 계산 중단 |
자주 묻는 질문
서브프로그램 안에서 또 서브프로그램을 부를 수 있나요?
M98과 G65 매크로 호출은 무엇이 다른가요?
G65는 인수(A, B, C…)를 변수로 넘겨 호출하는 매크로 호출입니다. 같은 형상을 치수만 바꿔 부를 때 쓰며, M98은 인수 없이 같은 동작을 반복합니다.