Browse Source

add vpw recipe view partly

chenzk 3 days ago
parent
commit
823131cd5b

+ 5 - 5
Framework/Common/RecipeCenter/VpwRecipe.cs

@@ -22,10 +22,10 @@ namespace MECF.Framework.Common.RecipeCenter
         private int _totalTimeSeconds;
         
         private bool _purgeEnable;
-        private double _diwLoopDoSet;
+        private int _diwLoopDoSet;
 
-        private double _vacuumTarget;
-        private bool _isSprayBarRetract;
+        private int _vacuumTarget;
+        private bool _isSprayBarRetract = true;
         private int _dryHoldTime;
         private bool _vacuumPrewetDripEnable;
         private bool _vacuumPrewetSmallEnable;
@@ -73,10 +73,10 @@ namespace MECF.Framework.Common.RecipeCenter
         public bool PurgeEnable { get { return _purgeEnable; } set { _purgeEnable = value; InvokePropertyChanged(nameof(PurgeEnable)); } }
 
         [JsonProperty]
-        public double DiwLoopDoSet { get { return _diwLoopDoSet; } set { _diwLoopDoSet = value; InvokePropertyChanged(nameof(DiwLoopDoSet)); } }
+        public int DiwLoopDoSet { get { return _diwLoopDoSet; } set { _diwLoopDoSet = value; InvokePropertyChanged(nameof(DiwLoopDoSet)); } }
 
         [JsonProperty]
-        public double VacuumTarget { get { return _vacuumTarget; } set { _vacuumTarget = value; InvokePropertyChanged(nameof(VacuumTarget)); } }
+        public int VacuumTarget { get { return _vacuumTarget; } set { _vacuumTarget = value; InvokePropertyChanged(nameof(VacuumTarget)); } }
 
         [JsonProperty]
         public bool IsSprayBarRetract { get { return _isSprayBarRetract; } set { _isSprayBarRetract = value; InvokePropertyChanged(nameof(IsSprayBarRetract)); } }

+ 339 - 2
PunkHPX8_MainPages/ViewModels/VpwRecipeViewModel.cs

@@ -31,6 +31,22 @@ namespace PunkHPX8_MainPages.ViewModels
         private RecipeNode _currentNode;
         private bool _enable = false;
         private bool _isEdit = false;
+        /// <summary>
+        /// Wafer尺寸集合
+        /// </summary>
+        private List<int> _waferSizeLst = null;
+        /// <summary>
+        /// Vacuum Prewet step选择索引
+        /// </summary>
+        private int _selectedVacuumPrewetIndex = -1;
+        /// <summary>
+        /// Extend Clean step选择索引
+        /// </summary>
+        private int _selectedExtendCleanIndex = -1;
+        /// <summary>
+        /// Vent Prewet step选择索引
+        /// </summary>
+        private int _selectedVentPrewetIndex = -1;
         #endregion
 
         #region 属性
@@ -70,7 +86,38 @@ namespace PunkHPX8_MainPages.ViewModels
             get { return _recipe; }
             set { SetProperty(ref _recipe, value); }
         }
