diff --git a/docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md b/docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md new file mode 100644 index 0000000..6a67301 --- /dev/null +++ b/docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md @@ -0,0 +1,90 @@ +# "Laser On 눌러도 레이저가 안 나옴" 원인 분석 (기능 존재 여부) + +- **작성일:** 2026-06-18 +- **대상:** `WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs` (`PerformCmdLaserShotOnPercent` / `...Watt`) +- **디바이스:** `AuroraDevices/AuroraLaserScanner/Scanner.cs`, `ScannerRTC5.cs` (Trumpf TruFiber 레이저) +- **선행:** `102847_...groupbox_analysis.md`, `114445_...no_laser_toggle_analysis.md` + +--- + +## 0. 증상 / 질문 + +> IO Control(DO9/13)도 true, DI(Laser Ready)도 잘 읽혀서 Laser Ready도 true → 레이저가 나와야 하는데 **Laser On 눌러도 레이저가 안 나온다.** 기능이 현재 없는 건지 분석. + +--- + +## 1. 결론 + +- **준비조건(IO/Ready)은 문제 없음.** 문제는 발사 명령 자체에서 **레이저 Gate 신호 셋업이 빠져있는 것**. +- **Trumpf 레이저는 `SetLaserTiming`으로 Gate 신호를 살려줘야 출사된다**(코드 주석으로 명시 + 241025 출사 확인 기록). +- 그런데 수동 **Laser On 직접 분기(No Use Spot Time)** 에서는 `SetLaserTiming`(과 `SetStandby`)이 **주석 처리**되어 있어, `LaserSignalOn()`만으로는 Gate가 안 열려 **실제 출사가 안 됨.** +- 즉 "직접 출사" 기능은 **사실상 미완성(셋업 라인 비활성)** 상태. 기능 자체가 아예 없는 건 아니고, **Gate 셋업 한 줄이 빠진 것**. + +--- + +## 2. 근거 + +### 2-1. Laser On 직접 분기 (현재 코드, `PerformCmdLaserShotOnPercent` else 분기) +```csharp +_Scanner.WriteDA(DA1, powerVolt1, COMMAND); // 전압 OK +_Scanner.WriteDA(DA2, powerVolt2, COMMAND); +_Scanner.SetLaserPulseCtrl(LaserPeriod*1000, LaserPulseWidth); +//_Scanner.SetLaserTiming(LaserPeriod*1000, LaserPulseWidth, LaserPulseWidth); // ← 주석! +//_Scanner.SetStandby(LaserPeriod*1000, LaserPulseWidth); // ← 주석! +_Scanner.LaserSignalOn(); // Gate(LASERON) 신호만 올림 +``` +→ `LaserSignalOn()`은 RTC5 `n_laser_signal_on`(레이저 Active 신호)만 올림. **Gate 타이밍(SetLaserTiming) 설정이 없으면 Trumpf 레이저는 출사 안 됨.** + +### 2-2. "Trumpf는 SetLaserTiming으로 Gate 살려야 함" 명시 (SeqUploadWeldingList.cs:624~626) +``` +//TrumpLaser의 경우 SetLaserTiming 함수로 Gate 신호를 살려줘야 함 +//우선 무조건 셋팅하는 것으로 쓰고 Trump_IO Class 만들면 ... Trump의 경우에만 셋팅 +//LaserFrequency = 10, LaserPulseDuration = 0.1로 셋팅하면 출사 되는 것 확인_241025 +``` +→ **출사 확인된 셋업: `SetLaserTiming(주파수=10, PulseDuration=0.1ms)`** (= `SetLaserTiming(10, 100, 100)` 형태). + +### 2-3. 실제 출사되는 경로는 List + Timing 셋업 사용 +- `SeqUploadWeldingList` / `SeqMarkGrid` 등 실제 마킹 경로는 `SetLaserTiming(...)` + `LaserOnList(...)`(리스트 기반)로 출사. +- 수동 버튼 직접 분기는 리스트가 아닌 `LaserSignalOn` 직접 호출인데 Timing 셋업이 빠짐. + +--- + +## 3. 두 가지 Laser On 경로 정리 + +| 모드(토글) | 경로 | 출사 여부 | +|---|---|---| +| **Use Spot Time** (기본값 `IsUseLaserAutoOffChecked=true`) | `SeqTeachingRun.Start(...)` (리스트 기반, `NeedSetLaserTiming=true` 전달) | 모델 선택 등 전제 충족 시 출사(스팟). 단 모델 null/Busy/LaserReady false면 경고 후 미발사 | +| **No Use Spot Time** (직접) | `WriteDA → SetLaserPulseCtrl → LaserSignalOn` | **SetLaserTiming 주석 → Gate 안 열림 → 출사 안 됨** ★ | + +> 사용자가 "직접 한 방 쏘려고" No Use Spot Time로 눌렀다면 §2-1 이유로 안 나옴. +> Use Spot Time(기본)인데도 안 나온다면 §3 표의 전제(모델 선택/Busy/`_Laser.GetLaserReady()`)에서 막혔을 가능성(토스트 메시지 확인 필요). + +--- + +## 4. 권장 수정 (직접 분기 출사 활성화) + +직접 분기에서 `LaserSignalOn()` **앞에** Gate 타이밍을 살려준다: +```csharp +_Scanner.SetLaserPulseCtrl(LaserPeriod*1000, LaserPulseWidth); +_Scanner.SetLaserTiming(LaserPeriod, LaserPulseWidth, LaserPulseWidth); // ← 주석 해제/추가 (Gate 신호 enable) +_Scanner.LaserSignalOn(); +``` +- 우선 검증은 **확인된 값**으로: `SetLaserTiming(10, 100, 100)`(주파수 10, PulseDuration 0.1ms) → 출사 확인된 셋업(241025). +- 그 후 화면 입력값(`LaserPeriod`/`LaserPulseWidth`) 단위를 SetLaserTiming 인자 단위(periodHz, pulseWidthUs)에 맞춰 매핑 필요. +- Laser Off 시 `LaserSignalOff()` 유지(이미 있음). + +> ⚠ 안전: 이 수정은 **실제 레이저를 출사**시키므로, 적용/테스트는 차폐·인터락·저파워에서 단계적으로. (NoLaser 옵션과 함께 쓰면 컨트롤러 OFF로 무발광 검증 가능.) + +--- + +## 5. 추가 확인 필요 +1. 사용자가 누른 Laser On이 **어느 모드(Use Spot Time vs No Use Spot Time)** 였는지 → 토스트 메시지/화면 토글 상태 확인. +2. `SetLaserTiming` 인자 단위(periodHz/us)와 화면 입력값(`LaserPeriod` kHz, `LaserPulseWidth` us) 정합 매핑. +3. 현재 레이저 타입(`_LaserConfig.TruFiberType`)이 Trumpf 계열인지(맞으면 Gate 셋업 필수). +4. Use Spot Time 경로가 막히는 경우 전제조건(`_Laser.GetLaserReady()`, 모델 선택, Scanner Busy) 로그 확인. + +--- + +## 6. 답: "기능이 없는 건가?" +- **완전히 없는 건 아님.** Use Spot Time(시퀀스) 경로는 출사 로직이 있음. +- 다만 **직접 출사(No Use Spot Time) 경로는 Gate 셋업(`SetLaserTiming`)이 주석 처리되어 미완성** → 그래서 IO/Ready가 다 맞아도 안 나옴. §4 한 줄(또는 확인값) 추가가 핵심.