diff --git a/AuroraDevices/AuroraLaserScanner/Scanner.cs b/AuroraDevices/AuroraLaserScanner/Scanner.cs index 79f220f..2779045 100644 --- a/AuroraDevices/AuroraLaserScanner/Scanner.cs +++ b/AuroraDevices/AuroraLaserScanner/Scanner.cs @@ -207,6 +207,14 @@ namespace AuroraLaserScanner _scannerObj.WriteDA(portNo, value, type); } + public int GetAnalogOut(uint portNo) + { + if (!IsActivated) { + return -1; + } + return _scannerObj.GetAnalogOut(portNo); + } + public void SetEndList() { if (!IsActivated) { diff --git a/AuroraDevices/AuroraLaserScanner/ScannerObj.cs b/AuroraDevices/AuroraLaserScanner/ScannerObj.cs index 6c4b6bc..5a50049 100644 --- a/AuroraDevices/AuroraLaserScanner/ScannerObj.cs +++ b/AuroraDevices/AuroraLaserScanner/ScannerObj.cs @@ -277,6 +277,12 @@ namespace AuroraLaserScanner public abstract void EnableLaser(); // Write DA public abstract void WriteDA(uint portNo, float value/*0~100%*/, eFunctionType type = eFunctionType.COMMAND); + /// + /// RTC 보드가 출력 중인 AnalogOut DAC 값을 되읽는다. + /// portNo: 1 = AnalogOut1(DA1), 2 = AnalogOut2(DA2) + /// 반환: 0 ~ 4095 (12bit DAC). 전압 = 반환값 / 4095.0 * 10.0 [V] + /// + public abstract int GetAnalogOut(uint portNo); //Ramping 관련 기능 추가 public abstract void SetVectorControl(uint portNo, uint value); public abstract void ParaMarkAbs(double x, double y, float powerValue/*0~100%*/ ); diff --git a/AuroraDevices/AuroraLaserScanner/ScannerRTC5.cs b/AuroraDevices/AuroraLaserScanner/ScannerRTC5.cs index 8823d9c..6068b68 100644 --- a/AuroraDevices/AuroraLaserScanner/ScannerRTC5.cs +++ b/AuroraDevices/AuroraLaserScanner/ScannerRTC5.cs @@ -350,6 +350,13 @@ namespace AuroraLaserScanner } } + public override int GetAnalogOut(uint portNo) + { + // eRecordSignal.AnalogOut1 = 33, AnalogOut2 = 34 → signal = portNo + 32 + uint signal = portNo + 32; + return RTC5Wrap.n_get_value(m_deviceNo, signal); + } + public override void GetEncoder(out double encoderX, out double encoderY, bool rotateMode = false) { diff --git a/AuroraDevices/AuroraLaserScanner/ScannerRTC6.cs b/AuroraDevices/AuroraLaserScanner/ScannerRTC6.cs index 34037db..265cf2e 100644 --- a/AuroraDevices/AuroraLaserScanner/ScannerRTC6.cs +++ b/AuroraDevices/AuroraLaserScanner/ScannerRTC6.cs @@ -350,6 +350,13 @@ namespace AuroraLaserScanner } } + public override int GetAnalogOut(uint portNo) + { + // eRecordSignal.AnalogOut1 = 33, AnalogOut2 = 34 → signal = portNo + 32 + uint signal = portNo + 32; + return RTC6Wrap.n_get_value(m_deviceNo, signal); + } + public override void GetEncoder(out double encoderX, out double encoderY, bool rotateMode = false) { diff --git a/AuroraDevices/AuroraLaserScanner/ScannerSimul.cs b/AuroraDevices/AuroraLaserScanner/ScannerSimul.cs index 47c9d4d..16e9626 100644 --- a/AuroraDevices/AuroraLaserScanner/ScannerSimul.cs +++ b/AuroraDevices/AuroraLaserScanner/ScannerSimul.cs @@ -102,6 +102,11 @@ namespace AuroraLaserScanner } + public override int GetAnalogOut(uint portNo) + { + return 0; + } + public override void GetEncoder(out double encoderX, out double encoderY, bool rotateMode = false) { diff --git a/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControl.xaml b/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControl.xaml index 5c35928..e2c3bee 100644 --- a/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControl.xaml +++ b/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControl.xaml @@ -52,6 +52,10 @@ + + + + diff --git a/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs b/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs index f9f9b05..db9340d 100644 --- a/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs +++ b/WeldingComponents/WeldingCommon/Views/Manual/Scanner/UCScannerLaserControlViewModel.cs @@ -55,6 +55,12 @@ namespace WeldingCommon.Views private double _LaserPower2Watt; public double LaserPower2Watt { get => _LaserPower2Watt; set => SetProperty(ref _LaserPower2Watt, value); } + // RTC5 AnalogOut(파워 지령 전압) readback 표시값 [V] + private double _AnalogOut1Voltage; + public double AnalogOut1Voltage { get => _AnalogOut1Voltage; set => SetProperty(ref _AnalogOut1Voltage, value); } + private double _AnalogOut2Voltage; + public double AnalogOut2Voltage { get => _AnalogOut2Voltage; set => SetProperty(ref _AnalogOut2Voltage, value); } + private uint _LaserPeriod; public uint LaserPeriod { get => _LaserPeriod; set => SetProperty(ref _LaserPeriod, value); } @@ -239,6 +245,16 @@ namespace WeldingCommon.Views ListInterationCount = _ListIterationCount; } + private void ReadbackAnalogOut() + { + int raw1 = _Scanner.GetAnalogOut((uint)eAnalogPortOut.DA1); + int raw2 = _Scanner.GetAnalogOut((uint)eAnalogPortOut.DA2); + + // -1 은 Scanner 미활성(IsActivated == false) sentinel + AnalogOut1Voltage = raw1 < 0 ? 0 : raw1 / 4095.0 * 10.0; + AnalogOut2Voltage = raw2 < 0 ? 0 : raw2 / 4095.0 * 10.0; + } + private void PerformCmdLaserShotOnPercent(object obj) { if (IsUseLaserAutoOffChecked) { @@ -306,6 +322,9 @@ namespace WeldingCommon.Views Thread.Sleep(50); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND); + + ReadbackAnalogOut(); // DAC에 실린 AnalogOut 전압을 읽어 UI에 표시 (출사 전) + _Scanner.SetLaserPulseCtrl(LaserPeriod * 1000, LaserPulseWidth); //_Scanner.SetLaserTiming(LaserPeriod * 1000, LaserPulseWidth, LaserPulseWidth); //_Scanner.SetStandby(LaserPeriod * 1000, LaserPulseWidth); @@ -382,6 +401,9 @@ namespace WeldingCommon.Views Thread.Sleep(50); _Scanner.WriteDA((uint)eAnalogPortOut.DA1, powerVolt1, eFunctionType.COMMAND); _Scanner.WriteDA((uint)eAnalogPortOut.DA2, powerVolt2, eFunctionType.COMMAND); + + ReadbackAnalogOut(); // DAC에 실린 AnalogOut 전압을 읽어 UI에 표시 (출사 전) + _Scanner.SetLaserPulseCtrl(LaserPeriod * 1000, LaserPulseWidth); //_Scanner.SetLaserTiming(LaserPeriod * 1000, LaserPulseWidth, LaserPulseWidth); //_Scanner.SetStandby(LaserPeriod * 1000, LaserPulseWidth); diff --git a/docs/작업일지/2026_06_18.md b/docs/작업일지/2026_06_18.md index 6707a8a..8924fea 100644 --- a/docs/작업일지/2026_06_18.md +++ b/docs/작업일지/2026_06_18.md @@ -101,3 +101,15 @@ - IO 결선을 바꿔서, 레시피의 Laser Ready 판정 입력을 `ReadDI(12) && ReadDI(24)` → **`ReadDI(11) && ReadDI(15)`** 로 수정. - 위치: `UCScannerObjectTeachingControlBoxViewModel`의 `OnMonitoring` Laser Ready 판정부. - 변경된 결선에 맞춘 단순 입력 번호 교체(로직 동일). + +## 13:55 + +### RTC5 AnalogOut 전압 Readback 표시 (Laser Shot Control) + +- `docs/RTC5_AnalogOut_Readback_수정가이드.md`(외부 작성 구현 명세)에 맞춰 RTC5 보드의 AnalogOut(파워 지령 전압) readback 기능 구현. 가이드 파일은 적용 후 삭제. +- **Device 계층**: `ScannerObj`에 `abstract int GetAnalogOut(uint portNo)` 추가 → `ScannerRTC5`/`ScannerRTC6`(`n_get_value(signal=portNo+32)`, AnalogOut1=33/AnalogOut2=34)/`ScannerSimul`(더미 0) override + `Scanner` 파사드(미활성 시 -1). +- **ViewModel**(`UCScannerLaserControlViewModel`): `AnalogOut1Voltage`/`AnalogOut2Voltage` 속성 + `ReadbackAnalogOut()`(raw/4095×10 [V]) 추가, Laser On 직접 분기(No Use Spot Time)의 WriteDA 직후·출사 전 호출. +- **XAML**(`UCScannerLaserControl.xaml`): Control Setting(Percent 영역)에 `DA1 Voltage`/`DA2 Voltage` [V] 읽기전용 표시 추가. +- 표시 대상은 Power Calibration(dbVoltage)이 아니라 **ScannerLaserControl 화면**으로 확정(요청). LaserSignalOn 발사 동작은 변경 없음(readback만 추가). +- AuroraDevices 변경이라 VS Rebuild로 빌드 확인 예정(abstract 추가 → override 3개 모두 구현). +- 관련 분석: `docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md`