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 µs0 µs0 µs
JumpDelay0 µs200 µs0 µs
MarkDelay200 µs200 µs200 µs
PolygonDelay (Arc 분절 간)0 µs50~100 µs0 µs
JumpSpeed1000 mm/s1000 mm/s1000 mm/s
MarkSpeed100 mm/s100 mm/s100 mm/s
LaserPower1 (Center)467 W467 W467 W
ArcRampingInterval— (미설정 = 0)0.1 mm0 mm
RampingStartDist / EndDist0 / 02 / 2 mm10 / 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를 표로 옮겼습니다.

램핑 상태와블 상태IntervalStart+End thetatotalCount실제 회전각판정근거

7현장 조치 체크리스트

#항목내용
1Arc 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로.
5Arc 분절 정정 PolygonDelay = 0은 Arc 분절 사이 정정 대기가 없다는 뜻입니다. 원호 오버슈트가 보이면 50~100 µs를 넣고 비교.
6재현 시험 1·2번만 적용하고 재현되는지 먼저 확인 → 재현되면 후보 3(딜레이) 쪽으로 이동. 한 번에 다 바꾸면 어느 것이 원인인지 확정되지 않습니다.
참조한 소스 위치
위치내용
SeqUploadWeldingList.cs:1269length = param.ArcRampingInterval
SeqUploadWeldingList.cs:1273-1278theta = (length/radius)×(180/π), CW는 부호 반전
SeqUploadWeldingList.cs:1302-1303램핑 분기 가드 — R×|Sweep°| (π/180 누락)
SeqUploadWeldingList.cs:1313-1316risingEdgeCount·fallingEdgeCount·totalCount
SeqUploadWeldingList.cs:1342-1344Constant 구간 루프 (카운터 붕괴 시 폭주 지점)
SeqUploadWeldingList.cs:1366-1367lastSweep 보정 ArcAbs
SeqUploadWeldingList.cs:1374-1375_LastX/_LastY = obj.PF2 (물리 위치와 어긋날 수 있음)
SeqUploadWeldingList.cs:1220, 800"이미 시작점인가" 판정 → 점프 생략 분기
ScannerParam.cs:331-341ArcRampingInterval — 초기값 없음(=0), 권장 0.1 mm
ScannerParam.cs:56-70LaserOnDelay=int(음수 가능), LaserOffDelay=uint
ScannerRTC6.cs:691-699딜레이 단위 — 레이저 0.5 µs/bit, 스캐너 10 µs/bit
ScannerRTC6.cs:262-271ArcAbs(x,y,angle) — 각도 degree, CW가 +
ArcCircleTool.cs:905-924SweepAngle degree, Length = R×Sweep×π/180 (정확값 존재)