본문 바로가기
PLC 전기제어 기술자료/모션 기술자료

모션 충돌방지 알고리즘 3편: 데드락과 양보(Yield) 제어

by 위치결정JP 2026. 7. 2.
728x90
반응형
이전 시리즈 1편: 이동 영역(Band)으로 충돌 예측
이전 시리즈 2편: 비대칭 마진 최적화와 Follow 추종 제어

 

충돌방지 3편 데드락 상황 개념도: 단일 레일에서 Ax#1과 Ax#2가 서로의 앞 지점을 목표로 마주보고 접근하다 둘 다 멈추는 교착(Deadlock)

 

2편의 Follow 추종은 상대가 비켜주면 그만큼 따라 들어가는 제어였습니다.

그런데 두 헤드가 서로의 자리로 가려고 마주보면 Follow로는 안 풀립니다.

둘 다 상대 경계까지만 크롤하다가 서로를 막고 멈춰 버리는 교착(데드락) 이 생기기 때문입니다.

이번 편은 한 축이 잠깐 양보(Yield·park) 해서 이 교착을 푸는 제어를 다룹니다.

1. 데드락이란: Follow가 못 푸는 교착

단일 레일에 헤드가 두 개 있고, 서로 상대가 있는 방향으로 이동 지령이 내려왔다고 해봅시다.

Follow 제어는 "상대 Band 경계 직전까지만 부분 이동"이 목표입니다.

그런데 두 헤드가 마주보면 이런 일이 벌어집니다.

 

        Ax#1 목표 →              ← Ax#2 목표
   ●━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━●
  Ax#1 현재                      Ax#2 현재
   (오른쪽으로 가려 함)        (왼쪽으로 가려 함)

   → Ax#1은 Ax#2 앞에서 멈추고
   → Ax#2도 Ax#1 앞에서 멈추고
   → 둘 다 크롤만 하다 서로를 막음 = 데드락

 

Follow는 "상대가 비켜주면 따라간다"는 협조 제어입니다.

그런데 아무도 안 비켜주면 따라갈 대상이 없습니다.

서로 상대의 Band 경계 앞에서 조금씩 다가가다 멈추고, 그 상태로 굳어 버립니다.

⚠️ 주의

고정 양보축(한 축만 양보)으로는 한 방향만 풀립니다.
"무조건 Ax#2가 양보한다"로 정하면, Ax#2가 상대를 통과해야 하는 반대 방향 교착은 여전히 못 풉니다.
양보해야 할 축은 상황(어느 쪽이 상대를 지나가려 하는가)에 따라 바뀌어야 합니다. 이 판정은 4편에서 다룹니다.

2. Yield 개념: 목표는 그대로, 주장만 접는다

Yield(양보)의 핵심은 목표를 버리지 않는다는 점입니다.

Follow처럼 목표를 상대 경계로 끌어내리는(crawl) 게 아니라, 위치결정 목표(D40036)는 원래 값 그대로 두고 내가 "지금 점유하겠다고 주장하는 영역"만 현재 위치로 줄입니다.

이렇게 주장 Band를 현재 위치의 점(point)으로 축소하는 것을 park(양보 정지) 라고 부릅니다.

park한 축은 그 자리에 완전히 멈춰서 길을 터 줍니다.

상대가 그 옆을 지나가고 나면, 원래 목표(D40036)가 그대로 남아 있으므로 정확히 원래 가려던 곳으로 1회 복귀합니다.

항목 Yield (양보·기본) Follow (추종)
주장 Band 현재 위치로 축소(park) 상대 경계까지 끌어내림
자기 기동 Ok 차단(완전 정지) Ok 허용(부분 이동)
목표(D40036) 보존 끌어내려 변경
복귀 원목표로 1회 복귀 없음(목표 자체가 바뀜)
용도 데드락 양보 좁은 구간 추종
💡 TIP

충돌해소 모드는 워드 하나(ZR490x1)로 고릅니다.
0 = Normal(Yield, 기본) / 1 = Follow. ZR 기본값이 0이므로, 아무것도 설정하지 않으면 가장 안전한 데드락 해소(Yield)가 디폴트로 동작합니다.

park를 이해하는 가장 쉬운 그림은 이렇습니다.

 

