Browse Source

1.根据长鑫要求Process Hietory界面添加eap提供的wafeid与lottype信息
2.优化all进all出不做cooling bug

lixiang 4 months ago
parent
commit
1931fc55d3

+ 3 - 1
Venus/Framework/Common/DBCore/DatabaseCleaner.cs

@@ -10,6 +10,7 @@ using Aitex.Core.RT.Log;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
 using Aitex.Core.Util;
 using log4net.Repository.Hierarchy;
 using log4net.Repository.Hierarchy;
+using MECF.Framework.Common.Equipment;
 using Npgsql;
 using Npgsql;
 
 
 namespace MECF.Framework.Common.DBCore
 namespace MECF.Framework.Common.DBCore
@@ -94,6 +95,7 @@ namespace MECF.Framework.Common.DBCore
                         command.ExecuteNonQuery();
                         command.ExecuteNonQuery();
                         double elapsedTime = timer.GetElapseTime() / 1000;
                         double elapsedTime = timer.GetElapseTime() / 1000;
                         log = string.Format("当前日期为{0},删除目录表{1}里{2}天前的记录,用时{3}秒", System.DateTime.Now.ToString("D"), timeStamp[i, 0], _daysOfRetainData, elapsedTime);
                         log = string.Format("当前日期为{0},删除目录表{1}里{2}天前的记录,用时{3}秒", System.DateTime.Now.ToString("D"), timeStamp[i, 0], _daysOfRetainData, elapsedTime);
+                        LOG.Write(eEvent.EV_DEVICE_INFO, ModuleName.System, log);
                         //LOG.Info(log);
                         //LOG.Info(log);
                         System.Threading.Thread.Sleep(50);
                         System.Threading.Thread.Sleep(50);
                     }
                     }
@@ -117,7 +119,7 @@ namespace MECF.Framework.Common.DBCore
             }
             }
             catch (Exception ex)
             catch (Exception ex)
             {
             {
-                LOG.WriteExeption(ex);
+                //LOG.WriteExeption(ex);
                 if (conn != null)
                 if (conn != null)
                 {
                 {
                     conn.Close();
                     conn.Close();

+ 3 - 1
Venus/Framework/Common/DBCore/DatabaseTable.cs

@@ -78,6 +78,8 @@ namespace MECF.Framework.Common.DBCore
                 {"lot_data_guid", typeof(string)},
                 {"lot_data_guid", typeof(string)},
                 {"wafer_data_guid", typeof(string)},
                 {"wafer_data_guid", typeof(string)},
                 {"carrier_id", typeof(string)},
                 {"carrier_id", typeof(string)},
+                
+
             };
             };
 
 
 
 
@@ -122,7 +124,7 @@ namespace MECF.Framework.Common.DBCore
                 {"lot_id", typeof(string) },
                 {"lot_id", typeof(string) },
                 {"slot_id", typeof(string) },
                 {"slot_id", typeof(string) },
                 {"carrier_id", typeof(string)},
                 {"carrier_id", typeof(string)},
-
+                {"lot_type", typeof(string)},
             });
             });
         }
         }
     }
     }

+ 4 - 3
Venus/Framework/Common/DBCore/ProcessDataRecorder.cs

@@ -132,10 +132,10 @@ namespace MECF.Framework.Common.DBCore
             }
             }
         }
         }
 
 
-        public static void RecordPrecess(string guid, DateTime startTime, DateTime endTime, string recipeName,string status, string waferDataGuid, string processIn, string lotID, string slotID, string recipe_type,string carrierId)
+        public static void RecordPrecess(string guid, DateTime startTime, DateTime endTime, string recipeName,string status, string waferDataGuid, string processIn, string lotID, string slotID, string recipe_type,string carrierId,string lotType)
         {
         {
             string sql = string.Format(
             string sql = string.Format(
-                "INSERT INTO \"process_data\"(\"guid\", \"process_begin_time\",\"process_end_time\", \"recipe_name\" ,\"process_status\", \"wafer_data_guid\", \"process_in\", \"lot_id\", \"slot_id\", \"recipe_type\", \"carrier_id\")VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}','{7}' ,'{8}','{9}','{10}');",
+                "INSERT INTO \"process_data\"(\"guid\", \"process_begin_time\",\"process_end_time\", \"recipe_name\" ,\"process_status\", \"wafer_data_guid\", \"process_in\", \"lot_id\", \"slot_id\", \"recipe_type\", \"carrier_id\", \"lot_type\")VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}','{7}' ,'{8}','{9}','{10}','{11}');",
                 guid,
                 guid,
                 startTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
                 startTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
                 endTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
                 endTime.ToString("yyyy/MM/dd HH:mm:ss.fff"),
@@ -146,7 +146,8 @@ namespace MECF.Framework.Common.DBCore
                 lotID,
                 lotID,
                 string.IsNullOrEmpty(slotID) ? "" : (int.Parse(slotID) + 1).ToString(),
                 string.IsNullOrEmpty(slotID) ? "" : (int.Parse(slotID) + 1).ToString(),
                 recipe_type,
                 recipe_type,
-                carrierId
+                carrierId,
+                lotType
                 );
                 );
             DB.Insert(sql);
             DB.Insert(sql);
         }
         }

+ 31 - 2
Venus/Framework/Common/SubstrateTrackings/WaferInfo.cs

@@ -84,8 +84,35 @@ namespace Aitex.Core.Common
 			    InvokePropertyChanged("WaferID");
 			    InvokePropertyChanged("WaferID");
 			}
 			}
 		}
 		}
-
-		private string _waferOrigin;
+		private string lotType;
+        [DataMember]
+        public string  LotType
+        {
+            get
+            {
+                return lotType;
+            }
+            set
+            {
+                lotType = value;
+                InvokePropertyChanged("LotType");
+            }
+        }
+        private string eapWaferID;
+        [DataMember]
+        public string EAPWaferID
+        {
+            get
+            {
+                return eapWaferID;
+            }
+            set
+            {
+                eapWaferID = value;
+                InvokePropertyChanged("EAPWaferID");
+            }
+        }
+        private string _waferOrigin;
 		[DataMember]
 		[DataMember]
 		public string WaferOrigin
 		public string WaferOrigin
 		{
 		{
@@ -350,6 +377,8 @@ namespace Aitex.Core.Common
 
 
 		    ProcessJob = source.ProcessJob;
 		    ProcessJob = source.ProcessJob;
 		    NextSequenceStep = source.NextSequenceStep;
 		    NextSequenceStep = source.NextSequenceStep;
+			EAPWaferID = source.EAPWaferID;
+			LotType= source.LotType;
 		}
 		}
 
 
 	    public void SetEmpty()
 	    public void SetEmpty()

+ 1 - 1
Venus/Framework/Common/Utilities/PeriodicJob.cs

@@ -124,7 +124,7 @@ namespace Aitex.Core.Util
                 }
                 }
                 catch (Exception ex)
                 catch (Exception ex)
                 {
                 {
-                    LOG.WriteExeption(ex);
+                    //LOG.WriteExeption(ex);
                 }
                 }
 
 
                 _sleepFlag.WaitOne(Math.Max(_interval - (int)_elapseTimer.GetElapseTime(), 30));
                 _sleepFlag.WaitOne(Math.Max(_interval - (int)_elapseTimer.GetElapseTime(), 30));

+ 2 - 1
Venus/Venus_Core/RtState.cs

@@ -42,7 +42,8 @@ namespace Venus_Core
         SERunning,
         SERunning,
         ReturnWafer,
         ReturnWafer,
         SETransfer,
         SETransfer,
-        SEReturnWafer
+        SEReturnWafer,
+        Aborting
     }
     }
 
 
     public enum PMState
     public enum PMState

+ 9 - 0
Venus/Venus_MainPages/ViewModels/KeplerProcessHistoryViewModel.cs

@@ -224,6 +224,10 @@ namespace Venus_MainPages.ViewModels
                 item.Status = dbData.Rows[i]["process_status"].ToString();
                 item.Status = dbData.Rows[i]["process_status"].ToString();
                 item.SlotID = dbData.Rows[i]["slot_id"].ToString();
                 item.SlotID = dbData.Rows[i]["slot_id"].ToString();
                 item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
                 item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
+                item.WaferId = dbData.Rows[i]["wafer_data_guid"].ToString();
+                item.LotType = dbData.Rows[i]["lot_type"].ToString();
+
+
                 item.LotID = dbData.Rows[i]["lot_id"].ToString();
                 item.LotID = dbData.Rows[i]["lot_id"].ToString();
                 item.CarrierId = dbData.Rows[i]["carrier_id"].ToString();
                 item.CarrierId = dbData.Rows[i]["carrier_id"].ToString();
                 if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
                 if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
@@ -303,6 +307,9 @@ namespace Venus_MainPages.ViewModels
                         item.Status = dbData.Rows[i]["process_status"].ToString();
                         item.Status = dbData.Rows[i]["process_status"].ToString();
                         item.SlotID = dbData.Rows[i]["slot_id"].ToString();
                         item.SlotID = dbData.Rows[i]["slot_id"].ToString();
                         item.LotID = dbData.Rows[i]["lot_id"].ToString();
                         item.LotID = dbData.Rows[i]["lot_id"].ToString();
