“데이터 100개를 전수 검사하기 위해 로직을 100줄 쓰고 계신가요?
아니면 배열 처리를 못 해서 일일이 수작업으로 데이터를 옮기고 계신가요?”
D, W, R, Z 같은 데이터 디바이스가 익숙하지 않다면 아래 글부터 보고 오시면 이해가 훨씬 쉽습니다.
👉 [실무] D·W·R·Z 데이터 구조와 용도 제대로 이해하기
미쓰비시 PLC 제어에서 단순 반복 작업은 로직의 가독성을 해치고 유지보수를 어렵게 만듭니다.
오늘은 수많은 데이터를 한 번에 처리하여 로직을 1/100로 줄여주는 FOR-NEXT 루프와 인덱스 레지스터(Z)의 실무 활용법을 정리합니다.
1. FOR-NEXT: 반복 작업 로직을 한 번에 정리하는 방법
저도 FOR문을 모를 때는 같은 패턴을 래더로 100줄씩 직접 만들었습니다.
처음엔 만들 수는 있습니다.
그런데 하다 보면 지루해서 죽을 것 같고, 나중에 오류 하나 찾으려면 마우스휠만 끝없이 내리게 됩니다.
특히 비슷한 로직이 반복될수록
“지금 내가 보고 있는 게 37번째 줄인지 73번째 줄인지” 감도 안 옵니다.
그때 FOR-NEXT를 알고 나서야 왜 다들 반복 로직은 묶어서 처리하는지 이해됐습니다.
FOR-NEXT는 지정된 횟수만큼 구간 내의 로직을 한 스캔 내에서 반복 실행합니다.
- 동작 원리: FOR에서 설정한 횟수만큼 해당 구간을 반복 실행하며, 모든 반복이 완료된 후에야 다음 로직으로 넘어갑니다.
- 실무 활용: 유사한 구조의 데이터 비교, 센서 평균값 계산, 대량의 데이터 전송 등에 사용됩니다.
[한 줄 직설] “FOR-NEXT는 복사 붙여넣기가 필요한 반복 로직을 한 줄로 압축하는 도구다.”
2. 인덱스 레지스터(Z): FOR 루프의 진정한 파트너
처음엔 어렵게 느껴지지만, Z 인덱스를 제대로 써보면 왜 이 기능을 만들어놨는지 감탄하게 됩니다.
고정 주소만 읽던 메모리가,
Z 하나 붙는 순간 배열처럼 움직이기 시작합니다.
실무에서는 복사·검사·비교·정렬 같은 반복 작업을 할 때
정말 잘 만들어진 기능이라는 생각이 들 정도로 활용도가 높습니다.
특히 미쓰비시 PLC에서 FOR-NEXT와 Z 인덱스를 함께 사용하는 구조는 배열 처리의 기본 패턴입니다.
루프만 사용하면 동일한 주소만 반복해서 읽게 되지만,
주소값에 변수를 더해주는 인덱스 레지스터(Z)가 결합되면 비로소 효율적인 처리가 가능해집니다.

