PLC Engineer's Field Notes

Practical solutions for industrial automation


[실무] PLC 스캔 타임 개선과 CJ 점프 명령어 활용법

CPU 점유율보다 중요한 것은 스캔 타임입니다. 스캔 타임이 길어지면 입력 신호 감지와 출력 응답 타이밍이 늦어질 수 있습니다.

PLC 프로그램 규모가 커질수록 모든 로직을 매 스캔마다 연산하는 것은 비효율적입니다. 이때 불필요한 구간을 건너뛰는 CJ(Conditional Jump) 명령어를 활용하면 스캔 효율을 개선할 수 있습니다.

이번 글에서는 CJ 명령어의 동작 원리, 실무 활용 예시, 그리고 사용 시 주의사항을 정리합니다.


1. 스캔 타임, 왜 ‘속도’가 아니라 ‘타이밍’의 문제인가?

PLC 스캔 타임이 늘어난다는 것은 CPU가 한 바퀴 돌아 다시 입력 신호를 확인하는 주기가 길어진다는 뜻입니다. 현장에서는 다음과 같은 치명적인 문제가 발생합니다.

  • 신호 누락: 고속 제품 감지 센서 신호가 스캔 주기보다 짧으면 PLC는 이를 인식하지 못하고 ‘씹어버립니다’.
  • 응답 지연: 안전 인터락이나 정지 명령이 수 밀리초(ms) 늦게 나가면서 기계적 파손이 발생할 수 있습니다.
  • 통신 에러: 상위 시스템이나 인버터와의 통신 주기가 깨지면서 타임아웃 에러가 빈번해집니다.

[한 줄 직설] “스캔 타임 문제는 설비의 ‘반응 속도’가 아니라 ‘생존 타이밍’의 문제다.”


2. CJ(Conditional Jump): 불필요한 구간은 읽지 않고 건너뛴다

CJ 명령어는 조건이 ON 되었을 때, 지정된 포인터(P) 위치로 로직 실행 순서를 즉시 이동시킵니다.

  • 동작 원리: CJ 조건이 ON 되면, 현재 위치부터 목적지(Pointer) 사이의 로직은 연산 자체가 생략됩니다. CPU는 그 줄을 아예 읽지 않고 넘어갑니다.
  • 실무 핵심: 중요한 점은 “로직 연산을 건너뛰는 것”이지, “출력을 제어하는 것”이 아니라는 사실입니다. 수동 모드일 때 자동 로직을, 정상 운전 시에는 에러 처리 루틴을 건너뛰어 스캔 타임의 낭비를 막습니다.

실무 적용 예시: 문자열 비교 루틴 조건부 실행

비전 장비 또는 바코드 리더기에서 100자 문자열 데이터를 수신한 뒤, 기준 문자열과 비교하여 OK / NG를 판정하고 결과를 상위 장비로 전송하는 공정이 있었습니다.

기존 구조에서는 문자열 비교 루틴이 매 스캔마다 실행되고 있었습니다. 문자 데이터가 새로 들어오지 않아도 100자 비교 연산을 계속 수행하므로 불필요한 연산 부담이 발생할 수 있습니다.

개선 후에는 문자 리딩 완료 비트가 ON 되었을 때만 비교 루틴이 실행되도록 CJ 조건을 적용했습니다.

  • 평상시: 비교 연산 생략
  • 리딩 완료 시: 문자열 비교 실행
  • 판정 후: OK / NG 데이터 전송
  • 완료 후: 대기 상태 복귀

이와 같이 조건이 충족될 때만 연산을 수행하면 스캔 효율 개선과 프로그램 가독성 향상에 도움이 됩니다.


3. 🚨 실전 도면 분석: CJ 점프가 MC 블록을 만났을 때

아래 도면은 CJ가 로직을 어떻게 ‘무시’하는지 보여주는 결정적인 예시입니다.

PLC CJ(Conditional Jump) 명령으로 MC 블록이 실행되지 않고 스킵되는 구조를 보여주는 래더 로직 예시
[Fig. 1] CJ 점프 시 MC 블록이 OFF가 아니라 ‘연산 자체가 생략되는’ 구조 예시

① CJ P1 (무조건 점프): SM400에 의해 무조건 P1으로 점프합니다.

② 스킵된 MC 구간: M0가 살아서 MC N1을 켜야 하지만, CPU가 이 구간을 스캔하지 않습니다.

③ 결과 확인: 점프 도착지(P1) 에서 M1 상태가 OFF 상태이기 때문에 M1001은 켜지지 않습니다.

[참고] SM400이 무엇인지 궁금하다면?