+                        item.WaferId = dbData.Rows[i]["wafer_data_guid"].ToString();
+                        item.LotType = dbData.Rows[i]["lot_type"].ToString();
+
                         item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
                         item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
                         if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
                         if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
                             item.StartTime = ((DateTime)dbData.Rows[i]["process_begin_time"]).ToString("yyyy-MM-dd HH:mm:ss");
                             item.StartTime = ((DateTime)dbData.Rows[i]["process_begin_time"]).ToString("yyyy-MM-dd HH:mm:ss");
@@ -397,6 +404,8 @@ namespace Venus_MainPages.ViewModels
                     item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
                     item.RecipeType = dbData.Rows[i]["recipe_type"].ToString();
                     item.LotID = dbData.Rows[i]["lot_id"].ToString();
                     item.LotID = dbData.Rows[i]["lot_id"].ToString();
                     item.CarrierId = dbData.Rows[i]["carrier_id"].ToString();
                     item.CarrierId = dbData.Rows[i]["carrier_id"].ToString();
+                    item.WaferId = dbData.Rows[i]["wafer_data_guid"].ToString();
+                    item.LotType = dbData.Rows[i]["lot_type"].ToString();
 
 
                     if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
                     if (!dbData.Rows[i]["process_begin_time"].Equals(DBNull.Value))
                         item.StartTime = ((DateTime)dbData.Rows[i]["process_begin_time"]).ToString("yyyy-MM-dd HH:mm:ss");
                         item.StartTime = ((DateTime)dbData.Rows[i]["process_begin_time"]).ToString("yyyy-MM-dd HH:mm:ss");

+ 2 - 2
Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs

@@ -1678,8 +1678,8 @@ namespace Venus_MainPages.ViewModels
             MFC6SetPoint = 0;
             MFC6SetPoint = 0;
             MFC7SetPoint = 0;
             MFC7SetPoint = 0;
             MFC8SetPoint = 0;
             MFC8SetPoint = 0;
-            HighTemperatureHeaterTemperatureSetpoint = 0;
-            HighTemperatureHeaterRatioSetpoint = 0;
+            //HighTemperatureHeaterTemperatureSetpoint = 0;
+            //HighTemperatureHeaterRatioSetpoint = 0;
         }
         }
         private IEnumerable<string> GetFilesNames(string path)
         private IEnumerable<string> GetFilesNames(string path)
         {
         {

+ 2 - 2
Venus/Venus_MainPages/ViewModels/OverKepler2200BViewModel.cs

@@ -1689,8 +1689,8 @@ namespace Venus_MainPages.ViewModels
             MFC7SetPoint = 0;
             MFC7SetPoint = 0;
             MFC8SetPoint = 0;
             MFC8SetPoint = 0;
             RFBoxC1Setpoint = 0;
             RFBoxC1Setpoint = 0;
-            HighTemperatureHeaterTemperatureSetpoint = 0;
-            HighTemperatureHeaterRatioSetpoint = 0;
+            //HighTemperatureHeaterTemperatureSetpoint = 0;
+            //HighTemperatureHeaterRatioSetpoint = 0;
 
 
         }
         }
         private IEnumerable<string> GetFilesNames(string path)
         private IEnumerable<string> GetFilesNames(string path)

+ 4 - 0
Venus/Venus_MainPages/ViewModels/ProcessHistoryViewModel.cs

@@ -889,6 +889,10 @@ namespace Venus_MainPages.ViewModels
         public string CarrierId { get; set; }
         public string CarrierId { get; set; }
 
 
         public string RecipeType { get; set; }
         public string RecipeType { get; set; }
+
+        public string WaferId { get; set; }
+
+        public string LotType { get;set; }
     }
     }
     public class StepData
     public class StepData
     {
     {

+ 20 - 6
Venus/Venus_MainPages/Views/KeplerProcessHistoryView.xaml

@@ -112,21 +112,35 @@
                     </i:EventTrigger>
                     </i:EventTrigger>
                 </i:Interaction.Triggers>
                 </i:Interaction.Triggers>
                 <DataGrid.Columns>
                 <DataGrid.Columns>
-                    <DataGridTemplateColumn Header="Carrier ID" Width="100">
+                    <DataGridTemplateColumn Header="Carrier ID" Width="80">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding CarrierId}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                                 <TextBlock Text="{Binding CarrierId}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                             </DataTemplate>
                             </DataTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                     </DataGridTemplateColumn>
                     </DataGridTemplateColumn>
-                    <DataGridTemplateColumn Header="Lot ID" Width="320">
+                    <DataGridTemplateColumn Header="Lot ID" Width="200">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding LotID}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                 <TextBlock Text="{Binding LotID}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                             </DataTemplate>
                             </DataTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                     </DataGridTemplateColumn>
                     </DataGridTemplateColumn>
-                    <DataGridTemplateColumn Header="Slot ID" Width="120">
+                    <DataGridTemplateColumn Header="Lot Type" Width="100">
+                        <DataGridTemplateColumn.CellTemplate>
+                            <DataTemplate>
+                                <TextBlock Text="{Binding LotType}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
+                            </DataTemplate>
+                        </DataGridTemplateColumn.CellTemplate>
+                    </DataGridTemplateColumn>
+                    <DataGridTemplateColumn Header="Wafer ID" Width="300">
+                        <DataGridTemplateColumn.CellTemplate>
+                            <DataTemplate>
+                                <TextBlock Text="{Binding WaferId}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
+                            </DataTemplate>
+                        </DataGridTemplateColumn.CellTemplate>
+                    </DataGridTemplateColumn>
+                    <DataGridTemplateColumn Header="Slot ID" Width="50">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding SlotID}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                 <TextBlock Text="{Binding SlotID}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
@@ -134,14 +148,14 @@
                         </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                     </DataGridTemplateColumn>
                     </DataGridTemplateColumn>
 
 
-                    <DataGridTemplateColumn Header="Start" Width="280">
+                    <DataGridTemplateColumn Header="Start" Width="200">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding StartTime}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                 <TextBlock Text="{Binding StartTime}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                             </DataTemplate>
                             </DataTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                     </DataGridTemplateColumn>
                     </DataGridTemplateColumn>
-                    <DataGridTemplateColumn Header="End" Width="280">
+                    <DataGridTemplateColumn Header="End" Width="200">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding EndTime}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                 <TextBlock Text="{Binding EndTime}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
@@ -155,7 +169,7 @@
                             </DataTemplate>
                             </DataTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                         </DataGridTemplateColumn.CellTemplate>
                     </DataGridTemplateColumn>
                     </DataGridTemplateColumn>
-                    <DataGridTemplateColumn Header="Recipe type" Width="180">
+                    <DataGridTemplateColumn Header="Recipe type" Width="120">
                         <DataGridTemplateColumn.CellTemplate>
                         <DataGridTemplateColumn.CellTemplate>
                             <DataTemplate>
                             <DataTemplate>
                                 <TextBlock Text="{Binding RecipeType}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />
                                 <TextBlock Text="{Binding RecipeType}" Margin="5,0" FontFamily="Arial" FontSize="14" Foreground="{DynamicResource FG_Black}" HorizontalAlignment="Center" VerticalAlignment="Center" />

+ 2 - 2
Venus/Venus_RT/Config/EquipmentVariables.xml

@@ -221,7 +221,7 @@
 		<StatusVariable id="430101119" valueType="Boolean" logicalName="TM.LLALid.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101119" valueType="Boolean" logicalName="TM.LLALid.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101120" valueType="F8" logicalName="TM.LLAPCWFlowSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101120" valueType="F8" logicalName="TM.LLAPCWFlowSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101121" valueType="F8" logicalName="TM.LLAPCWFlowSwitch.Value" eventTrigger="" units="" />
 		<StatusVariable id="430101121" valueType="F8" logicalName="TM.LLAPCWFlowSwitch.Value" eventTrigger="" units="" />
-		<StatusVariable id="430101122" valueType="Boolean" logicalName="TM.LLAPressure" eventTrigger="" units="" />
+		<StatusVariable id="430101122" valueType="F8" logicalName="TM.LLAPressure" eventTrigger="" units="" />
 		<StatusVariable id="430101123" valueType="Boolean" logicalName="TM.LLATSlitDoor" eventTrigger="" units="" />
 		<StatusVariable id="430101123" valueType="Boolean" logicalName="TM.LLATSlitDoor" eventTrigger="" units="" />
 		<StatusVariable id="430101124" valueType="Boolean" logicalName="TM.LLATSlitDoor.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101124" valueType="Boolean" logicalName="TM.LLATSlitDoor.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101125" valueType="Boolean" logicalName="TM.LLAVacSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101125" valueType="Boolean" logicalName="TM.LLAVacSwitch" eventTrigger="" units="" />
@@ -237,7 +237,7 @@
 		<StatusVariable id="430101135" valueType="Boolean" logicalName="TM.LLBLid.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101135" valueType="Boolean" logicalName="TM.LLBLid.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101136" valueType="F8" logicalName="TM.LLBPCWFlowSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101136" valueType="F8" logicalName="TM.LLBPCWFlowSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101137" valueType="F8" logicalName="TM.LLBPCWFlowSwitch.Value" eventTrigger="" units="" />
 		<StatusVariable id="430101137" valueType="F8" logicalName="TM.LLBPCWFlowSwitch.Value" eventTrigger="" units="" />