📌 [Fig.1] FOR-NEXT와 인덱스(Z)를 이용한 반복 연산 구조
이 예제는 두 개의 데이터 배열(D100, D200)을 순차적으로 더해서
결과를 D300에 저장하는 FOR-NEXT 반복 연산 구조입니다.
- SM400 (ALWAY ON)
→ PLC가 RUN 상태인 동안 항상 ON되어, 초기화와 연산이 지속적으로 실행됩니다. - MOV K0 Z0 / MOV K0 Z1
→ 루프 시작 전에 인덱스 Z0, Z1을 0으로 초기화합니다.
→ 초기화가 되지 않으면 이전 값이 남아 잘못된 주소를 참조하게 됩니다.
※ MOV 명령어가 익숙하지 않다면 아래 글에서 먼저 정리해 보세요.
👉 [실무] MOV·BMOV·FMOV로 래더 줄이는 방법 - FOR K100
→ 총 100개의 데이터를 반복 처리하는 루프 시작 지점입니다. - D100Z0 + D200Z0 → D300Z1
→ Z0 값을 기준으로
D100 ~ D199와 D200 ~ D299 데이터를 순차적으로 더하고,
그 결과를 D300부터 순차적으로 저장합니다. - INCP Z0
→ 입력 데이터 인덱스를 1씩 증가시켜
다음 데이터(D101, D102 …)로 이동합니다. - +P Z1 K2 Z1
→ 결과 저장 인덱스를 2씩 증가시켜
다음 저장 위치(D302, D304 …)로 이동합니다.
→ (데이터 구조에 따라 간격을 두고 저장하는 방식) - NEXT
→ FOR에서 지정한 횟수만큼 반복 실행 후 루프를 종료합니다.
3. 🚨 주의사항: CPU 점유율과 WDT 에러
FOR-NEXT는 강력하지만, PLC의 기본 원리인 ‘스캔 구조’ 안에서 동작한다는 사실을 잊으면 안 됩니다.
- 문제: FOR 루프는 CPU 점유 시간이 길어질 수 있으므로, 반복 횟수를 너무 크게 잡거나 루프 안에 무거운 연산을 넣으면 한 스캔이 끝나기 전에 WDT(Watchdog Timer) 에러가 발생할 수 있습니다.
- 결과: PLC는 즉시 에러와 함께 STOP 상태가 되어 설비가 멈춥니다.
- 해결책: 반복 횟수는 반드시 필요한 만큼만 설정하고, 처리량이 너무 많다면 여러 스캔에 나누어 연산하는 기법을 고려해야 합니다.
저도 실제로 스캔타임이 길어지는 설비에서, 매 스캔마다 돌릴 필요 없는 구간은 CJ(Conditional Jump) 로 건너뛰게 구성해서 부하를 줄인 적이 있습니다.
FOR문 자체를 없앤 게 아니라,
언제 실행할지 제어해서 CPU 점유율을 낮춘 방식이었습니다.
※ 스캔타임 최적화가 필요하다면 아래 글도 같이 보세요.
👉 [실무] PLC 스캔 타임 개선과 CJ 점프 명령어 활용법
4. 🔧 실전 디버깅: 루프 시작 전 초기화와 외부 간섭 확인
FOR-NEXT 내부 로직은 한 스캔 내에서 순식간에 지나가기 때문에 모니터링이 매우 어렵습니다.
- 인덱스(Z) 초기화: 루프 시작 직전에 반드시
[MOV K0 Z0]명령어를 통해 인덱스를 0으로 초기화하세요. 이전 스캔의 잔상이 남아있으면 엉뚱한 메모리 주소를 건드릴 수 있습니다. - 외부 간섭 체크: 만약
Z0값이 예상과 다르게 증가하거나 튀고 있다면, 루프 외부의 다른 로직에서 인덱스 레지스터를 변경하고 있지는 않은지 반드시 확인해야 합니다. - 검증 방법: 로직을 처음 적용할 때는 루프 횟수를 1~2회로 줄여서 데이터가 의도한 주소로 정확히 들어가는지 먼저 확인하는 것이 안전합니다.
5. 📌 반복 연산 설계 시 안전 체크리스트
- [ ] 루프 시작 전 인덱스 레지스터(Z)를 K0로 초기화 했는가?
- [ ] 반복 횟수가 WDT 에러를 유발할 정도로 과도하지 않은가?
- [ ] 인덱스 연산(
D100Z0)이 할당된 메모리 범위를 초과하여 침범하지 않는가? - [ ] 루프 외부에서 인덱스 레지스터를 임의로 변경하는 로직은 없는가?
👉 오늘 내용 3줄 요약
- FOR-NEXT는 반복적인 로직을 획기적으로 줄여주는 효율화 도구다.
- 인덱스 레지스터(Z)와 결합해야 미쓰비시 PLC에서 실질적인 대량 데이터 처리가 가능하다.
- 과도한 루프는 WDT 에러를 유발하므로 항상 스캔 타임을 고려해야 한다.
📌 결론
“반복문은 로직을 간결하게 만들지만, 설계자의 머릿속은 더 정교해야 합니다.” 루프가 도는 찰나의 순간에 메모리 안에서 벌어지는 일들을 완벽히 제어할 수 있을 때, 비로소 데이터 핸들링의 고수가 될 수 있습니다.
[다음 포스팅 예고]
로직과 데이터를 다루는 법을 익혔으니, 이제는 외부 기기와 대화할 차례입니다. 현장에서 가장 많이 쓰이지만 배선부터 설정까지 까다로운 미쓰비시 PLC 시리얼 통신 기초(RS-232/485)에 대해 깊이 있게 다뤄야 합니다. 자동화의 기본인 통신을 놓치면 안되고 그중에 기초가 시리얼 통신입니다. 통신에 대해 이 포스팅 준비하고 있습니다. 다음 포스팅 가봅시다.