park 전/후 주장 Band 비교 개념도: park 전은 현재~목표 경로 전체를 주장, park 후는 현재 위치 한 점으로 축소(목표 D40036은 보존)

 

[park 전]  주장 Band = [현재 ~ 목표] + 마진   ← 경로 전체를 주장
[park 후]  주장 Band = [현재] 점 + 마진        ← 지금 밟고 선 자리만 주장
                 목표(D40036)는 그대로 보관

 

주장 영역이 현재 위치 한 점으로 줄어드니, 상대가 지나갈 길이 열립니다.

3. park override 래더: 글로벌 목표 소스를 바꾼다

park의 구현은 생각보다 간단합니다.

1편·2편에서 Band는 글로벌 현재(D49000)와 글로벌 목표(D49002) 로 계산했습니다.

park는 이 중 글로벌 목표의 소스를 바꾸는 것으로 끝납니다.

STEP3(글로벌 좌표 계산)에서 목표 소스를 상황별로 분기하는데, 여기에 park 분기를 추가합니다.

 

STEP3 글로벌 좌표 목표 소스 분기 래더: 설치방향(ZR49000 Posi/Nega) 분기 아래에서 yield 활성 비트 M49013에 따라 글로벌 목표가 요청 어드레스(D40036) 또는 현재값(D40000)으로 갈림 — park 중 목표가 현재 위치로 동결

 

; STEP3 글로벌 목표(D49002) 소스 분기 — Posi 설치 기준
| M49000 |--| M49013/ |--[ D+ ZR49002 D40036 D49002 ]   ; 요청중·미park: 새 목표 주장
| M49000 |--| M49013  |--[ D+ ZR49002 D40000 D49002 ]   ; 요청중·park:  현재 위치 주장 (양보)
| M40001            |--[ D+ ZR49002 D40002 D49002 ]   ; 이동중: 실지령 목표
| 요청X·이동X       |--[ D+ ZR49002 D40000 D49002 ]   ; 정지중: 현재 위치 (Band 축퇴)

 

핵심은 두 번째 줄입니다.

yield 활성 래치(M49013)가 ON인 동안에는 목표 소스를 D40036(새 목표)이 아니라 D40000(현재 위치) 로 바꿉니다.

그러면 글로벌 목표 = 글로벌 현재가 되어, Band가 현재 위치의 점-Band로 축소됩니다.

이때 원목표 D40036은 손대지 않으므로 그대로 보존됩니다.

💡 TIP

park는 판정용 목표(D40036)만 잠시 안 쓰는 것이지, 서보를 움직이는 게 아닙니다.
실제 서보는 위치번호(D40029 등)로 구동하고, D40036은 Band 계산 전용입니다.
park는 D40036을 건드리지 않으니 서보 지령도, 복귀 목표도 모두 안전합니다.

4. Ok 차단: park한 축은 완전히 멈춘다

주장 Band를 현재 위치로 줄이면, 그 축은 항상 "안전(SAFE)"으로 보입니다(자기 자리만 주장하니까).

그런데 SAFE라고 기동을 허가해 버리면, park한 의미가 없어집니다.

그래서 park 중에는 종합 판정(Ok)을 강제로 차단합니다.

STEP6(종합 판정)에서 yield 래치(M49013)를 B접점으로 직렬에 넣습니다.

 

STEP6 최종 판정 래더: M49005(Crash Safe)와 yield 활성 M49013 b접점 직렬로 M49008(MovAble Judge Ok) 출력 — yield park 중에는 이동허가 Ok가 차단되고 Ng로 전환

 

; STEP6 종합 판정 — yield park 시 Ok 차단
| M49000 |--+--| M49001 |--| M49003 |--+--| M49005 |--| M49013/ |--( M49008 )
            +--| M49002 |--| M49004 |--+                            ; M49013=park 시 Ok 차단
            +--[ D49016 = K0 ]---------+

기동 출력: Y10 = (Pos cmd OR체인) AND M49008 AND NOT M40001

 

M49013이 ON이면 M49008(Ok)이 서지 못하므로, 기동 출력 Y10이 나가지 않습니다.

park한 축은 그 자리에 완전히 정지한 채로 상대에게 길을 내줍니다.