-		<StatusVariable id="430101138" valueType="Boolean" logicalName="TM.LLBPressure" eventTrigger="" units="" />
+		<StatusVariable id="430101138" valueType="F8" logicalName="TM.LLBPressure" eventTrigger="" units="" />
 		<StatusVariable id="430101139" valueType="Boolean" logicalName="TM.LLBTSlitDoor" eventTrigger="" units="" />
 		<StatusVariable id="430101139" valueType="Boolean" logicalName="TM.LLBTSlitDoor" eventTrigger="" units="" />
 		<StatusVariable id="430101140" valueType="Boolean" logicalName="TM.LLBTSlitDoor.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101140" valueType="Boolean" logicalName="TM.LLBTSlitDoor.IsClosed" eventTrigger="" units="" />
 		<StatusVariable id="430101141" valueType="Boolean" logicalName="TM.LLBVacSwitch" eventTrigger="" units="" />
 		<StatusVariable id="430101141" valueType="Boolean" logicalName="TM.LLBVacSwitch" eventTrigger="" units="" />

+ 17 - 6
Venus/Venus_RT/Config/System_Kepler2200.sccfg

@@ -39,9 +39,11 @@
 			<config default="Thick" name="LP2WaferThicknessType" nameView="LP2 wafer thickness type" description="Thin;Thick" max="" min="" paramter="" tag="" unit="0" type="String" />
 			<config default="Thick" name="LP2WaferThicknessType" nameView="LP2 wafer thickness type" description="Thin;Thick" max="" min="" paramter="" tag="" unit="0" type="String" />
 		</configs>-->
 		</configs>-->
 
 
-		<configs name="Job" nameView="Job"  >
+		<configs name="Job" nameView="Job">
 			<config default="10" name="BuzzerTimeWhenJobDone" nameView="Buzzer Time When Job Done"  description="buzzer time after job done, -1=never stop, 0=silent,xxx=buzzer time" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
 			<config default="10" name="BuzzerTimeWhenJobDone" nameView="Buzzer Time When Job Done"  description="buzzer time after job done, -1=never stop, 0=silent,xxx=buzzer time" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
 			<config default="0" name="PPSelectFoupMode" nameView="PP-Select Foup Mode"  description="0:从下往上是1-25,1:从上往下是1-25" max="1" min="0" paramter="" tag="" unit="s" type="Integer" />
 			<config default="0" name="PPSelectFoupMode" nameView="PP-Select Foup Mode"  description="0:从下往上是1-25,1:从上往下是1-25" max="1" min="0" paramter="" tag="" unit="s" type="Integer" />
+			<config default="60" name="PreCleanIdleMaxTime" nameView="Pre Clean Idle Max Time"  description="PreClean 超过最大时间再做" max="86400" min="0" paramter="" tag="" unit="s" type="Integer" />
+
 		</configs>
 		</configs>
 	</configs>
 	</configs>
 
 
@@ -93,7 +95,7 @@
 		<config default="false" name="IgnoreWaterFlowError" nameView="Ignore water flow alarm" description="是否忽略冷却水报警" max="" min="" paramter="" tag="" unit="N/A" type="Bool" />
 		<config default="false" name="IgnoreWaterFlowError" nameView="Ignore water flow alarm" description="是否忽略冷却水报警" max="" min="" paramter="" tag="" unit="N/A" type="Bool" />
 
 
 		<config default="40" name="DelayTimeBeforeLiftDown" nameView="Delay Time before lift down" description="冷却前,lift pin停留多久再落下" max="600" min="0" paramter="" tag="" unit="second" type="Integer" />
 		<config default="40" name="DelayTimeBeforeLiftDown" nameView="Delay Time before lift down" description="冷却前,lift pin停留多久再落下" max="600" min="0" paramter="" tag="" unit="second" type="Integer" />
-		<config default="0" name="SingleArmOption"   nameView="Single Arm Option"   description="0, both; 1, Blade1; 2, Blade2" max="2" min="0" paramter="" tag="" unit="N/A" type="Integer" Restart="1" />
+		<config default="0" name="SingleArmOption"   nameView="Single Arm Option"   description="0, both; 1, Blade1; 2, Blade2" max="2" min="0" paramter="" tag="" unit="N/A" type="Integer" Restart="0" />
 
 
 		<config default="4" name="LLAutoPumpInWaferOpt" nameView="Loadlock Auto Pump Option for Raw Wafer" description="当没作工艺wafer数量大于或等于此数量时,自动开始Pump" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="4" name="LLAutoPumpInWaferOpt" nameView="Loadlock Auto Pump Option for Raw Wafer" description="当没作工艺wafer数量大于或等于此数量时,自动开始Pump" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="0" name="LLAutoPumpOutWaferOpt" nameView="Loadlock Auto Pump Option for Processed Wafer" description="当完成工艺wafer数量小于或等于此数量时,自动开始Pump" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="0" name="LLAutoPumpOutWaferOpt" nameView="Loadlock Auto Pump Option for Processed Wafer" description="当完成工艺wafer数量小于或等于此数量时,自动开始Pump" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
@@ -143,6 +145,8 @@
 		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="SoftVent转FastVent压力设定" max="30000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="100" name="SoftVentEndPressure" nameView="Soft Vent End Pressure" description="SoftVent转FastVent压力设定" max="30000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="Vent到大气压超时" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="60" name="VentingTimeout" nameView="Venting Timeout" description="Vent到大气压超时" max="3000" min="0" paramter="" tag="" unit="s" type="Integer" />
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="结束Vent时延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="结束Vent时延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		<config default="1000" name="ExhaustValveOffDelayTime" nameView="Exhaust Valve Off Delay Time" description="结束Vent时延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+
 		<config default="2000" name="PurgeVentPressure" description="purge时vent至的压力" max="760000" min="0" paramter="" tag="" unit="Pa" type="Double" />
 		<config default="2000" name="PurgeVentPressure" description="purge时vent至的压力" max="760000" min="0" paramter="" tag="" unit="Pa" type="Double" />
 		<config default="30" name="PurgeCycleCount" description="Purge循环次数" max="200" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="30" name="PurgeCycleCount" description="Purge循环次数" max="200" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="120" name="PurgePumpTime" description="purge时pumpdown至设定压力时间" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
 		<config default="120" name="PurgePumpTime" description="purge时pumpdown至设定压力时间" max="7200" min="0" paramter="" tag="" unit="second" type="Integer" />
@@ -167,6 +171,7 @@
 
 
 		<config default="0" name="LLAutoVentInWaferOpt" nameView="Loadlock Aut Vent Option For Raw Wafer" description="当未做工艺wafer数量小于或等于此数量时,自动做Vent" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="0" name="LLAutoVentInWaferOpt" nameView="Loadlock Aut Vent Option For Raw Wafer" description="当未做工艺wafer数量小于或等于此数量时,自动做Vent" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="4" name="LLAutoVentOutWaferOpt" nameView="Loadlock Auto Vent Option For Processed Wafer" description="当已做工艺wafer数量大于或等于此数量时,自动做Vent" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 		<config default="4" name="LLAutoVentOutWaferOpt" nameView="Loadlock Auto Vent Option For Processed Wafer" description="当已做工艺wafer数量大于或等于此数量时,自动做Vent" max="10" min="0" paramter="" tag="" unit="N/A" type="Integer" />
+
 		<configs name="TM_MFC1" nameView="MFC1" >
 		<configs name="TM_MFC1" nameView="MFC1" >
 			<config default="true" name="Enable" nameView="Enable" description="启用气路" tag="" unit="N/A" type="Bool" />
 			<config default="true" name="Enable" nameView="Enable" description="启用气路" tag="" unit="N/A" type="Bool" />
 			<config default="O2" name="GasName" nameView="Gas Name" description="气体名称" tag="" unit="N/A" type="String" />
 			<config default="O2" name="GasName" nameView="Gas Name" description="气体名称" tag="" unit="N/A" type="String" />
@@ -222,6 +227,9 @@
 		<config default="30" name="LeakRate" description="Leak rate 触发上限" max="756000" min="0" paramter="" tag="" unit="PaPerMin" type="Double" />
 		<config default="30" name="LeakRate" description="Leak rate 触发上限" max="756000" min="0" paramter="" tag="" unit="PaPerMin" type="Double" />
 		<config default="2" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="N/A" type="Integer" Restart="1" />
 		<config default="2" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="N/A" type="Integer" Restart="1" />
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="Vent完成后延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer"/>
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="Vent完成后延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer"/>
+		<config default="1000" name="ExhaustValveOffDelayTime" nameView="Exhaust Valve Off Delay Time" description="关闭Exhaust Valve延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		<config default="3000" name="OverVentFlow" nameView="Over Vent Flow" description="" max="5000" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+
 		<!--<config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="N/A" type="Integer" />-->
 		<!--<config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="N/A" type="Integer" />-->
 		<config default="100" name="ControlPressureCheckPoint" nameView="Control Pressure CheckPoint" description="LLA Chamber 控压 检测值" max="300" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="100" name="ControlPressureCheckPoint" nameView="Control Pressure CheckPoint" description="LLA Chamber 控压 检测值" max="300" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="90"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="LLA Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="90"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="LLA Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="Pa" type="Integer" />
