feat: NoLaser 옵션을 Manual(ScannerLaserControl)로 이동, Recipe NoLaser 제거

- Manual: IsNoLaser 추가, Laser On 직접 분기(Percent/Watt)의 LaserSignalOn을
  if(!IsNoLaser)로 가드 → 체크 시 발진 없이 전압만 인가
- Manual XAML: Use Spot Time과 동일 ToggleSwitch 디자인의 'No Laser(전압만)' 토글 추가
  (Timer Set: UseSpotTime → Time(체크시) → NoLaser → DA1/DA2 Voltage)
- Recipe(UCScannerObjectTeachingControlBox): NoLaser 완전 제거(원래 의도가 Manual),
  PerformCmdLaserReadyCheck를 WriteDoBit(9/13,true)로 환원. DI 11&15 변경은 유지.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
노도연 2026-06-18 14:14:59 +09:00
parent 166d1bd2f0
commit accffdd94a
5 changed files with 32 additions and 20 deletions

View File

@ -52,10 +52,6 @@
<usercontrols:UCKeyValue KeyText="Frequency" Value="{Binding LaserPeriod}" DecimalPlaces="0" Unit="kHz" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
<usercontrols:UCKeyValue KeyText="Pulse Width" Value="{Binding LaserPulseWidth}" DecimalPlaces="0" Unit="us" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
</UniformGrid>
<UniformGrid Grid.Row="1" Rows="2" VerticalAlignment="Top" Margin="0 5 0 0">
<usercontrols:UCKeyValue KeyText="DA1 Voltage" Value="{Binding AnalogOut1Voltage}" DecimalPlaces="3" Unit="V" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" IsReadOnly="True" />
<usercontrols:UCKeyValue KeyText="DA2 Voltage" Value="{Binding AnalogOut2Voltage}" DecimalPlaces="3" Unit="V" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" IsReadOnly="True" />
</UniformGrid>
</Grid>
</GroupBox>
@ -72,6 +68,7 @@
<GroupBox Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Header="Timer Set" Style="{StaticResource StGroupBox4th}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
@ -83,6 +80,16 @@
OnContent="Use Spot Time"/>
</Border>
<usercontrols:UCKeyValue Grid.Row="1" KeyText="Time" Value="{Binding LaserOnTime}" DecimalPlaces="0" Unit="ms" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" Visibility="{Binding IsUseLaserAutoOffChecked, Converter={StaticResource convTrueVisible}}" />
<Border Grid.Row="2" BorderBrush="Gray" BorderThickness="0.5" Margin="0 3 0 0">
<mah:ToggleSwitch HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsNoLaser}"
OffContent="Laser Fire"
OnContent="No Laser (전압만)"/>
</Border>
<UniformGrid Grid.Row="3" Rows="2" VerticalAlignment="Top" Margin="0 5 0 0">
<usercontrols:UCKeyValue KeyText="DA1 Voltage" Value="{Binding AnalogOut1Voltage}" DecimalPlaces="3" Unit="V" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True" />
<usercontrols:UCKeyValue KeyText="DA2 Voltage" Value="{Binding AnalogOut2Voltage}" DecimalPlaces="3" Unit="V" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True" />
</UniformGrid>
</Grid>
</GroupBox>
<GroupBox Grid.Row="0" Grid.Column="1" Header="Laser Shot Result" Style="{StaticResource StGroupBox4th}">

View File

@ -69,6 +69,10 @@ namespace WeldingCommon.Views
private bool _IsUseLaserAutoOffChecked;
public bool IsUseLaserAutoOffChecked { get => _IsUseLaserAutoOffChecked; set => SetProperty(ref _IsUseLaserAutoOffChecked, value); }
// No Laser 모드: 체크 시 Laser On 눌러도 LaserSignalOn(발진) 생략 → 전압만 인가(전압 readback 표시용)
private bool _IsNoLaser;
public bool IsNoLaser { get => _IsNoLaser; set => SetProperty(ref _IsNoLaser, value); }
private double _LaserOnTime;
public double LaserOnTime { get => _LaserOnTime; set => SetProperty(ref _LaserOnTime, value); }
@ -328,7 +332,9 @@ namespace WeldingCommon.Views
_Scanner.SetLaserPulseCtrl(LaserPeriod * 1000, LaserPulseWidth);
//_Scanner.SetLaserTiming(LaserPeriod * 1000, LaserPulseWidth, LaserPulseWidth);
//_Scanner.SetStandby(LaserPeriod * 1000, LaserPulseWidth);
_Scanner.LaserSignalOn();
if (!IsNoLaser) {
_Scanner.LaserSignalOn(); // No Laser면 발진 신호 생략 → 전압만 인가
}
}
}
private void PerformCmdLaserShotOnWatt(object obj)
@ -407,7 +413,9 @@ namespace WeldingCommon.Views
_Scanner.SetLaserPulseCtrl(LaserPeriod * 1000, LaserPulseWidth);
//_Scanner.SetLaserTiming(LaserPeriod * 1000, LaserPulseWidth, LaserPulseWidth);
//_Scanner.SetStandby(LaserPeriod * 1000, LaserPulseWidth);
_Scanner.LaserSignalOn();
if (!IsNoLaser) {
_Scanner.LaserSignalOn(); // No Laser면 발진 신호 생략 → 전압만 인가
}
}
}
private void OnCompleteMarkGrid(SequenceActionResult res)

