Browse Source

revise metal loop run recipe ,add TC monitor,revise pump flow scaling

chenzk 2 months ago
parent
commit
ccde2b587e

+ 22 - 22
CyberX8_MainPages/Views/ResRecipeView.xaml

@@ -128,10 +128,10 @@
                                         <GroupBox Header="DI Replen Enable" Grid.Column="0" Grid.Row="0" IsEnabled="{Binding Enable}">
                                             <Grid>
                                                 <RadioButton Content="False" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Right" 
-                                                          Command ="{Binding DIReplenEnableFalseCommand}" IsChecked="{Binding Recipe.DIReplenEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="5,15,40,0">
+                                                          Command ="{Binding DIReplenEnableFalseCommand}" IsChecked="{Binding Recipe.DIReplenEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="0,16,25,2">
                                                 </RadioButton>
                                                 <RadioButton Content="True" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                          Command ="{Binding DIReplenEnableTrueCommand}" IsChecked="{Binding Recipe.DIReplenEnable,Mode=TwoWay}" Margin="25,15,0,0" ></RadioButton>
+                                                          Command ="{Binding DIReplenEnableTrueCommand}" IsChecked="{Binding Recipe.DIReplenEnable,Mode=TwoWay}" Margin="15,16,0,2" ></RadioButton>
                                             </Grid>
                                         </GroupBox>
                                         <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="1" Title="DI Replen Time Rate" Unit="mL/day" MinValue="0" MaxValue="9000" IntValue="{Binding Recipe.DIReplenTimeRate,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[DIReplenTimeRate],Mode=TwoWay}" Width="200"/>
@@ -235,9 +235,9 @@
                                         <GroupBox Header="AN DI Replen Enable" Grid.Column="0" Grid.Row="0" IsEnabled="{Binding Enable}">
                                             <Grid>
                                                 <RadioButton Content="False" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Right" 
-                                                         Command ="{Binding ANDIReplenEnableFalseCommand}" IsChecked="{Binding Recipe.ANDIReplenEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="5,15,40,0"></RadioButton>
+                                                         Command ="{Binding ANDIReplenEnableFalseCommand}" IsChecked="{Binding Recipe.ANDIReplenEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="0,16,30,2"></RadioButton>
                                                 <RadioButton Content="True" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         Command ="{Binding ANDIReplenEnableTrueCommand}" IsChecked="{Binding Recipe.ANDIReplenEnable,Mode=TwoWay}" Margin="25,15,0,0" ></RadioButton>
+                                                         Command ="{Binding ANDIReplenEnableTrueCommand}" IsChecked="{Binding Recipe.ANDIReplenEnable,Mode=TwoWay}" Margin="18,16,0,2" ></RadioButton>
                                             </Grid>
                                         </GroupBox>
                                         <UserControls:GroupTextBoxControl Grid.Column="0" Grid.Row="1" Title="AN DI Replen Time Rate" Unit="mL/day" MinValue="0" MaxValue="9000" IntValue="{Binding Recipe.ANDIReplenTimeRate,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[ANDIReplenTimeRate],Mode=TwoWay}" Width="200"/>
@@ -353,9 +353,9 @@
                                         <GroupBox Header="Burn In Enable" Grid.Column="0" Grid.Row="0" IsEnabled="{Binding Enable}">
                                             <Grid>
                                                 <RadioButton Content="False" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Right" 
-                                                         IsChecked="{Binding Recipe.BurnInEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="0,15,40,0"></RadioButton>
+                                                         IsChecked="{Binding Recipe.BurnInEnable,Converter={StaticResource boolReverseConverter},Mode=TwoWay}" Margin="0,16,26,2"></RadioButton>
                                                 <RadioButton Content="True" Height="35" Width="60" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         IsChecked="{Binding Recipe.BurnInEnable,Mode=TwoWay}" Margin="40,15,0,0" ></RadioButton>
+                                                         IsChecked="{Binding Recipe.BurnInEnable,Mode=TwoWay}" Margin="26,16,0,2" ></RadioButton>
                                             </Grid>
                                         </GroupBox>
                                         <GroupBox Header="Method" Grid.Row="1" Grid.Column="0" Grid.RowSpan="4" Grid.ColumnSpan="2" Padding="10" IsEnabled="{Binding Enable}">