@@ -282,6 +290,9 @@
 		<config default="30" name="LeakRate" description="Leak rate 触发上限" max="756000" min="0" paramter="" tag="" unit="PaPerMin" type="Double" />
 		<config default="30" name="LeakRate" description="Leak rate 触发上限" max="756000" min="0" paramter="" tag="" unit="PaPerMin" type="Double" />
 		<config default="4" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="N/A" type="Integer" Restart="1" />
 		<config default="4" name="SlotNumber" nameView="Slot number"  description="槽位个数" max="60" min="1" paramter="" tag="" unit="N/A" type="Integer" Restart="1" />
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="Vent完成后延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
 		<config default="2000" name="OverVentTime" nameView="Over Vent Time Delay" description="Vent完成后延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		<config default="1000" name="ExhaustValveOffDelayTime" nameView="Exhaust Valve Off Delay Time" description="关闭Exhaust Valve延时时间" max="60000" min="0" paramter="" tag="" unit="ms" type="Integer" />
+		<config default="3000" name="OverVentFlow" nameView="Over Vent Flow" description="" max="5000" min="0" paramter="" tag="" unit="sccm" type="Integer" />
+
 		<!--<config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="N/A" type="Integer" />-->
 		<!--<config default="0" name="MFCWriteMode" nameView="MFCWriteMode" description=" 0:Flow; 1:Percent" max="1" min="0" paramter="" tag="" unit="N/A" type="Integer" />-->
 		<config default="100" name="ControlPressureCheckPoint" nameView="Control Pressure CheckPoint" description="LLA Chamber 控压 检测值" max="300" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="100" name="ControlPressureCheckPoint" nameView="Control Pressure CheckPoint" description="LLA Chamber 控压 检测值" max="300" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="90"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="LLA Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 		<config default="90"  name="ControlPressureSetPoint"   nameView="Control Pressure SetPoint"   description="LLA Chamber 控压 设定值" max="200" min="0" paramter="" tag="" unit="Pa" type="Integer" />
@@ -613,7 +624,7 @@
 		</configs>
 		</configs>
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
-			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
+			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" Restart="1"/>
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
@@ -947,7 +958,7 @@
 		</configs>
 		</configs>
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
-			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
+			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" Restart="1"/>
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
@@ -1281,7 +1292,7 @@
 		</configs>
 		</configs>
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
-			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
+			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" Restart="1"/>
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
@@ -1615,7 +1626,7 @@
 		</configs>
 		</configs>
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 		<configs name="PendulumValve" nameView="Pendulum Valve">
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
 			<config default="COM66" name="Port" nameView="Port" description="端口号" max="" min="" paramter="" tag="" unit="N/A" type="String" Restart="1" />
-			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" />
+			<config default="400" name="PressureFullRange" nameView="PressureFullRange" description="钟摆阀压力范围" max="13000" min="0" paramter="" tag="" unit="Pa" type="Integer" Restart="1"/>
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="ForelinePressureLimit" nameView="ForelinePressureLimit" description="前级管压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="80"  name="ChamberPressureLimit" nameView="ForelinePressureLimit" description="腔体压力限制范围" max="250" min="0" paramter="" tag="" unit="Pa" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />
 			<config default="100"  name="TurboPumpSpeedLimit"  nameView="Turbo PumpSpeed Limit" description="分子泵转速限制范围" max="3000" min="0" paramter="" tag="" unit="N/A" type="Integer" />

+ 3 - 1
Venus/Venus_RT/Config/System_Kepler2300.sccfg

@@ -47,8 +47,10 @@
 			<config default="Thick" name="LP2WaferThicknessType" nameView="LP2 wafer thickness type" description="Thin;Thick" max="" min="" paramter="" tag="" unit="0" type="String" />
 			<config default="Thick" name="LP2WaferThicknessType" nameView="LP2 wafer thickness type" description="Thin;Thick" max="" min="" paramter="" tag="" unit="0" type="String" />
 		</configs>
 		</configs>
 
 
-		<configs name="Job" nameView="Job"  >
+		<configs name="Job" nameView="Job">
 			<config default="10" name="BuzzerTimeWhenJobDone" nameView="Buzzer Time When Job Done"  description="buzzer time after job done, -1=never stop, 0=silent,xxx=buzzer time" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
 			<config default="10" name="BuzzerTimeWhenJobDone" nameView="Buzzer Time When Job Done"  description="buzzer time after job done, -1=never stop, 0=silent,xxx=buzzer time" max="300" min="0" paramter="" tag="" unit="s" type="Integer" />
+			<config default="60" name="PreCleanMaxIdleTime" nameView="Pre Clean Idle Max Time"  description="PreClean 超过最大时间再做" max="86400" min="0" paramter="" tag="" unit="s" type="Integer" />
+
 		</configs>
 		</configs>
 	</configs>
 	</configs>
 
 

+ 6 - 6
Venus/Venus_RT/Devices/EFEM/JetEfem.cs

@@ -922,12 +922,12 @@ namespace Venus_RT.Devices.EFEM
                             LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "System Sensor Vacuum/Air Pressure for PreAligner Abnormal");
                             LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "System Sensor Vacuum/Air Pressure for PreAligner Abnormal");
                             Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
                             Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
                         }
                         }
-                        if (!baData1[13])   // Bit[13] ON=Normal, OFF=Abnormal
-                        {
-                            //EV.Notify(EFEMFFUAlarm);
-                            LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "System Sensor Vacuum/Air Pressure for PreAligner2 Abnormal");
-                            Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
-                        }
+                        //if (!baData1[13])   // Bit[13] ON=Normal, OFF=Abnormal
+                        //{
+                        //    //EV.Notify(EFEMFFUAlarm);
+                        //    LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, ModuleName.EFEM, "System Sensor Vacuum/Air Pressure for PreAligner2 Abnormal");
+                        //    Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
+                        //}
 
 
                         // DATA2
                         // DATA2
                         _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);
                         _signalT.ChangeLightStatus(LightType.RED, baData2[0] ? LightStatus.ON : baData2[5] ? LightStatus.BLINK : LightStatus.OFF);

+ 13 - 12
Venus/Venus_RT/Devices/IODevices/IoTMPressureCtl.cs