-       
+        /// <summary>
+        /// Wafer 尺寸集合
+        /// </summary>
+        public List<int> WaferSizeLst
+        {
+            get { return _waferSizeLst; }
+            set { SetProperty(ref _waferSizeLst, value); }
+        }
+        /// <summary>
+        /// Vacuum Prewet step选择索引
+        /// </summary>
+        public int SelectedVacuumPrewetIndex
+        {
+            get { return _selectedVacuumPrewetIndex; }
+            set { SetProperty(ref _selectedVacuumPrewetIndex, value); }
+        }
+        /// <summary>
+        /// SelectedExtendCleanIndex选择索引
+        /// </summary>
+        public int SelectedExtendCleanIndex
+        {
+            get { return _selectedExtendCleanIndex; }
+            set { SetProperty(ref _selectedExtendCleanIndex, value); }
+        }
+        /// <summary>
+        /// SelectedVentPrewetIndex选择索引
+        /// </summary>
+        public int SelectedVentPrewetIndex
+        {
+            get { return _selectedVentPrewetIndex; }
+            set { SetProperty(ref _selectedVentPrewetIndex, value); }
+        }
         #region 指令
         public ICommand OperationCommand
         {
@@ -85,6 +132,8 @@ namespace PunkHPX8_MainPages.ViewModels
         public ICommand SaveRecipeCommand { get; private set; }
         [IgnorePropertyChange]
         public ICommand SaveAsRecipeCommand { get; private set; }
+        [IgnorePropertyChange]
+        public ICommand IsSprayBarRetractFalseCommand { get; private set; }
         #endregion
 
         public VpwRecipeViewModel()
@@ -94,9 +143,27 @@ namespace PunkHPX8_MainPages.ViewModels
             EditCommand = new DelegateCommand<object>(EditAction);
             SaveRecipeCommand = new DelegateCommand<object>(SaveAction);
             SaveAsRecipeCommand = new DelegateCommand<object>(SaveAsAction);
+            IsSprayBarRetractFalseCommand = new DelegateCommand<object>(IsSprayBarRetractFalseAction);
+
+            //Wafer尺寸集合
+            WaferSizeLst = new List<int>();
+            WaferSizeLst.Add(100);
+            WaferSizeLst.Add(150);
+            WaferSizeLst.Add(200);
+            WaferSizeLst.Add(300);
+
+            InitializeProprtyValidResultDictionary();
         }
         #endregion
-
+        private void InitializeProprtyValidResultDictionary()
+        {
+            //需要检验的参数
+            PropertyValidResultDic["VacuumTarget"] = false;
+            PropertyValidResultDic["DryHoldTime"] = false;
+            PropertyValidResultDic["DiwLoopDoSet"] = false;
+            PropertyValidResultDic["SpinSpeed"] = false;
+            PropertyValidResultDic["SpinTime"] = false;
+        }
 
         public void LoadRecipeData()
         {
@@ -282,5 +349,275 @@ namespace PunkHPX8_MainPages.ViewModels
             return true;
         }
 