@@ -371,22 +371,22 @@
                                                     <ColumnDefinition Width="80"></ColumnDefinition>
                                                     <ColumnDefinition Width="200"></ColumnDefinition>
                                                 </Grid.ColumnDefinitions>
-                                                <Grid Grid.Row="0" Grid.Column="0">
-                                                    <RadioButton Content="Idle Time" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         IsChecked="{Binding Recipe.IdleTime,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
-                                                </Grid>
-                                                <Grid Grid.Row="1" Grid.Column="0">
-                                                    <RadioButton Content="Charge" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         IsChecked="{Binding Recipe.Charge,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
-                                                </Grid>
-                                                <Grid Grid.Row="2" Grid.Column="0">
-                                                    <RadioButton Content="Cycles" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         IsChecked="{Binding Recipe.Cycles,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
-                                                </Grid>
-                                                <Grid Grid.Row="3" Grid.Column="0">
-                                                    <RadioButton Content="Start Time" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
-                                                         IsChecked="{Binding Recipe.StartTime,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
-                                                </Grid>
+
+                                                <RadioButton Grid.Row="0" Grid.Column="0" Content="Idle Time" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
+                                                        IsChecked="{Binding Recipe.IdleTime,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
+
+                                                
+                                                <RadioButton  Grid.Row="1" Grid.Column="0" Content="Charge" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
+                                                        IsChecked="{Binding Recipe.Charge,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
+
+
+                                                <RadioButton Grid.Row="2" Grid.Column="0" Content="Cycles" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
+                                                        IsChecked="{Binding Recipe.Cycles,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
+
+                                                
+                                                <RadioButton Grid.Row="3" Grid.Column="0" Content="Start Time" Height="35" Width="80" VerticalContentAlignment="Center" HorizontalAlignment="Left" 
+                                                        IsChecked="{Binding Recipe.StartTime,Mode=TwoWay}" Margin="0,15,0,0" ></RadioButton>
+                                               
                                                 <UserControls:GroupTextBoxControl Grid.Column="1" Grid.Row="0" IsEnabled="{Binding Recipe.IdleTime}"  Title="Burn In Time" Unit="min" MinValue="60" MaxValue="1440" IntValue="{Binding Recipe.BurnInTime,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[BurnInTime],Mode=TwoWay}" Width="200"/>
 
                                                 <UserControls:GroupTextBoxControl Grid.Column="1" Grid.Row="1" IsEnabled="{Binding Recipe.Charge}" Title="Burn In Current" Unit="Ah" MinValue="0" MaxValue="5000" IntValue="{Binding Recipe.BurnInCurrent,Mode=TwoWay}" ValidResult="{Binding PropertyValidResultDic[BurnInCurrent],Mode=TwoWay}" Width="200"/>

+ 4 - 4
CyberX8_RT/Config/Devices/WagoControllerCfg-Simulator.xml

@@ -295,15 +295,15 @@
 				<AI Name="r_DI_WATER_PRESSURE"  Address="11" Scaling="0=0, 100=32767" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="4">
-				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=0,40=32767" DataType="short"/>
+				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI13"  Address="13" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=0,40=32767" DataType="short"/>
+				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI15"  Address="15" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="5">
-				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=0,40=32767" DataType="short"/>
+				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI17"  Address="17" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=0,40=32767" DataType="short"/>
+				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI19"  Address="19" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="6">

+ 4 - 4
CyberX8_RT/Config/Devices/WagoControllerCfg.xml

@@ -295,15 +295,15 @@
 				<AI Name="r_DI_WATER_PRESSURE"  Address="11" Scaling="0=0, 100=32767" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="4">
-				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=3276.7,40=16383.5" DataType="short"/>
+				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=3276.7,100=16383.5" DataType="short"/>
 				<AI Name="AI13"  Address="13" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=3276.7,40=16383.5" DataType="short"/>
+				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=3276.7,100=16383.5" DataType="short"/>
 				<AI Name="AI15"  Address="15" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="5">