@@ -96,18 +96,19 @@ namespace Venus_RT.Devices
 
 
         public void Monitor()
         public void Monitor()
         {
         {
-            _trigTMPressureGauge.CLK = TMPressureGauge.GaugeAlarm;
-            if (_trigTMPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "MF pressure gauge Alarm");
-            _trigLLAPressureGauge.CLK = LLAPressureGauge.GaugeAlarm;
-            if (_trigLLAPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Chamber pressure gauge Alarm");
-            _trigLLBPressureGauge.CLK = LLBPressureGauge.GaugeAlarm;
-            if (_trigLLBPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Foreline pressure gauge Alarm");
-
-            _trigMFForelineGauge.CLK = MFForelineGauge.GaugeAlarm;
-            if (_trigMFForelineGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Process High Gauge Alarm");
-
-            _trigLLAForelineGauge.CLK = LLAForelineGauge.GaugeAlarm;
-            if (_trigLLAForelineGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Process Low Gauge Alarm");
+            //_trigTMPressureGauge.CLK = TMPressureGauge.GaugeAlarm;
+            //if (_trigTMPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "MF pressure gauge Alarm");
+
+            //_trigLLAPressureGauge.CLK = LLAPressureGauge.GaugeAlarm;
+            //if (_trigLLAPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Chamber pressure gauge Alarm");
+            //_trigLLBPressureGauge.CLK = LLBPressureGauge.GaugeAlarm;
+            //if (_trigLLBPressureGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Foreline pressure gauge Alarm");
+
+            //_trigMFForelineGauge.CLK = MFForelineGauge.GaugeAlarm;
+            //if (_trigMFForelineGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Process High Gauge Alarm");
+
+            //_trigLLAForelineGauge.CLK = LLAForelineGauge.GaugeAlarm;
+            //if (_trigLLAForelineGauge.Q) LOG.Write(eEvent.ERR_DEVICE_INFO, Module, "Process Low Gauge Alarm");
         }
         }
 
 
 
 

+ 5 - 4
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -667,9 +667,9 @@ namespace Venus_RT.Modules.PMs
             WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleHelper.Converter(Module.ToString()), 0);
             WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleHelper.Converter(Module.ToString()), 0);
             if (!waferInfo.IsEmpty)
             if (!waferInfo.IsEmpty)
             {
             {
-                WaferId = waferInfo.InnerId.ToString();
+                WaferId =string.IsNullOrEmpty(waferInfo.EAPWaferID) ? waferInfo.InnerId.ToString(): waferInfo.EAPWaferID;
                 SlotID = waferInfo.OriginSlot.ToString();
                 SlotID = waferInfo.OriginSlot.ToString();
-                LotID = waferInfo.ProcessJob == null || string.IsNullOrEmpty(waferInfo.ProcessJob.ControlJobName) ? "" : waferInfo.ProcessJob.ControlJobName;
+                LotID = waferInfo.ProcessJob == null || string.IsNullOrEmpty(waferInfo.ProcessJob.LotName) ? "" : waferInfo.ProcessJob.LotName;
                 if (RtInstance.ConfigType == ConfigType.Kepler2200 && waferInfo.ProcessJob!=null)
                 if (RtInstance.ConfigType == ConfigType.Kepler2200 && waferInfo.ProcessJob!=null)
                 {
                 {
                    string lp = waferInfo.ProcessJob.SlotWafers[0].Item1.ToString();
                    string lp = waferInfo.ProcessJob.SlotWafers[0].Item1.ToString();
@@ -681,12 +681,13 @@ namespace Venus_RT.Modules.PMs
             switch (_currentRecipe.Header.Type)
             switch (_currentRecipe.Header.Type)
             {
             {
                 case RecipeType.Clean:
                 case RecipeType.Clean:
-                    ProcessDataRecorder.RecordPrecess(RecipeId, RecipeStartTime, RecipeEndTime, _currentRecipe.Header.Name, result, "", _chamber.Name, "", "", _currentRecipe.Header.Type.ToString(),"");
+                    ProcessDataRecorder.RecordPrecess(RecipeId, RecipeStartTime, RecipeEndTime, _currentRecipe.Header.Name, result, "", _chamber.Name, "", "", _currentRecipe.Header.Type.ToString(),"","");
                     break;
                     break;
                 case RecipeType.Chuck:
                 case RecipeType.Chuck:
                 case RecipeType.DeChuck:
                 case RecipeType.DeChuck:
                 case RecipeType.Process:
                 case RecipeType.Process:
-                    ProcessDataRecorder.RecordPrecess(RecipeId, RecipeStartTime, RecipeEndTime, _currentRecipe.Header.Name, result, WaferId, _chamber.Name, LotID, SlotID, _currentRecipe.Header.Type.ToString(), carrierId);
+
+                    ProcessDataRecorder.RecordPrecess(RecipeId, RecipeStartTime, RecipeEndTime, _currentRecipe.Header.Name, result, WaferId, _chamber.Name, LotID, SlotID, _currentRecipe.Header.Type.ToString(), carrierId, waferInfo.LotType) ;
                     break;
                     break;
             }
             }
 
 

+ 73 - 7
Venus/Venus_RT/Modules/RouteManager.cs

@@ -1257,7 +1257,14 @@ namespace Venus_RT.Modules
             switch (command.ToUpper())
             switch (command.ToUpper())
             {
             {
                 case "PP-SELECT":
                 case "PP-SELECT":
-                    return FaCreateJob(paras, out reason);
+                    if (RtInstance.ConfigType == ConfigType.Kepler2200)
+                    {
+                        return FaKepler2200CreateJob(paras, out reason);
+                    }
+                    else
+                    {
+                        return FaCreateJob(paras, out reason);
+                    }                   
                 case "STARTJOB":
                 case "STARTJOB":
                     //return FaStartJob(paras[0].ToString(), out reason);
                     //return FaStartJob(paras[0].ToString(), out reason);
                     return CheckToPostMessage((int)MSG.StartEAPJob, paras);
                     return CheckToPostMessage((int)MSG.StartEAPJob, paras);
@@ -1305,7 +1312,49 @@ namespace Venus_RT.Modules
                 object[] tmpArys=(object[])paras[3];
                 object[] tmpArys=(object[])paras[3];
                 string[] strAry = new string[tmpArys.Length];
                 string[] strAry = new string[tmpArys.Length];
 
 
-                if (RtInstance.ConfigType == ConfigType.Kepler2200 && SC.GetValue<int>("System.Job.PPSelectFoupMode") == 0)
+                for (int i = 0; i < tmpArys.Length; i++)
+                {
+                    strAry[i] = tmpArys[i].ToString();
+                }
+                
+                           
+                createParams["SlotSequence"] = strAry;
+                
+                createParams["AutoStart"] = true;
+                if (paras.Length >= 5)
+                {
+                    createParams["PreCleanRecipeName"] = paras[4].ToString();
+                }
+                if (paras.Length >= 6)
+                {
+                    createParams["PostCleabRecipeName"] = paras[5].ToString();
+                }
+                return _AutoCycle.CreateJob(createParams, out reason);
+            }
+        }
+        /// <summary>
+        /// Fa创建任务
+        /// </summary>
+        /// <param name="paras"></param>
+        /// <param name="reason"></param>
+        /// <returns></returns>
+        private bool FaKepler2200CreateJob(object[] paras, out string reason)
+        {
+            if (!CheckAuto())
+            {
+                reason = "System is not in Auto,cannot create job";
+                return false;
+            }
+            else
+            {
+                Dictionary<string, object> createParams = new Dictionary<string, object>();
+                createParams["Module"] = $"LP{paras[0]}";
+                createParams["JobId"] = paras[1].ToString();
+                createParams["LotId"] = paras[2].ToString();
+                object[] tmpArys = (object[])paras[3];
+                string[] strAry = new string[tmpArys.Length];
+
+                if (SC.GetValue<int>("System.Job.PPSelectFoupMode") == 0)
                 {
                 {
                     for (int i = 0; i < tmpArys.Length; i++)
                     for (int i = 0; i < tmpArys.Length; i++)
                     {
                     {
@@ -1319,17 +1368,34 @@ namespace Venus_RT.Modules
                         strAry[i] = tmpArys[i].ToString();
                         strAry[i] = tmpArys[i].ToString();
                     }
                     }
                 }
                 }
-                           
-                createParams["SlotSequence"] = strAry;
-                createParams["AutoStart"] = true;
+                string[] stringWaferIds = new string[tmpArys.Length];
+                string lotType = "";
                 if (paras.Length >= 5)
                 if (paras.Length >= 5)
                 {
                 {
-                    createParams["PreCleanRecipeName"] = paras[4].ToString();
+                    object[] waferIdArys = (object[])paras[4];
+
+                    if (RtInstance.ConfigType == ConfigType.Kepler2200 && SC.GetValue<int>("System.Job.PPSelectFoupMode") == 0)
+                    {
+                        for (int i = 0; i < waferIdArys.Length; i++)
+                        {
+                            stringWaferIds[i] = waferIdArys[waferIdArys.Length - 1 - i].ToString();
+                        }
+                    }
+                    else
+                    {
+                        for (int i = 0; i < waferIdArys.Length; i++)
+                        {
+                            stringWaferIds[i] = waferIdArys[i].ToString();
+                        }
+                    }
                 }
                 }
                 if (paras.Length >= 6)
                 if (paras.Length >= 6)
                 {
                 {
-                    createParams["PostCleabRecipeName"] = paras[5].ToString();
+                    createParams["LotType"] = paras[5].ToString();
                 }
                 }
+                createParams["SlotSequence"] = strAry;
+                createParams["WaferId"] = stringWaferIds;
+                createParams["AutoStart"] = true;
                 return _AutoCycle.CreateJob(createParams, out reason);
                 return _AutoCycle.CreateJob(createParams, out reason);
             }
             }
         }
         }

+ 115 - 59
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -27,6 +27,7 @@ using Venus_Unity;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
 using System.Linq.Expressions;
 using System.Linq.Expressions;
 using Aitex.Core.UI.Control;
 using Aitex.Core.UI.Control;
+using SecsGem.Core.ItemModel;
 
 
 namespace Venus_RT.Modules
 namespace Venus_RT.Modules
 {
 {
@@ -91,11 +92,12 @@ namespace Venus_RT.Modules
 
 
         private DateTime _scheduledTime;
         private DateTime _scheduledTime;
 
 
+        public ModuleName DestinationPM { get; set; }
         public WaferTask(ModuleName source, int srcSlot, ModuleName dest, int dstSlot, float temp, Guid waferID, Guid lotID, string recipeName, string wtwClean, SequenceLLInOutPath inOutPath, int LLDelay, bool needAlign)
         public WaferTask(ModuleName source, int srcSlot, ModuleName dest, int dstSlot, float temp, Guid waferID, Guid lotID, string recipeName, string wtwClean, SequenceLLInOutPath inOutPath, int LLDelay, bool needAlign)
         {
         {
             sourceMod = currentMod = nextMod = routedMod = source;
             sourceMod = currentMod = nextMod = routedMod = source;
             sourceSlot = currentSlot = nextSlot = routedSlot = srcSlot;
             sourceSlot = currentSlot = nextSlot = routedSlot = srcSlot;
-
+            DestinationPM = dest;
             destMod = dest;
             destMod = dest;
             destSlot = dstSlot;
             destSlot = dstSlot;
             hand = Hand.None;
             hand = Hand.None;
@@ -593,6 +595,7 @@ namespace Venus_RT.Modules
 
 
         public void InvokePreJobClean(string preJobClean)
         public void InvokePreJobClean(string preJobClean)
         {
         {
+
             _preJobCleanRecipe = preJobClean;
             _preJobCleanRecipe = preJobClean;
             _pendingCleanTask.Enqueue(CleanType.PreJobClean);
             _pendingCleanTask.Enqueue(CleanType.PreJobClean);
             //LOG.Write(eEvent.INFO_TROUGHPUT_ENHANCE_TRACE, Module, $"Invoke preClean {preJobClean}");
             //LOG.Write(eEvent.INFO_TROUGHPUT_ENHANCE_TRACE, Module, $"Invoke preClean {preJobClean}");
@@ -947,6 +950,9 @@ namespace Venus_RT.Modules
         public List<string> LP1InUseRecipes = new List<string>();
         public List<string> LP1InUseRecipes = new List<string>();
         public List<string> LP2InUseRecipes = new List<string>();
         public List<string> LP2InUseRecipes = new List<string>();
         public List<string> LP3InUseRecipes = new List<string>();
         public List<string> LP3InUseRecipes = new List<string>();
+
+        private Dictionary<ModuleName, DateTime> _pmLastWaferEndTime = new Dictionary<ModuleName, DateTime>();
+        private int _preCleanMaxIdleTime = 60;
         #region public interface
         #region public interface
         public SystemDispatcher()
         public SystemDispatcher()
         {
         {
@@ -984,6 +990,15 @@ namespace Venus_RT.Modules
             {
             {
                 LOG.ModuleErrorInterrupt += (modulename, id) => ModuleErrorInterrupt(modulename, id);
                 LOG.ModuleErrorInterrupt += (modulename, id) => ModuleErrorInterrupt(modulename, id);
             }
             }
+
+            ModuleHelper.InstalledModules.ForEach(x =>
+            {
+                if (ModuleHelper.IsPm(x))
+                {
+                    _pmLastWaferEndTime.Add(x, DateTime.Now.AddDays(-1));
+                }
+            });
+
         }
         }
         private void ModuleErrorInterrupt(ModuleName pmname, eEvent eEventid)
         private void ModuleErrorInterrupt(ModuleName pmname, eEvent eEventid)
         {
         {
@@ -993,7 +1008,7 @@ namespace Venus_RT.Modules
                 x.Sequence.PMs.ForEach(m => modules.Add(m));
                 x.Sequence.PMs.ForEach(m => modules.Add(m));
             });
             });
             if (modules.Contains(pmname) && (eEventid == eEvent.ERR_PM_SCRUBBER_NOOK_CONTINUEPROCESS || eEventid == eEvent.ERR_PM_SCRUBBER_NOOK_STOPPROCESS))
             if (modules.Contains(pmname) && (eEventid == eEvent.ERR_PM_SCRUBBER_NOOK_CONTINUEPROCESS || eEventid == eEvent.ERR_PM_SCRUBBER_NOOK_STOPPROCESS))
-            { 
+            {
                 Singleton<RouteManager>.Instance.InvokeAbort(new object[] { ModuleName.System });
                 Singleton<RouteManager>.Instance.InvokeAbort(new object[] { ModuleName.System });
                 LOG.Write(eEvent.ERR_PM_SCRUBBER_NOOK_STOPTRANSFER, ModuleName.System, $"{pmname} Scrubber Alarm ,Tranfer Stop");
                 LOG.Write(eEvent.ERR_PM_SCRUBBER_NOOK_STOPTRANSFER, ModuleName.System, $"{pmname} Scrubber Alarm ,Tranfer Stop");
             }
             }
@@ -1027,7 +1042,7 @@ namespace Venus_RT.Modules
             _tmRobotSingleArmOption = SC.GetValue<int>("TM.SingleArmOption");
             _tmRobotSingleArmOption = SC.GetValue<int>("TM.SingleArmOption");
             _LLSlotInOutOption = (LLSlotInOutOpt)SC.GetValue<int>("System.LoadlockSlotInOutOption");
             _LLSlotInOutOption = (LLSlotInOutOpt)SC.GetValue<int>("System.LoadlockSlotInOutOption");
             _specialRoutingPattern = (SpecialRoutingPattern)SC.GetValue<int>("System.SpecialRoutingPattern");
             _specialRoutingPattern = (SpecialRoutingPattern)SC.GetValue<int>("System.SpecialRoutingPattern");
-
+            _preCleanMaxIdleTime = SC.GetValue<int>("System.Job.PreCleanIdleMaxTime");
             // rounding TM robot single arm option
             // rounding TM robot single arm option
             if (_tmRobotSingleArmOption > 2 && _LLSlotInOutOption == LLSlotInOutOpt.AllInAllOut)
             if (_tmRobotSingleArmOption > 2 && _LLSlotInOutOption == LLSlotInOutOpt.AllInAllOut)
             {
             {
@@ -1062,7 +1077,7 @@ namespace Venus_RT.Modules
             RoutingVacWafers();
             RoutingVacWafers();
 
 
             epilogue();
             epilogue();
-           
+
             return _cycleState;
             return _cycleState;
         }
         }
 
 
@@ -1075,6 +1090,26 @@ namespace Venus_RT.Modules
             reason = "";
             reason = "";
 
 
             string[] slotSequence = (string[])param["SlotSequence"];
             string[] slotSequence = (string[])param["SlotSequence"];
+            string[] slotWaferId = new string[slotSequence.Length];
+            if (param.Keys.Contains("WaferId"))
+            {
+                slotWaferId = (string[])param["WaferId"];
+            }
+            else
+            {
+                for (int i = 0; i < slotWaferId.Length; i++)
+                {
+                    slotWaferId[i] = "";
+                }
+            }
+
+            string lotType = "";
+            if (param.Keys.Contains("LotType"))
+            {
+                lotType = (string)param["LotType"];
+            }
+
+
             string module = (string)param["Module"];
             string module = (string)param["Module"];
 
 
             string jobId = (string)param["JobId"];
             string jobId = (string)param["JobId"];
@@ -1188,6 +1223,8 @@ namespace Venus_RT.Modules
                 WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i);
                 WaferInfo waferInfo = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i);
                 cj.LotWafers.Add(waferInfo);
                 cj.LotWafers.Add(waferInfo);
                 waferInfo.SequenceName = slotSequence[i];
                 waferInfo.SequenceName = slotSequence[i];
+                waferInfo.EAPWaferID = slotWaferId[i];
+                waferInfo.LotType = lotType;
                 waferInfo.LotId = lotId;
                 waferInfo.LotId = lotId;
                 //--- 2024-03-21 增加了waferinfo 相应的lotId信息 end---
                 //--- 2024-03-21 增加了waferinfo 相应的lotId信息 end---
 
 
@@ -1580,26 +1617,26 @@ namespace Venus_RT.Modules
             ModuleName SourceModule = (ModuleName)objs[0];
             ModuleName SourceModule = (ModuleName)objs[0];
             int SourceSlot = (int)objs[1];
             int SourceSlot = (int)objs[1];
 
 
-            if (!_dictModuleTask.Keys.Contains(SourceModule))
-            {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"Invalid source module {SourceModule} for manual return wafer");
-                return false;
-            }
+            //if (!_dictModuleTask.Keys.Contains(SourceModule))
+            //{
+            //    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"Invalid source module {SourceModule} for manual return wafer");
+            //    return false;
+            //}
 
 
-            if (WaferManager.Instance.CheckNoWafer(SourceModule, SourceSlot))
-            {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"Can not return wafer as {SourceModule} {SourceSlot} has no wafer");
-                return false;
-            }
+            //if (WaferManager.Instance.CheckNoWafer(SourceModule, SourceSlot))
+            //{
+            //    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"Can not return wafer as {SourceModule} {SourceSlot} has no wafer");
+            //    return false;
+            //}
 
 
-            if (!_dictModuleTask[SourceModule].Scheduler.IsIdle)
-            {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"The module: {SourceModule} is not ready for return wafer");
-                return false;
-            }
+            //if (!_dictModuleTask[SourceModule].Scheduler.IsIdle)
+            //{
+            //    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"The module: {SourceModule} is not ready for return wafer");
+            //    return false;
+            //}
 
 
             var wafer = WaferManager.Instance.GetWafer(SourceModule, SourceSlot);
             var wafer = WaferManager.Instance.GetWafer(SourceModule, SourceSlot);
-            LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"Manual return  wafer: {wafer.WaferOrigin} at {SourceModule} {SourceSlot} while system is auto running");
+            //LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"Manual return  wafer: {wafer.WaferOrigin} at {SourceModule} {SourceSlot} while system is auto running");
 
 
             _qeReturnWafers.Enqueue(wafer);
             _qeReturnWafers.Enqueue(wafer);
             return true;
             return true;
@@ -1609,17 +1646,17 @@ namespace Venus_RT.Modules
         {
         {
             var pmWaferCount = _dictModuleTask.Where(mod => ModuleHelper.IsPm(mod.Key) && WaferManager.Instance.CheckHasWafer(mod.Key, 0)).Count();
             var pmWaferCount = _dictModuleTask.Where(mod => ModuleHelper.IsPm(mod.Key) && WaferManager.Instance.CheckHasWafer(mod.Key, 0)).Count();
             var tmRobotWaferCount = (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 0) ? 1 : 0) + (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 1) ? 1 : 0);
             var tmRobotWaferCount = (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 0) ? 1 : 0) + (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 1) ? 1 : 0);