+        private void IsSprayBarRetractFalseAction(object param)
+        {
+            Recipe.IsSprayBarRetract = false;
+        }
+
+
+        #region Vacuum prewet按钮
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void AddBelowAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                Recipe.VacuumRinseStep.Insert(SelectedVacuumPrewetIndex + 1, currentRinseSteps);
+                SelectedVacuumPrewetIndex++;
+            }
+
+        }
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void AddAboveAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                if (SelectedVacuumPrewetIndex == -1)
+                {
+                    Recipe.VacuumRinseStep.Add(currentRinseSteps);
+                    SelectedVacuumPrewetIndex = 0;
+                }
+                else
+                {
+                    Recipe.VacuumRinseStep.Insert(SelectedVacuumPrewetIndex, currentRinseSteps);
+                    SelectedVacuumPrewetIndex--;
+                }
+            }
+        }
+        /// <summary>
+        /// 上移
+        /// </summary>
+        /// <param name="param"></param>
+        private void MoveUpAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedVacuumPrewetIndex > 0)
+                {
+                    int currentIndex = SelectedVacuumPrewetIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.VacuumRinseStep[SelectedVacuumPrewetIndex];
+                    Recipe.VacuumRinseStep.RemoveAt(SelectedVacuumPrewetIndex);
+                    Recipe.VacuumRinseStep.Insert(currentIndex - 1, currentRinseSteps);
+                    SelectedVacuumPrewetIndex = currentIndex - 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 下移
+        /// </summary>
+        /// <param name="param"></param>
+        private void MoveDownAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedVacuumPrewetIndex >= 0 && SelectedVacuumPrewetIndex < Recipe.VacuumRinseStep.Count - 1 && Recipe.VacuumRinseStep.Count > 1)
+                {
+                    int currentIndex = SelectedVacuumPrewetIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.VacuumRinseStep[SelectedVacuumPrewetIndex];
+                    Recipe.VacuumRinseStep.RemoveAt(SelectedVacuumPrewetIndex);
+                    Recipe.VacuumRinseStep.Insert(currentIndex + 1, currentRinseSteps);
+                    SelectedVacuumPrewetIndex = currentIndex + 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="param"></param>
+        private void DeleteAction(object param)
+        {
+            if (SelectedVacuumPrewetIndex != -1)
+            {
+                if (Recipe != null && Recipe.VacuumRinseStep.Count > SelectedVacuumPrewetIndex)
+                {
+                    Recipe.VacuumRinseStep.RemoveAt(SelectedVacuumPrewetIndex);
+                }
+            }
+        }
+        #endregion
+
+        #region Vent prewet按钮
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void VentPrewetAddBelowAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                Recipe.VentRinseStep.Insert(SelectedVentPrewetIndex + 1, currentRinseSteps);
+                SelectedVentPrewetIndex++;
+            }
+
+        }
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void VentPrewetAddAboveAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                if (SelectedVentPrewetIndex == -1)
+                {
+                    Recipe.VentRinseStep.Add(currentRinseSteps);
+                    SelectedVentPrewetIndex = 0;
+                }
+                else
+                {
+                    Recipe.VentRinseStep.Insert(SelectedVentPrewetIndex, currentRinseSteps);
+                    SelectedVentPrewetIndex--;
+                }
+            }
+        }
+        /// <summary>
+        /// 上移
+        /// </summary>
+        /// <param name="param"></param>
+        private void VentPrewetMoveUpAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedVentPrewetIndex > 0)
+                {
+                    int currentIndex = SelectedVentPrewetIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.VentRinseStep[SelectedVentPrewetIndex];
+                    Recipe.VentRinseStep.RemoveAt(SelectedVentPrewetIndex);
+                    Recipe.VentRinseStep.Insert(currentIndex - 1, currentRinseSteps);
+                    SelectedVentPrewetIndex = currentIndex - 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 下移
+        /// </summary>
+        /// <param name="param"></param>
+        private void VentPrewetMoveDownAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedVentPrewetIndex >= 0 && SelectedVentPrewetIndex < Recipe.VentRinseStep.Count - 1 && Recipe.VentRinseStep.Count > 1)
+                {
+                    int currentIndex = SelectedVentPrewetIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.VentRinseStep[SelectedVentPrewetIndex];
+                    Recipe.VentRinseStep.RemoveAt(SelectedVentPrewetIndex);
+                    Recipe.VentRinseStep.Insert(currentIndex + 1, currentRinseSteps);
+                    SelectedVentPrewetIndex = currentIndex + 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="param"></param>
+        private void VentPrewetDeleteAction(object param)
+        {
+            if (SelectedVentPrewetIndex != -1)
+            {
+                if (Recipe != null && Recipe.VentRinseStep.Count > SelectedVentPrewetIndex)
+                {
+                    Recipe.VentRinseStep.RemoveAt(SelectedVentPrewetIndex);
+                }
+            }
+        }
+        #endregion
+
+        #region Extend Clean按钮
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void ExtendCleanAddBelowAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                Recipe.ExtendCleanRinseStep.Insert(SelectedExtendCleanIndex + 1, currentRinseSteps);
+                SelectedExtendCleanIndex++;
+            }
+
+        }
+        /// <summary>
+        /// 增加
+        /// </summary>
+        /// <param name="param"></param>
+        private void ExtendCleanAddAboveAction(object param)
+        {
+            if (Recipe != null)
+            {
+                VpwRinseStep currentRinseSteps = new VpwRinseStep();
+                if (SelectedExtendCleanIndex == -1)
+                {
+                    Recipe.ExtendCleanRinseStep.Add(currentRinseSteps);
+                    SelectedExtendCleanIndex = 0;
+                }
+                else
+                {
+                    Recipe.ExtendCleanRinseStep.Insert(SelectedExtendCleanIndex, currentRinseSteps);
+                    SelectedExtendCleanIndex--;
+                }
+            }
+        }
+        /// <summary>
+        /// 上移
+        /// </summary>
+        /// <param name="param"></param>
+        private void ExtendCleanMoveUpAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedExtendCleanIndex > 0)
+                {
+                    int currentIndex = SelectedExtendCleanIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.ExtendCleanRinseStep[SelectedExtendCleanIndex];
+                    Recipe.ExtendCleanRinseStep.RemoveAt(SelectedExtendCleanIndex);
+                    Recipe.ExtendCleanRinseStep.Insert(currentIndex - 1, currentRinseSteps);
+                    SelectedExtendCleanIndex = currentIndex - 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 下移
+        /// </summary>
+        /// <param name="param"></param>
+        private void ExtendCleanMoveDownAction(object param)
+        {
+            if (Recipe != null)
+            {
+                if (SelectedExtendCleanIndex >= 0 && SelectedExtendCleanIndex < Recipe.ExtendCleanRinseStep.Count - 1 && Recipe.ExtendCleanRinseStep.Count > 1)
+                {
+                    int currentIndex = SelectedExtendCleanIndex;
+                    VpwRinseStep currentRinseSteps = Recipe.ExtendCleanRinseStep[SelectedExtendCleanIndex];
+                    Recipe.ExtendCleanRinseStep.RemoveAt(SelectedExtendCleanIndex);
+                    Recipe.ExtendCleanRinseStep.Insert(currentIndex + 1, currentRinseSteps);
+                    SelectedExtendCleanIndex = currentIndex + 1;
+                }
+            }
+        }
+        /// <summary>
+        /// 删除
+        /// </summary>
+        /// <param name="param"></param>
+        private void ExtendCleanDeleteAction(object param)
+        {
+            if (SelectedExtendCleanIndex != -1)
+            {
+                if (Recipe != null && Recipe.ExtendCleanRinseStep.Count > SelectedExtendCleanIndex)
+                {
+                    Recipe.ExtendCleanRinseStep.RemoveAt(SelectedExtendCleanIndex);
+                }
+            }
+        }
+        #endregion
+
     }
 }