-				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=3276.7,40=16383.5" DataType="short"/>
+				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=3276.7,100=16383.5" DataType="short"/>
 				<AI Name="AI17"  Address="17" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=3276.7,40=16383.5" DataType="short"/>
+				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=3276.7,100=16383.5" DataType="short"/>
 				<AI Name="AI19"  Address="19" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="6">

+ 1 - 1
CyberX8_RT/Config/Layout/ToolLayoutConfiguration.xml

@@ -280,7 +280,7 @@
 		<!-- RESISTIVITY PROBES -->
 
 		<Item i:type="ResistivityProbe">
-			<Installed>false</Installed>
+			<Installed>true</Installed>
 			<Count>4</Count>
 			<ResistivityProbeID>1</ResistivityProbeID>
 			<SubType>STDThornton</SubType>

+ 48 - 1
CyberX8_RT/Devices/Reservoir/StandardHotReservoirDevice.cs

@@ -339,7 +339,8 @@ namespace CyberX8_RT.Devices.Reservoir
             /// WaterLevelMonitor
             /// </summary>
             WaterLevelMonitor();
-
+            //TC SafeCheck
+            TCSafeCheck();
             //DIReplen
             if (_direplenHelper != null)
             {
@@ -466,6 +467,52 @@ namespace CyberX8_RT.Devices.Reservoir
             }
         }
         /// <summary>
+        /// 检验TC的运行状态是否满足
+        /// </summary>
+        private void TCSafeCheck()
+        {
+            bool result = false;
+            double totalFlow = 0;
+
+            //检验冷却水
+            SystemFacilities systemFacilities = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
+            if ((systemFacilities != null && !systemFacilities.HouseChilledWaterEnable))
+            {
+                result = true;
+            }
+            //检验循环流量
+            for (int i = 0; i < _metalDevices.Count; i++)
+            {
+                StandardHotMetalDevice hotMetalDevice = _metalDevices[i];
+                if (hotMetalDevice != null)
+                {
+                    if (hotMetalDevice.MetalDeviceData != null)
+                    {
+                        totalFlow += hotMetalDevice.MetalDeviceData.CellFlow;
+                    }
+                }
+            }
+            if(totalFlow <= 0)
+            {
+                result = true ;
+            }       
+            if (result)
+            {
+                ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module);
+                //禁用TC
+                if (!String.IsNullOrEmpty(reservoirItem.TCID))
+                {
+                    TemperatureController temperatureController = DEVICE.GetDevice<TemperatureController>(reservoirItem.TCID);
+                    if (temperatureController != null && temperatureController.TemperatureData.ControlOperationModel == 5)
+                    {
+                        LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"TC run status abnormal, DisableTC !");
+                        temperatureController.DisableOperation("", null);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
         /// High Level 触发操作
         /// </summary>
         private void HighLevelOperation()

+ 2 - 0
CyberX8_RT/Modules/Metal/StandardHotRunRecipeRoutine.cs

@@ -30,6 +30,7 @@ namespace CyberX8_RT.Modules.Metal
             RunRecipe,
             RunRecipeWait,
             WaferHolderUnclampOn,
+            LoopDelay,
             LoopEnd,
             End
         }
@@ -112,6 +113,7 @@ namespace CyberX8_RT.Modules.Metal
                 .LoopRun(RecipeStep.RunRecipe, () => _runRecipeRoutine.Start(new object[] { _recipe, _side }) == RState.Running, _delay_1ms)
                 .LoopRunWithStopStatus(RecipeStep.RunRecipeWait, () => CommonFunction.CheckRoutineEndState(_runRecipeRoutine), CheckRunRecipeStopStatus, ALL_DAY_MILLOSECONDS)
                 .LoopRun(RecipeStep.WaferHolderUnclampOn, () => _device.WaferHolderClampOff("", null), () => !_device.MetalDeviceData.WaferHolderClamp, _delay_1s)
+                .LoopRunIf(RecipeStep.LoopDelay, _cycle > 1, NullFun, _delay_5s)
                 .LoopEnd(RecipeStep.LoopEnd, UpdateCycleCount, _delay_1ms)
                 .End(RecipeStep.End, NullFun, _delay_1ms);