-            if (!_dictModuleTask[ModuleName.TMRobot].Scheduler.IsIdle && (pmWaferCount > 0 || tmRobotWaferCount > 0))
-            {
-                LOG.Write(eEvent.ERR_ROUTER, ModuleName.TMRobot, $"The TM Robot is not ready for return wafer.");
-                return RState.Failed;
-            }
+            //if (!_dictModuleTask[ModuleName.TMRobot].Scheduler.IsIdle && (pmWaferCount > 0 || tmRobotWaferCount > 0))
+            //{
+            //    LOG.Write(eEvent.ERR_ROUTER, ModuleName.TMRobot, $"The TM Robot is not ready for return wafer.");
+            //    return RState.Failed;
+            //}
 
 
-            if (!_dictModuleTask[ModuleName.EfemRobot].Scheduler.IsIdle)
-            {
-                LOG.Write(eEvent.ERR_ROUTER, ModuleName.EfemRobot, $"The EFEM Robot is not ready for return wafer.");
-                return RState.Failed;
-            }
+            //if (!_dictModuleTask[ModuleName.EfemRobot].Scheduler.IsIdle)
+            //{
+            //    LOG.Write(eEvent.ERR_ROUTER, ModuleName.EfemRobot, $"The EFEM Robot is not ready for return wafer.");
+            //    return RState.Failed;
+            //}
 
 
             foreach (var mod in _dictModuleTask)
             foreach (var mod in _dictModuleTask)
             {
             {
@@ -1629,11 +1666,11 @@ namespace Venus_RT.Modules
                 if (!mod.Value.Scheduler.IsInclude)
                 if (!mod.Value.Scheduler.IsInclude)
                     continue;
                     continue;
 
 
-                if (!mod.Value.Scheduler.IsIdle)
-                {
-                    LOG.Write(eEvent.ERR_ROUTER, mod.Key, $"{mod.Key} is not ready for return wafer.");
-                    return RState.Failed;
-                }
+                //if (!mod.Value.Scheduler.IsIdle)
+                //{
+                //    LOG.Write(eEvent.ERR_ROUTER, mod.Key, $"{mod.Key} is not ready for return wafer.");
+                //    return RState.Failed;
+                //}
 
 
                 int nSlotNumber = ModuleHelper.IsLoadLock(mod.Key) ? (mod.Key == ModuleName.LLA ? _LLASlotNumber : _LLBSlotNumber) : (ModuleHelper.IsTMRobot(mod.Key) || ModuleHelper.IsEFEMRobot(mod.Key) ? 2 : 1);
                 int nSlotNumber = ModuleHelper.IsLoadLock(mod.Key) ? (mod.Key == ModuleName.LLA ? _LLASlotNumber : _LLBSlotNumber) : (ModuleHelper.IsTMRobot(mod.Key) || ModuleHelper.IsEFEMRobot(mod.Key) ? 2 : 1);
                 for (int slot = 0; slot < nSlotNumber; slot++)
                 for (int slot = 0; slot < nSlotNumber; slot++)
@@ -1643,18 +1680,19 @@ namespace Venus_RT.Modules
                         continue;
                         continue;
 
 
                     var destLP = (ModuleName)wafer.OriginStation;
                     var destLP = (ModuleName)wafer.OriginStation;
-                    if (!_dictModuleTask[destLP].Scheduler.IsAvailable)
-                    {
-                        LOG.Write(eEvent.ERR_ROUTER, destLP, $"The destination Loadport {destLP} is not ready for return wafer.");
-                        return RState.Failed;
-                    }
+                    //if (!_dictModuleTask[destLP].Scheduler.IsAvailable)
+                    //{
+                    //    LOG.Write(eEvent.ERR_ROUTER, destLP, $"The destination Loadport {destLP} is not ready for return wafer.");
+                    //    return RState.Failed;
+                    //}
 
 
-                    if (!ModuleHelper.IsLoadPort(destLP))
-                    {
-                        LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"The wafer {wafer.WaferOrigin} cannot be return, please manually drag it.");
-                        return RState.Failed;
-                    }
+                    //if (!ModuleHelper.IsLoadPort(destLP))
+                    //{
+                    //    LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"The wafer {wafer.WaferOrigin} cannot be return, please manually drag it.");
+                    //    return RState.Failed;
+                    //}
                 }
                 }
