添加 MX-PD-盘古 项目文件

将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
This commit is contained in:
Shi.Ji
2026-05-18 11:43:09 +08:00
parent 03632a379d
commit e31d3560bb
739 changed files with 99783 additions and 0 deletions

View File

@@ -0,0 +1,480 @@
<UserControl x:Class="MXJM.SystemSetting.View.CameraFusionCali02AView"
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:mwControls="http://www.maxwell-gp.com/"
Loaded="{mwControls:Action viewLoad}"
Unloaded="{mwControls:Action viewUnLoad}"
xmlns:view="clr-namespace:MXJM.Common.View"
xmlns:local="clr-namespace:MXJM.SystemSetting.View"
xmlns:testdemo="clr-namespace:MwFramework.Controls.SystemCalib;assembly=MwFramework.Controls.SystemCalib"
mwControls:ParameterAttach.DelayAcceptValue ="{Binding ParameterHelper}"
xmlns:convert="clr-namespace:MXJM.Common.Converter"
mc:Ignorable="d"
d:DesignHeight="850" d:DesignWidth="1200">
<UserControl.Resources>
<convert:CameraTypeToBoolConverter x:Key="CameraTypeToBoolConverter"/>
<Style x:Key="CommonLableStyle" TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
<Setter Property="HorizontalContentAlignment" Value="Right"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
<Setter Property="Height" Value="35"/>
<Setter Property="Width" Value="120"/>
</Style>
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
<Setter Property="HorizontalContentAlignment" Value="Left"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
<Setter Property="Height" Value="35"/>
<Setter Property="Width" Value="120"/>
</Style>
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" >
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
<Setter Property="Height" Value="35"/>
<Setter Property="Width" Value="110"/>
</Style>
</UserControl.Resources>
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<view:CameraAxisView DataContext="{Binding }" IsEnabled="{Binding Motion.IsFinish}"/>
<Grid Grid.Column="1">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition Height="60"/>
</Grid.RowDefinitions>
<TabControl mwControls:TabControlAttach.FontSize="12" mwControls:TabControlAttach.HeaderHeight="30" mwControls:TabControlAttach.HeaderWidth="120" Margin="5,0,0,0" >
<TabItem Header="相机晶圆伺服融合">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
<GroupBox.Header>
<TextBlock Text="WS运动系标定位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Grid.Row="0" Rows="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="140"/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<!--<ColumnDefinition/>-->
</Grid.ColumnDefinitions>
<Label Content="WS平台标定X1(mm)" Width="200" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Tag="WS平台标定X1" Value="{Binding CameraWaferFusionCalibrationItem.WSPlatCalibXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
<!--<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />-->
<Button Grid.Column="3" Tag="WS平台标定X1-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveWSCalibPosPosition}" HorizontalAlignment="Left" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.6*"/>
<ColumnDefinition/>
<ColumnDefinition />
<ColumnDefinition/>
<ColumnDefinition Width="1.5*"/>
</Grid.ColumnDefinitions>
<Label Content="X2" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
<Label Content="Y2" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
<Button Grid.Column="5" Tag="WS平台标定X1-中心对齐" Content="中心对齐" Click="{mwControls:Action btnGotoCalibPos}" HorizontalAlignment="Left" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="1" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
<GroupBox.Header>
<TextBlock Text="相机起始位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Grid.Row="0" Rows="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="CameraX(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Center" />
<mwControls:NumberBox Tag="CameraX" Value="{Binding CameraWaferFusionCalibrationItem.CameraX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Center" Margin="5" Width="120" Height="35" />
<!--<Label Content="CameraY(mm)" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CameraY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
<Button Grid.Column="3" Tag="计算相机起始位置" Content="计算位置" Click="{mwControls:Action BtnCalculateCameraPosition}" HorizontalAlignment="Left" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Column="1" Tag="相机起始位置-读取当前位置" Content="读取当前位置" Click="{mwControls:Action btnSetCameraPosition}" HorizontalAlignment="Left" />
<Button Grid.Column="3" Tag="相机起始位置-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveCameraPosition}" HorizontalAlignment="Left" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
<GroupBox.Header>
<TextBlock Text="WS起始位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="StartX(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartX}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Label Content="StartY(mm)" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartY}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Tag="WS起始位置-计算当前位置" Content="计算位置" Click="{mwControls:Action BtnCalculateWSPosition}" HorizontalAlignment="Left" Grid.ColumnSpan="2" Margin="3,0,0,0" />
<Button Grid.Column="1" Tag="WS起始位置-读取当前位置" Content="读取当前位置" Click="{mwControls:Action btnSetWaferStartPosition}" HorizontalAlignment="Left" Grid.ColumnSpan="2" Margin="3,0,0,0" />
<Button Grid.Column="2" Tag="WS起始位置-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveWaferStartPosition}" HorizontalAlignment="Left" Margin="2,0,0,0" />
<Button Grid.Column="3" Tag="WS起始位置-对齐中心" Content="对齐中心" Click="{mwControls:Action btnMoveToCenter}" HorizontalAlignment="Left" Margin="3,0,0,0" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="4" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" Grid.ColumnSpan="2">
<GroupBox.Header>
<TextBlock Text="标定参数" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<!--<DataGrid Grid.Row="0" ItemsSource="{Binding CameraWaferFusionCalibrationItem.AxisAndPixelPointItemList}" SelectedItem="CameraWaferFusionCalibrationItem.SelectedAxisAndPixelPointItem" Margin="3" AutoGenerateColumns="false" SelectionMode="Single"
CanUserSortColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="No" Binding="{Binding Id}" Width="1*" IsReadOnly="true"/>
<DataGridTextColumn Header="AxisX1" Binding="{Binding AxisX1}" Width="2*" IsReadOnly="true"/>
<DataGridTextColumn Header="AxisY1" Binding="{Binding AxisY1}" Width="2*" IsReadOnly="true"/>
<DataGridTextColumn Header="AxisX2" Binding="{Binding AxisX2}" Width="2*" IsReadOnly="true"/>
<DataGridTextColumn Header="AxisY2" Binding="{Binding AxisY2}" Width="2*" IsReadOnly="true"/>
<DataGridTextColumn Header="RecognizeX" Binding="{Binding PixelX}" Width="2*" IsReadOnly="true"/>
<DataGridTextColumn Header="RecognizeY" Binding="{Binding PixelY}" Width="2*" IsReadOnly="true"/>
</DataGrid.Columns>
</DataGrid>-->
<Grid Grid.Row="1" IsEnabled="{Binding Motion.IsFinish}" >
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="WaferStepXY(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStepXY}" Tag="WaferStepXY(mm)" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="0" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Label Content="WaferCountXY" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferCountXY}" Tag="WaferCountXY" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="0" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
</Grid>
<Grid IsEnabled="{Binding Motion.IsFinish}" >
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="StepX1(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Tag="StepX(mm)" Value="{Binding CameraWaferFusionCalibrationItem.StepX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<!--<Label Content="StepY(mm)" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.StepY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
<Label Content="CountX1" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:IntNumberBox Tag="CountX" Value="{Binding CameraWaferFusionCalibrationItem.CountX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="1" Maximum="10000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
</Grid>
<Grid Grid.Row="3">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--<Button Grid.Column="0" Content="移到此位置" Click="{mwControls:Action btnMovePosition}" HorizontalAlignment="Left" />
<Button Grid.Column="1" Content="识别" Click="{mwControls:Action btnRecognize}" HorizontalAlignment="Left" />-->
<!--<Button Content="计算" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnFix}" Grid.Column="0" />-->
<!--<Button Content="验证" Click="{mwControls:Action btnVarify}" Grid.Column="1" />-->
<CheckBox x:Name="circleCk" Content="圆形标定" IsChecked="{Binding CameraWaferFusionCalibrationItem.UseCircleCalib}" />
<Button Content="开始" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStart}" Grid.Column="2" IsEnabled="{Binding Motion.IsFinish}" />
<Button Content="停止" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStop}" Grid.Column="3" />
</Grid>
</Grid>
</GroupBox>
<GroupBox Grid.Row="3" Visibility="{Binding ElementName=circleCk, Path=IsChecked, Converter={StaticResource boolToVisibleConverter}}" Style="{StaticResource GroupBoxSecondary}" IsEnabled="{Binding Motion.IsFinish}" Margin="3" Header="圆参数示教">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<UniformGrid Columns="4">
<!--<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="圆心X:"/>
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CenterX}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="True"/>
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="圆心Y:"/>
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CenterY}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="True"/>-->
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="半径:"/>
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.Radius}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="标定板行间距:"/>
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.RowStep}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="标定板列间距:"/>
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.ColStep}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
<!--<Button Margin="2,2" Content="示教" Click="{mwControls:Action TeachCircleCenter}"/>
<Button Margin="2,2" Content="导入圆坐标" Click="{mwControls:Action ImportCircleFile}"/>-->
</UniformGrid>
</Grid>
</GroupBox>
</Grid>
</TabItem>
<TabItem Header="验证" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="80"/>
<RowDefinition Height="140"/>
<RowDefinition Height="190"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="第一步设定Die位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<!--<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>-->
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Visibility="Collapsed" Content="移到相机位置" Click="{mwControls:Action btnMoveCameraPosition}" HorizontalAlignment="Left" />
<Button Grid.Column="1" Visibility="Collapsed" Content="移到Wafer位置" Click="{mwControls:Action btnMoveWaferStartPosition}" HorizontalAlignment="Left" />
<Button Grid.Column="0" Content="设定Die位置" Click="{mwControls:Action btnSetDiePosition}" HorizontalAlignment="Center" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="1" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="第二步设定Pad位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<!--<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>-->
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="设定Pad位置" Click="{mwControls:Action btnSetPadPosition}" HorizontalAlignment="Center" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="第三步计算Wafer移动坐标" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="X,Y(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding WaferVerifyX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<mwControls:NumberBox Value="{Binding WaferVerifyY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Button Grid.Column="3" Content="计算" Click="{mwControls:Action btnCalculate}" HorizontalAlignment="Left" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Grid.Column="3" Content="移动到验证点" Click="{mwControls:Action btnMoveToVerifyPoint}" HorizontalAlignment="Left" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="3" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="相机畸变测试" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="3" Columns="4">
<Label Content="RealX,Y(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding DesPixelX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<mwControls:NumberBox Value="{Binding DesPixelY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Button Grid.Column="3" Content="识别" Click="{mwControls:Action btnCameraTest}" HorizontalAlignment="Left" />
<Label Content="RulerX,Y(mm)" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding DesRulerX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<mwControls:NumberBox Value="{Binding DesRulerY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Label/>
<RadioButton Content="定位相机" Margin="10,0,0,0" IsChecked="{Binding CameraTypeVM, Converter={StaticResource CameraTypeToBoolConverter}, ConverterParameter=1}" GroupName="cameraType"/>
<RadioButton Content="虚拟定位相机" Margin="10,0,0,0" IsChecked="{Binding CameraTypeVM, Converter={StaticResource CameraTypeToBoolConverter}, ConverterParameter=2}" GroupName="cameraType"/>
</UniformGrid>
</GroupBox>
</Grid>
</TabItem>
<TabItem Header="验证1" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="WS运动系标定位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Grid.Row="0" Rows="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"/>
<ColumnDefinition/>
<ColumnDefinition/>
<!--<ColumnDefinition/>-->
</Grid.ColumnDefinitions>
<Label Content="WS平台标定X1,X2,Y2(mm)" Width="200" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSPlatCalibXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
<!--<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />-->
<Button Grid.Column="2" Content="移到此位置" Click="{mwControls:Action btnMoveWSCalibPosPosition}" HorizontalAlignment="Left" />
</Grid>
<Grid Visibility="Collapsed">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="X" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
<Label Content="Y" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
<Button Grid.Column="5" Content="中心对齐" Click="{mwControls:Action btnGotoCalibPos}" HorizontalAlignment="Left" />
</Grid>
</UniformGrid>
</GroupBox>
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
<GroupBox.Header>
<TextBlock Text="WS运动位置" VerticalAlignment="Center" FontWeight="Bold" />
</GroupBox.Header>
<UniformGrid Rows="5" Columns="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="StartX(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartVerifyX}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Label Content="StartY(mm)" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartVerifyY}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<!--<Button Grid.Column="1" Content="读取当前位置" Click="{mwControls:Action btnSetWaferStartPosition}" HorizontalAlignment="Left" />-->
<Button Grid.Column="3" Content="设置起点" Click="{mwControls:Action btnMoveToCenter}" HorizontalAlignment="Left" />
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="Step(mm)" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityStep}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Button Grid.Column="3" Content="移动到起点" Click="{mwControls:Action btnMoveToStartPoint}" HorizontalAlignment="Left" />
<!--<Label Content="StepY(mm)" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.StepY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Label Content="CountX" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityCountX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
<Label Content="CountY" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityCountY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
</Grid>
<Grid>
<Button Content="开始飞拍" Click="{mwControls:Action btnMoveWafer}" Grid.Column="0" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}" />
</Grid>
<Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="以当前相机位置验证" Click="{mwControls:Action btnVerityWafer}" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}" Width="150"/>
<Button Content="停止" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStopVerityWafer}" HorizontalAlignment="Right"/>
</StackPanel>
</Grid>
</UniformGrid>
</GroupBox>
</Grid>
</TabItem>
<TabItem Header="轴系精度验证">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<view:AxisPrecisionCheckParamView Grid.Row="0" AxisPrecisionCheck="{Binding AxisCheckItem.PHSPerpendicularityCheck}"/>
<GroupBox Grid.Row="1" Header="WS轴精度验证">
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="X1移动到标定位置" Tag="X1移动到标定位置" Click="{mwControls:Action BtnMoveX1ToCalibPos}"></Button>
<view:AxisPrecisionCheckParamView Grid.Row="2" AxisPrecisionCheck="{Binding AxisCheckItem.WSPerpendicularityCheck}"/>
</Grid>
</GroupBox>
<view:AxisPrecisionCheckParamView Grid.Row="2" AxisPrecisionCheck="{Binding AxisCheckItem.X1X2ParallelismCheck}"/>
</Grid>
</TabItem>
</TabControl>
<Grid Grid.Row="1">
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" >
<Button Content="保存" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnSave}" Grid.Row="1" Grid.Column="4" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}"/>
</StackPanel>
</Grid>
</Grid>
</Grid>
</UserControl>