+ 145 - 0
PunkHPX8_MainPages/Views/VpwRecipeView.xaml

@@ -9,6 +9,7 @@
              xmlns:converters="clr-namespace:PunkHPX8_MainPages.Converters"
              xmlns:UserControls="clr-namespace:PunkHPX8_Themes.UserControls;assembly=PunkHPX8_Themes"  
              xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
+             xmlns:extendedControls="clr-namespace:MECF.Framework.UI.Core.ExtendedControls;assembly=MECF.Framework.UI.Core"
              xmlns:wf ="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
              prism:ViewModelLocator.AutoWireViewModel="True"
              mc:Ignorable="d" 
@@ -26,10 +27,154 @@
         <Grid.ColumnDefinitions>
             <ColumnDefinition Width="50"></ColumnDefinition>
             <ColumnDefinition Width="400"></ColumnDefinition>
+
             <ColumnDefinition></ColumnDefinition>
         </Grid.ColumnDefinitions>
         <UserControls:RecipeFileLoadControl Grid.Row="1" Grid.RowSpan="2" Grid.Column="1" Title="VPW Recipe" RecipeNodes="{Binding RecipeNodes}" OperationCommand="{Binding OperationCommand}"
                                      RecipeLocation="{Binding CurrentNode.RecipeLocation}" EditEnable="{Binding EditEnable}" CreateEnable="{Binding CreateEnable}" RecipeFileName="{Binding CurrentNode.FileName}"
                                      CreateCommand="{Binding CreateCommand}" EditCommand="{Binding EditCommand}"/>
