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`