위 예시에서 사용된 SM400은 PLC가 RUN 상태일 때 항상 ON을 유지하는 ‘상시 ON 특수 릴레이’입니다. CJ 명령어로 특정 구간을 무조건 점프(Jump)시키고 싶을 때 가장 흔히 사용되는 접점이죠. SM 시리즈의 종류와 활용법이 더 궁금하시다면 이전 포스팅을 참고해 주세요.

👉 [관련 글] [실무] SM·SD 잘못 건드리면 로직 충돌로 장비 멈춘다

※ 핵심 포인트 위 상태에서 MC가 OFF 되어 꺼진 것이 아닙니다. 애초에 “MC 실행 명령어 자체가 연산되지 않은 것”입니다. 로직이 존재는 하되, CPU 입장에서는 없는 페이지나 마찬가지인 상태입니다.

[한 줄 직설] “CJ는 로직을 끄는 게 아니라, 그 로직이 존재하지 않는 것처럼 만든다.”


4. ⚠️ 반드시 체크해야 할 ‘출력 HOLD’ 현상

👉 관련 글: [실무] MC 구간 잘못 쓰면 비상정지 풀자마자 설비 움직입니다

마스터 코일(MC)은 OFF 시 구간 내 출력을 강제로 끊어버리지만, CJ는 단순히 해당 구간을 “읽지 않고 지나칠 뿐”입니다.

  • 문제 상황: CJ 구간 내 출력이 ON 된 상태에서 점프가 활성화되면, 그 출력은 무한히 ON 상태를 유지(HOLD)합니다. PLC가 OFF 신호를 인지할 기회조차 없기 때문입니다.
  • 해결 핵심: CJ를 사용하기 전, 해당 구간의 출력은 반드시 RST 조건으로 초기화되거나, CJ 조건과 출력 조건을 완전히 분리하여 점프 중에도 HOLD 상태가 발생하지 않도록 설계해야 합니다.

[한 줄 직설] “MC는 전원을 끄는 것이고, CJ는 눈을 감고 지나가는 것이다.”


5. 🔧 CJ 점프 위치, 나중에 못 찾는 이유와 해결법

CJ를 잘못 쓰면 제일 먼저 터지는 문제가 “어디로 점프했는지 못 찾는 상황”입니다. 디버깅 난이도가 급상승하므로 다음 3가지를 반드시 지켜야 합니다.

  1. 포인터(P) 바로 위에 주석 박기: P1 // AUTO ROUTINE START 처럼 도착 위치에 반드시 이름을 붙이세요.
  2. CJ와 P를 최대한 근거리 블록으로 묶기: 중간에 너무 많은 다른 로직을 끼워 넣지 말고, 구조가 한눈에 들어오도록 유지하세요.
  3. “상태 변수” 남기기: 진입 전 MOV K1 D900, 점프 후 MOV K0 D900 처럼 상태 값을 남기면, 현재 점프 구간 안에 있는지 데이터 값만 보고 바로 확인 가능합니다.

💡 사수 팁 “CJ는 쓰는 것보다 추적하는 게 더 어렵다. 진짜 잘하는 사람은 나중에 내가 이해할 수 있도록 CJ의 흐름을 남긴다.”


6. 📌 CJ 설계 시 안전 체크리스트

  • [ ] CJ 점프 구간 내에 ‘반드시 꺼져야 할 출력’이 살아있는 채로 점프하지 않는가?
  • [ ] CJ 점프 조건이 의도치 않게 항상 ON 상태가 되어 로직이 먹통이 되지 않는가?
  • [ ] 포인터(P) 위치에 주석 및 상태 변수 등 추적 가능한 구조를 남겼는가?
  • [ ] 점프 구간이 너무 길어 중요한 연산(PID 등)까지 건너뛰고 있지는 않는가?

👉 오늘 내용 3줄 요약

  1. 스캔 타임 지연은 설비의 감지 및 응답 타이밍을 무너뜨리는 중대 결함이다.
  2. CJ는 불필요한 연산을 생략하여 스캔 타임을 사수하는 강력한 도구다.
  3. CJ는 성능을 올리는 도구지만, 잘못 쓰면 설비를 멈추는 원인이 된다.

📌 결론

“CJ는 로직의 효율을 극대화하지만, PLC의 기본 동작 원리인 ‘순차 스캔’을 인위적으로 꺾는 기술입니다.” 단순히 로직을 줄이는 것이 아니라, 트러블 발생 시 신속히 추적할 수 있도록 흔적을 남기는 것이 고수의 설계입니다.


[다음 포스팅 예고]

이제 수만 개의 데이터를 한 번에 처리하는 기술이 필요합니다. 반복문의 꽃, FOR-NEXT와 인덱스 레지스터(Z)를 활용한 데이터 핸들링 기법을 알아보겠습니다.

👉 [실무] PLC FOR NEXT 안 쓰면 데이터 100개를 100줄로 처리합니다