+        <Grid Grid.Row="1" Grid.Column="2" Margin="10 0 0 0">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition Height="70"></RowDefinition>
+                <RowDefinition/>
+            </Grid.RowDefinitions>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="220"></ColumnDefinition>
+                <ColumnDefinition Width="220"></ColumnDefinition>
+                <ColumnDefinition Width="220"></ColumnDefinition>
+                <ColumnDefinition Width="220"></ColumnDefinition>
+                <ColumnDefinition Width="220"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <GroupBox Header="PPID" Grid.Row="0" Grid.ColumnSpan="3">
+                <TextBlock Text="{Binding Recipe.Ppid}" FontSize="20" VerticalAlignment="Center" TextAlignment="Center">
+                </TextBlock>
+            </GroupBox>
+            <Grid Grid.Row="0" Grid.Column="3" Grid.ColumnSpan="2" Margin="10 0 0 0 ">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="70"></RowDefinition>
+                </Grid.RowDefinitions>
+                <Grid Grid.Row="0" >
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+                        <ColumnDefinition/>
+                    </Grid.ColumnDefinitions>
+                    <Button Grid.Column="0" IsEnabled="{Binding Enable}" Style="{StaticResource SysBtnStyle}"  Content="Save" Height="35" Width="100" Command="{Binding SaveRecipeCommand}"></Button>
+                    <Button Grid.Column="1" Style="{StaticResource SysBtnStyle}"  Content="SaveAs" Height="35" Width="100" Command="{Binding SaveAsRecipeCommand}"></Button>
+                </Grid>
+
+            </Grid>
+            <GroupBox Header="Description" Grid.Row="1" Grid.ColumnSpan="3">
+                <TextBlock Text="{Binding Recipe.Description}" FontSize="18" VerticalAlignment="Center" TextAlignment="Center">
+                </TextBlock>
+            </GroupBox>
+
+            <GroupBox Header="Author" Grid.Row="2" Grid.Column="0">
+                <Label Content="{Binding Recipe.Author}" Height="30" Width="195" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                            HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+            </GroupBox>
+            <GroupBox Header="CreateDate" Grid.Row="2" Grid.Column="1">
+                <Label Content="{Binding Recipe.CreateDate}" Height="30" Width="195" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                            HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+            </GroupBox>
+            <GroupBox Header="SaveDate" Grid.Row="2" Grid.Column="2">
+                <Label Content="{Binding Recipe.SaveDate}" Height="30" Width="195" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                                            HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+            </GroupBox>
+            <GroupBox Header="Total TIme" IsEnabled="{Binding Enable}"  Grid.Row="2" Grid.Column="3">
+                <Label Content="{Binding Recipe.TotalTime}" Height="30" Width="195" VerticalAlignment="Center" HorizontalAlignment="Left" Foreground="White" Background="Gray" 
+                             HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Grid.Column="1" Margin="6,0,0,0"></Label>
+            </GroupBox>
+            <GroupBox Header="Wafer Size" IsEnabled="{Binding Enable}"  Grid.Row="2" Grid.Column="4">
+                <ComboBox Height="30" Margin="0,0,20,0" ItemsSource="{Binding WaferSizeLst}" SelectedItem="{Binding Recipe.WaferSize, Mode=TwoWay}">
+                </ComboBox>
+            </GroupBox>
+        </Grid>
+        <Grid Grid.Row="2" Grid.Column="2">
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="350"></ColumnDefinition>
+                <ColumnDefinition Width="350"></ColumnDefinition>
+                <ColumnDefinition Width="350"></ColumnDefinition>
+                <ColumnDefinition Width="350"></ColumnDefinition>
+            </Grid.ColumnDefinitions>
+            <GroupBox  Header="1 Vacuum Prewet" Grid.Column="3"  Padding="10">
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="75"></RowDefinition>
+                        <RowDefinition Height="75"></RowDefinition>
+                        <RowDefinition Height="45"></RowDefinition>
+                        <RowDefinition Height="45"></RowDefinition>
+                        <RowDefinition Height="45"></RowDefinition>
+                        <RowDefinition Height="45"></RowDefinition>
+                        <RowDefinition Height="200"></RowDefinition>
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="300"></ColumnDefinition>
+                    </Grid.ColumnDefinitions>
+                    <Button Grid.Row="6" Style="{StaticResource SysBtnStyle}"  Content="Add Below" Height="25" Width="80" FontSize="10" Command="{Binding AddBelowCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,-150,-20,0"></Button>
+                    <Button Grid.Row="6" Style="{StaticResource SysBtnStyle}"  Content="Add Above" Height="25" Width="80" FontSize="10" Command="{Binding AddAboveCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,-80,-20,0"></Button>
+                    <Button Grid.Row="6" Style="{StaticResource SysBtnStyle}"  Content="Move Up" Height="25" Width="80" FontSize="10" Command="{Binding MoveUpCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,-10,-20,0"></Button>
+                    <Button Grid.Row="6" Style="{StaticResource SysBtnStyle}"  Content="Move Down" Height="25" Width="80" FontSize="10" Command="{Binding MoveDownCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,60,-20,0"></Button>
+                    <Button Grid.Row="6" Style="{StaticResource SysBtnStyle}"  Content="Delete" Height="25" Width="80" FontSize="10" Command="{Binding DeleteCommand}" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="0,130,-20,0"></Button>
+                    <UserControls:GroupTextBoxControl Grid.Row="0" Title="Vacuum Target" Unit="Toor" MinValue="0" MaxValue="200"  Width="300"
+                                                                 IntValue="{Binding Recipe.VacuumTarget,Mode=TwoWay}" 
+                                                                 ValidResult="{Binding PropertyValidResultDic[VacuumTarget],Mode=TwoWay}" />
+                    <UserControls:GroupTextBoxControl Grid.Row="1" Title="Dry Hold Time" Unit="Sec" MinValue="0" MaxValue="800"  Width="300"
+                                              IntValue="{Binding Recipe.DryHoldTime,Mode=TwoWay}" 
+                                              ValidResult="{Binding PropertyValidResultDic[DryHoldTime],Mode=TwoWay}" />
+                    <GroupBox Grid.Row="2" IsEnabled="{Binding Enable}" Margin="0,10,0,0">
+                        <Grid>
+                            <Label Content="Spray Bar" Height="30" VerticalAlignment="Top" />
+                            <RadioButton Content="RET" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left"
+           Command="{Binding AutoCurrentBasedFalseCommand}"  IsChecked="{Binding Recipe.IsSprayBarRetract ,Mode=TwoWay}" Margin="158,-1,0,-6" ></RadioButton>
+                            <RadioButton Content="EXT" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
+            Command="{Binding AutoCurrentBasedTrueCommand}"  IsChecked="{Binding Recipe.IsSprayBarRetract,Mode=TwoWay,Converter={StaticResource boolReverseConverter}}" Margin="220,-1,0,-6" ></RadioButton>
+                        </Grid>
+                    </GroupBox>
+                    <GroupBox Grid.Row="3" IsEnabled="{Binding Enable}" Margin="0,10,0,0">
+                        <Grid>
+                            <Label Content="Drip Enable" Height="30" VerticalAlignment="Top" />
+                            <RadioButton Content="True" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left"
+Command="{Binding AutoCurrentBasedFalseCommand}"  IsChecked="{Binding Recipe.VacuumPrewetDripEnable ,Mode=TwoWay}" Margin="158,-1,0,-6" ></RadioButton>
+                            <RadioButton Content="False" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
+ Command="{Binding AutoCurrentBasedTrueCommand}"  IsChecked="{Binding Recipe.VacuumPrewetDripEnable,Mode=TwoWay,Converter={StaticResource boolReverseConverter}}" Margin="220,-1,0,-6" ></RadioButton>
+                        </Grid>
+                    </GroupBox>
+                    <GroupBox Grid.Row="4" IsEnabled="{Binding Enable}" Margin="0,10,0,0">
+                        <Grid>
+                            <Label Content="Small Enable" Height="30" VerticalAlignment="Top" />
+                            <RadioButton Content="True" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left"
+Command="{Binding AutoCurrentBasedFalseCommand}"  IsChecked="{Binding Recipe.VacuumPrewetSmallEnable ,Mode=TwoWay}" Margin="158,-1,0,-6" ></RadioButton>
+                            <RadioButton Content="False" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
+ Command="{Binding AutoCurrentBasedTrueCommand}"  IsChecked="{Binding Recipe.VacuumPrewetSmallEnable,Mode=TwoWay,Converter={StaticResource boolReverseConverter}}" Margin="220,-1,0,-6" ></RadioButton>
+                        </Grid>
+                    </GroupBox>
+                    <GroupBox Grid.Row="5" IsEnabled="{Binding Enable}" Margin="0,10,0,0">
+                        <Grid>
+                            <Label Content="Large" Height="30" VerticalAlignment="Top" />
+                            <RadioButton Content="True" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left"
+Command="{Binding AutoCurrentBasedFalseCommand}"  IsChecked="{Binding Recipe.VacuumPrewetLargeEnable ,Mode=TwoWay}" Margin="158,-1,0,-6" ></RadioButton>
+                            <RadioButton Content="False" Height="30" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Center" 
+ Command="{Binding AutoCurrentBasedTrueCommand}"  IsChecked="{Binding Recipe.VacuumPrewetLargeEnable,Mode=TwoWay,Converter={StaticResource boolReverseConverter}}" Margin="220,-1,0,-6" ></RadioButton>
+                        </Grid>
+                    </GroupBox>
+                    <DataGrid x:Name="VacuumPrewetRinseGrid" Width="215" MinRowHeight="27" Grid.Row="6" AutoGenerateColumns="False"  CanUserAddRows="False"  FontFamily="Arial" FontSize="14" Margin="-70,10,0,0" 
+          ItemsSource="{Binding Recipe.VacuumRinseStep}" SelectionMode="Single" IsEnabled="{Binding Enable}" SelectedIndex="{Binding SelectedRampIndex,Mode=TwoWay}">
+                        <DataGrid.Resources>
+                            <extendedControls:BindingProxy x:Key="DataShowProxy"  Data="{Binding}" />
+                        </DataGrid.Resources>
+                        <DataGrid.Columns>
+                            <DataGridTextColumn Header="Step" Width="50"  Binding="{Binding CurrentRampDurartionSeconds,Mode=TwoWay}" CanUserSort="false" CanUserReorder="False" CanUserResize="False"/>
+                            <DataGridTextColumn Header="Time(sec)" Width="80"  Binding="{Binding DurationSeconds,Mode=TwoWay}" CanUserSort="false" CanUserReorder="False" CanUserResize="False" >
+                            </DataGridTextColumn>
+                            <DataGridTextColumn Header="Speed(rpm)" Width="85"  Binding="{Binding RotationSpeed,Mode=TwoWay}" CanUserSort="false" CanUserReorder="False" CanUserResize="False" />
+                        </DataGrid.Columns>
+                    </DataGrid>
+                </Grid>
+            </GroupBox>
+          
+        </Grid>
     </Grid>
 </UserControl>

