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

3편에서 한 축이 park(양보)하면 데드락이 풀린다는 것을 봤습니다.
문제는 누가 양보하느냐 입니다.
양쪽이 다 양보하면 둘 다 멈춰 또 교착이고, 아무도 안 하면 충돌입니다.
이번 편은 정확히 한 축만 양보하도록 만드는 적격 판정과, 동률일 때 순서를 가르는 상호배제 우선권(seal-in) 을 진리표로 풉니다.
1. 추월형 적격 판정: 뒤축이 양보한다
먼저 "양보 후보"를 가립니다.
기준은 하나입니다. 내 목표가 상대의 현재 위치를 지나(너머) 가려는 축입니다.
이 축이 곧 상대를 추월하려는 뒤축이고, 이 축이 양보하면 앞축이 먼저 지나갑니다.

적격(Ax#1) = (현재 D49000 < 상대현재 D49050 AND 목표 D49002 > 상대현재 D49050) ; 오른쪽으로 통과
OR (현재 D49000 > 상대현재 D49050 AND 목표 D49002 < 상대현재 D49050) ; 왼쪽으로 통과
; (Ax#2 는 상대현재 = D49000 으로 대칭)
풀어 보면 이렇습니다.
내 현재 위치는 상대의 이쪽에 있는데, 내 목표는 상대의 저쪽에 있다.
그러면 나는 상대를 가로질러 가야 하므로, 내가 뒤축(추월 시도)입니다.
비교 기준은 상대의 Band 가 아니라 상대의 "현재 위치"(D49050)입니다.
두 Band 가 깊이 겹치는 추월 상황에서 상대 Band 를 기준으로 삼으면 양쪽 다 부적격이 되어 안 풀립니다.
현재 위치를 기준으로 삼아야 "누가 누구를 지나가려 하는가"가 정확히 갈립니다.
이 방식의 장점은 충돌 방향과 무관하게 자동 해소된다는 점입니다.
Ax#1이 오른쪽으로 추월하든 왼쪽으로 추월하든, "상대를 지나가려는 쪽"이 적격이 되어 양보합니다.
한 축만 양보 대상으로 고정할 필요가 없습니다.
2. 마진범위 적격: 티칭 잔차를 흡수한다
위 식은 목표와 상대 현재를 정확한 값으로 크기 비교(목표 > 상대현재)합니다.
그런데 실제 설비에서는 이게 위태롭습니다.
두 로봇의 티칭 좌표에는 글로벌 캘리브레이션(2편 §6) 후에도 미세한 잔차가 남습니다.
목표가 상대 현재 위치와 아슬아슬하게 붙어 있을 때, 이 잔차가 적격 판정을 뒤집어 버릴 수 있습니다.
그래서 정본은 정확값 대신 상대 현재 ± 마진 허용 범위로 적격을 판정합니다.
이때 LOOSEN(느슨) 방향으로 넓혀야 합니다. 목표가 마진 범위에 닿기만 해도 적격으로 봅니다.
오른쪽 통과 적격: 목표 D49002 > (상대현재 − 마진) = D_lo
왼쪽 통과 적격: 목표 D49002 < (상대현재 + 마진) = D_hi
임계값 D_lo/D_hi는 매 스캔 미리 계산해 둡니다(설치 방향에 따라 Back/Front 마진을 §4 Band 와 동일하게 스왑).
반대로 TIGHTEN(엄격)으로 좁히면 영구 데드락에 빠집니다.
"마진을 확실히 넘어야 적격"(목표 > 상대현재 + 마진)으로 좁히면, 목표가 상대 자리 근처인 케이스(서로의 자리로 수렴)에서 양쪽 다 부적격이 됩니다.
그러면 우선권 판정으로 넘어가 비우선축이 그 자리에 park 해 길을 막고, 아무도 못 지나가는 영구 교착이 됩니다.
LOOSEN 은 그 축을 적격 → 양보시켜 상대가 먼저 자리를 비우게 함으로써 교착을 풉니다.
이 마진 범위(상대 현재 ± 작은 마진)는 충돌 판정용 Band 와 다릅니다.
충돌 Band 는 상대의 전체 이동 영역이고, 여기서 쓰는 마진 범위는 티칭 잔차를 흡수하기 위한 tolerance 입니다.
적격의 기준 자체는 여전히 "상대의 현재 위치"입니다.
3. 동률 tie-break: 상호배제 seal-in 우선권
적격 판정만으로는 한 가지 상황이 안 풀립니다.
두 헤드가 같은 자리로 수렴하면(공유 zone), 양쪽이 동시에 적격이거나 동시에 부적격인 동률이 됩니다.
이때는 "먼저 지령한 축"에게 우선권을 주고, 나머지가 양보하게 합니다.
이 우선권을 상호배제 seal-in(자기유지) 회로로 구현합니다.
축마다 우선 비트를 하나씩 둡니다(Ax#1 = M49010, Ax#2 = M49060).

; 지령순 우선 = 상호배제 seal-in (Ax#1 관점)
M49010 = (M49000 AND /M49060) ; SET : 내가 요청 & 상대가 아직 미우선
OR (M49010 AND (M49000 OR M49050)) ; HOLD: 자기유지 (충돌 국면이 유지되는 동안)
세 가지 동작으로 나뉩니다.
- SET — 내가 요청(
M49000)했고 상대가 아직 우선을 안 잡았으면(/M49060) 내가 우선을 잡습니다. - HOLD — 한 번 잡은 우선은 충돌 국면(둘 중 하나라도 요청 중)이 이어지는 동안 자기유지됩니다.
- RESET — 둘 다 idle(요청 없음)이 되면 우선이 풀려 다음 국면을 위해 초기화됩니다.
핵심은 SET 항의 /M49060(상대 우선 비트 B접점) 입니다.
상대가 이미 우선을 잡았으면 내 SET는 원천 차단됩니다.
그래서 두 축이 동시에 우선을 잡는 일이 구조적으로 불가능합니다.
4. 데드락 불가 진리표: 우선은 항상 XOR
상호배제 seal-in 이 왜 데드락을 막는지 진리표로 보겠습니다.
충돌 국면에서 두 우선 비트(M49010, M49060)의 상태를 전부 나열합니다.
| 케이스 | 요청 상황 | M49010 (Ax#1 우선) | M49060 (Ax#2 우선) | 결과 |
|---|---|---|---|---|
| A | Ax#1 만 먼저 요청 | 1 (SET) | 0 (상대 우선이라 SET 차단) | Ax#1 통과 · Ax#2 양보 |
| B | Ax#2 만 먼저 요청 | 0 | 1 | Ax#2 통과 · Ax#1 양보 |
| C | 완전 동시 요청 | 1 (Ax#1 선실행 SET) | 0 (직후 /M49010로 차단) |
Ax#1 통과 (축번호 우선) |
| D | 우선 확보 후 상대도 요청 | 1 (HOLD 유지) | 0 (뒤늦은 SET 차단) | 먼저 지령한 Ax#1 계속 우선 |
네 케이스 모두 정확히 하나만 1입니다.
즉 충돌 국면에서 우선 비트는 항상 M49010 XOR M49060 이고, 둘 다 1인 상태(both=1)는 도달 불가입니다.
충돌 국면 불변식: M49010 XOR M49060 = 1 (both=1 은 도달 불가)
이것이 데드락 불가의 핵심입니다.
둘 다 우선이 되는 일이 없으니, 동률 상황에서 반드시 한 축만 양보하고 다른 축은 통과합니다.
양보 판정(M49012)은 이 우선 비트를 이렇게 조합합니다.
M49012(양보) = (M49011 AND /M49061) ; 나만 적격 = 추월 뒤축 → 내가 양보
OR ( 동률[양쪽 적격 OR 양쪽 부적격] AND 상대우선축 M49060 ) ; 동률이면 비우선축이 양보
- 한 축만 적격이면 그 축이 양보(뒤축이 앞축을 먼저 보냄).
- 동률이면 seal-in 이 가린 비우선축만 양보.
두 경로 모두 "정확히 한 축"으로 수렴합니다.
5. 실행 순서 우선: 완전 동시엔 축번호로 가른다
완전히 같은 스캔에 두 축이 요청하면 어떻게 될까요(케이스 C).
이건 P0 서브루틴의 호출 순서로 자동 해결됩니다.


메인 루틴
Ax#1 목표 로드
| SM400 |----[ XCALL P0 ] ; 호출(1) — Sv-1(Ax#1) 판정 먼저
Ax#2 목표 로드
| SM400 |----[ XCALL P0 ] ; 호출(2) — Sv-2(Ax#2) 판정 나중
Ax#1(Sv-1) 판정이 먼저 실행되므로, 완전 동시 요청이라도 Ax#1이 그 스캔에서 우선을 먼저 잡습니다.
그 다음 Ax#2 판정 때는 이미 M49010이 서 있어, Ax#2의 SET가 /M49010으로 차단됩니다.
결과적으로 축번호가 낮은 축이 우선(tie-break)이 되는 결정적 규칙이 생깁니다.
상용 라이브러리도 같은 원리를 씁니다.
Beckhoff TwinCAT 의 충돌 회피 기능(Tc3_McCollisionAvoidance)도 한 레일을 공유할 때 "먼저 지령한 축만 목표까지 이동"하는 우선 규칙을 씁니다.
다른 점은, 상용은 우선 규칙이 블랙박스라는 것이고 여기서는 그 우선권을 진리표로 공개하고 미쓰비시 래더로 직접 구현한다는 점입니다.
이 tie-break 는 실제로 자주 일어나는 공유 zone 수렴(같은 위치로 가려는 경합)만 순차화합니다.
양쪽이 서로의 목표로 자리를 맞바꾸는 "진짜 교차"는 알고리즘 대상 밖입니다.
한 레일 위에서 두 헤드가 서로를 완전히 통과해 자리를 바꾸는 것은 물리적으로 불가능합니다.
충돌방지(P0)는 "지령된 목표를 안전하게 갈지"만 담당하고, 한 레일 위 헤드 좌우 순서 유지(교차 지령 금지)는 상위 응용 시퀀스(Job 스케줄러·반송 흐름)의 책임입니다.
6. 정리: 적격 + 우선권으로 한 축만 양보
- 적격 판정 — 내 목표가 상대 현재 위치를 통과하려는 축(추월 뒤축)이 양보 후보. 충돌 방향 무관 자동 해소.
- 마진범위 적격(LOOSEN) — 정확값 비교의 티칭 잔차 취약성을
상대현재 ± 마진으로 흡수. TIGHTEN 은 영구 데드락이라 불채택. - 상호배제 seal-in — 동률(공유 zone 수렴)일 때 SET 항의
/상대우선B접점으로 우선을 배타 확보. - 데드락 불가 불변식 — 충돌 국면에서 항상
M49010XORM49060. both=1 은 도달 불가라 반드시 한 축만 양보. - 완전 동시엔 축번호 tie-break — P0 를 Ax#1 → Ax#2 순서로 2회 호출해 낮은 축번호가 먼저 우선 확보.
여기까지 "정확히 한 축만 양보한다"가 완성됐습니다.
그런데 실제 설비에 올리면 질문이 또 생깁니다.
park 한 축은 언제, 어떻게 복귀할까요? 미러로 설치된 축은? park 중에 상위 시퀀스가 목표를 바꾸면?
다음 편(모션 충돌방지 알고리즘 5편: 견고한 양보 (복귀·설치방향·N축 확장))에서 실 설비 견고성을 다룹니다.
이전 편(3편: 데드락과 양보(Yield) 제어)이 궁금하시면 함께 보시길 권합니다.
테스트해 보시고 문제점이 있다면 댓글로 피드백 주시면 감사드리겠습니다. ^^
'PLC 전기제어 기술자료 > 모션 기술자료' 카테고리의 다른 글
| 모션 충돌방지 알고리즘 5편: 견고한 양보 (복귀·설치방향·N축 확장) (0) | 2026.07.05 |
|---|---|
| 모션 충돌방지 알고리즘 3편: 데드락과 양보(Yield) 제어 (0) | 2026.07.02 |
| PLC 경로충돌방지 알고리즘 2편: 비대칭 마진 최적화와 Follow 추종 제어 (0) | 2026.06.18 |
| PLC 경로충돌방지 알고리즘 1편: 이동 영역(Band)으로 충돌 예측 (0) | 2026.04.22 |
| UVW 스테이지 위치값 연산: 보정이송량 계산과 현재위치 역산 PLC 구현 (1) | 2025.03.08 |