View File

@ -92,7 +92,6 @@
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Guid Beam Status" VerticalAlignment="Center" HorizontalAlignment="Right"/>
@ -119,10 +118,6 @@
<TextBlock Text="Laser Ready"/>
</StackPanel>
</Button>
<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 (전압만, 발진 안 함)"/>
</Grid>
</GroupBox>

View File

@ -76,10 +76,6 @@ namespace WeldingCommon.Views
private bool _IsLaserReady;
public bool IsLaserReady { get => _IsLaserReady; set => SetProperty(ref _IsLaserReady, value); }
// NoLaser 모드: true면 Laser Control(BIT9/13)을 켜지 않음(false 유지) → 레이저 컨트롤러 OFF 상태로 Laser On 가능 (Cal/전압 측정용)
private bool _IsNoLaser;
public bool IsNoLaser { get => _IsNoLaser; set => SetProperty(ref _IsNoLaser, value); }
// Object Select Type
private bool _IsObjectSelectAll;
public bool IsObjectSelectAll { get => _IsObjectSelectAll; set => SetProperty(ref _IsObjectSelectAll, value); }
@ -148,7 +144,6 @@ namespace WeldingCommon.Views
IsGuidBeam = false;
IsLaserReady = false;
IsNoLaser = false;
IsObjectSelectAll = true;
}
@ -466,10 +461,8 @@ namespace WeldingCommon.Views
// 추후 Write bit 파라미터화 해야함
if(toggleIO)
{
// IsNoLaser면 레이저 컨트롤러(BIT9/13)를 켜지 않음(false 유지) → 발진 없이 Laser On 가능
bool ctrlOn = !IsNoLaser;
_IODevice._iOUnit.WriteDoBit(9, ctrlOn);
_IODevice._iOUnit.WriteDoBit(13, ctrlOn);
_IODevice._iOUnit.WriteDoBit(9, true);
_IODevice._iOUnit.WriteDoBit(13, true);
toggleIO = false;
}
else

View File

@ -113,3 +113,12 @@
- 표시 대상은 Power Calibration(dbVoltage)이 아니라 **ScannerLaserControl 화면**으로 확정(요청). LaserSignalOn 발사 동작은 변경 없음(readback만 추가).
- AuroraDevices 변경이라 VS Rebuild로 빌드 확인 예정(abstract 추가 → override 3개 모두 구현).
- 관련 분석: `docs/분석/2026/06/18/122432_laser_on_no_emission_analysis.md`
## 14:14
### NoLaser를 Manual(ScannerLaserControl)로 이동 + Recipe NoLaser 제거
- 어제/오늘 Recipe(UCScannerObjectTeachingControlBox)에 만들었던 NoLaser는 **원래 의도가 Manual 화면**이었음 → Recipe에서 **완전 제거**(속성/InitVariable/체크박스/RowDefinition/`PerformCmdLaserReadyCheck`의 `ctrlOn` 원복하여 `WriteDoBit(9/13,true)`로 환원). **DI 11&15 변경은 유지.**
- **Manual**(`UCScannerLaserControlViewModel`): `IsNoLaser` 추가, Laser On 직접 분기(Percent/Watt 두 곳)의 `LaserSignalOn()`을 `if(!IsNoLaser)`로 가드 → 체크 시 발진 없이 전압만 인가.
- **Manual XAML**(`UCScannerLaserControl.xaml`): Use Spot Time 토글과 **같은 ToggleSwitch 디자인**의 `No Laser (전압만)` 토글 추가. Timer Set 영역 배치 = Use Spot Time → Time(체크 시만) → No Laser → DA1/DA2 Voltage 순.
- 이 NoLaser는 RTC5 발진 게이트(`LaserSignalOn`)를 막는 방식이라 **이 화면만으로 자기완결**(DO9/13 별도 화면 불필요). No Use Spot Time + No Laser + Laser On → 전압 readback 표시 + 발진 없음.