+ 2 - 2
PunkHPX8_RT/Config/Devices/Beckhoffcfg - plctask.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <BeckhoffCfg>
-	<Controller Name="MASTER" IPAddress="192.168.0.200.1.1" PortAddress="851">
+	<Controller Name="MASTER" IPAddress="10.4.6.75.1.1" PortAddress="851">
 
 		<!-- Need to have at least one input and one output before Axis stuff -->
 
@@ -41,7 +41,7 @@
 		<Output Name="c_VPW_VACUUM_PUMP_ENABLE" Address="MAIN.MAIN_IO_RELAY_4CHANNEL_EL2624_N106_1" Type="Digital" Invert="false" DataType="bool"/>
 		<Output Name="c_VPW_VACUUM_PUMP_SPEED_ENABLE" Address="MAIN.MAIN_IO_RELAY_4CHANNEL_EL2624_N106_2" Type="Digital" Invert="false" DataType="bool"/>
 		<Output Name="c_VPW_VACUUM_PUMP_SPEED" Address="MAIN.VPW_AO_8CHANNEL_0_10V_EL4008_N104_1" Scaling="0=0,20=32767" Type="Analog" DataType="int"/>
-		<Output Name="c_VPW_BOOSTER_PUMP_SPPED" Address="MAIN.VPW_AO_8CHANNEL_0_10V_EL4008_N104_5" Scaling="300=0,7300=32767" Type="Analog" DataType="int"/>
+		<Output Name="c_VPW_BOOSTER_PUMP_SPPED" Address="MAIN.VPW_AO_8CHANNEL_0_10V_EL4008_N104_5" Scaling="300=0,10000=32767" Type="Analog" DataType="int"/>
 		<Output Name="c_VPW_DIW_ENABLE" Address="MAIN.VPW_PNEU_SMC_EX260_BYTE0" Type="Digital" BitOperated="true" Bit="0" DataType="byte"/>
 		<Output Name="c_VPW_DIW_PROCESS" Address="MAIN.VPW_PNEU_SMC_EX260_BYTE0" Type="Digital" BitOperated="true" Bit="1" DataType="byte"/>
 		<Output Name="c_VPW_DIW_DEGAS" Address="MAIN.VPW_PNEU_SMC_EX260_BYTE1" Type="Digital" BitOperated="true" Bit="0" DataType="byte"/>