+
             }
             }
 
 
             Clear();
             Clear();
@@ -1696,6 +1734,7 @@ namespace Venus_RT.Modules
             if (systemWaferCount == 0)
             if (systemWaferCount == 0)
                 return RState.End;
                 return RState.End;
 
 
+
             if (_qeWaitCoolingLLs.Count > 0 && _dictModuleTask[_qeWaitCoolingLLs.First()].Scheduler.IsIdle && !IsLLReservedByEFEM(_qeWaitCoolingLLs.First()) && !IsLLReservedByTM(_qeWaitCoolingLLs.First()))
             if (_qeWaitCoolingLLs.Count > 0 && _dictModuleTask[_qeWaitCoolingLLs.First()].Scheduler.IsIdle && !IsLLReservedByEFEM(_qeWaitCoolingLLs.First()) && !IsLLReservedByTM(_qeWaitCoolingLLs.First()))
             {
             {
                 if ((_dictModuleTask[_qeWaitCoolingLLs.First()] as LoadlockTask).Cooling())
                 if ((_dictModuleTask[_qeWaitCoolingLLs.First()] as LoadlockTask).Cooling())
@@ -1770,6 +1809,17 @@ namespace Venus_RT.Modules
             RunLotCleanTasks();
             RunLotCleanTasks();
 
 
             CreateNewWaferTask();
             CreateNewWaferTask();
+
+            //var endWaferTask = _lstWaferTasks.Where(item => ModuleHelper.IsLoadPort(item.destMod) && ModuleHelper.IsLoadPort(item.currentMod) && item.pressureStatus == RState.End);
+            //if (endWaferTask.Count() > 0)
+            //{
+            //    foreach (var waferTask in endWaferTask)
+            //    {
+            //        var pj = _lstProcessJobs.Find(process => process.InnerId == waferTask.lotId);
+            //        //_pmLastWaferEndTime[waferTask.DestinationPM] = DateTime.Now;
+            //    }
+            //}
+
             _lstWaferTasks.RemoveAll(item => ModuleHelper.IsLoadPort(item.destMod) && ModuleHelper.IsLoadPort(item.currentMod) && item.pressureStatus == RState.End);
             _lstWaferTasks.RemoveAll(item => ModuleHelper.IsLoadPort(item.destMod) && ModuleHelper.IsLoadPort(item.currentMod) && item.pressureStatus == RState.End);
 
 
             ReDispatchBlockingWafers();
             ReDispatchBlockingWafers();
@@ -2242,6 +2292,10 @@ namespace Venus_RT.Modules
         private void WaferLeaved(WaferTask wafer, MoveItem item)
         private void WaferLeaved(WaferTask wafer, MoveItem item)
         {
         {
             _dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
             _dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
+            if (ModuleHelper.IsPm(item.SourceModule))
+            {
+                _pmLastWaferEndTime[item.SourceModule] = DateTime.Now;
+            }
 
 
             //--2024-03-21 增加了PortJobWaferStart 上报事件 start--
             //--2024-03-21 增加了PortJobWaferStart 上报事件 start--
             if (ModuleHelper.IsLoadPort(item.SourceModule))
             if (ModuleHelper.IsLoadPort(item.SourceModule))
@@ -3199,7 +3253,6 @@ namespace Venus_RT.Modules
                         hands.Add((Hand)i);
                         hands.Add((Hand)i);
                 }
                 }
             }
             }
-
             return hands;
             return hands;
         }
         }
 
 
@@ -3527,7 +3580,7 @@ namespace Venus_RT.Modules
                         var inLLWafers = _lstWaferTasks.FindAll(wt => wt.currentMod == inLL).ToList();
                         var inLLWafers = _lstWaferTasks.FindAll(wt => wt.currentMod == inLL).ToList();
 
 
                         int pickCount = 0;
                         int pickCount = 0;
-                        foreach(var inWafer in inLLWafers)
+                        foreach (var inWafer in inLLWafers)
                         {
                         {
                             if (!_dictModuleTask[inWafer.destMod].HasWafer && _dictModuleTask[inWafer.destMod].TimeToReady < 20 && pickCount < freeHands.Count)
                             if (!_dictModuleTask[inWafer.destMod].HasWafer && _dictModuleTask[inWafer.destMod].TimeToReady < 20 && pickCount < freeHands.Count)
                             {
                             {
@@ -3537,21 +3590,21 @@ namespace Venus_RT.Modules
                             }
                             }
                         }
                         }
 
 
-                        if(pickCount == 2)
+                        if (pickCount == 2)
                         {
                         {
                             _tmSchdActions.Enqueue(pickActions);
                             _tmSchdActions.Enqueue(pickActions);
-                            foreach(var ac in placeActions)
+                            foreach (var ac in placeActions)
                             {
                             {
                                 _tmSchdActions.Enqueue(new List<MoveItem> { ac });
                                 _tmSchdActions.Enqueue(new List<MoveItem> { ac });
                             }
                             }
                         }
                         }
