ILSOS_PrismaticRD_PTOP · SeqUploadWeldingList / ScannerParam · 정적 분석 기준
모두 레시피/스캐너 파라미터로 바로 회피 가능합니다. 아래 카드의 조치값을 먼저 적용한 뒤 재현 여부를 보면 어느 후보인지 확정됩니다. 후보 1과 2는 Arc 전용 경로이고, 후보 3은 전 타입 공통입니다.
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 Ramping Interval = 0.1 mm
(툴팁 권장값). 램핑이 필요 없으면 Start Distance = End Distance = 0으로 두어
램핑 분기 자체를 타지 않게 하는 편이 더 안전합니다.분기 조건(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에 계산 예시가 있습니다.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와 함께 보십시오.
아래 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 | ||
색만으로 구분하지 않습니다 — 점프는 파선, 마크는 실선, 이상 발광은 굵은 실선 + ✕ 표식입니다. 파워 크기는 같은 파랑 계열의 명도(연함 = 저출력, 진함 = 고출력)로만 표현합니다. 각 셀에 마우스를 올리면 해당 조합의 파라미터가 표시됩니다. 전체 수치는 §6 표로도 제공합니다.
FuncLoadDrawObjectScannerParamSelected()가 실제로 처리하는 8개 분기입니다.
Ellipse · Rectangle · Roi는 분기가 없어 여기에 없습니다(별건 — 예외처리 대기 중).
행 = 램핑 상태, 열 = 와블/스노우맨 상태. 모두 R 10 mm · Sweep 90° · CCW 동일 형상입니다. 빨간 셀이 이번 현상의 재현 조건입니다.
각 행은 파라미터 하나를 작게 / 권장 / 크게 3단으로 비교합니다.
그림 없이도 같은 내용을 읽을 수 있도록 격자 B를 표로 옮겼습니다.
| 램핑 상태 | 와블 상태 | Interval | Start+End | theta | totalCount | 실제 회전각 | 판정 | 근거 |
|---|
| # | 항목 | 내용 |
|---|---|---|
| 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 (정확값 존재) |