View File

@@ -0,0 +1,404 @@
using JM1.JM1Params;
using Maxwell.SemiFramework.DefaultConfig.Vision;
using MaxwellControl.Controls;
using MaxwellFramework.Core.Interfaces;
using MaxWellGeneralLog.Extension;
using MwFramework.Controls.Components;
using MwFramework.Device;
using MwFramework.ManagerService;
using MwFramework.MXJM.ProcessAnalysis.Model;
using MXJM.Common;
using MXJM.Common.EventArgsFolder;
using MXJM.Logic.Operation;
using MXJM.Parameter.SystemSetting;
using MXJM.SystemSetting.ViewModel;
using SemiconductorVisionAlgorithm.SemiParams;
using Stylet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Markup;
using MessageBox = MaxwellControl.Controls.MessageBox;
using Point = System.Windows.Point;
namespace MXJM.Logic.SystemSetting
{
public class CameraFusionCalibrationMotion02A : DelegateBase
{
public override bool Check(object state)
{
IoC.Get<IProjectManager>().EnablePageAndDisableOther("视觉标定");
_device = IoC.Get<GlobalDeviceService>();
double speed = 50;
SafeAxisMotion.SetAxisSpeed(_device.Axis_X11, speed);
SafeAxisMotion.SetAxisSpeed(_device.Axis_Y11, speed);
SafeAxisMotion.SetAxisSpeed(_device.Axis_X21, speed);
SafeAxisMotion.SetAxisSpeed(_device.Axis_Y21, speed);
return true;
}
IParamList _paramList;
GlobalDeviceService _device;
VisionOperation _visionOperation;
CameraWaferFusionCalibrationSetting _parameter;
CameraWaferFusionCalibrationItem _cameraWaferFusionCalibrationItem;
public Rectangle1 Rectangle { get; set; }
bool _isCancle = false;
private Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]> _calibWaferData = new Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]>();
private List<double> _x11PosList = new List<double>();
private SemiconductorVisionAlgorithm.SemiParams.Point[,] _initialwsPos = new SemiconductorVisionAlgorithm.SemiParams.Point[0,0];
SafeAxisMotion motion;
private int _x11Count = 0;
private bool _isReDo = false;
public override void Do(object state)
{
try
{
_isCancle = false;
if (_isReDo)
{
_isReDo = false;
}
else
{
_calibWaferData.Clear();
_x11PosList.Clear();
}
var objects=state as object[];
var pointDic = objects[1] as FusionPoint[,];
bool isRecheck = Convert.ToBoolean(objects[0]);
_paramList = IoC.Get<IParameterManager>() as IParamList;
_parameter = _paramList.GetParameter<CameraWaferFusionCalibrationSetting>();
_cameraWaferFusionCalibrationItem = _parameter.CameraWaferFusionCalibrationItem;
motion = IoC.Get<SafeAxisMotion>();
_device = IoC.Get<GlobalDeviceService>();
_visionOperation = IoC.Get<VisionOperation>();
double stageY = _device.Axis_Y11.State.ActualPos;
double waferStep = _cameraWaferFusionCalibrationItem.WaferStepXY;
string modelFileName = _cameraWaferFusionCalibrationItem.ModelPath;
string path = System.AppDomain.CurrentDomain.BaseDirectory + modelFileName;
if (_x11PosList.Count != _cameraWaferFusionCalibrationItem.CountX || _calibWaferData.Count != _cameraWaferFusionCalibrationItem.CountX)
{
_calibWaferData.Clear();
_x11PosList.Clear();
_x11Count = 0;
for (int i = 0; i < _cameraWaferFusionCalibrationItem.CountX; i++)
{
_x11PosList.Add(0);
_calibWaferData.Add(i, new SemiconductorVisionAlgorithm.SemiParams.Point[0, 0]);
}
}
//相机移到起点 //wafer移到起点
//motion.SafeMovePHSAndWS(_cameraWaferFusionCalibrationItem.CameraX, stageY, _cameraWaferFusionCalibrationItem.WaferStartX, _cameraWaferFusionCalibrationItem.WaferStartY, isCalib: true);
if(_cameraWaferFusionCalibrationItem.UseCircleCalib)
{
_initialwsPos = ApprochWSCircleTable(pointDic, _cameraWaferFusionCalibrationItem.WSPlatCalibXPos, stageY, _cameraWaferFusionCalibrationItem.WSApproachXPos,
_cameraWaferFusionCalibrationItem.WSApproachYPos, 0, path);
}
else
_initialwsPos = ApprochWSTable(waferStep, _cameraWaferFusionCalibrationItem.WSPlatCalibXPos, stageY, _cameraWaferFusionCalibrationItem.WSApproachXPos,
_cameraWaferFusionCalibrationItem.WSApproachYPos, 0, path);
int count = 0;
for (int i = _x11Count; i < _cameraWaferFusionCalibrationItem.CountX; i++)
{
if (_isCancle)
{
return;
}
count++;
double x1 = _cameraWaferFusionCalibrationItem.CameraX + _cameraWaferFusionCalibrationItem.StepX * i;
double y1 = _device.Axis_Y11.State.ActualPos;
double x2 = _cameraWaferFusionCalibrationItem.WaferStartX + _cameraWaferFusionCalibrationItem.StepX * i;
double y2 = _cameraWaferFusionCalibrationItem.WaferStartY;
//如果是检查 X1=1/2 * StepX Y1是stage的那个黑色平台 Y2是ws
if (isRecheck)
{
x1 = _cameraWaferFusionCalibrationItem.CameraX - 0.5 * _cameraWaferFusionCalibrationItem.StepX + _cameraWaferFusionCalibrationItem.StepX * i;
y1 = _device.Axis_Y11.State.ActualPos;
x2 = _cameraWaferFusionCalibrationItem.WaferStartX - 0.5 * _cameraWaferFusionCalibrationItem.StepX + _cameraWaferFusionCalibrationItem.StepX * i;
y2 = _cameraWaferFusionCalibrationItem.WaferStartY;
}
SemiconductorVisionAlgorithm.SemiParams.Point[,] points = null;
if (_cameraWaferFusionCalibrationItem.UseCircleCalib)
{
points = ApprochWSCircleTable(pointDic, x1, y1, x2, y2, count, path);
}
else
points = ApprochWSTable(waferStep, x1, y1, x2, y2, count, path);
if (_calibWaferData.ContainsKey(i))
{
_calibWaferData[i] = points;
}
else
{
_calibWaferData.Add(i, points);
}
_x11PosList[i] = _device.Axis_X11.State.ActualPos;
}
//当count为1时认为是老标定
if (_cameraWaferFusionCalibrationItem.WaferCountXY == 1)
{
SemiconductorVisionAlgorithm.SemiParams.Point ini_wsPos = new SemiconductorVisionAlgorithm.SemiParams.Point(_cameraWaferFusionCalibrationItem.WSApproachXPos,
_cameraWaferFusionCalibrationItem.WSApproachYPos);
List<SemiconductorVisionAlgorithm.SemiParams.Point> wsList = new List<SemiconductorVisionAlgorithm.SemiParams.Point>();
_calibWaferData.ForEach(p =>
{
if (p.Value.Length > 0)
{
wsList.Add(p.Value[0, 0]);
}
});
//JM1Vision.JM1Manager.Instance.cal_interpolate_affine(_cameraWaferFusionCalibrationItem.WSPlatCalibXPos, ini_wsPos,
// _x11PosList, wsList);
}
else
{
SemiconductorVisionAlgorithm.SemiParams.Point[,] _circleInitialwsPos = new SemiconductorVisionAlgorithm.SemiParams.Point[0, 0];
Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]> _circleCalibData = new Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]>(_calibWaferData.Count);
if (_cameraWaferFusionCalibrationItem.UseCircleCalib)
{
ConvertToRecheckDiePoint(ref _initialwsPos);
foreach (var item in _calibWaferData)
{
var rows=item.Value.GetLength(0);
var cols=item.Value.GetLength(1);
RecheckDiePoint[,] recheckDiePoint = new RecheckDiePoint[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
var point=item.Value[i, j];
bool isexist = !(point.X == 0 && point.Y == 0);
var recheckPoint = new RecheckDiePoint
{
X = point.X,
Y = point.Y,
State = isexist
};
recheckDiePoint[i,j]= recheckPoint;
}
}
JM1Vision.JM1Manager.Instance.FillCalibData(recheckDiePoint, _cameraWaferFusionCalibrationItem.WaferStepXY,
_cameraWaferFusionCalibrationItem.WaferCountXY,out RecheckDiePoint[,] resutPoint);
SemiconductorVisionAlgorithm.SemiParams.Point[,] finalResultPoint = new SemiconductorVisionAlgorithm.SemiParams.Point[rows, cols];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
var point = resutPoint[i, j];
finalResultPoint[i, j] = new SemiconductorVisionAlgorithm.SemiParams.Point
{
X = point.X,
Y = point.Y,
};
}
}
_circleCalibData[item.Key] = finalResultPoint;
}
_calibWaferData= _circleCalibData;
}
JM1Vision.JM1Manager.Instance.cal_wafer_fusion(_calibWaferData, _x11PosList, _initialwsPos, _cameraWaferFusionCalibrationItem.StepX, waferStep, _cameraWaferFusionCalibrationItem.WaferCountXY);
}
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"CalibData";
JM1Vision.JM1Manager.Instance.Save(filePath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
if (MessageBox.Show("是否继续!", null, "是否继续", MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel) == MessageBoxResult.OK)
{
_isReDo = true;
this.Do(state);
}
else
{
_isReDo = false;
}
}
MessageBox.Show("校正完成");
}
private void ConvertToRecheckDiePoint(ref SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray)
{
var rows = pointArray.GetLength(0);
var cols = pointArray.GetLength(1);
RecheckDiePoint[,] recheckDiePoint =new RecheckDiePoint[rows, cols];
for (int i = 0; i < recheckDiePoint.GetLength(0); i++)
{
for (int j = 0; j < recheckDiePoint.GetLength(1); j++)
{
var point = pointArray[i, j];
bool isExist = !(point.X == 0 && point.Y == 0);
recheckDiePoint[i, j] = new RecheckDiePoint
{
X = point.X,
Y = point.Y,
State = isExist
};
}
}
JM1Vision.JM1Manager.Instance.FillCalibData(recheckDiePoint, _cameraWaferFusionCalibrationItem.WaferStepXY,
_cameraWaferFusionCalibrationItem.WaferCountXY, out RecheckDiePoint[,] resutPoint);
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
var point = resutPoint[i, j];
pointArray[i, j] = new SemiconductorVisionAlgorithm.SemiParams.Point
{
X = point.X,
Y = point.Y,
};
}
}
}
private SemiconductorVisionAlgorithm.SemiParams.Point[,] ApprochWSTable (double waferStep, double x1,double y1,double x2,double y2, int count,string path)
{
SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray =
new SemiconductorVisionAlgorithm.SemiParams.Point[_cameraWaferFusionCalibrationItem.WaferCountXY, _cameraWaferFusionCalibrationItem.WaferCountXY];
motion.MovePHSAndWS(x1, y1, x2, y2);
for (int y = 0; y < _cameraWaferFusionCalibrationItem.WaferCountXY; y++)
{
double waferY = y * waferStep + y2;
for (int x = 0; x < _cameraWaferFusionCalibrationItem.WaferCountXY; x++)
{
int index = y % 2 == 0 ? x : _cameraWaferFusionCalibrationItem.WaferCountXY - 1 - x;
double waferX = index * waferStep + x2;
if (_isCancle)
{
return pointArray;
}
motion.SafeMoveWS(waferX, waferY);
Point point = new Point();
//相机拍照
if (!_visionOperation.ApproachPointCircle(_device.Camera_ExtendWS, _device.Axis_X21, _device.Axis_Y21,
path, Rectangle, out point))
{
Cancel();
}
Thread.Sleep(100);
AxisAndPixelPointItem item = new AxisAndPixelPointItem();
item.Id = count;
item.AxisX1 = _device.Axis_X11.State.ActualPos;
item.AxisX2 = _device.Axis_X21.State.ActualPos;
item.AxisY1 = _device.Axis_Y11.State.ActualPos;
item.AxisY2 = _device.Axis_Y21.State.ActualPos;
item.PixelX = point.X;
item.PixelY = point.Y;
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(item.AxisX2, item.AxisY2);
//IoC.Get<IEventAggregator>()?.Publish(new WaferFusionCalibrationResultEventArgs(item));
}
}
return pointArray;
}
private SemiconductorVisionAlgorithm.SemiParams.Point[,] ApprochWSCircleTable(FusionPoint[,] tableDic, double x1, double y1, double x2, double y2, int count, string path)
{
SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray =
new SemiconductorVisionAlgorithm.SemiParams.Point[_cameraWaferFusionCalibrationItem.WaferCountXY, _cameraWaferFusionCalibrationItem.WaferCountXY];
motion.MovePHSAndWS(x1, y1, x2, y2);
var offsetX = x2 - _cameraWaferFusionCalibrationItem.CenterX;
var rowCount = tableDic.GetLength(0);
var columnCount = tableDic.GetLength(1);
for (int y = 0; y < rowCount; y++)
{
for (int x = 0; x < columnCount; x++)
{
int index = y % 2 == 0 ? x : columnCount - 1 - x;
if (_isCancle)
{
return pointArray;
}
//var movePoint = tableDic[y,x];
var movePoint = tableDic[y, index];
if (!movePoint.IsExist)
{
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(0, 0);
continue;
}
motion.SafeMoveWS(movePoint.X+ offsetX, movePoint.Y);
Point point = new Point();
//相机拍照
if (!_visionOperation.ApproachPointCircle(_device.Camera_ExtendWS, _device.Axis_X21, _device.Axis_Y21,
path, Rectangle, out point))
{
Cancel();
}
Thread.Sleep(100);
AxisAndPixelPointItem item = new AxisAndPixelPointItem();
item.Id = count;
item.AxisX1 = _device.Axis_X11.State.ActualPos;
item.AxisX2 = _device.Axis_X21.State.ActualPos;
item.AxisY1 = _device.Axis_Y11.State.ActualPos;
item.AxisY2 = _device.Axis_Y21.State.ActualPos;
item.PixelX = point.X;
item.PixelY = point.Y;
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(item.AxisX2, item.AxisY2);
//IoC.Get<IEventAggregator>()?.Publish(new WaferFusionCalibrationResultEventArgs(item));
}
}
return pointArray;
}
public override void Finish()
{
base.Finish();
IoC.Get<IProjectManager>().SwitchState();
}
public override void Cancel()
{
_isCancle = true;
}
}
}