정리하면 park는 두 줄로 완성됩니다.

 

  • STEP3: M49013 ON → 주장 목표를 현재 위치로 (주장 Band 축소)
  • STEP6: M49013 ON → 자기 Ok 차단 (완전 정지)

5. 왜 crawl이 아니라 완전 정지 park인가

Follow는 상대 경계까지 조금씩 크롤(부분 이동)합니다.

Yield는 그러지 않고 완전히 멈춥니다. 이유는 세 가지입니다.

첫째, 데드락 상황에서는 완전 정지가 더 안전합니다.

서로 마주본 상태에서 양쪽이 조금씩 움직이면 오히려 충돌 위험이 커집니다.

한 축이 확실히 멈춰야 상대가 안심하고 지나갈 공간이 생깁니다.

둘째, 목표가 무손상이라 복귀가 정확합니다.

crawl은 목표 자체를 끌어내려 바꿔 버립니다(복귀할 원래 목표가 사라짐).

park는 D40036을 그대로 두므로, 상대가 지나간 뒤 원래 가려던 그 위치로 한 번에 복귀합니다.

셋째, 래치(SET/RST)로 park를 잠가 두어야 풀리지 않습니다.

M49013을 매 스캔 판정하는 레벨 신호가 아니라 SET/RST 래치로 둡니다.

park로 주장 Band가 줄어들면 그 축은 SAFE로 보이는데, 레벨 신호였다면 SAFE가 되는 순간 양보 조건이 무너져 park가 풀리고 다시 움직이려 합니다(crawl 발생).

래치로 잠가 두면 park 조건이 사라져도 완전 정지가 유지되고, 정해진 해제 조건에서만 풀립니다.

⚠️ 주의

park 진입 조건에는 마진이 0이면 안 됩니다.
마진(ZR49004/ZR49006)은 최적화 여유가 아니라 물리 충돌 방지 버퍼 그 자체입니다.
0으로 두면 Band가 순수 이동 구간으로 붕괴해, 상대 경계를 미세하게 넘겨 정지한 헤드가 SAFE=1로 오판되어 양보도 인터락도 없이 충돌할 수 있습니다.
시운전 전 네 개 마진(ZR49004/ZR49006/ZR49054/ZR49056)이 모두 물리 이격(≥10) 이상인지 반드시 확인하세요.

6. 정리: Yield park로 데드락을 푼다

  • 데드락 = 두 헤드가 서로의 자리로 마주보는 교착. Follow(추종)로는 아무도 안 비켜 못 푼다.
  • Yield = 목표(D40036)는 보존한 채 주장 Band만 현재 위치로 축소(park). 상대를 통과시킨 뒤 원목표로 복귀.
  • park override는 두 줄: STEP3에서 목표 소스를 D40036D40000(현재)로, STEP6에서 M49013으로 자기 Ok 차단.
  • 완전 정지 park를 쓰는 이유: 데드락엔 정지가 안전 / 목표 무손상이라 복귀 정확 / 래치(SET/RST)로 잠가야 풀리지 않음.
  • 충돌해소 모드는 ZR490x1 워드 하나 — 기본값 0이 곧 Yield라 무설정이 가장 안전.

 

여기까지는 "한 축이 양보하면 데드락이 풀린다"까지 왔습니다.

그런데 정작 중요한 질문이 남았습니다.

둘 중 누가 양보해야 할까요? 양쪽이 다 양보하면 또 교착이고, 아무도 안 하면 충돌입니다.

다음 편(모션 충돌방지 알고리즘 4편: 누가 양보하나 (적격 판정과 우선권))에서 정확히 한 축만 양보하도록 만드는 적격 판정상호배제 우선권(seal-in) 을 진리표로 풀겠습니다.

글에서 설명한 데드락·양보(Yield) park 제어를 그대로 담은 테스트용 PLC 래더(GX Works2)와 프로페이스 HMI 화면 파일을 첨부합니다.

 

r06_Deadlock Yield_260701.gxw
1.84MB

 

r06_Deadlock Yield_260701.prx
0.45MB

 

테스트해 보시고 문제점이 있다면 댓글로 피드백 주시면 감사드리겠습니다. ^^

728x90
반응형