[카테고리:] PLC/Automation

PLC/자동제어 카테고리는 산업 자동화 현장에서 사용하는 PLC 제어, 전장 설계, 산업용 통신, 서보·모션, 제어반 제작과 관련된 실무 내용과 자동화 산업 현장 인사이트를 정리합니다. 현장 시운전과 유지보수 과정에서 자주 발생하는 문제, 전시회와 설비 트렌드에서 확인한 내용을 기준으로 작성합니다.

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

    PLC에서 같은 패턴의 데이터 처리를 여러 번 반복해야 하는 경우가 있습니다. 예를 들어 D100부터 D199까지 100개의 데이터를 검사하거나, 여러 개의 설정값을 순서대로 계산하거나, 일정 범위의 데이터를 비교하는 작업입니다. 이런 로직을 모두 한 줄씩 작성하면 프로그램이 길어지고 유지보수가 어려워집니다. FOR-NEXT와 인덱스 레지스터 Z를 함께 사용하면 반복 데이터 처리를 훨씬 간결하게 구성할 수 있습니다.

    반복 로직을 줄여야 하는 이유

    PLC 프로그램에서 같은 구조가 반복되면 처음 작성할 때는 단순해 보일 수 있습니다. 그러나 데이터 개수가 늘어나면 문제가 달라집니다.

    예를 들어 데이터 100개를 하나씩 비교하려고 같은 비교 로직을 100줄 작성하면, 나중에 조건을 하나 수정할 때 100곳을 확인해야 합니다. 중간에 주소 하나가 잘못 들어가도 찾기가 어렵고, 프로그램 전체 가독성도 떨어집니다.

    반복 로직이 길어지면 다음 문제가 자주 발생합니다.

    문제설명
    로직 길이 증가같은 패턴이 반복되어 프로그램이 길어짐
    주소 오류D137, D173처럼 중간 주소를 잘못 입력하기 쉬움
    수정 부담조건 변경 시 여러 줄을 모두 수정해야 함
    디버깅 어려움몇 번째 데이터에서 문제가 생겼는지 찾기 어려움
    유지보수성 저하다른 작업자가 로직 구조를 파악하기 어려움

    FOR-NEXT는 이런 반복 작업을 정리하는 데 사용됩니다. 특히 인덱스 레지스터 Z와 함께 사용하면 연속된 데이터 영역을 배열처럼 처리할 수 있습니다.

    본 글은 미쓰비시 MELSEC Q/R 시리즈 및 GX Works2/3 기준의 일반적인 내용을 바탕으로 작성했습니다. FOR-NEXT 사용 가능 범위, 인덱스 레지스터 개수, 명령어 제한 조건은 CPU 모델과 프로젝트 설정에 따라 달라질 수 있으므로 실제 적용 전 매뉴얼을 확인해야 합니다.

    FOR-NEXT의 기본 개념

    FOR-NEXT는 지정한 횟수만큼 특정 구간의 로직을 반복 실행하는 구조입니다. FOR에서 반복 횟수를 지정하고, NEXT에서 반복 구간을 종료합니다.

    예를 들어 100개의 데이터를 처리해야 한다면 FOR K100처럼 반복 횟수를 지정할 수 있습니다. 그러면 FOR와 NEXT 사이의 로직이 지정 횟수만큼 반복 실행됩니다.

    FOR-NEXT의 기본 개념은 다음과 같습니다.

    구분설명
    FOR반복 시작 지점
    반복 횟수몇 번 반복할지 지정
    반복 구간FOR와 NEXT 사이의 로직
    NEXT반복 종료 지점
    실행 방식지정 횟수만큼 반복 후 다음 로직으로 진행

    FOR-NEXT는 반복 로직을 줄이는 데 효과적입니다. 다만 한 스캔 안에서 반복이 처리될 수 있으므로 반복 횟수와 내부 연산량을 신중하게 잡아야 합니다.

    FOR만으로는 배열 처리가 어렵다

    FOR-NEXT만 사용하면 같은 구간을 반복 실행할 수는 있지만, 주소가 자동으로 바뀌는 것은 아닙니다.

    예를 들어 D100 값을 100번 읽는 구조라면 반복은 되지만 매번 같은 D100만 읽게 됩니다. 데이터 100개를 순서대로 처리하려면 D100, D101, D102처럼 주소가 반복마다 바뀌어야 합니다.

    이때 필요한 것이 인덱스 레지스터 Z입니다.

    인덱스 레지스터 Z의 역할

    Z는 주소를 가변적으로 지정할 때 사용하는 인덱스 레지스터입니다. 고정 주소 뒤에 Z를 붙이면 실제 참조 주소가 Z 값만큼 이동합니다.

    예를 들어 Z0 값이 5라면 D100Z0은 D105를 가리키는 방식으로 이해할 수 있습니다.

    Z0 값D100Z0이 가리키는 실제 주소
    0D100
    1D101
    2D102
    5D105
    99D199

    이 구조를 FOR-NEXT와 결합하면 연속된 데이터 영역을 순서대로 처리할 수 있습니다.

    FOR-NEXT와 Z를 함께 사용하는 기본 패턴

    FOR-NEXT와 Z를 함께 사용할 때는 보통 다음 흐름으로 구성합니다.

    단계처리 내용
    1루프 시작 전 Z 값을 초기화
    2FOR로 반복 횟수 지정
    3D100Z0처럼 인덱스 주소로 데이터 처리
    4반복마다 Z 값을 증가
    5NEXT에서 지정 횟수만큼 반복
    6반복 완료 후 다음 로직 진행

    예를 들어 D100부터 D199까지 100개 데이터를 순서대로 검사하려면, Z0을 0으로 초기화한 뒤 FOR K100을 실행하고, 반복마다 Z0을 1씩 증가시키는 방식으로 구성할 수 있습니다.

    이때 중요한 것은 루프 시작 전에 Z 값을 반드시 초기화하는 것입니다. 이전 스캔이나 다른 로직에서 사용한 Z 값이 남아 있으면 의도하지 않은 주소를 참조할 수 있습니다.

    데이터 배열 연산 예시

    두 개의 데이터 배열을 더해서 결과 배열에 저장하는 구조를 예로 들 수 있습니다.

    예를 들어 D100~D199와 D200~D299의 값을 순서대로 더해 D300~D399에 저장하는 구조입니다.

    개념은 다음과 같습니다.

    반복 순서읽는 값 1읽는 값 2저장 위치
    1회D100D200D300
    2회D101D201D301
    3회D102D202D302
    100회D199D299D399

    이런 구조를 개별 로직으로 작성하면 100줄 이상이 필요합니다. 하지만 FOR-NEXT와 Z를 사용하면 반복 패턴 하나로 처리할 수 있습니다.

    인덱스는 반드시 초기화해야 한다

    FOR-NEXT에서 Z를 사용할 때 가장 기본이 되는 작업은 인덱스 초기화입니다.

    예를 들어 루프 시작 전에 Z0을 0으로 만들지 않으면, 이전에 사용하던 값이 남아 있을 수 있습니다. Z0 값이 50인 상태에서 D100Z0을 사용하면 D150부터 참조하게 됩니다.

    따라서 반복 처리를 시작하기 전에는 MOV K0 Z0처럼 인덱스 값을 초기화하는 구조를 넣는 것이 일반적입니다.

    인덱스 초기화가 필요한 이유는 다음과 같습니다.

    이유설명
    주소 기준점 정리항상 D100부터 시작하도록 보장
    이전 값 영향 제거이전 루프 또는 다른 로직의 Z 값 잔류 방지
    디버깅 편의반복 시작점이 명확해짐
    메모리 침범 방지예상보다 뒤쪽 주소를 참조하는 문제 방지

    Z는 단순한 데이터가 아니라 주소를 바꾸는 값입니다. 따라서 일반 D 값보다 더 신중하게 관리해야 합니다.

    Z를 증가시키는 방식

    반복마다 다음 주소로 이동하려면 Z 값을 증가시켜야 합니다. 1워드씩 순서대로 처리하는 경우에는 Z0을 1씩 증가시키면 됩니다.

    예를 들어 D100, D101, D102처럼 연속 주소를 처리할 때는 반복마다 Z0을 1씩 증가시키는 방식이 적합합니다.

    반면 결과 저장 위치를 한 칸씩 띄워서 저장해야 한다면 Z 값을 2씩 증가시키는 구조도 사용할 수 있습니다. 예를 들어 D300, D302, D304처럼 저장해야 하는 경우입니다.

    처리 방식인덱스 증가
    D100, D101, D102 순서1씩 증가
    D300, D302, D304 순서2씩 증가
    32비트 데이터 단위 처리구조에 따라 2워드 단위 고려
    고정 간격 데이터 처리데이터 구조에 맞게 증가값 설정

    32비트 데이터를 다룰 때는 한 데이터가 2워드를 사용하는 경우가 많으므로 인덱스 증가량을 반드시 확인해야 합니다. 32비트 위치값을 D100/D101, D102/D103처럼 저장했다면 다음 데이터로 이동할 때 2워드 단위 이동이 필요할 수 있습니다.

    FOR-NEXT는 한 스캔 부하를 증가시킬 수 있다

    FOR-NEXT는 반복 로직을 짧게 만들지만, 실행 부하가 사라지는 것은 아닙니다. 반복 횟수만큼 내부 로직이 실행되므로 한 스캔에서 처리해야 하는 연산량은 늘어날 수 있습니다.

    예를 들어 FOR K100 내부에 단순 비교 한두 개만 있다면 큰 문제가 없을 수 있습니다. 하지만 내부에 문자열 처리, 대량 연산, 통신 데이터 가공, 여러 개의 BMOV, 복잡한 비교가 들어가면 스캔 타임이 늘어날 수 있습니다.

    반복 횟수와 내부 연산량이 과도하면 WDT, 즉 Watchdog Timer 에러가 발생할 수 있습니다. WDT는 PLC가 정해진 시간 안에 한 스캔을 끝내지 못할 때 발생할 수 있으며, 경우에 따라 CPU STOP으로 이어질 수 있습니다.

    WDT 에러를 피하기 위한 기준

    FOR-NEXT를 사용할 때는 반복 횟수를 무조건 크게 잡지 말고 실제 필요한 만큼만 설정해야 합니다.

    다음 기준을 확인하는 것이 좋습니다.

    확인 항목설명
    반복 횟수실제 필요한 데이터 개수만 반복하는지 확인
    내부 연산량루프 안에 무거운 연산이 과도하게 들어가지 않았는지 확인
    실행 주기매 스캔 실행해야 하는지, 조건부 실행이면 되는지 확인
    스캔 타임 변화적용 전후 스캔 타임을 확인
    분할 처리 필요성데이터가 많으면 여러 스캔으로 나누어 처리 검토

    모든 데이터를 반드시 한 스캔에 처리할 필요가 없다면, 여러 스캔에 나누어 처리하는 방식도 검토할 수 있습니다. 예를 들어 한 스캔에 10개씩 처리하고 다음 스캔에서 이어서 처리하는 구조입니다.

    CJ와 함께 사용하는 경우

    FOR-NEXT는 매 스캔 실행할 필요가 없는 경우가 많습니다. 예를 들어 모델 변경 시에만 레시피 데이터를 검사하거나, 검사 완료 후에만 100개 데이터를 비교하는 구조라면 매 스캔 반복문을 실행할 필요가 없습니다.

    이런 경우 CJ 같은 조건부 점프 구조를 이용해 필요한 시점에만 FOR-NEXT 구간을 실행하도록 구성할 수 있습니다.

    다만 CJ를 사용할 때는 출력 HOLD나 RST 미실행 문제를 주의해야 합니다. FOR-NEXT 구간이 데이터 처리 전용인지, 출력 제어와 섞여 있는지 반드시 확인해야 합니다.

    FOR-NEXT와 CJ를 함께 사용할 때의 기준은 다음과 같습니다.

    항목기준
    실행 조건데이터 처리 요청이 있을 때만 실행
    출력 제어루프 내부에서 실제 Y 출력 제어는 피함
    완료 플래그반복 처리 완료 후 별도 플래그 설정
    재실행 방지완료 후 요청 비트 초기화
    스캔 타임 확인조건부 실행 시에도 최대 부하 확인

    CJ는 반복문 실행 시점을 제어하는 데 사용할 수 있지만, 안전 조건이나 최종 출력부를 건너뛰는 용도로 사용하면 안 됩니다.

    루프 외부 간섭을 확인해야 한다

    FOR-NEXT와 Z를 사용할 때 Z 값이 예상과 다르게 움직인다면, 루프 외부에서 같은 Z 레지스터를 사용하고 있는지 확인해야 합니다.

    하나의 Z 레지스터를 여러 루틴에서 공유하면 다음 문제가 발생할 수 있습니다.

    문제설명
    주소 참조 오류다른 루틴에서 바꾼 Z 값으로 엉뚱한 주소 접근
    간헐적 오류특정 조건에서만 Z 값이 바뀌어 원인 추적 어려움
    데이터 덮어쓰기저장 위치가 밀려 다른 영역을 덮을 수 있음
    디버깅 어려움루프 내부에서는 정상처럼 보이지만 외부 조건이 간섭

    가능하면 루틴별로 사용하는 Z 번호를 구분하고, 주석으로 용도를 명확히 남기는 것이 좋습니다.

    예를 들어 Z0은 검사 데이터 루프, Z1은 결과 저장 루프, Z2는 레시피 복사 루프처럼 역할을 나누면 유지보수가 쉬워집니다.

    처음 적용할 때는 반복 횟수를 줄여 검증한다

    FOR-NEXT는 한 스캔 안에서 빠르게 실행되기 때문에 모니터링이 쉽지 않습니다. 따라서 처음부터 FOR K100으로 전체 데이터를 처리하기보다, FOR K1 또는 FOR K2처럼 작은 횟수로 동작을 검증하는 것이 안전합니다.

    검증할 때는 다음 항목을 확인합니다.

    확인 항목설명
    첫 번째 주소D100, D200, D300 등 시작 주소가 맞는지 확인
    두 번째 주소Z 증가 후 D101, D201, D301로 이동하는지 확인
    저장 결과결과값이 의도한 위치에 들어가는지 확인
    반복 종료지정 횟수 후 루프가 종료되는지 확인
    범위 초과마지막 반복에서 지정 영역을 넘지 않는지 확인

    검증 후 반복 횟수를 실제 데이터 개수로 늘리는 것이 좋습니다.

    메모리 범위 초과를 주의해야 한다

    Z 인덱스를 사용하면 주소가 자동으로 이동하기 때문에, 반복 횟수를 잘못 설정하면 할당하지 않은 영역까지 접근할 수 있습니다.

    예를 들어 D100부터 D199까지 100개 데이터만 처리해야 하는데 FOR K120으로 설정하면 D200 이후 영역까지 참조할 수 있습니다. 그 영역이 다른 용도로 사용 중이라면 데이터 충돌이 발생합니다.

    메모리 범위 초과를 막으려면 다음을 확인해야 합니다.

    확인 항목설명
    시작 주소배열의 첫 주소 확인
    데이터 개수실제 처리할 개수 확인
    인덱스 증가량1씩 증가인지, 2씩 증가인지 확인
    마지막 주소마지막 반복에서 접근하는 주소 계산
    주변 영역바로 뒤 주소가 다른 용도로 쓰이는지 확인

    FOR-NEXT와 Z를 사용할 때는 시작 주소와 반복 횟수만 보는 것이 아니라, 마지막으로 접근하는 주소까지 계산해야 합니다.

    반복 연산 설계 체크리스트

    FOR-NEXT와 Z를 사용한 반복 연산을 설계할 때는 다음 항목을 점검하는 것이 좋습니다.

    점검 항목확인 내용
    인덱스 초기화루프 시작 전 Z 값을 0 또는 기준값으로 초기화했는지 확인
    반복 횟수실제 데이터 개수와 반복 횟수가 일치하는지 확인
    인덱스 증가데이터 구조에 맞게 1워드 또는 2워드 단위로 증가하는지 확인
    메모리 범위마지막 반복에서 할당 영역을 넘지 않는지 확인
    외부 간섭다른 로직에서 같은 Z를 변경하지 않는지 확인
    스캔 타임반복 처리로 스캔 타임이 과도하게 늘지 않는지 확인
    WDT 위험루프 내부 연산량이 과도하지 않은지 확인
    테스트 방법처음에는 1~2회 반복으로 검증했는지 확인

    이 체크리스트를 기준으로 보면 반복문 사용 시 발생하는 대부분의 주소 오류와 스캔 타임 문제를 줄일 수 있습니다.

    FOR-NEXT와 Z 활용 정리

    FOR-NEXT는 반복적인 로직을 줄이는 데 효과적인 구조입니다. 데이터 100개를 비교하거나, 여러 설정값을 순서대로 처리하거나, 연속된 영역을 검사해야 할 때 같은 로직을 반복해서 작성하지 않고 하나의 반복 구조로 정리할 수 있습니다.

    하지만 FOR-NEXT만으로는 주소가 자동으로 바뀌지 않습니다. 인덱스 레지스터 Z를 함께 사용해야 D100, D101, D102처럼 연속된 데이터를 순서대로 처리할 수 있습니다. 그래서 미쓰비시 PLC에서 FOR-NEXT와 Z는 대량 데이터 처리의 기본 조합으로 볼 수 있습니다.

    반복문은 로직을 짧게 만들지만, 한 스캔 안에서 여러 번 실행되므로 스캔 타임과 WDT 에러를 고려해야 합니다. 루프 시작 전에는 Z 값을 초기화하고, 반복 횟수와 마지막 접근 주소를 계산해야 하며, 다른 로직에서 같은 Z를 변경하지 않는지도 확인해야 합니다.

    FOR-NEXT와 Z를 정확히 사용하면 반복 로직을 줄이고 데이터 처리 구조를 명확하게 만들 수 있습니다. 다만 반복문은 눈에 보이는 래더 줄 수를 줄이는 도구일 뿐, 메모리 안에서 어떤 주소를 읽고 쓰는지까지 계산되어야 안정적으로 사용할 수 있습니다.

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

    PLC 프로그램 규모가 커지면 모든 로직을 매 스캔마다 연산하는 구조가 비효율적일 수 있습니다. 특히 특정 조건에서만 필요한 비교, 문자열 처리, 데이터 검사, 에러 처리 루틴이 매번 실행되면 스캔 타임이 길어지고 입력 감지나 출력 응답 타이밍에 영향을 줄 수 있습니다. 이때 CJ 명령어를 사용하면 조건에 따라 불필요한 로직 구간을 건너뛰어 스캔 효율을 개선할 수 있습니다.

    스캔 타임을 관리해야 하는 이유

    PLC는 입력을 읽고, 프로그램을 연산하고, 출력을 갱신하는 과정을 반복합니다. 이 한 바퀴에 걸리는 시간이 스캔 타임입니다.

    스캔 타임이 길어지면 단순히 PLC가 느려지는 문제가 아니라, 설비의 반응 타이밍이 늦어질 수 있습니다. 현장에서는 몇 ms 차이로 센서 감지, 정지 응답, 통신 처리 결과가 달라질 수 있습니다.

    스캔 타임이 길어졌을 때 발생할 수 있는 문제는 다음과 같습니다.

    문제설명
    입력 신호 누락짧은 센서 신호가 스캔 주기 사이에 지나갈 수 있음
    출력 응답 지연정지, 차단, 다음 동작 신호가 늦게 나갈 수 있음
    통신 주기 불안정상위 장비, 인버터, 서보와의 통신 처리 타이밍이 흔들릴 수 있음
    타이머·카운터 조건 지연조건 판단이 늦어져 공정 흐름이 달라질 수 있음
    디버깅 난이도 증가어느 구간에서 시간이 걸리는지 찾기 어려워짐

    스캔 타임 문제는 단순한 속도 문제가 아니라 설비의 입력과 출력이 언제 반응하느냐의 문제입니다. 따라서 프로그램이 커질수록 꼭 필요한 로직만 필요한 시점에 실행되도록 구성하는 것이 중요합니다.

    본 글은 미쓰비시 MELSEC Q/R 시리즈 및 GX Works2/3 기준의 일반적인 내용을 바탕으로 작성했습니다. CJ 명령어의 세부 동작, 포인터 사용 범위, 제한 조건은 CPU 모델과 프로그램 구조에 따라 달라질 수 있으므로 실제 적용 전 매뉴얼을 확인해야 합니다.

    CJ 명령어의 기본 개념

    CJ는 Conditional Jump의 약자로, 조건이 성립했을 때 지정한 포인터 위치로 프로그램 실행 흐름을 이동시키는 명령어입니다.

    예를 들어 특정 조건이 ON되면 현재 위치부터 지정된 포인터까지의 로직을 연산하지 않고 건너뜁니다. 조건이 OFF이면 점프하지 않고 아래 로직을 그대로 실행합니다.

    CJ의 핵심은 출력 제어가 아니라 연산 구간 생략입니다.

    구분설명
    CJ 조건 OFF아래 로직을 그대로 실행
    CJ 조건 ON지정한 포인터 위치까지 점프
    점프된 구간해당 스캔에서 연산되지 않음
    포인터 위치점프 후 다시 실행이 이어지는 위치

    CJ는 특정 출력을 끄는 명령이 아닙니다. CPU가 해당 구간을 읽지 않고 지나가게 만드는 명령에 가깝습니다. 이 차이를 이해하지 못하면 출력 HOLD 문제가 생길 수 있습니다.

    CJ는 로직을 끄는 기능이 아니다

    CJ를 사용할 때 가장 중요한 점은 CJ가 로직을 OFF시키는 기능이 아니라는 것입니다.

    MC/MCR은 특정 구간을 상위 조건으로 묶어 일반 출력이 OFF되도록 만드는 구조로 사용할 수 있습니다. 반면 CJ는 조건이 성립하면 해당 구간의 연산 자체를 건너뜁니다.

    즉, CJ로 건너뛴 구간은 그 스캔에서 판단되지 않습니다. 해당 구간 안에 출력 OFF 조건이나 RST 조건이 있어도, 점프가 걸리면 그 조건은 실행되지 않을 수 있습니다.

    구분MC/MCRCJ
    기본 성격구간 제어실행 흐름 이동
    OFF 처리일반 출력 차단 구조로 사용 가능구간을 연산하지 않고 건너뜀
    내부 로직MC 조건에 따라 처리점프 시 실행되지 않음
    주의점SET/RST 위치 확인 필요출력 HOLD와 RST 미실행 주의

    CJ는 성능 개선에 유용하지만, 출력 차단이나 안전 인터락 목적으로 직접 사용하면 위험할 수 있습니다.

    CJ를 사용하는 대표적인 상황

    CJ는 매 스캔마다 실행할 필요가 없는 로직을 조건부로 처리할 때 효과적입니다.

    예를 들어 다음과 같은 구간은 CJ 적용을 검토할 수 있습니다.

    적용 구간설명
    자동운전 전용 로직수동 모드일 때 자동 시퀀스 연산 생략
    모델 변경 처리모델 변경 요청이 있을 때만 레시피 복사 실행
    문자열 비교데이터 수신 완료 시에만 비교 루틴 실행
    알람 분석 루틴알람 발생 시에만 상세 분석 실행
    대량 데이터 검사검사 요청이 있을 때만 연산 실행
    통신 송신 준비송신 조건이 있을 때만 데이터 조립

    반대로 매 스캔 반드시 확인해야 하는 안전 조건, 정지 조건, 비상정지 관련 최종 출력 조건은 CJ로 건너뛰지 않는 것이 좋습니다.

    문자열 비교 루틴에 CJ를 적용하는 예

    비전 장비나 바코드 리더기에서 문자열 데이터를 받아 기준 문자열과 비교하는 공정이 있다고 가정합니다. 수신되는 문자열이 길고 비교 항목이 많다면, 이 비교 루틴을 매 스캔 실행하는 것은 불필요할 수 있습니다.

    기존 구조에서는 새 데이터가 들어오지 않아도 문자열 비교가 계속 실행됩니다. 데이터가 바뀌지 않았는데도 CPU는 같은 비교 연산을 반복합니다.

    이런 경우에는 리딩 완료 비트가 ON되었을 때만 비교 루틴을 실행하도록 구성할 수 있습니다.

    흐름은 다음과 같이 정리할 수 있습니다.

    상태처리
    평상시문자열 비교 루틴 생략
    리딩 완료비교 루틴 실행
    판정 완료OK 또는 NG 결과 생성
    결과 전송상위 장비 또는 HMI로 결과 전달
    완료 후리딩 완료 비트 초기화 후 대기

    이 구조를 사용하면 필요한 순간에만 연산이 실행되므로 스캔 효율이 좋아지고, 프로그램 흐름도 명확해집니다.

    CJ와 MC 블록을 함께 볼 때 주의할 점

    CJ가 MC 블록을 건너뛰는 구조에서는 MC가 OFF되어 꺼진 것인지, 아니면 MC 명령 자체가 연산되지 않은 것인지 구분해야 합니다.

    예를 들어 CJ 조건이 ON되어 MC 구간 앞에서 포인터 위치로 점프했다면, CPU는 해당 스캔에서 MC 명령과 그 내부 로직을 실행하지 않습니다. 이 경우 MC가 OFF되어 내부 로직을 차단한 것이 아니라, 애초에 MC 구간 자체가 연산되지 않은 것입니다.

    이 차이는 트러블슈팅에서 중요합니다.

    MC가 OFF된 경우에는 MC 조건을 추적해야 하지만, CJ로 건너뛴 경우에는 점프 조건과 포인터 위치를 먼저 확인해야 합니다.

    상황확인할 것
    MC 조건 OFFMC를 구동하는 상위 인터락 조건 확인
    CJ로 MC 구간 스킵CJ 조건과 점프 포인터 확인
    내부 출력 미동작MC OFF인지, CJ 스킵인지 구분
    내부 RST 미실행CJ로 RST 구간을 건너뛰었는지 확인

    CJ가 적용된 로직에서는 단순히 접점 상태만 보지 말고, 해당 네트워크가 실제로 스캔되고 있는지도 확인해야 합니다.

    출력 HOLD 현상을 반드시 확인해야 한다

    CJ 사용 시 가장 주의해야 할 문제는 출력 HOLD입니다.

    CJ는 구간을 연산하지 않고 지나갑니다. 따라서 점프되는 구간 안에 있던 출력이 이전 스캔에서 ON된 상태라면, 다음 스캔에서 해당 구간을 건너뛰는 동안 OFF 조건이 실행되지 않을 수 있습니다.

    이 경우 출력이 의도와 다르게 ON 상태로 남아 있을 수 있습니다.

    예를 들어 어떤 출력이 특정 조건에서 ON되었고, 그 출력을 끄는 조건이 같은 점프 구간 내부에 있다고 가정합니다. 이후 CJ 조건이 ON되어 해당 구간을 건너뛰면, 출력 OFF 로직도 실행되지 않습니다. 결과적으로 이전 출력 상태가 남을 수 있습니다.

    CJ를 사용할 때는 다음을 반드시 확인해야 합니다.

    확인 항목설명
    점프 구간 내 출력ON 상태로 남으면 위험한 출력이 있는지 확인
    OFF 조건 위치OFF 또는 RST 조건이 점프 구간 밖에서도 실행되는지 확인
    SET/RST 사용 여부SET된 비트가 점프 중에도 해제되는지 확인
    최종 출력부안전 인터락이 CJ와 무관하게 항상 실행되는지 확인
    점프 전 초기화필요한 경우 점프 전에 상태를 정리하는지 확인

    CJ는 로직을 끄는 것이 아니라 읽지 않고 지나가는 것입니다. 그래서 출력 차단 목적이라면 CJ보다 별도 인터락이나 최종 출력 조건을 사용하는 것이 안전합니다.

    CJ를 사용하기 전에 출력 구조를 분리한다

    CJ를 안정적으로 사용하려면 연산 루틴과 최종 출력 제어를 분리하는 것이 좋습니다.

    예를 들어 자동운전 계산, 문자열 비교, 레시피 복사, 조건 판단 같은 연산성 로직은 CJ로 건너뛸 수 있습니다. 그러나 실제 Y 출력, 실린더 구동, 모터 구동, 히터 출력 같은 최종 출력부는 CJ에 의해 건너뛰지 않도록 별도 영역에서 항상 연산되게 구성하는 것이 안전합니다.

    구조를 나누면 다음과 같습니다.

    영역CJ 적용 여부
    대량 데이터 처리조건부 CJ 적용 가능
    문자열 비교데이터 수신 시에만 실행 가능
    모델 변경 처리변경 요청 시에만 실행 가능
    상태 플래그 정리상황에 따라 주의 필요
    최종 출력 제어CJ로 건너뛰지 않는 것이 안전
    비상정지·안전 인터락항상 연산되는 위치에 배치

    CJ를 사용해 스캔 타임을 줄이더라도 최종 출력 안전 조건은 매 스캔 확인되도록 설계해야 합니다.

    포인터 위치는 추적 가능하게 남긴다

    CJ를 많이 사용하면 디버깅이 어려워집니다. 프로그램이 위에서 아래로 순서대로 실행되지 않고 중간 구간을 건너뛰기 때문에, 나중에 유지보수할 때 어느 위치로 점프했는지 찾기 어려울 수 있습니다.

    따라서 CJ와 포인터를 사용할 때는 주석과 상태 표시를 남기는 것이 좋습니다.

    관리 기준설명
    포인터 주석포인터 위치에 용도를 명확히 표시
    CJ 주석어떤 조건에서 어디로 점프하는지 기록
    가까운 범위 유지CJ와 도착 포인터를 너무 멀리 떨어뜨리지 않음
    상태 변수 활용현재 어떤 루틴을 실행 중인지 D나 M으로 표시
    점프 구조 최소화불필요한 다중 점프를 피함

    예를 들어 P1 위치가 자동운전 루틴 시작점이라면 포인터 근처에 자동운전 루틴 시작이라는 주석을 남겨야 합니다. 점프 전후로 상태값을 남기면 모니터링 중에도 현재 어느 흐름을 타고 있는지 확인하기 쉽습니다.

    CJ를 남발하면 유지보수가 어려워진다

    CJ는 스캔 타임 개선에 도움이 될 수 있지만, 너무 많이 사용하면 프로그램 흐름이 끊겨 보입니다. 특히 점프가 여러 단계로 중첩되면 현재 로직이 왜 실행되지 않는지 찾기가 어려워집니다.

    CJ를 사용할 때는 다음 기준을 적용하는 것이 좋습니다.

    기준설명
    필요한 구간에만 사용매 스캔 불필요한 연산에 한정
    안전 로직 제외안전, 정지, 최종 출력부는 점프 대상에서 제외
    구간 단위로 사용작은 조건마다 점프하지 않고 루틴 단위로 정리
    포인터 명확화점프 도착지와 목적을 주석으로 표시
    스캔 타임 확인실제 개선 효과를 SD 스캔 타임 등으로 확인

    CJ를 넣었다고 항상 스캔 타임이 의미 있게 개선되는 것은 아닙니다. 실제로 어떤 루틴이 스캔 타임을 많이 사용하고 있는지 확인한 뒤 적용하는 것이 좋습니다.

    CJ 설계 시 점검할 항목

    CJ 명령어를 사용할 때는 다음 항목을 점검해야 합니다.

    점검 항목확인 내용
    점프 조건의도치 않게 항상 ON 상태가 되지 않는지 확인
    점프 구간중요한 연산이나 안전 로직이 포함되지 않았는지 확인
    출력 상태ON된 출력이 점프 중 HOLD되지 않는지 확인
    RST 조건필요한 리셋이 점프 구간 밖에서도 실행되는지 확인
    포인터 위치CJ와 포인터가 명확하게 연결되는지 확인
    주석점프 목적과 도착 위치를 추적할 수 있는지 확인
    스캔 타임 효과적용 전후 스캔 타임 변화를 확인했는지 확인
    유지보수성다른 작업자가 흐름을 이해할 수 있는지 확인

    CJ는 잘 쓰면 프로그램 효율을 높일 수 있지만, 잘못 쓰면 로직이 실행되지 않는 이유를 찾기 어렵게 만듭니다.

    CJ 활용 기준 정리

    CJ는 조건에 따라 불필요한 로직 구간을 건너뛰는 명령어입니다. 매 스캔 실행할 필요가 없는 문자열 비교, 대량 데이터 검사, 모델 변경 루틴, 자동운전 전용 루틴 등에 활용하면 스캔 타임 개선에 도움이 될 수 있습니다.

    하지만 CJ는 출력을 끄는 명령이 아닙니다. 점프 구간 안에 출력 OFF 조건이나 RST 조건이 있으면, 점프 중에는 그 조건이 실행되지 않을 수 있습니다. 이 때문에 출력 HOLD나 내부 플래그 잔류 문제가 발생할 수 있습니다.

    따라서 CJ를 사용할 때는 연산 루틴과 최종 출력부를 분리하고, 안전 조건과 정지 조건은 항상 스캔되는 위치에 두는 것이 좋습니다. 또한 포인터 위치와 점프 목적을 주석으로 남겨 나중에 흐름을 추적할 수 있게 해야 합니다.

    스캔 타임 개선은 단순히 로직을 줄이는 작업이 아니라, 어떤 로직을 매 스캔 실행해야 하고 어떤 로직은 조건부로 실행해도 되는지 구분하는 작업입니다. CJ는 그 구분이 명확할 때 효과적인 명령어입니다.

  • [실무] 비상정지 복귀 시 오동작 막는 MC/MCR 설계 기준

    비상정지 해제 후 설비가 예상과 다르게 즉시 동작하는 경우가 있습니다. 이런 문제는 단순히 출력 회로만 볼 것이 아니라 PLC 내부의 인터락 구조, MC/MCR 블록, SET/RST 사용 위치를 함께 확인해야 합니다. MC OFF 상태에서 어떤 로직은 멈추고, 어떤 상태 비트는 그대로 남는지 구분하지 못하면 재기동 시 오동작으로 이어질 수 있습니다.

    MC/MCR을 이해해야 하는 이유

    MC/MCR은 특정 로직 구간을 통째로 제어하기 위한 마스터 제어 구조입니다. MC로 블록을 시작하고 MCR로 블록을 닫는 방식으로 사용하며, 해당 구간 안의 로직을 상위 조건에 따라 일괄적으로 동작시키거나 차단할 수 있습니다.

    예를 들어 자동운전 조건, 안전 조건, 비상정지 조건, 도어 인터록 조건이 정상일 때만 특정 구간의 로직을 실행하고 싶다면 MC/MCR 구조를 사용할 수 있습니다.

    다만 MC/MCR은 단순한 전원 스위치처럼 생각하면 안 됩니다. MC가 OFF되었을 때 일반 코일, 내부 비트, SET/RST, 타이머, 카운터가 각각 어떻게 동작하는지 확인해야 합니다.

    본 글은 미쓰비시 MELSEC Q/R 시리즈 및 GX Works2/3 기준의 일반적인 내용을 바탕으로 작성했습니다. MC/MCR 명령의 세부 동작과 제한 사항은 CPU 시리즈와 프로그램 구조에 따라 달라질 수 있으므로 실제 적용 전 매뉴얼을 확인해야 합니다.

    MC/MCR 블록은 특정 구간에만 영향을 준다

    MC/MCR은 프로그램 전체를 끄는 명령이 아니라, MC와 MCR 사이에 있는 특정 로직 구간에 영향을 줍니다.

    MC 조건이 ON이면 해당 구간의 로직은 정상적으로 연산됩니다. MC 조건이 OFF되면 해당 구간의 일반 출력은 차단되고, 구간 내부 로직은 정상 실행 상태와 다르게 처리됩니다.

    일반적인 개념은 다음과 같습니다.

    상태동작 개념
    MC ONMC/MCR 구간 내부 로직이 정상 연산됨
    MC OFF구간 내부 일반 출력이 OFF 방향으로 처리됨
    MCRMC로 시작한 제어 구간을 종료함
    MC/MCR 범위 밖 로직해당 MC 조건의 직접 영향 없음

    중요한 점은 MC 내부에 있는 신호는 그 신호가 SM400 같은 항상 ON 접점이라도 MC 조건의 영향을 받는다는 것입니다. MC 블록 안에 들어간 순간, 그 로직은 상위 MC 조건이 살아 있을 때만 정상적으로 의미를 갖습니다.

    MC/MCR 번호와 중첩 구조를 확인해야 한다

    MC/MCR은 시작과 종료 번호가 맞아야 합니다. 예를 들어 MC N1로 시작했다면 해당 구간은 MCR N1로 닫아야 합니다.

    번호가 맞지 않거나 MCR이 빠지면 어느 구간까지 MC의 영향을 받는지 파악하기 어려워집니다. 유지보수 시 로직 범위가 불명확해지고, 비상정지나 자동운전 조건이 의도하지 않은 구간까지 영향을 줄 수 있습니다.

    중첩 구조도 주의해야 합니다. 예를 들어 N0 블록 안에 N1 블록이 들어가 있다면, 상위 N0가 OFF될 경우 하위 N1 조건이 ON이어도 내부 로직은 영향을 받을 수 있습니다.

    MC/MCR을 사용할 때는 다음 항목을 확인해야 합니다.

    확인 항목설명
    MC 번호시작 번호가 의도한 번호인지 확인
    MCR 번호종료 번호가 MC 번호와 일치하는지 확인
    적용 범위어느 로직까지 MC 영향권인지 확인
    중첩 구조상위 MC와 하위 MC의 관계 확인
    주석블록 목적과 적용 범위를 명확히 표시

    MC/MCR은 로직을 깔끔하게 묶을 수 있지만, 범위가 틀어지면 문제 원인을 찾기 어려워집니다.

    MC OFF 시 일반 코일과 SET은 다르게 봐야 한다

    MC/MCR에서 가장 주의해야 할 부분은 일반 코일과 SET 명령의 차이입니다.

    일반 코일 OUT은 MC 구간이 OFF되면 함께 OFF되는 방향으로 처리됩니다. 그래서 안전 조건이나 자동운전 조건이 끊겼을 때 출력이 꺼지는 구조를 만들기 쉽습니다.

    하지만 SET으로 이미 ON된 비트는 별도의 RST가 실행되지 않으면 상태가 남을 수 있습니다. 이 차이를 모르고 MC 내부에서 SET을 사용하면 비상정지 복귀 후 예상하지 못한 동작이 발생할 수 있습니다.

    구분MC OFF 시 주의점
    일반 코일 OUTMC 조건이 끊기면 OFF 방향으로 처리됨
    자기유지MC 조건이 상위에 있으면 함께 끊기도록 구성 가능
    SET 비트RST가 실행되지 않으면 상태가 남을 수 있음
    RST 명령MC 내부에 있으면 MC OFF 중 실행되지 않을 수 있음

    MC는 SET으로 켜진 상태를 자동으로 정리해 주는 기능이 아닙니다. SET을 사용했다면 반드시 RST 조건을 별도로 설계해야 합니다.

    비상정지 복귀 후 즉시 동작하는 원인

    비상정지 해제 후 실린더나 모터가 바로 동작하는 경우에는 내부 상태 비트가 남아 있는지 확인해야 합니다.

    예를 들어 MC 내부에서 특정 동작 플래그를 SET해 두었고, 비상정지로 MC 조건이 OFF되었다고 가정합니다. 이때 일반 출력은 꺼졌기 때문에 설비는 멈춘 것처럼 보입니다. 그러나 SET된 내부 플래그가 RST되지 않았다면 메모리 상태는 여전히 ON으로 남아 있을 수 있습니다.

    이후 비상정지를 해제해 MC 조건이 다시 ON되면, 남아 있던 SET 비트가 다시 출력 조건을 만족시켜 설비가 즉시 동작할 수 있습니다.

    문제 흐름을 정리하면 다음과 같습니다.

    단계상태
    동작 중내부 동작 플래그가 SET됨
    비상정지 발생MC OFF로 일반 출력은 차단됨
    MC 내부 RST 미실행SET 비트가 그대로 남음
    비상정지 해제MC ON 복귀
    재기동 명령 없음남아 있던 SET 비트 때문에 출력 조건 성립 가능

    이 구조에서는 작업자가 다시 시작 버튼을 누르지 않았는데도 설비가 움직일 수 있습니다. 따라서 비상정지 복귀 조건과 재기동 조건은 반드시 분리해야 합니다.

    RST를 MC 내부에만 두면 문제가 생길 수 있다

    MC 구간 내부에 RST 명령을 넣는 경우가 있습니다. 그러나 MC가 OFF되었을 때 해당 구간이 정상 연산되지 않는 구조라면, 내부 RST도 실행되지 않을 수 있습니다.

    즉, 비상정지나 상위 인터락으로 MC가 OFF된 상태에서는 정작 SET 비트를 꺼야 하는 RST가 동작하지 못할 수 있습니다.

    이 문제는 현장에서 반복적으로 발생합니다. 전원을 껐다 켜면 일시적으로 정상처럼 보일 수 있지만, 같은 운전 조건이 반복되면 다시 동일한 증상이 발생합니다. 원인은 출력부가 아니라 내부 SET 비트와 RST 위치일 수 있습니다.

    따라서 비상정지, 알람, 자동운전 해제처럼 반드시 상태를 정리해야 하는 RST 조건은 MC 외부 또는 상위에서 확실히 실행되는 위치에 두는 것이 안전합니다.

    SET을 사용할 때는 외부 RST 구조를 만든다

    SET 자체가 항상 나쁜 것은 아닙니다. 알람 기억, 공정 완료 플래그, 특정 상태 유지처럼 SET/RST가 적합한 경우도 있습니다.

    문제는 SET을 사용하고도 확실한 RST 조건을 만들지 않는 것입니다.

    SET을 사용하는 경우에는 다음 조건에서 RST가 실행되는지 확인해야 합니다.

    RST 조건목적
    비상정지 발생위험 상태에서 내부 동작 플래그 제거
    자동운전 OFF자동 시퀀스 상태 초기화
    알람 발생이상 상태에서 다음 동작 차단
    원점 복귀 시작이전 공정 상태 정리
    운전 준비 해제재기동 전 내부 상태 제거
    작업자 리셋확인 후 다음 사이클 준비

    특히 비상정지와 자동운전 OFF 조건은 MC 내부가 아니라 MC 외부에서 RST가 실행되도록 구성하는 것이 좋습니다. 그래야 MC가 OFF된 상태에서도 내부 상태를 확실히 정리할 수 있습니다.

    재기동 조건은 비상정지 복귀와 분리한다

    비상정지를 해제했다고 해서 설비가 바로 다시 동작하면 안 됩니다. 비상정지 해제는 운전 가능 상태로 돌아가는 조건일 뿐, 기동 명령 자체가 되어서는 안 됩니다.

    안전한 구조는 다음과 같이 나누는 것입니다.

    구분의미
    비상정지 해제설비가 다시 운전 가능한 상태
    운전 준비안전 조건, 원점, 알람 상태 정상 확인
    작업자 시작작업자가 Start 버튼으로 재기동 승인
    자동운전 플래그시작 조건 후에만 ON
    출력 동작자동운전 플래그와 공정 조건이 모두 만족될 때 동작

    이렇게 구성하면 비상정지를 해제해도 내부 상태가 바로 출력으로 이어지지 않습니다. 작업자가 다시 시작 명령을 넣어야만 자동운전 플래그가 살아나고, 그 이후 공정 조건이 순서대로 진행됩니다.

    MC 내부 출력은 최종 인터락을 한 번 더 거치는 것이 좋다

    MC/MCR은 소프트웨어 인터락 구조입니다. 하지만 실제 출력은 별도 안전 조건과 최종 인터락을 거쳐 제어하는 것이 좋습니다.

    예를 들어 실린더 전진 출력은 단순히 공정 플래그만으로 나가는 것이 아니라 다음 조건을 함께 봐야 합니다.

    출력 전 확인 조건설명
    비상정지 정상안전 회로 정상 여부
    자동운전 상태작업자가 운전을 승인했는지 확인
    알람 없음장비 이상 상태가 아닌지 확인
    반대 동작 OFF전진·후진 동시 출력 방지
    위치 조건현재 위치가 동작 가능한 상태인지 확인
    에어 압력 정상공압 동작 가능 여부 확인

    MC 내부 로직이 정상이어도 최종 출력부에서 한 번 더 조건을 걸면 예상하지 못한 내부 플래그 잔류로 인한 동작을 줄일 수 있습니다.

    MC와 SET/RST 사용 시 점검할 항목

    MC/MCR과 SET/RST가 함께 사용된 로직은 다음 항목을 확인하는 것이 좋습니다.

    점검 항목확인 내용
    MC 범위MC와 MCR 사이에 어떤 로직이 포함되는지 확인
    SET 위치MC 내부에 SET 명령이 있는지 확인
    RST 위치RST가 MC 외부 또는 상위 조건에서 실행되는지 확인
    비상정지 시 상태비상정지 발생 시 내부 플래그가 정리되는지 확인
    복귀 시 상태비상정지 해제 후 출력이 즉시 살아나지 않는지 확인
    재기동 조건Start 버튼 등 작업자 기동 조건이 분리되어 있는지 확인
    중복 제어같은 비트를 OUT, SET, RST로 여러 곳에서 제어하지 않는지 확인
    MC 번호MC/MCR 번호와 중첩 구조가 맞는지 확인

    시운전 중에는 비상정지, 알람 발생, 자동운전 해제, 전원 재투입, 원점 복귀 같은 비정상 흐름을 반드시 테스트해야 합니다. 정상 사이클만 확인하면 SET 비트 잔류 문제를 놓치기 쉽습니다.

    MC/MCR 설계 기준 정리

    MC/MCR은 로직 구간을 일괄적으로 제어할 수 있는 유용한 구조입니다. 자동운전 조건, 안전 조건, 상위 인터락을 기준으로 특정 구간을 묶어 관리할 때 효과적입니다.

    하지만 MC가 OFF된다고 해서 모든 내부 상태가 자동으로 안전하게 초기화되는 것은 아닙니다. 일반 코일은 MC 조건에 따라 OFF될 수 있지만, SET으로 유지된 비트는 RST가 실행되지 않으면 그대로 남을 수 있습니다. 또한 RST를 MC 내부에만 두면 MC OFF 상태에서 정작 리셋이 실행되지 않을 수 있습니다.

    따라서 MC 내부에 SET을 사용하는 경우에는 반드시 MC 외부 또는 상위 조건에서 실행되는 RST 구조를 만들어야 합니다. 비상정지 해제 후에는 자동 재기동이 되지 않도록 작업자의 Start 조건을 별도로 요구해야 합니다.

    MC/MCR은 편의 기능이 아니라 상위 인터락 구조입니다. 설계할 때는 MC OFF 시 일반 출력, SET 비트, RST 조건, 재기동 조건이 각각 어떻게 동작하는지 확인해야 비상정지 복귀 시 오동작을 줄일 수 있습니다.