이전 시리즈 1편: 이동 영역(Band)으로 충돌 예측
이전 시리즈 2편: 비대칭 마진 최적화와 Follow 추종 제어

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회 복귀 | 없음(목표 자체가 바뀜) |
| 용도 | 데드락 양보 | 좁은 구간 추종 |
충돌해소 모드는 워드 하나(ZR490x1)로 고릅니다.0 = Normal(Yield, 기본) / 1 = Follow. ZR 기본값이 0이므로, 아무것도 설정하지 않으면 가장 안전한 데드락 해소(Yield)가 디폴트로 동작합니다.
park를 이해하는 가장 쉬운 그림은 이렇습니다.

[park 전] 주장 Band = [현재 ~ 목표] + 마진 ← 경로 전체를 주장
[park 후] 주장 Band = [현재] 점 + 마진 ← 지금 밟고 선 자리만 주장
목표(D40036)는 그대로 보관
주장 영역이 현재 위치 한 점으로 줄어드니, 상대가 지나갈 길이 열립니다.
3. park override 래더: 글로벌 목표 소스를 바꾼다
park의 구현은 생각보다 간단합니다.
1편·2편에서 Band는 글로벌 현재(D49000)와 글로벌 목표(D49002) 로 계산했습니다.
park는 이 중 글로벌 목표의 소스를 바꾸는 것으로 끝납니다.
STEP3(글로벌 좌표 계산)에서 목표 소스를 상황별로 분기하는데, 여기에 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은 손대지 않으므로 그대로 보존됩니다.
park는 판정용 목표(D40036)만 잠시 안 쓰는 것이지, 서보를 움직이는 게 아닙니다.
실제 서보는 위치번호(D40029 등)로 구동하고, D40036은 Band 계산 전용입니다.
park는 D40036을 건드리지 않으니 서보 지령도, 복귀 목표도 모두 안전합니다.
4. Ok 차단: park한 축은 완전히 멈춘다
주장 Band를 현재 위치로 줄이면, 그 축은 항상 "안전(SAFE)"으로 보입니다(자기 자리만 주장하니까).
그런데 SAFE라고 기동을 허가해 버리면, park한 의미가 없어집니다.
그래서 park 중에는 종합 판정(Ok)을 강제로 차단합니다.
STEP6(종합 판정)에서 yield 래치(M49013)를 B접점으로 직렬에 넣습니다.

; 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:
M49013ON → 주장 목표를 현재 위치로 (주장 Band 축소) - STEP6:
M49013ON → 자기 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에서 목표 소스를
D40036→D40000(현재)로, STEP6에서M49013으로 자기 Ok 차단. - 완전 정지 park를 쓰는 이유: 데드락엔 정지가 안전 / 목표 무손상이라 복귀 정확 / 래치(SET/RST)로 잠가야 풀리지 않음.
- 충돌해소 모드는
ZR490x1워드 하나 — 기본값 0이 곧 Yield라 무설정이 가장 안전.
여기까지는 "한 축이 양보하면 데드락이 풀린다"까지 왔습니다.
그런데 정작 중요한 질문이 남았습니다.
둘 중 누가 양보해야 할까요? 양쪽이 다 양보하면 또 교착이고, 아무도 안 하면 충돌입니다.
다음 편(모션 충돌방지 알고리즘 4편: 누가 양보하나 (적격 판정과 우선권))에서 정확히 한 축만 양보하도록 만드는 적격 판정과 상호배제 우선권(seal-in) 을 진리표로 풀겠습니다.
글에서 설명한 데드락·양보(Yield) park 제어를 그대로 담은 테스트용 PLC 래더(GX Works2)와 프로페이스 HMI 화면 파일을 첨부합니다.
테스트해 보시고 문제점이 있다면 댓글로 피드백 주시면 감사드리겠습니다. ^^
'PLC 전기제어 기술자료 > 모션 기술자료' 카테고리의 다른 글
| 모션 충돌방지 알고리즘 5편: 견고한 양보 (복귀·설치방향·N축 확장) (0) | 2026.07.05 |
|---|---|
| 모션 충돌방지 알고리즘 4편: 누가 양보하나 (적격 판정과 우선권) (0) | 2026.07.04 |
| PLC 경로충돌방지 알고리즘 2편: 비대칭 마진 최적화와 Follow 추종 제어 (0) | 2026.06.18 |
| PLC 경로충돌방지 알고리즘 1편: 이동 영역(Band)으로 충돌 예측 (0) | 2026.04.22 |
| UVW 스테이지 위치값 연산: 보정이송량 계산과 현재위치 역산 PLC 구현 (1) | 2025.03.08 |