From d29bf83ed3ca54010b318edb93e69fcaa8c52d79 Mon Sep 17 00:00:00 2001 From: NohDoyeon241104 Date: Thu, 18 Jun 2026 12:18:09 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20NoLaser=20=EB=B6=84=EC=84=9D=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=20=EA=B0=B1=EC=8B=A0=20-=20DO9/13(IO=20Contr?= =?UTF-8?q?ol)=20=EC=B1=84=ED=83=9D=EC=95=88=EC=9C=BC=EB=A1=9C=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 발진 Enable 실제 지점이 LaserSignalOn(RTC5)이 아니라 IO Control DO9/DO13(Core/Ring Laser Control)임을 반영. IsNoLaser 채택 구현과 초기 LaserSignalOn 방식 원복 경위 기록. Co-Authored-By: Claude Opus 4.8 --- ...4445_analog_only_no_laser_toggle_analysis.md | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 docs/분석/2026/06/18/114445_analog_only_no_laser_toggle_analysis.md diff --git a/docs/분석/2026/06/18/114445_analog_only_no_laser_toggle_analysis.md b/docs/분석/2026/06/18/114445_analog_only_no_laser_toggle_analysis.md new file mode 100644 index 0000000..6765e59 --- /dev/null +++ b/docs/분석/2026/06/18/114445_analog_only_no_laser_toggle_analysis.md @@ -0,0 +1,117 @@ +# Manual Laser Power Control — "레이저 컨트롤러 OFF + 전압만 인가(NoLaser)" 분석 및 채택안 + +- **작성일:** 2026-06-18 (갱신: 최종 채택안 = IO Control DO9/13 + `IsNoLaser`) +- **관련 View/VM:** + - 채택 지점: `WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBox.xaml` (+ `...ViewModel.cs`) + - 초기 검토 지점(원복): `WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControl.xaml` (+ VM) +- **디바이스:** `AuroraDevices/AuroraLaserScanner/Scanner.cs`, `ScannerRTC5.cs`, `WeldingCommon/Devices/Laser/LaserIOControl.cs` +- **선행 분석:** `102847_manual_laser_power_control_groupbox_analysis.md` + +--- + +## 0. 내 요청사항 + +> Manual Laser Power Control 영역에서 **레이저(발진, lasing)는 안 나가게 하고 전압(Voltage)만 인가**되도록 하고 싶다. `Laser On`을 눌렀을 때 동작하도록 **체크박스/토글** 하나가 있어야 할 것 같다. (Cal 파일 작성용: 레이저는 안 쏘고 전압만 인가, 기록은 남기기) +> +> 추가 확인(현장): "Laser On 누르면 원래 **IO Control 9번이 true**가 되는데, 그 IO를 true로 안 켜면(false 유지) 발진 없이 동작한다." → 그 지점을 막는 방식으로. + +--- + +## 1. 결론 요약 (최종 채택안) + +- **실제 발진을 만드는 지점은 `LaserSignalOn`(RTC5 게이트)이 아니라 IO Control 비트였다.** + - **DO 9 = `CoreLaser_Control`**, **DO 13 = `RingLaser_Control`** (PAIX `ePrismaticDOAddress`). + - 이 둘이 true가 되면 레이저 컨트롤러가 발진 가능(enable) 상태가 됨. +- 따라서 **이 DO9/13을 켜는 부분을 NoLaser일 때 false로 유지**하면, 전압(WriteDA)은 인가되되 레이저 컨트롤러는 OFF → 발진 없이 `Laser On` 가능. +- 채택 위치: `UCScannerObjectTeachingControlBoxViewModel.PerformCmdLaserReadyCheck` (Laser Control GroupBox의 **Laser Ready** 버튼). +- 구현: ViewModel에 `IsNoLaser`(bool, 기본 false) 추가 + 켜는 분기에 `ctrlOn = !IsNoLaser` 적용 + XAML 체크박스. + +--- + +## 2. 메커니즘 근거 + +### 2-1. 전압 출력과 발진은 독립 (선행 확인) +- `Scanner.WriteDA(port, value)` → RTC5 `n_write_da_x` (아날로그 전압 출력). `ScannerRTC5.WriteDA`: `targetValue = value * 40.95` (0~4095 = 0~10V). 즉 **출력 전압[V] = value/10**. +- `Scanner.LaserSignalOn()` → RTC5 `n_laser_signal_on` (스캐너측 레이저 Active 신호). 전압 출력과 별개 호출. + +### 2-2. ★ 실제 레이저 컨트롤러 Enable = IO DO9/DO13 +`WeldingCommon/Devices/Laser/LaserIOControl.cs` 의 `ePrismaticDOAddress`: +``` +CoreLaser_Control = 9 +CoreLaser_ErrorClearing +RingLaser_Control = 13 +RingLaser_ErrorClearing +``` +→ DO9/DO13(Core/Ring Laser Control)을 true로 주면 레이저 컨트롤러가 켜짐(발진 가능). **이게 "발진을 만드는 IO".** +(참고: DI9 = `CoreLaser_Laser_Ready`는 읽기 신호로 별개.) + +### 2-3. DO9/13을 켜는 코드 위치 +`UCScannerObjectTeachingControlBoxViewModel.PerformCmdLaserReadyCheck` — `Laser Ready` 버튼이 `toggleIO`로 DO9/DO13을 true/false 토글. +```csharp +if (toggleIO) { + _IODevice._iOUnit.WriteDoBit(9, true); // CoreLaser_Control ON + _IODevice._iOUnit.WriteDoBit(13, true); // RingLaser_Control ON + toggleIO = false; +} else { + _IODevice._iOUnit.WriteDoBit(9, false); + _IODevice._iOUnit.WriteDoBit(13, false); + toggleIO = true; +} +``` + +--- + +## 3. 채택 구현 (적용 완료) + +### 3-1. ViewModel — `IsNoLaser` 추가 +```csharp +private bool _IsNoLaser; +public bool IsNoLaser { get => _IsNoLaser; set => SetProperty(ref _IsNoLaser, value); } +// InitVariable()에서 IsNoLaser = false (기본: 기존 동작) +``` + +### 3-2. 켜는 분기를 NoLaser면 false로 +```csharp +if (toggleIO) { + // IsNoLaser면 레이저 컨트롤러(BIT9/13)를 켜지 않음(false 유지) → 발진 없이 Laser On 가능 + bool ctrlOn = !IsNoLaser; + _IODevice._iOUnit.WriteDoBit(9, ctrlOn); + _IODevice._iOUnit.WriteDoBit(13, ctrlOn); + toggleIO = false; +} else { + _IODevice._iOUnit.WriteDoBit(9, false); + _IODevice._iOUnit.WriteDoBit(13, false); + toggleIO = true; +} +``` + +### 3-3. XAML — 체크박스 (Laser Control GroupBox) +```xml + +``` + +### 3-4. 동작 표 +| IsNoLaser | Laser Ready 버튼 | 결과 | +|---|---|---| +| **false (기본)** | DO9/13 ON/OFF 토글 | 기존과 동일(레이저 컨트롤러 켜짐 → 발진 가능) | +| **true (NoLaser)** | DO9/13을 **false 유지** | 레이저 컨트롤러 OFF, 발진 없이 진행(전압만) | + +> 적용 = 커밋 `8ec4fd0`. 디바이스 레이어(Scanner/RTC5) 무변경, IO 비트 9/13만 제어. + +--- + +## 4. 초기 검토안(원복) 기록 +- 처음엔 `UCScannerLaserControl`(Manual Laser Power Control)에 `IsAnalogOnly`를 추가해 `LaserSignalOn()`(RTC5 게이트)을 조건부로 막는 방식을 구현했음. +- 그러나 현장 확인 결과 **실제 발진 Enable은 다른 소스(ObjectTeachingControlBox)의 IO DO9/13**임이 확인되어, 해당 변경은 **원복**(Watt 숨김 커밋 `ad6cf68`은 유지)하고 본 §3의 DO9/13 방식으로 재구현함. +- 교훈: "발진을 막는 지점"이 RTC5 게이트(`LaserSignalOn`)가 아니라 **레이저 컨트롤러 Enable IO(DO9/13)** 였음. + +--- + +## 5. 주의 / 추가 확인 +1. **전압 표시(요청)**: 인가 전압을 화면에 표시하려면, 하드웨어 readback API는 없으므로 **명령 전압값(= WriteDA에 쓰는 powerVolt/10 [V])** 을 VM 프로퍼티로 노출해 표시하는 방식 권장(디바이스 무변경). → 별도 작업으로 진행 가능. +2. **RTC5 기록 저장**: WriteDA(전압)는 발진과 무관하게 수행되므로 전압 명령 자체는 남음. "기록 저장"이 앱 로깅을 의미하면 별도 로깅 경로 확인 필요. +3. **안전**: NoLaser는 기본 false. 체크 상태를 화면에 명확히 표시(체크박스 라벨). NoLaser일 때는 DO9/13이 절대 true로 가지 않음(켜는 분기·끄는 분기 모두 false). +4. **Manual Laser Power Control(UCScannerLaserControl) 쪽**: 현재 Watt GroupBox는 숨김(`Collapsed`), Analog Only 변경은 원복됨. 추후 그쪽에도 동일 NoLaser 연동이 필요한지는 운영하며 판단.