View File

@@ -0,0 +1,17 @@
1、die融合标定ws圆形标定融合
即在X1全行程不同位置标定建立X2,Y1的die融合表用于对位晶粒使得晶粒可以通过X2,Y1的补偿移动到任意X1位置下(此时对位是Y1位置微动变化)。
标定方法
- 在die运动系下(固定X1)移动X2,Y1扫描获取N×N点阵作为初始位置。
- 选取X2负限位位置附近设置起始位置将X1,X2平移相同距离移动到起始位置设定标定范围标定间隔扫描一系列N×N点阵保存为die融合位置表。
验证方法
在die运动系下飞拍任意坐标再选取任意X1位置使用融合位置表计算出任意坐标移动到该X11位置下的X2Y1坐标同时获取到在该X11位置下实际逼近的X2Y1坐标输出即为标定误差。可选择若干位置覆盖测试全行程误差
2、pad融合标定stage拼接融合
即在Y1全行程不同位置建立X1,Y2的pad融合表用于对位pad使得产品pad在获取到运动系X1,Y2坐标后可以移动到任意Y1位置下(此时对位是X1位置微动变化)。
标定方法
- 在pad运动系下(固定Y1)移动X1,Y2扫描获取N×N点阵作为初始位置。
- 选取Y2负限位位置附近设置起始位置将Y1,Y2平移相同距离移动到起始位置设立标定范围标定间隔扫描一系列N×N点阵保存为pad融合位置表。
验证方法
在pad运动系下飞拍任意坐标再选取任意Y1位置使用融合位置表计算出任意坐标移动到该Y11位置下的X1Y2坐标同时获取到在该Y11位置下实际逼近的X1Y2坐标输出即为标定误差。可选择若干位置覆盖测试全行程误差。
3、整体验证
整体对位流程为:飞拍获取对应die的下相机X2,Y2坐标X1坐标固定上相机die运动系X2Y1转换为X1,Y1坐标 。pad定位mark获取X1,Y2坐标Y1坐标固定上相机pad运动系X1Y2即转化为X1,Y1坐标 。
此时通过查找die融合表将dieX方向对齐pad(此时Y1会产生少许偏移)再根据此时Y1值将padY方向对齐die(X1会产生少许偏移)此时再移动X2跟上X1的移动量(此处直接移动或查表再移动)。

View File

@@ -0,0 +1,12 @@
旧项目的标定页面为CameraFusionCalibAView.xaml里面的融合标定和验证1是新项目需要的流程
CameraFusionCali02AViewModel.xaml是原项目的CameraFusionCali02AViewModel.cs
CameraFusionCalibrationMotion02A.xaml是原项目的CameraFusionCalibrationMotion02A.cs
旧项目的ws轴是x2、Y2pad轴是X1、Y1
新项目的ws轴是X2、Y1pad轴是x1、Y2
新项目的需求是pad融合标定和die融合标定并且有分别的验证
然后总体又有一个整体的验证,及对位流程