NohDoyeon241104 3b8e64b9be feat: 레이저 출사중 표시 및 출사조건 로그 (ISSUE-260904-01)
메뉴얼/레시피 화면에 DI Laser_EMISSION_ON(10) 기반 출사중 램프 추가. 260904 현장 실측으로 DI 10 이 DO 9 의 에코가 아닌 실제 발진 피드백임을 확증하여 LaserIOControl 주석도 정정. 출사조건 스냅샷은 [LaserCond] 로그로 4개 시점(ShotOn/Heartbeat/ShotOff/DoorForceOff)에 기록. 표시·기록 전용이며 출사 차단 로직은 변경 없음.
2026-09-04 14:13:13 +09:00

324 lines
25 KiB
XML

<UserControl x:Class="WeldingCommon.Views.UCScannerLaserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WeldingCommon.Views"
xmlns:behavior="http://schemas.microsoft.com/xaml/behaviors"
xmlns:view="clr-namespace:Aurora.View;assembly=Aurora"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:aurorauicomponent="clr-namespace:AuroraUIComponent;assembly=AuroraUIComponent"
xmlns:usercontrols="clr-namespace:AuroraUIComponent.UserControls;assembly=AuroraUIComponent"
d:DataContext="{d:DesignInstance Type=local:UCScannerLaserControlViewModel}"
mc:Ignorable="d"
d:DesignHeight="800" d:DesignWidth="600" x:Name="uc">
<UserControl.Resources>
<view:BoolConverter x:Key="convTrueVisible" TrueValue="Visible" FalseValue="Hidden"/>
<view:BoolConverter x:Key="convFalseVisible" TrueValue="Hidden" FalseValue="Visible"/>
<view:BoolConverter x:Key="convReverse" FalseValue="True" TrueValue="False"/>
<view:BoolConverter x:Key="convFieldColor" TrueValue="Red" FalseValue="Gray" />
</UserControl.Resources>
<behavior:Interaction.Triggers>
<behavior:PropertyChangedTrigger Binding="{Binding IsVisible, ElementName=uc}">
<behavior:InvokeCommandAction Command="{Binding CMD_VisibleChanged}" CommandParameter="{Binding IsVisible, ElementName=uc}"/>
</behavior:PropertyChangedTrigger>
</behavior:Interaction.Triggers>
<Grid>
<Grid.RowDefinitions>
<!-- [출사 표시 2026-09-04] 0행 = Laser Emission 램프.
맨 위에 둔 이유: 아래 Marking On The Fly 그룹이 convTrueVisible(FalseValue=Hidden)
을 쓰기 때문에 미사용 설비에서도 화면 높이를 그대로 점유한다.
램프를 그 아래에 두면 패널 밖으로 밀려나 보이지 않는다(260904 현장 확인). -->
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<GroupBox Grid.Row="1" Header="Manual Laser Power Control" Margin="0 3 3 0">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<GroupBox Header="Control Setting" Grid.Column="0" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Rows="4">
<usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Percent}" DecimalPlaces="0" Unit="%" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
<usercontrols:UCKeyValue KeyText="Power #2" Value="{Binding LaserPower2Percent}" DecimalPlaces="0" Unit="%" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
<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>
</Grid>
</GroupBox>
<GroupBox Header="Laser Shot Control" Grid.Column="1" Margin="5 5 0 0" Style="{StaticResource StGroupBox2nd}" FontSize="10">
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<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>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5">
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsUseLaserAutoOffChecked}"
OffContent="No Use Spot Time"
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" Visibility="{Binding IsNoLaser, Converter={StaticResource convTrueVisible}}">
<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}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<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="List" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding BusyStatus}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Repeat Count" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding ListInterationCount}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
</Grid>
</GroupBox>
<UniformGrid Grid.Row="1" Grid.Column="1" Columns="2">
<Button Margin="3" Command="{Binding CMD_LaserShotOnPercent}" Content="Laser On" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Margin="3" Command="{Binding CMD_LaserShotOff}" Content="Laser Off" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
</UniformGrid>
</Grid>
</GroupBox>
</Grid>
</GroupBox>
<GroupBox Grid.Row="2" Header="Manual Laser Power Control" Margin="0 3 3 0" Visibility="Collapsed">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"></ColumnDefinition>
<ColumnDefinition Width="2*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<GroupBox Header="Control Setting" Grid.Column="0" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<UniformGrid Grid.Row="0" Rows="4">
<usercontrols:UCKeyValue KeyText="Power #1" Value="{Binding LaserPower1Watt}" DecimalPlaces="0" Unit="W" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
<usercontrols:UCKeyValue KeyText="Power #2" Value="{Binding LaserPower2Watt}" DecimalPlaces="0" Unit="W" KeyHorizontalAlignment="Right" KeyTextWidth="0.5*" />
<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>
</Grid>
</GroupBox>
<GroupBox Header="Laser Shot Control" Grid.Column="1" Margin="5 5 0 0" Style="{StaticResource StGroupBox2nd}" FontSize="10">
<Grid Margin="3">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<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="1*"></RowDefinition>
</Grid.RowDefinitions>
<Border Grid.Row="0" BorderBrush="Gray" BorderThickness="0.5">
<mah:ToggleSwitch Grid.Row="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsUseLaserAutoOffChecked}"
OffContent="No Use Spot Time"
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}}" />
</Grid>
</GroupBox>
<GroupBox Grid.Row="0" Grid.Column="1" Header="Laser Shot Result" Style="{StaticResource StGroupBox4th}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<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="List" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding BusyStatus}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Repeat Count" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding ListInterationCount}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
</Grid>
</GroupBox>
<UniformGrid Grid.Row="1" Grid.Column="1" Columns="2">
<Button Margin="3" Command="{Binding CMD_LaserShotOnWatt}" Content="Laser On" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Margin="3" Command="{Binding CMD_LaserShotOff}" Content="Laser Off" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
</UniformGrid>
</Grid>
</GroupBox>
</Grid>
</GroupBox>
<GroupBox Grid.Row="3" Header="Marking On The Fly" Margin="0 3 3 0" Visibility="{Binding IsUseMarkingOnTheFly, Converter={StaticResource convTrueVisible}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<GroupBox Header="Encoder Value" Grid.Row="0" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<UniformGrid Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Rows="4">
<usercontrols:UCKeyValue KeyText="Encoder X" Value="{Binding EncoderValueAxisX}" DecimalPlaces="3" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True"/>
<usercontrols:UCKeyValue KeyText="Encoder Y" Value="{Binding EncoderValueAxisY}" DecimalPlaces="3" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True"/>
<usercontrols:UCKeyValue KeyText="Encoder Rotate" Value="{Binding EncoderValueRotate}" DecimalPlaces="3" Unit="degree" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True"/>
<usercontrols:UCKeyValue KeyText="Encoder Velocity" Value="{Binding EncoderValueVelocity}" DecimalPlaces="3" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" IsReadOnly="True"/>
</UniformGrid>
<GroupBox Grid.Row="0" Grid.Column="1" Header="FieldOut Status" Style="{StaticResource StGroupBox4th}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="X Dir FieldOut" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsFieldOutX}" Background="{Binding IsFieldOutX, Converter={StaticResource convFieldColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Y Dir FieldOut" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsFieldOutY}" Background="{Binding IsFieldOutY, Converter={StaticResource convFieldColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
</Grid>
</GroupBox>
<UniformGrid Grid.Row="1" Grid.Column="1" Columns="3" Margin="5 0 5 0">
<Button Margin="3" Command="{Binding CMD_ResetEncoderValue}" Content="Reset Encoder" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Margin="3" Command="{Binding CMD_SimulateEncoder}" Content="Simul X" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Margin="3" Command="{Binding CMD_SimulateEncoderXY}" Content="XY" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
</UniformGrid>
</Grid>
</GroupBox>
<GroupBox Header="Control Setting" Grid.Row="1" Margin="0 5 0 0" Style="{StaticResource StGroupBox4th}">
<Grid Margin="3">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<UniformGrid Grid.Row="0" Rows="3">
<usercontrols:UCKeyValue KeyText="Rotate CenterX" Value="{Binding RotateCenterX}" DecimalPlaces="3" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
<usercontrols:UCKeyValue KeyText="Rotate CenterY" Value="{Binding RotateCenterY}" DecimalPlaces="3" Unit="mm" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
<usercontrols:UCKeyValue KeyText="Encoder Resolution" Value="{Binding EncoderResolution}" DecimalPlaces="3" Unit="count/rev" KeyHorizontalAlignment="Right" KeyTextWidth="0.9*" />
</UniformGrid>
<UniformGrid Grid.Row="0" Grid.Column="1" Columns="2" Margin="5 0 5 0">
<Button Margin="3" Command="{Binding CMD_ActivateOnTheFly}" Content="Activate On The Fly" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Margin="3" Command="{Binding CMD_DeactivateOnTheFly}" Content="Deactivate On The Fly" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
</UniformGrid>
</Grid>
</GroupBox>
</Grid>
</GroupBox>
<!-- [출사 표시 2026-09-04] 레이저 출사중 표시 (요청 260904-01)
DI Laser_EMISSION_ON(10) = 실제 발진 피드백(260904 현장 실측),
DO Laser_REMOTE(9) = Emission 게이트(260826 부터 쓰던 기존 표시 근거).
두 신호를 함께 보되 문구는 3단으로 나눈다. 표시 전용이며 출사를 차단하지 않는다. -->
<GroupBox Grid.Row="0" Header="Laser Emission" Margin="0 3 3 0" VerticalAlignment="Top">
<Border Margin="3" MinHeight="60" BorderBrush="Gray" BorderThickness="1"
Background="{Binding EmissionColor}">
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="{Binding EmissionText}" FontSize="20" FontWeight="Bold"
Foreground="White" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding EmissionSignalText}" FontSize="11"
Foreground="#FFDDDDDD" HorizontalAlignment="Center" Margin="0 2 0 0"/>
</StackPanel>
</Border>
</GroupBox>
</Grid>
</UserControl>