docs: NoLaser 분석 문서 갱신 - DO9/13(IO Control) 채택안으로 정리
발진 Enable 실제 지점이 LaserSignalOn(RTC5)이 아니라 IO Control DO9/DO13(Core/Ring Laser Control)임을 반영. IsNoLaser 채택 구현과 초기 LaserSignalOn 방식 원복 경위 기록. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
8ec4fd0d62
commit
d29bf83ed3
@ -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
|
||||||
|
<CheckBox Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Margin="5 6 0 0"
|
||||||
|
FontSize="12" FontWeight="Bold" Foreground="#FFBBBBBB"
|
||||||
|
IsChecked="{Binding IsNoLaser}"
|
||||||
|
Content="No Laser (전압만, 발진 안 함)"/>
|
||||||
|
```
|
||||||
|
|
||||||
|
### 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 연동이 필요한지는 운영하며 판단.
|
||||||
Loading…
x
Reference in New Issue
Block a user