+ 1 - 1
PunkHPX8_RT/Config/Devices/Beckhoffcfg.xml

@@ -40,7 +40,7 @@
 		<Output Name="c_VPW_VACUUM_PUMP_ENABLE" Address="Task 2.Outputs.MAIN_IO_RELAY_4CHANNEL_EL2624_N106_1" Type="Digital" Invert="false" DataType="bool"/>
 		<Output Name="c_VPW_VACUUM_PUMP_SPEED_ENABLE" Address="Task 2.Outputs.MAIN_IO_RELAY_4CHANNEL_EL2624_N106_2" Type="Digital" Invert="false" DataType="bool"/>
 		<Output Name="c_VPW_VACUUM_PUMP_SPEED" Address="Task 2.Outputs.VPW_AO_8CHANNEL_0_10V_EL4008_N104_1" Scaling="0=0,20=32767" Type="Analog" DataType="int"/>
-		<Output Name="c_VPW_BOOSTER_PUMP_SPPED" Address="Task 2.Outputs.VPW_AO_8CHANNEL_0_10V_EL4008_N104_5" Scaling="0=0,20=32767" Type="Analog" DataType="int"/>
+		<Output Name="c_VPW_BOOSTER_PUMP_SPPED" Address="Task 2.Outputs.VPW_AO_8CHANNEL_0_10V_EL4008_N104_5" Scaling="300=0,10000=32767" Type="Analog" DataType="int"/>
 		<Output Name="c_VPW_DIW_ENABLE" Address="Task 2.Outputs.VPW_PNEU_SMC_EX260_BYTE0" Type="Digital" BitOperated="true" Bit="0" DataType="byte"/>
 		<Output Name="c_VPW_DIW_PROCESS" Address="Task 2.Outputs.VPW_PNEU_SMC_EX260_BYTE0" Type="Digital" BitOperated="true" Bit="1" DataType="byte"/>
 		<Output Name="c_VPW_DIW_DEGAS" Address="Task 2.Outputs.VPW_PNEU_SMC_EX260_BYTE1" Type="Digital" BitOperated="true" Bit="0" DataType="byte"/>

