feat: RTC5 AnalogOut 전압 readback 표시 (Scanner Laser Control)

- Device 계층: ScannerObj.GetAnalogOut(abstract) + RTC5/RTC6(n_get_value, signal=portNo+32)
  /Simul(0) override + Scanner 파사드(미활성 -1)
- UCScannerLaserControlViewModel: AnalogOut1/2Voltage + ReadbackAnalogOut(raw/4095*10 V),
  Laser On 직접 분기 WriteDA 직후 호출
- UCScannerLaserControl.xaml: Control Setting에 DA1/DA2 Voltage [V] 읽기전용 표시
- LaserSignalOn 발사 동작 무변경. (AnalogOut1=33/AnalogOut2=34)
- 분석 문서 추가: Laser On 미출사 원인(122432)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
노도연 2026-06-18 13:56:38 +09:00
parent f0380f43f9
commit ed36f8deaa

View File

@ -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 한 줄(또는 확인값) 추가가 핵심.