-                        else if(pickCount == 1)
+                        else if (pickCount == 1)
                         {
                         {
-                            if(inLLWafers.Count == 2 && freeHands.Count == 2)
+                            if (inLLWafers.Count == 2 && freeHands.Count == 2)
                             {
                             {
                                 var peerSlot = 1 - pickActions.First().SourceSlot;
                                 var peerSlot = 1 - pickActions.First().SourceSlot;
                                 var peerWafer = inLLWafers.Find(wt => wt.currentSlot == peerSlot);
                                 var peerWafer = inLLWafers.Find(wt => wt.currentSlot == peerSlot);
-                                if(peerWafer != null && _dictModuleTask[peerWafer.destMod].TimeToReady < 60)
+                                if (peerWafer != null && _dictModuleTask[peerWafer.destMod].TimeToReady < 60)
                                 {
                                 {
                                     pickActions.Add(new MoveItem(peerWafer.currentMod, peerWafer.currentSlot, ModuleName.TMRobot, (int)freeHands[pickCount], freeHands[pickCount]));
                                     pickActions.Add(new MoveItem(peerWafer.currentMod, peerWafer.currentSlot, ModuleName.TMRobot, (int)freeHands[pickCount], freeHands[pickCount]));
                                 }
                                 }
@@ -4146,7 +4199,7 @@ namespace Venus_RT.Modules
                             destLL = readyPushInLLs.Last().Key;
                             destLL = readyPushInLLs.Last().Key;
                         }
                         }
 
 
-                       var pickHand = SelectTMPickArm(destLL);
+                        var pickHand = SelectTMPickArm(destLL);
                         var llWafers = _lstWaferTasks.Where(x => x.currentMod == destLL).ToList();
                         var llWafers = _lstWaferTasks.Where(x => x.currentMod == destLL).ToList();
                         if (llWafers.Count() == 0)
                         if (llWafers.Count() == 0)
                         {
                         {
@@ -4154,11 +4207,11 @@ namespace Venus_RT.Modules
                         }
                         }
                         for (int i = 0; i < llWafers.Count(); i++)
                         for (int i = 0; i < llWafers.Count(); i++)
                         {
                         {
-                            if (_lstWaferTasks.Count(x => ModuleHelper.IsPm(x.currentMod) && llWafers[i].destMod==x.currentMod)==0)
+                            if (_lstWaferTasks.Count(x => ModuleHelper.IsPm(x.currentMod) && llWafers[i].destMod == x.currentMod) == 0)
                             {
                             {
                                 _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(destLL, GetLLFixedReadyInOutSlots(destLL).tOutSlot.First(), ModuleName.TMRobot, (int)pickHand, pickHand) });
                                 _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(destLL, GetLLFixedReadyInOutSlots(destLL).tOutSlot.First(), ModuleName.TMRobot, (int)pickHand, pickHand) });
                             }
                             }
-                        } 
+                        }
                         //if (_lstWaferTasks.Count(x => ModuleHelper.IsPm(x.currentMod)) == 0)
                         //if (_lstWaferTasks.Count(x => ModuleHelper.IsPm(x.currentMod)) == 0)
                         //{ 
                         //{ 
                         //_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(destLL, GetLLFixedReadyInOutSlots(destLL).tOutSlot.First(), ModuleName.TMRobot, (int)pickHand, pickHand) });
                         //_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(destLL, GetLLFixedReadyInOutSlots(destLL).tOutSlot.First(), ModuleName.TMRobot, (int)pickHand, pickHand) });
@@ -4705,7 +4758,7 @@ namespace Venus_RT.Modules
                         schdPumpingLLs.Add(ModuleName.LLA);
                         schdPumpingLLs.Add(ModuleName.LLA);
                 }
                 }
                 else if ((llaWaferStatus.outSlot.Count == _LLASlotNumber) ||
                 else if ((llaWaferStatus.outSlot.Count == _LLASlotNumber) ||
-                         (llaWaferStatus.outSlot.Count > 0 && llaWaferStatus.outSlot.Count < _LLASlotNumber && !NeedPairingForNexWafer()))
+                         (llaWaferStatus.outSlot.Count > 0 && llaWaferStatus.outSlot.Count < _LLASlotNumber))
                 {
                 {
                     if (!schdVentingLLs.Contains(ModuleName.LLA))
                     if (!schdVentingLLs.Contains(ModuleName.LLA))
                         schdCoolingLLs.Add(ModuleName.LLA);
                         schdCoolingLLs.Add(ModuleName.LLA);
@@ -4718,7 +4771,7 @@ namespace Venus_RT.Modules
                         schdPumpingLLs.Add(ModuleName.LLB);
                         schdPumpingLLs.Add(ModuleName.LLB);
                 }
                 }
                 else if ((llbWaferStatus.outSlot.Count == _LLBSlotNumber) ||
                 else if ((llbWaferStatus.outSlot.Count == _LLBSlotNumber) ||
-                         (llbWaferStatus.outSlot.Count > 0 && llbWaferStatus.outSlot.Count < _LLBSlotNumber && !NeedPairingForNexWafer()))
+                         (llbWaferStatus.outSlot.Count > 0 && llbWaferStatus.outSlot.Count < _LLBSlotNumber))
                 {
                 {
                     if (!schdVentingLLs.Contains(ModuleName.LLB))
                     if (!schdVentingLLs.Contains(ModuleName.LLB))
                         schdCoolingLLs.Add(ModuleName.LLB);
                         schdCoolingLLs.Add(ModuleName.LLB);
@@ -4781,7 +4834,10 @@ namespace Venus_RT.Modules
                         var preClean = pj.Sequence.GetPreCleanRecipe(pm.Key);
                         var preClean = pj.Sequence.GetPreCleanRecipe(pm.Key);
                         if (!string.IsNullOrWhiteSpace(preClean))
                         if (!string.IsNullOrWhiteSpace(preClean))
                         {
                         {
-                            pmTask.InvokePreJobClean(preClean);
+                            if (DateTime.Now.Subtract(_pmLastWaferEndTime[pm.Key]).TotalSeconds > _preCleanMaxIdleTime)
+                            {
+                                pmTask.InvokePreJobClean(preClean);
+                            }
                             _preLotCleanMarks[pm.Key].Add(waitInWafer.lotId);
                             _preLotCleanMarks[pm.Key].Add(waitInWafer.lotId);
                         }
                         }
                     }
                     }
@@ -5011,7 +5067,7 @@ namespace Venus_RT.Modules
                         return;
                         return;
 
 
                     var llActions = _curTmAction.Find(ac => ModuleHelper.IsLoadLock(ac.DestinationModule));
                     var llActions = _curTmAction.Find(ac => ModuleHelper.IsLoadLock(ac.DestinationModule));
-                    if(llActions != null && !_qeWaitCoolingLLs.Contains(llActions.DestinationModule) && !RouteManager.IsATMMode)
+                    if (llActions != null && !_qeWaitCoolingLLs.Contains(llActions.DestinationModule) && !RouteManager.IsATMMode)
                     {
                     {
                         _qeWaitCoolingLLs.Enqueue(llActions.DestinationModule);
                         _qeWaitCoolingLLs.Enqueue(llActions.DestinationModule);
                     }
                     }

+ 26 - 2
Venus/Venus_RT/Modules/TM/MFPurgeRoutine.cs

@@ -83,6 +83,14 @@ namespace Venus_RT.Modules.TM
 
 
         public void Abort()
         public void Abort()
         {
         {
+            if (Module == ModuleName.LLA)
+            {
+                _JetTM.SetLLAFlow(0);
+            }
+            else if (Module == ModuleName.LLB)
+            {
+                _JetTM.SetLLBFlow(0);
+            }
             _JetTM.CloseModuleAllValves(Module);
             _JetTM.CloseModuleAllValves(Module);
         }
         }
 
 
@@ -101,8 +109,16 @@ namespace Venus_RT.Modules.TM
                 _JetTM.TurnVentValve(Module, true);
                 _JetTM.TurnVentValve(Module, true);
             }
             }
             else
             else
-            { 
-               _JetTM.TurnPurgeValve(Module, true);
+            {
+                if (Module == ModuleName.LLA)
+                { 
+                    _JetTM.SetLLAFlow(2000);
+                }
+                else if(Module == ModuleName.LLB)
+                {
+                    _JetTM.SetLLBFlow(2000);
+                }
+                _JetTM.TurnPurgeValve(Module, true);
             }
             }
             return true;
             return true;
         }
         }
@@ -115,6 +131,14 @@ namespace Venus_RT.Modules.TM
             }
             }
             else
             else
             {
             {
+                if (Module == ModuleName.LLA)
+                {
+                    _JetTM.SetLLAFlow(0);
+                }
+                else if (Module == ModuleName.LLB)
+                {
+                    _JetTM.SetLLBFlow(0);
+                }
                 _JetTM.TurnPurgeValve(Module, false);
                 _JetTM.TurnPurgeValve(Module, false);
             }
             }
             return true;
             return true;

+ 1 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -349,6 +349,7 @@
     <Compile Include="Modules\TM\MFSwapRoutine.cs" />
     <Compile Include="Modules\TM\MFSwapRoutine.cs" />
     <Compile Include="Modules\TM\MFVentRoutine.cs" />
     <Compile Include="Modules\TM\MFVentRoutine.cs" />
     <Compile Include="Modules\TM\TMEntity.cs" />
     <Compile Include="Modules\TM\TMEntity.cs" />
+    <Compile Include="Modules\TM\Vent.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFHomeRoutine.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFHomeRoutine.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFLeakCheckRoutine.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFLeakCheckRoutine.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFPickRoutine.cs" />
     <Compile Include="Modules\TM\VenusEntity\SEMFPickRoutine.cs" />

+ 1 - 1
Venus/Venus_Simulator/Devices/AdTecGeneratorMockPMA.cs

@@ -46,7 +46,7 @@ namespace Venus_Simulator.Devices
                     case "Q":
                     case "Q":
                         if (_simGeneratorStatus == GeneratorStatus.ON)
                         if (_simGeneratorStatus == GeneratorStatus.ON)
                         {
                         {
-                            sRes = "2010000 12345 00900 00100 45678\r";
+                            sRes = "2010000 12345 00900 00010 45678\r";
                         }
                         }
                         else if (_simGeneratorStatus == GeneratorStatus.OFF)
                         else if (_simGeneratorStatus == GeneratorStatus.OFF)
                         {
                         {