+ 2 - 2
PunkHPX8_Themes/UserControls/VPWBoosterPumpControl.xaml.cs

@@ -151,9 +151,9 @@ namespace PunkHPX8_Themes.UserControls
             {
                 if (short.TryParse(param[1].ToString(), out short paramValue))
                 {
-                    if (paramValue < 300 || paramValue > 7300)
+                    if (paramValue < 300 || paramValue > 10000)
                     {
-                        MessageBox.Show("qualified values 300 ~ 7300", "Invalid Speed Input", MessageBoxButton.OK, MessageBoxImage.Error);
+                        MessageBox.Show("qualified values 300 ~ 10000", "Invalid Speed Input", MessageBoxButton.OK, MessageBoxImage.Error);
                     }
                     else
                     {

+ 2 - 2
PunkHPX8_Themes/UserControls/VPWMainStateControl.xaml.cs

@@ -166,12 +166,12 @@ namespace PunkHPX8_Themes.UserControls
 
         private void DIWInletValveOpen_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DIWInletValveOn");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DiwEnable");
         }
 
         private void DIWInletValveClose_Click(object sender, RoutedEventArgs e)
         {
-            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DIWInletValveOff");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DiwDisable");
         }
 
         private void ChamberOpen_Click(object sender, RoutedEventArgs e)

+ 2 - 2
PunkHPX8_Themes/UserControls/VPWMainUIControl.xaml.cs

@@ -199,12 +199,12 @@ namespace PunkHPX8_Themes.UserControls
 
         private void OpenDIWProcessValve_Click(object sender, RoutedEventArgs e)
         {
-            //InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DIWInletValveOff");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DiwProcessOn");
         }
 
         private void CloseDIWProcessValve_Click(object sender, RoutedEventArgs e)
         {
-            //InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DegasAdjustOn");
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName}.DiwProcessOff");
         }
 
 

+ 1 - 1
PunkHPX8_Themes/UserControls/VPWMainVacuumPumpControl.xaml.cs

@@ -54,7 +54,7 @@ namespace PunkHPX8_Themes.UserControls
 
 
         public static readonly DependencyProperty InputPumpSpeedProperty = DependencyProperty.Register(
-        "InputPumpSpeed", typeof(short), typeof(VPWMainVacuumPumpControl), new FrameworkPropertyMetadata((short)300, FrameworkPropertyMetadataOptions.AffectsRender));
+        "InputPumpSpeed", typeof(short), typeof(VPWMainVacuumPumpControl), new FrameworkPropertyMetadata((short)0, FrameworkPropertyMetadataOptions.AffectsRender));
         /// <summary>
         /// InputLowThreshold
         /// </summary>