diff --git a/Doc/인수인계/260903_Door인터락_현장검증_가이드.html b/Doc/인수인계/260903_Door인터락_현장검증_가이드.html
new file mode 100644
index 0000000..4fd4c35
--- /dev/null
+++ b/Doc/인수인계/260903_Door인터락_현장검증_가이드.html
@@ -0,0 +1,293 @@
+
+
+
+
+
+
+
메뉴얼 Door 인터락 현장 검증 가이드
+
+ 커밋 7c97462 · ISSUE-260902-01 · 검증일 2026-09-03
+
+
+
+ 대상 화면 Manual → Scanner → Manual Laser Power Control
+ · 소스 UCScannerLaserControl.xaml
+
+
+
+
시작 전 필수
+
+ - 레이저 파워미터(측정기)는 치우고 덤프 타겟을 놓을 것 — 어제 누수 건도 있고 테스트 중 재파손 위험
+ - 출력은 10% 로 낮춰서 진행. 정상 파워측정 조건으로 하지 말 것
+ - 보안경 착용, 문 여는 사람과 화면 보는 사람 2인 권장
+
+
+
+
1. 화면 배치와 조작 위치
+
+ 아래는 XAML 기준 실제 배치입니다. Watt 패널은 Visibility="Collapsed" 라 화면에 안 나옵니다 — % 패널로만 진행합니다.
+
+
+
+
+
Manual Laser Power Control
+
+
+
+
+
Control Setting
+
2Power #110%
+
Power #20%
+
Frequency1kHz
+
Pulse Width1000000us
+
+
+
+
+
+
Laser Shot Control
+
+
+
+
Timer Set
+
3연속출사로 전환
+
+
No Use Spot Time
Use Spot Time
+
+
+ ← 이쪽이 자동 오프 없는 연속출사 (이번 사고 경로)
+
+
+
4실제 발진
+
+
Laser Fire
No Laser (전압만)
+
+
+ ※ DA1/DA2 전압 표시는 No Laser 쪽일 때만 보임
+
+
+
+
+
+
+
Laser Shot Result
+
ListN/A
+
Repeat Count0
+
+
+
5Laser On
+
Laser Off
+
+
+
+
+
+
+
+
+
+
+
+ 1 이 화면을 반드시 먼저 띄워야 합니다.
+ 출사 중 Door 감시 타이머는 VisibleChanged 로 시작됩니다. 화면을 한 번도 안 열면
+ 감시가 돌지 않습니다. (단, 이 작업 자체가 이 화면에서만 하는 것이라 실사용상 문제는 없습니다)
+
+
+
2. 검증 순서
+
+ | # | 조작 | 기대 결과 | 판정 |
+
+
+ | T1 |
+ 문을 연 채 [Laser On] (가장 안전한 첫 테스트) |
+ 출사 안 됨 + 노란 경고 토스트
+ Door Open 상태입니다. 문을 닫고 다시 시도하세요. |
+ 차단 정상 출사 → §3 |
+
+
+
+ | T2 |
+ 문 닫고 [Laser On] |
+ 정상 출사 시작. 계속 출사 상태 유지 (자동 오프 없음) |
+ 출사 정상 차단 → §3 |
+
+
+
+ | T3 |
+ 출사 중에 문을 연다 ★ 이번 사고 시나리오 |
+ 약 0.2초 내 강제 OFF + 빨간 토스트
+ Door Open 감지 → 레이저를 강제 OFF 했습니다. |
+ OFF 정상 유지 → §3 |
+
+
+
+ | T4 |
+ 문을 다시 닫는다 (아무것도 누르지 않음) |
+ 자동 재출사 안 됨 — 의도된 동작 |
+ 정지유지 |
+
+
+
+ | T5 |
+ [Laser On] 다시 누름 |
+ 정상 출사 재개 |
+ 출사 |
+
+
+
+ | T6 |
+ [Laser Off] 로 종료 |
+ 출사 종료, 감시 래치 해제 |
+ — |
+
+
+
+
3. 로그 확인 — 극성 판별
+
로그에서 [DoorInterlock] 으로 검색하면 전부 나옵니다.
+
+
+
정상 (문 열림에서 True 가 하나라도 뜸)
+
[DoorInterlock][ScannerLaserControl] Door OPEN 감지 → 이후 레이저 출사 차단 (PLC=True, IO_DI=True)
+[DoorInterlock] 출사 중 Door OPEN 감지 → 레이저 강제 OFF 실행 (직접 출사 중). PLC비트=True, IO접점=True, PLC연결=True, IO연결=True
+[DoorInterlock] 레이저 강제 OFF 완료. 재출사하려면 문을 닫고 Shot On 을 다시 누르십시오.
+
PLC / IO 둘 중 하나만 True 여도 정상 동작합니다(OR 판정). 어느 쪽이 False 인지는 알려주세요 — 배선/맵 확인 대상입니다.
+
+
+
+
이상 ①: 문 열었는데 둘 다 False → T1/T3 에서 차단이 안 됨
+
[DoorInterlock] ... (PLC=False, IO_DI=False)
+
+ PLC연결=False / IO연결=False 면 → 디바이스 미연결. 연결부터 확인
+ - 둘 다 연결인데 False 면 → 접점 극성 반대(b접점) 또는 PLC 비트 미할당
+
+
+
+
+
이상 ②: 문 닫았는데 True → T2 에서 출사가 막힘 (반대 증상)
+
문 닫힘 상태인데 → (PLC=True, IO_DI=True)
+
극성 반대 확정입니다. 판정부 한 줄만 뒤집으면 되니 로그값 그대로 보내주세요.
+
+
+
+
롱텀 추적용 하트비트 — 출사 중에는 10초마다 아래가 남습니다. 1시간 출사 구간 로그 공백이 없어집니다.
+
[DoorInterlock] 직접 출사 중... Door=CLOSE, DA1=1.000V, DA2=0.000V, PLC비트=False, IO접점=False, ...
+
+
+
4. 이 인터락이 못 막는 구간
+
+ | 경로 | 차단 시점 | 완전성 |
+
+ 파워측정 직접 출사 (No Use Spot Time) |
+ 출사 시작 전 + 출사 중 100ms 주기 |
+ 즉시 |
+
+
+ | Teaching Run 시퀀스 |
+ 시퀀스 진입 시 + 객체 사이사이
+ 리스트 1개 실행 중에는 개입 불가 |
+ 부분 |
+
+
+ | Auto 운전 |
+ 이번 범위 아님 — SeqAutoRunPTOP 은 자체 ExecuteWelding 사용 |
+ 미적용 |
+
+
+
+
+ 본질적 한계 — 반드시 같이 보고할 것
+ 이건 SW 방어이지 안전 인터락이 아닙니다. Door 감시가 UI 스레드 DispatcherTimer 기반이라
+ UI가 멈추면 감시도 같이 멈춥니다. Class 4 레이저 기준 최종 차단은
+ PLC / 하드와이어 안전회로로 별도 협의가 필요합니다.
+
+
+
+
+
+
+
diff --git a/Doc/인수인계/260903_파워캘_3000W오적용_레시피환산.md b/Doc/인수인계/260903_파워캘_3000W오적용_레시피환산.md
new file mode 100644
index 0000000..1c7da75
--- /dev/null
+++ b/Doc/인수인계/260903_파워캘_3000W오적용_레시피환산.md
@@ -0,0 +1,281 @@
+# 파워캘 CSV 3000W 오적용 및 레시피 Power 환산 (2026-09-03)
+
+> **목적** : 2000W 발진기에 3000W 기준 파워캘 CSV가 적용되어 있어 레시피 지령값의 2/3만
+> 실제 출사되던 건의 원인·근거·환산값을 남긴다.
+>
+> - 대상 설비 : PtoP 각형화 단동 용접기 (유니셀)
+> - 관련 문서 : `Doc/인수인계/2026_08_28_레이저발진기교체_및_진행현황.md` §2.4
+> - 파라미터 원본 : `docs/파라미터PTOP_260903.xlsx` 시트 `260903`
+
+**표기 규칙** (기존 인수인계 문서와 동일)
+
+| 표기 | 의미 |
+|---|---|
+| 🟩 **소스확인** | PC 소스/설정 파일에서 직접 대조해 확인한 사실 |
+| 🟦 **현장기록** | 현장 로그·시험 기록에 남아 있는 값 |
+| 🟨 **미확보** | 아직 확인되지 않음. 이어받는 사람이 채워야 할 항목 |
+
+---
+
+## 1. 한 줄 요약
+
+발진기는 **2000W/2000W (Core/Ring, 싱글모드)** 인데 파워캘 CSV가 **만점 3000W** 짜리로 물려 있어,
+레시피에 적힌 W의 **2/3만 실제로 출사**되고 있었다. CSV를 2000W 기준으로 재작성했으므로
+**레시피의 Power #1 / #2 를 × 2/3 으로 환산**해야 종전과 같은 실출력이 유지된다.
+
+```
+레시피 1500W → 지령 50% → DA 5.0V → 2000W × 50% = 1000W 출사
+```
+
+---
+
+## 2. 원인 🟩
+
+### 2.1 레시피 W 는 발진기로 그대로 가지 않는다
+
+`SeqUploadWeldingList.cs:639-671` — 자동 용접 시 파워를 싣는 경로.
+
+```
+레시피 LaserPower1/2 (W)
+ → CalibrateWattToPercent(W) ← 파워캘 CSV 조회
+ → percentLaser1/2 (0~100)
+ → WriteDA(DA1/DA2, percent) ← ×40.95 → 12bit DAC → 0~10V
+ → 발진기 아날로그 입력 = 자기 정격의 그 %
+```
+
+**CSV의 만점이 곧 "설비가 믿고 있는 발진기 정격"** 이다.
+`MaxCenterPower` / `MaxRingPower` 도 레이저 Config 가 아니라 **CSV 마지막 행**에서 읽는다
+(`LaserPowerCalParam.cs:70-71`). 발진기를 바꿔도 CSV 를 안 바꾸면 소프트웨어는 옛 정격으로 계산한다.
+
+### 2.2 실제로 참조되는 열
+
+현장은 로그상 `Normal Models::` 분기(`TruFiberType` 미지정)를 탄다. 이 분기의 `CalibrateWattToPercent` 가
+보는 열은 두 개뿐이다.
+
+| 열 | 이름 | 용도 |
+|---|---|---|
+| 0 | Index (%) | **반환값 — 그대로 `WriteDA` 지령** |
+| 1 | DesiredPower | 이 분기에선 미사용 |
+| 2 | CalibratedPower | **조회 키 — 레시피 W 를 여기서 찾음** |
+| 3 | volt | 이 분기에선 미사용 |
+
+> `TruFiberType` 을 `TruFiberP` / `CalPercentToMeasuredVoltage` 로 바꾸면 3열(전압)을 쓰는
+> 다른 분기로 넘어간다. CSV 를 새로 만들 때는 **어느 분기를 타는지부터 확인**할 것.
+
+---
+
+## 3. 근거
+
+### 3.1 로그 실측 🟦
+
+`Original Power → Calibrated Percent` 가 전부 정확히 `W ÷ 3000 × 100` 이다.
+
+| 로그 | 지령 W | Calibrated % | 검산 |
+|---|---|---|---|
+| Aurora_20260825.log | 150 | 5.000 | 150/3000 |
+| Aurora_20260826.log | 500 | 16.667 | 500/3000 |
+| Aurora_20260826.log | 800 | 26.667 | 800/3000 |
+| Aurora_20260826.log | 600 | 20.000 | 600/3000 |
+| Aurora_20260826.log | 1100 | 36.667 | 1100/3000 |
+
+Center · Ring 양쪽 모두 3000 으로 나뉘었다.
+
+### 3.2 CSV 대조 🟩
+
+| 파일 | 관계 | 성격 |
+|---|---|---|
+| `docs/3000W_CenterPower.csv` · `3000W_RingPower.csv` (구) | 파워 = **30 × Index** | 선형, 보정 없음 (CalibratedPower = DesiredPower) |
+| `docs/2000W_CenterPower.csv` · `2000W_RingPower.csv` (신) | 파워 = **20 × Index** | 선형, 보정 없음 |
+
+**양쪽 다 선형이므로 환산계수 `2000/3000 = 2/3` 는 근사가 아니라 정확값이다.**
+
+`volt` 열이 Center/Ring 미세하게 다르지만(50% 에서 5.0 vs 4.8) `Normal Models` 분기는 이 열을 쓰지 않는다.
+
+### 3.3 ⭐ 교차검증 — 「출력을 올려야 했다」의 정체 🟦
+
+기존 인수인계 문서 §2.4 에 **발진기 교체 후 기존 출력으로는 접합이 되지 않아 출력을 올렸다**는 기록이 있다.
+이번 건으로 계산해 보면 **실제 출사 파워는 거의 그대로였다.**
+
+| 12_1page (CC Anode) | 레시피 값 | 당시 CSV | 실제 출사 | 결과 |
+|---|---|---|---|---|
+| 교체 전 (3000W 발진기) | 450 | 3000 (정상) | **450W** | 접합 O |
+| 교체 직후 | 450 | 3000 (오적용) | **300W** | 접합 X |
+| 탐색 | 500 / 550 | 3000 (오적용) | 333 / 367W | 접합 X |
+| 최종 적용 | **650** | 3000 (오적용) | **433W** | 접합 O |
+
+즉 **접합에 필요한 실출력은 계속 430~450W 였고**, 레시피 숫자를 450 → 650 으로 올린 것은
+공정상 필요가 아니라 **CSV 오적용을 사람이 손으로 보정한 것**이었다.
+
+× 2/3 환산으로 650 → **433** 이 되는데, 이는 교체 전 정상값 450 과 사실상 같은 실출력이다.
+(싱글모드 전환으로 파워밀도가 높아져 약간 낮은 값에서 접합되는 것도 방향이 맞다.)
+
+> 12_2page · 12_3page 는 Ramping 변경(50%→70%)과 싱글모드 효과가 섞여 있어 이만큼 깔끔하게 떨어지지 않는다.
+
+---
+
+## 4. 환산
+
+### 4.1 규칙
+
+```
+새 레시피 W = 기존 레시피 W × 2/3
+```
+
+### 4.2 환산 대상 / 제외 🟩
+
+| 항목 | 환산 | 이유 |
+|---|---|---|
+| **Power #1 (Core, W)** | **× 2/3** | 절대 W → 지령 % 로 변환되는 값 |
+| **Power #2 (Ring, W)** | **× 2/3** | Ring 표도 만점 3000 선형이었음 |
+| Ramping Start/End Power | 그대로 | **%** 단위. `percentLaser1 × RampingStartPower / 100` 이라 자동 추종 (`SeqUploadWeldingList.cs:1319-1323`) |
+| Laser Duty | 그대로 | % |
+| Draw/Jump speed, 각종 Delay | 그대로 | 파워 무관 |
+| Frequency / Pulse Duration | 그대로 | 파워 무관 |
+| Wobbel · Zigzag | 그대로 | 파워 무관 |
+| Center/Ring 비율 | 자동 | 코드가 `round(100×P1/(P1+P2))` 로 매번 계산 |
+| 레이저 프로그램 워드 IW03/IW04 | 자동 | Power #1/#2 에서 파생 (`SeqWaitWeldOrChangePage.cs:205-223`) |
+
+### 4.3 환산표 — `파라미터PTOP_260903.xlsx` 시트 `260903` 기준 🟦
+
+| 레시피 | No | Page | 항목 | 기존 (W) | 지령 % | **변경 (W)** |
+|---|---|---|---|---|---|---|
+| cc welding | 12 | 1 (직렬 음) | Power #1 | 650 | 21.67 | **433** |
+| | | | Power #2 | 1050 | 35.00 | **700** |
+| | | 2 (sensing) | Power #1 | 550 | 18.33 | **367** |
+| | | | Power #2 | 1050 | 35.00 | **700** |
+| | | 3 (직렬 양) | Power #1 | 600 | 20.00 | **400** |
+| | | | Power #2 | 1200 | 40.00 | **800** |
+| U-Frame_pre | 21 | 1~6 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+| U-Frame_Back_pre | 22 | 1~6 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+| U-Frame_Main | 23 | 1~6 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+| U-Frame_Back_Main | 24 | 1~6 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+| Top_Frame | 31 | 1~2 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+| Top_Frame | 32 | 1~2 | Power #1 | 700 | 23.33 | **467** |
+| | | | Power #2 | 900 | 30.00 | **600** |
+
+고유값 7개 — `550→367, 600→400, 650→433, 700→467, 900→600, 1050→700, 1200→800`
+
+### 4.4 검산
+
+**지령 % 불변** — 환산 목적이 "기존에 실제로 나가던 파워 재현"이므로 지령 % 와 DA 전압은 변하지 않아야 한다.
+
+```
+기존 : 700W ÷ 30 = 23.33% → DA 2.33V → 2000W × 23.33% = 467W
+신규 : 467W ÷ 20 = 23.35% → DA 2.33V → 2000W × 23.35% = 467W ✅
+```
+
+**Center/Ring 비율 유지** — 반올림 후에도 전부 동일하다.
+
+| | 기존 | 신규 |
+|---|---|---|
+| cc 1page (650/1050) | 38 | 38 (433/700) |
+| cc 2page (550/1050) | 34 | 34 (367/700) |
+| cc 3page (600/1200) | 33 | 33 (400/800) |
+| U-Frame · Top (700/900) | 44 | 44 (467/600) |
+
+정수 반올림 오차는 최대 0.08 % (433 vs 433.33) 로 무시 가능하다.
+
+---
+
+## 5. ⚠ 주의
+
+### 5.1 환산 전에 신 CSV 만 적용된 상태는 위험하다 🟩
+
+| 기존 레시피 값 | 신 CSV 에서의 결과 |
+|---|---|
+| 2000 이하 | 의도의 **1.5배 과출력** |
+| 2000 초과 | `CalibrateWattToPercent` 가 구간을 못 찾아 **0 반환 → 0V, 무출력** |
+
+같은 레시피 안에서 과출력 라인과 무출력 라인이 섞인다. 환산은 한 번에 끝낼 것.
+(환산 후에는 모든 값이 2000 이하가 되어 이 함정은 사라진다.)
+
+### 5.2 지령 상한 클램프가 없다 🟩
+
+`percentLaser1/2` 는 `WriteDA` 로 가기 전 **상한 검사를 받지 않는다** (`SeqUploadWeldingList.cs:665-671`).
+램핑 구간만 `<= 100 ? … : 100` 으로 막혀 있다.
+
+따라서 **열 구성이 어긋난 CSV**(예: 0열에 Index % 대신 W 가 들어간 파일)를 물리면
+`WriteDA(600)` → `600 × 40.95 = 24570` → DAC 풀스케일 부근 → **정격 전출력**이 나간다.
+CSV 를 교체할 때는 0열이 0~100 인지 반드시 확인할 것.
+
+### 5.3 환산은 W 를 복원할 뿐, 용접 결과를 복원하지 않는다 🟦
+
+듀얼모드(3000W/3000W) → **싱글모드(2000W/2000W)** 전환이라 빔 품질(BPP/M²)이 달라졌다.
+같은 W 라도 집광 스팟이 작아 **파워밀도(W/mm²)가 훨씬 높다.**
+
+| | 환산으로 해결 | 남는 것 |
+|---|---|---|
+| 실제 출사 W | ✅ 종전과 동일 복원 | — |
+| 용입 깊이 | ❌ | 싱글모드라 더 깊음 |
+| 비드 폭 | ❌ | 싱글모드라 더 좁음 |
+
+현장 기록에도 싱글모드는 **"깊게 쏨 / 얇게 나옴"** 으로 적혀 있다.
+환산값은 **재튜닝의 출발점**이지 최종값이 아니다. 실물 비드 기준 재검증이 필요하다.
+
+---
+
+## 6. 추적성 — 어떤 CSV 가 물렸는지 확인하는 방법 🟩
+
+**소프트웨어는 적용된 CSV 의 경로도 값도 로그에 남기지 않는다.** 남는 것은 아래뿐이다.
+
+| 방법 | 얻는 것 |
+|---|---|
+| `_config_setting/LaserPowerCalParam.json` | **현재** 물린 Center/Ring CSV 경로 (이력 없음, 덮어쓰기) |
+| 로그 `AURORA_SYS_SETTING_CHANGED :: Param[LaserPowerCalParam]` | 설정을 **바꾼 시점** (경로는 안 나옴) |
+| 로그 `Original Power1 : X … Calibrated Percent1 : Y` | **X ÷ Y × 100 = 그 시점 CSV 만점** ← 가장 확실한 역산 수단 |
+| CSV 파일 수정일시 | 경로 그대로 두고 내용만 고친 경우의 유일한 단서 |
+
+> 출사 시마다 `Initialize()` 가 CSV 를 다시 읽으므로(`UCScannerLaserControlViewModel.cs:332`, `:422`,
+> `SeqUploadWeldingList.cs:154`), 앱 재기동 없이 파일 내용만 바꿔도 즉시 반영된다.
+
+### 이력 확인 결과 🟦
+
+| 로그 | `Param[LaserPowerCalParam]` 변경 |
+|---|---|
+| Aurora_20260825.log | 0 건 |
+| Aurora_20260826.log | 0 건 |
+| Aurora_20260902.log | **1 건 — 11:44:32 `From[USER_via_UI]`** |
+
+2026-09-02 11:44:32 이 CSV 경로 교체 시점이고, 이어진 13:45~15:03 의 `Laser On` 58 회가
+2000W 재캘리브레이션 작업이다.
+
+---
+
+## 7. 이어받는 사람에게
+
+- 🟨 **발진기 교체 시에는 CSV 재작성과 레시피 W 환산을 반드시 한 세트로 처리할 것.**
+ 둘 중 하나만 하면 이번과 같이 조용히 1.5배 또는 2/3 로 어긋난다.
+- 🟨 파워 이상 신고가 오면 §6 의 `Original Power1 / Calibrated Percent1` 비로 CSV 만점부터 역산할 것.
+- 🟨 §5.3 의 싱글모드 재검증은 **미완**이다. 환산 적용 후 비드 단면 확인 필요.
+- 🟨 CSV 경로·값을 로그에 남기는 계측을 추가하면 이런 추적이 훨씬 쉬워진다.
+ 출사 시작 로그(`UCScannerLaserControlViewModel.cs:361`, `:452`)에 CSV 경로 + Max 파워 +
+ 산출된 `powerVolt1/2` 를 붙이는 것만으로 충분하다. **미적용.**
+
+---
+
+## 8. 참고 파일 위치
+
+| 구분 | 경로 |
+|---|---|
+| 파라미터 원본 | `docs/파라미터PTOP_260903.xlsx` 시트 `260903`, 환산 이력 시트 `260903_2000W환산` |
+| 구 파워캘 CSV | `docs/3000W_CenterPower.csv` · `docs/3000W_RingPower.csv` |
+| 신 파워캘 CSV | `docs/2000W_CenterPower.csv` · `docs/2000W_RingPower.csv` |
+| 현장 로그 | `docs/Aurora_20260825.log` · `20260826` · `20260902` |
+| 파워캘 설정 클래스 | `WeldingComponents/WeldingCommon/Settings/LaserPowerCalParam.cs` |
+| 자동 용접 파워 적용부 | `WeldingComponents/WeldingCommon/Sequences/Main/SeqUploadWeldingList.cs:639-671` |
+| 수동 출사 파워 적용부 | `WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs:329-345`, `:419-436` |
+| DA 전압 변환 | `AuroraDevices/AuroraLaserScanner/ScannerRTC5.cs:342-351` |
+| 발진기 교체 경위 | `Doc/인수인계/2026_08_28_레이저발진기교체_및_진행현황.md` §2.4 |
+
+---
+
+## 변경 이력
+
+| 일자 | 작성 | 내용 |
+|---|---|---|
+| 2026-09-03 | 노도연 | 최초 작성. 3000W CSV 오적용 원인·근거·환산표·주의사항 정리. 기존 인수인계 §2.4 「출력을 올려야 했다」가 CSV 오적용 보정이었음을 교차검증 |
diff --git a/Doc/인수인계/260907_Arc용접_설정가이드_현장용.pptx b/Doc/인수인계/260907_Arc용접_설정가이드_현장용.pptx
new file mode 100644
index 0000000..b4c5c59
Binary files /dev/null and b/Doc/인수인계/260907_Arc용접_설정가이드_현장용.pptx differ
diff --git a/Doc/인수인계/260907_Arc출사_파라미터_시각화.html b/Doc/인수인계/260907_Arc출사_파라미터_시각화.html
new file mode 100644
index 0000000..1665463
--- /dev/null
+++ b/Doc/인수인계/260907_Arc출사_파라미터_시각화.html
@@ -0,0 +1,661 @@
+
+
+
+
+
+
+
0결론 — Arc가 원점 방향으로 발광한 원인 후보 3건
+
+모두 레시피/스캐너 파라미터로 바로 회피 가능합니다. 아래 카드의 조치값을 먼저 적용한 뒤 재현 여부를 보면
+어느 후보인지 확정됩니다. 후보 1과 2는 Arc 전용 경로이고, 후보 3은 전 타입 공통입니다.
+
+
+
+
+
✕CRITICAL · 최유력
+
후보 1 — Arc Ramping Interval = 0 (0으로 나눗셈)
+
ArcRampingInterval은 초기값이 없어 기본 0.0입니다(ScannerParam.cs:331).
+ 여기에 Ramping Start/End Distance를 하나라도 넣으면 theta = (0/R)×(180/π) = 0이 되고,
+ (int)(Dist/0) → (int)+∞ = int.MinValue로 카운터가 붕괴합니다.
+ Constant 루프가 약 21.5억 회 ArcAbs(center, 0°)를 리스트에 밀어넣어
+ RTC 리스트가 넘치고, 넘친 자리의 미초기화 좌표(0,0 = 원점)가 마크(레이저 ON)로 실행됩니다.
+
조치 · Arc를 쓰는 모든 레시피에서 Arc Ramping Interval = 0.1 mm
+ (툴팁 권장값). 램핑이 필요 없으면 Start Distance = End Distance = 0으로 두어
+ 램핑 분기 자체를 타지 않게 하는 편이 더 안전합니다.
+
+
+
+
!SERIOUS
+
후보 2 — 램핑 길이 가드의 단위 버그 → 과회전
+
분기 조건(SeqUploadWeldingList.cs:1303)이 호 길이를 R × |Sweep°|로 계산합니다.
+ 실제 호 길이는 R × |Sweep°| × π/180이라 우변이 약 57.3배 과대합니다.
+ (정확한 값은 Arc.Length에 이미 있는데 쓰지 않습니다.)
+ 그래서 램핑 거리가 실제 호보다 길어도 분기에 진입하고,
+ rising+falling 반복이 totalCount를 넘겨 의도한 각도를 초과해 레이저 ON 상태로 회전합니다.
+ 끝나면 _LastX/_LastY에 실제와 다른 좌표(PF2)를 기록해,
+ 다음 객체가 점프를 생략하고 엉뚱한 지점에서 마크를 시작합니다.
+
조치 · Start Dist + End Dist ≤ 호길이 × 0.5.
+ 호길이 = R × |Sweep°| × 0.01745. §4에 계산 예시가 있습니다.
+
+
+
+
!WARNING · 병행 확인
+
후보 3 — LaserOnDelay −1800 µs + JumpDelay 0
+
LaserOnDelay는 부호 있는 int(ScannerParam.cs:58)이고 단위는 µs입니다
+ (ScannerRTC6.cs:691, 1bit=0.5µs). 음수는 마크 시작 이전에 레이저를 켜므로
+ 직전 점프 구간 끝에서 발광합니다. 현장 로그 실측값이 −1800 µs이고 JumpDelay가 0이라
+ 미러 정정 대기 없이 발광합니다. JumpSpeed 1000 mm/s 기준 최대 1.8 mm 선행 발광.
+
조치 · LaserOnDelay −1800 → −200~0 검토,
+ JumpDelay 0 → 100~300 µs.
+ 단 1.8 mm 규모라 "원점까지"는 이것만으로 설명되지 않습니다. 후보 1·2와 함께 보십시오.
+
+
+
+
+
1기준 파라미터 세트 (현장 로그 실측값)
+
+아래 A는 Aurora_20260906.log에서 그대로 읽은 값이고, B·C는 이 문서의 시뮬레이션 예시입니다.
+이후 모든 격자는 이 세 세트를 기준으로 그렸습니다.
+
+
+
+ | 파라미터 | A · 현장 실측 |
+ B · 권장(램핑 사용) | C · 재현 조건(NG) |
+
+
+| LaserOnDelay | −1800 µs | −200 µs | −1800 µs |
+| LaserOffDelay (uint·음수 불가) | 0 µs | 0 µs | 0 µs |
+| JumpDelay | 0 µs | 200 µs | 0 µs |
+| MarkDelay | 200 µs | 200 µs | 200 µs |
+| PolygonDelay (Arc 분절 간) | 0 µs | 50~100 µs | 0 µs |
+| JumpSpeed | 1000 mm/s | 1000 mm/s | 1000 mm/s |
+| MarkSpeed | 100 mm/s | 100 mm/s | 100 mm/s |
+| LaserPower1 (Center) | 467 W | 467 W | 467 W |
+| ArcRampingInterval | — (미설정 = 0) | 0.1 mm | 0 mm |
+| RampingStartDist / EndDist | 0 / 0 | 2 / 2 mm | 10 / 10 mm |
+| RampingStartPower / EndPower | — | 30 / 30 % | 30 / 30 % |
+| Arc 형상 (예시) | R 10 mm, Sweep 90° | R 10 mm, Sweep 90° | R 10 mm, Sweep 90° |
+| → 실제 호 길이 | R × Sweep° × π/180 = 10 × 90 × 0.01745 = 15.71 mm |
+
+
+
+
+
2격자 읽는 법
+
+
+색만으로 구분하지 않습니다 — 점프는 파선, 마크는 실선, 이상 발광은 굵은 실선 + ✕ 표식입니다.
+파워 크기는 같은 파랑 계열의 명도(연함 = 저출력, 진함 = 고출력)로만 표현합니다.
+각 셀에 마우스를 올리면 해당 조합의 파라미터가 표시됩니다. 전체 수치는 §6 표로도 제공합니다.
+
+
+
+
3격자 A — Draw 타입별 출사 형상 (출사 분기 8종)
+
+FuncLoadDrawObjectScannerParamSelected()가 실제로 처리하는 8개 분기입니다.
+Ellipse · Rectangle · Roi는 분기가 없어 여기에 없습니다(별건 — 예외처리 대기 중).
+
+
+
+
+
4격자 B — Arc × 램핑/와블/스노우맨 조합 (핵심)
+
+행 = 램핑 상태, 열 = 와블/스노우맨 상태. 모두 R 10 mm · Sweep 90° · CCW 동일 형상입니다.
+빨간 셀이 이번 현상의 재현 조건입니다.
+
+
+
Wobble OFF
Wobble ON · 진폭 小
Wobble ON · 진폭 大
SnowMan ON
+
+
+
+
+
5격자 C — 값의 크고 작음이 만드는 차이
+
각 행은 파라미터 하나를 작게 / 권장 / 크게 3단으로 비교합니다.
+
+
+
+
+
6표 뷰 — 격자 B 전체 수치
+
그림 없이도 같은 내용을 읽을 수 있도록 격자 B를 표로 옮겼습니다.
+
+ | 램핑 상태 | 와블 상태 | Interval | Start+End |
+ theta | totalCount | 실제 회전각 | 판정 | 근거 |
+
+
+
+
7현장 조치 체크리스트
+
+| # | 항목 | 내용 |
+
+| 1 | Arc Ramping Interval 확인 |
+ Arc를 쓰는 모든 레시피 · 모든 Scanner Param No에 대해 값이 0이 아닌지 확인.
+ 0이면 0.1로 설정. (램핑 미사용이면 2번으로) |
+| 2 | 램핑 미사용 시 |
+ Start Distance = 0, End Distance = 0 → 단일 ArcAbs 경로(:1369)로 빠져
+ 카운터 붕괴·과회전 모두 회피됩니다. 가장 안전한 설정입니다. |
+| 3 | 램핑 사용 시 길이 검산 |
+ 호길이 = R × Sweep° × 0.01745. Start + End ≤ 호길이 × 0.5를 만족하는지
+ Arc마다 확인. 코드의 자동 가드는 57.3배 느슨해서 걸러주지 않습니다. |
+| 4 | 선행 발광 확인 |
+ LaserOnDelay −1800 µs 유지 여부 판단. 점프 종단 1.8 mm 발광이 허용되는 공정인지 확인.
+ 줄인다면 −200 µs부터. 동시에 JumpDelay를 100~300 µs로. |
+| 5 | Arc 분절 정정 |
+ PolygonDelay = 0은 Arc 분절 사이 정정 대기가 없다는 뜻입니다.
+ 원호 오버슈트가 보이면 50~100 µs를 넣고 비교. |
+| 6 | 재현 시험 |
+ 1·2번만 적용하고 재현되는지 먼저 확인 → 재현되면 후보 3(딜레이) 쪽으로 이동.
+ 한 번에 다 바꾸면 어느 것이 원인인지 확정되지 않습니다. |
+
+
+
+
+참조한 소스 위치
+
+| 위치 | 내용 |
+SeqUploadWeldingList.cs:1269 | length = param.ArcRampingInterval |
+SeqUploadWeldingList.cs:1273-1278 | theta = (length/radius)×(180/π), CW는 부호 반전 |
+SeqUploadWeldingList.cs:1302-1303 | 램핑 분기 가드 — R×|Sweep°| (π/180 누락) |
+SeqUploadWeldingList.cs:1313-1316 | risingEdgeCount·fallingEdgeCount·totalCount |
+SeqUploadWeldingList.cs:1342-1344 | Constant 구간 루프 (카운터 붕괴 시 폭주 지점) |
+SeqUploadWeldingList.cs:1366-1367 | lastSweep 보정 ArcAbs |
+SeqUploadWeldingList.cs:1374-1375 | _LastX/_LastY = obj.PF2 (물리 위치와 어긋날 수 있음) |
+SeqUploadWeldingList.cs:1220, 800 | "이미 시작점인가" 판정 → 점프 생략 분기 |
+ScannerParam.cs:331-341 | ArcRampingInterval — 초기값 없음(=0), 권장 0.1 mm |
+ScannerParam.cs:56-70 | LaserOnDelay=int(음수 가능), LaserOffDelay=uint |
+ScannerRTC6.cs:691-699 | 딜레이 단위 — 레이저 0.5 µs/bit, 스캐너 10 µs/bit |
+ScannerRTC6.cs:262-271 | ArcAbs(x,y,angle) — 각도 degree, CW가 + |
+ArcCircleTool.cs:905-924 | SweepAngle degree, Length = R×Sweep×π/180 (정확값 존재) |
+
+
+
+
+
+