Browse Source

1.Gas漏气检测结束ui界面不更新bug修复
2.Recipe 温度卡控设置为±5℃
3.爱德华干泵error状态继续读开关状态
4.RF 关闭自动将reflect power设为0 功能取消
5.加入天车Auto two 功能
6.爱德华pump counter功能优化
7.alarm list更新

lixiang 9 months ago
parent
commit
7556c43a4c
28 changed files with 1408 additions and 1145 deletions
  1. 2 0
      Venus/Framework/Common/DBCore/LeakCheckDataRecorder.cs
  2. 3 3
      Venus/Venus_Core/DeviceName.cs
  3. 2 2
      Venus/Venus_MainPages/Properties/AssemblyInfo.cs
  4. 18 19
      Venus/Venus_MainPages/ViewModels/NewRecipeViewModel.cs
  5. 8 0
      Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs
  6. 27 0
      Venus/Venus_MainPages/ViewModels/TMOperationViewModel.cs
  7. 11 6
      Venus/Venus_MainPages/ViewModels/WaferOffsetViewModel.cs
  8. 1 1
      Venus/Venus_MainPages/Views/KeplerGasLeakCheckView.xaml
  9. 1 1
      Venus/Venus_MainPages/Views/OverKepler2200AView.xaml
  10. 3 3
      Venus/Venus_MainPages/Views/OverKepler2200BView.xaml
  11. 19 0
      Venus/Venus_MainPages/Views/TMOperationView.xaml
  12. 37 0
      Venus/Venus_RT/Config/EquipmentVariables.xml
  13. 2 2
      Venus/Venus_RT/Config/System_Kepler2200.sccfg
  14. 5 1
      Venus/Venus_RT/Devices/EFEM/JetEfem.cs
  15. 1086 1086
      Venus/Venus_RT/Devices/EFEM/Loadport.cs
  16. 27 7
      Venus/Venus_RT/Devices/EdwardsPump.cs
  17. 1 1
      Venus/Venus_RT/Devices/IODevices/IoHeartbeat.cs
  18. 5 0
      Venus/Venus_RT/Devices/IODevices/IoHighTemperatureHeater.cs
  19. 2 2
      Venus/Venus_RT/Devices/PendulumValve.cs
  20. 1 1
      Venus/Venus_RT/Instances/ToolLoader.cs
  21. 19 1
      Venus/Venus_RT/Modules/PMs/GasBoxLeakCheckRoutine.cs
  22. 1 1
      Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs
  23. 3 3
      Venus/Venus_RT/Modules/PMs/ProcessDefine.cs
  24. 14 1
      Venus/Venus_RT/Modules/RouteManager.cs
  25. 9 1
      Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs
  26. 98 0
      Venus/Venus_RT/Modules/TM/MFPMSwapRoutine.cs
  27. 2 2
      Venus/Venus_Simulator/Devices/EdwardsPumpMockPMA.cs
  28. 1 1
      Venus/Venus_Simulator/Devices/SkyPumpMockPMA.cs

+ 2 - 0
Venus/Framework/Common/DBCore/LeakCheckDataRecorder.cs

@@ -89,6 +89,8 @@ namespace MECF.Framework.Common.DBCore
 
                 checkresult.ModuleName= ds.Tables[0].Rows[i]["module_name"].ToString();
                 checkresult.CheckDate= ds.Tables[0].Rows[i]["operate_time"].ToString();
+                checkresult.BasePressure = Convert.ToDouble(ds.Tables[0].Rows[i]["base_pressure"].ToString());
+
                 checkresult.StartPressure =Convert.ToDouble( ds.Tables[0].Rows[i]["start_pressure"].ToString());
                 checkresult.EndPressure = Convert.ToDouble(ds.Tables[0].Rows[i]["stop_pressure"].ToString());
                 checkresult.LeakCheckTime = Convert.ToInt32(ds.Tables[0].Rows[i]["leak_check_time"].ToString());

+ 3 - 3
Venus/Venus_Core/DeviceName.cs

@@ -45,8 +45,8 @@ namespace Venus_Core
         //WriteCarrierId,
         Grip,
         EmsStop,
-        Swap
-
+        Swap,
+        UnKnow
     }
 
     public class EfemConstant
@@ -92,7 +92,7 @@ namespace Venus_Core
                 }
             }
 
-            return default(EfemOperation);
+            return EfemOperation.UnKnow;
         }
     }
 

+ 2 - 2
Venus/Venus_MainPages/Properties/AssemblyInfo.cs

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
+[assembly: AssemblyVersion("1.0.0.1")]
+[assembly: AssemblyFileVersion("1.0.0.1")]

+ 18 - 19
Venus/Venus_MainPages/ViewModels/NewRecipeViewModel.cs

@@ -258,28 +258,26 @@ namespace Venus_MainPages.ViewModels
                         return;
                     }
                 }
-            }
-
-
-            CurrentRecipe.Header.EditTime = DateTime.Now.ToString();
-            CurrentRecipe.Header.LastModifiedBy=GlobalUser.Instance.User.Name;
-            //SaveRecipe(CurrentRecipeName, RecipeUnity.RecipeToString(CurrentRecipe));
 
-            var newrecipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, typeFolder, CurrentRecipeName + ".rcp");
-            FileInfo fi = new FileInfo(newrecipePath);
-            var di = fi.Directory;
-            if (!di.Exists)
-            {
-                di.Create();
-            }
-            //File.WriteAllText(newrecipePath, RecipeUnity.RecipeToString(CurrentRecipe),Encoding.UTF8);
+                CurrentRecipe.Header.EditTime = DateTime.Now.ToString();
+                CurrentRecipe.Header.LastModifiedBy = GlobalUser.Instance.User.Name;
+                //SaveRecipe(CurrentRecipeName, RecipeUnity.RecipeToString(CurrentRecipe));
 
-            string recipeContent = RecipeUnity.RecipeToString(CurrentRecipe);
-            SaveRecipe(CurrentRecipe.Header.Name, CurrentRecipe.Header.Type.ToString(), recipeContent);
-            //LoadHeadWrapPanel(headWrapPanel, CurrentRecipe);
+                var newrecipePath = Path.Combine(QueryDataClient.Instance.Service.GetData("GetRTPath").ToString(), "Recipes", ModuleName, typeFolder, CurrentRecipeName + ".rcp");
+                FileInfo fi = new FileInfo(newrecipePath);
+                var di = fi.Directory;
+                if (!di.Exists)
+                {
+                    di.Create();
+                }
+                //File.WriteAllText(newrecipePath, RecipeUnity.RecipeToString(CurrentRecipe),Encoding.UTF8);
 
-            SaveEAPRecipe(recipeContent,CurrentRecipeName);
+                string recipeContent = RecipeUnity.RecipeToString(CurrentRecipe);
+                SaveRecipe(CurrentRecipe.Header.Name, CurrentRecipe.Header.Type.ToString(), recipeContent);
+                //LoadHeadWrapPanel(headWrapPanel, CurrentRecipe);
 
+                SaveEAPRecipe(recipeContent, CurrentRecipeName);
+            }
         }
 
         private void OnSaveToRecipe(object obj)
@@ -581,13 +579,14 @@ namespace Venus_MainPages.ViewModels
                         return;
                     }
                     RecipeType type = (RecipeType)Enum.Parse(typeof(RecipeType), dlg.SelectedType);
+                    //typeFolder=type.ToString();
                     string newRecipe = RecipeUnity.CreateRecipe(currentChamber, type, dlg.InputText,GlobalUser.Instance.User.Name);
 
                     if (SaveAsRecipeWithType(recipeName, type.ToString(), newRecipe))
                     {
                         UpdateRecipeFileList();
                     }
-                    SaveEAPRecipe(newRecipe,recipeName);
+                    //SaveEAPRecipe(newRecipe,recipeName);
                 }
             }
             catch (Exception ex)

+ 8 - 0
Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs

@@ -1971,6 +1971,14 @@ namespace Venus_MainPages.ViewModels
             m_RtDataKeys.Add($"{ModuleName}.IoSensor.N2PurgePressureSwitch.Value");
             m_RtDataKeys.Add($"{ModuleName}.IoSensor.PN2PurgePressureSwitch.Value");
 
+            m_RtDataKeys.Add($"{ModuleName}.ProcessedWaferCount");
+            m_RtDataKeys.Add($"{ModuleName}.RfOnTime");
+            m_RtDataKeys.Add($"{ModuleName}.PumpOnTime");
+
+
+
+            
+
 
 
 

+ 27 - 0
Venus/Venus_MainPages/ViewModels/TMOperationViewModel.cs

@@ -77,9 +77,30 @@ namespace Venus_MainPages.ViewModels
 
         private bool m_firstLoad = true;
         DispatcherTimer timer;
+
+        private bool m_LLAIsEnablePumpSwitch = false;
+        private bool m_LLBIsEnablePumpSwitch = false;
+        private bool m_TMIsEnablePumpSwitch = false;
+
+
         #endregion
 
         #region 属性
+        public bool LLAIsEnablePumpSwitch
+        {
+            get { return m_LLAIsEnablePumpSwitch; }
+            set { SetProperty(ref m_LLAIsEnablePumpSwitch, value); }
+        }
+        public bool LLBIsEnablePumpSwitch
+        {
+            get { return m_LLBIsEnablePumpSwitch; }
+            set { SetProperty(ref m_LLBIsEnablePumpSwitch, value); }
+        }
+        public bool TMIsEnablePumpSwitch
+        {
+            get { return m_TMIsEnablePumpSwitch; }
+            set { SetProperty(ref m_TMIsEnablePumpSwitch, value); }
+        }
         public PressureType PressureType
         {
             get { return m_PressureType; }
@@ -767,6 +788,12 @@ namespace Venus_MainPages.ViewModels
             {
                 timer_Tick(null, null);
                 timer.Start();
+
+                LLAIsEnablePumpSwitch = (bool)(QueryDataClient.Instance.Service.GetConfig($"LLA.DryPump.EnableSwitch"));
+                LLBIsEnablePumpSwitch = (bool)(QueryDataClient.Instance.Service.GetConfig($"LLB.DryPump.EnableSwitch"));
+                TMIsEnablePumpSwitch = (bool)(QueryDataClient.Instance.Service.GetConfig($"TM.DryPump.EnableSwitch"));
+
+
             }
             else
             {

+ 11 - 6
Venus/Venus_MainPages/ViewModels/WaferOffsetViewModel.cs

@@ -29,6 +29,8 @@ namespace Venus_MainPages.ViewModels
         private WaferOffsetView m_waferoffset;
         private DelegateCommand<object> _LoadCommandPD;
         private ObservableCollection<OffsetItem> _offsetItems;
+
+        private bool _firstLoad = true;
         #endregion
         #region 公开变量
         public bool PMAIsInstalled
@@ -108,12 +110,15 @@ namespace Venus_MainPages.ViewModels
         //}
         private void OnLoadPd(object obj)
         {
-            m_waferoffset = (WaferOffsetView)obj;
-            m_waferoffset.TimeFrom.ValueChanged += TimeFrom_ValueChanged;
-            m_waferoffset.TimeTo.ValueChanged += TimeFrom_ValueChanged;
-            m_waferoffset.TimeFrom.Value = DateTime.Today;
-            m_waferoffset.TimeTo.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 23, 59, 59, 999);
-
+            if (_firstLoad)
+            {
+                _firstLoad = false;
+                m_waferoffset = (WaferOffsetView)obj;
+                m_waferoffset.TimeFrom.ValueChanged += TimeFrom_ValueChanged;
+                m_waferoffset.TimeTo.ValueChanged += TimeFrom_ValueChanged;
+                m_waferoffset.TimeFrom.Value = DateTime.Today;
+                m_waferoffset.TimeTo.Value = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 23, 59, 59, 999);
+            }
         }
 
         private void TimeFrom_ValueChanged(object sender, EventArgs e)

+ 1 - 1
Venus/Venus_MainPages/Views/KeplerGasLeakCheckView.xaml

@@ -684,7 +684,7 @@
                 <TextBlock Text="V4" Canvas.Left="1142" Canvas.Top="320" FontSize="14"/>
                 <ctrls:FlowPipe  Height="8"  Width="100" Canvas.Left="1114" Canvas.Top="342"   />
                 <customControls:CommonValveControl   ValveOrientation="Horizontal" Status="{Binding PenningGaugeValveIsOpen,Mode=TwoWay}" Height="20" Width="20" Canvas.Left="1140" Canvas.Top="336" IsCanEdit="{Binding IsAutoMode,Converter={StaticResource BoolToBool}}" Tag="59" Command="{Binding ControlValveCommand}" CommandParameter="{Binding RelativeSource={x:Static RelativeSource.Self}}"/>
-                <ctrls:TextboxWithLabel  Canvas.Top="316" Canvas.Left="1170" LabelValue="{Binding PressureType, StringFormat=Penning Guage({0})}" TextBoxValue="{Binding PenningPressure,StringFormat='F1'}" TextBoxColor="#E6ECF5"/>
+                <ctrls:TextboxWithLabel  Canvas.Top="316" Canvas.Left="1170" LabelValue="{Binding PressureType, StringFormat=Penning Guage({0})}" TextBoxValue="{Binding PenningPressure,StringFormat='F5'}" TextBoxColor="#E6ECF5"/>
 
                 <ctrls:ChamberWithHeater Canvas.Left="880" Canvas.Top="250" 
                        

+ 1 - 1
Venus/Venus_MainPages/Views/OverKepler2200AView.xaml

@@ -982,7 +982,7 @@
                 <!--chamber管道标签-->
                 <ctrls:TextBlockWithLabel  Canvas.Top="157" Canvas.Left="1296" LabelValue="{Binding PressureType, StringFormat=CM2({0})}" TextBoxValue="{Binding ChamberPressure,StringFormat='F1'}" />
                 <ctrls:TextBlockWithLabel  Canvas.Top="247" Canvas.Left="1288" LabelValue="{Binding PressureType, StringFormat=CM1({0})}" TextBoxValue="{Binding ProcessPressure,StringFormat='F1'}" />
-                <ctrls:TextBlockWithLabel  Canvas.Top="316" Canvas.Left="1300" LabelValue="{Binding PressureType, StringFormat=Penning Gauge({0})}" TextBoxValue="{Binding PenningPressure,StringFormat='F1'}"/>
+                <ctrls:TextBlockWithLabel  Canvas.Top="316" Canvas.Left="1300" LabelValue="{Binding PressureType, StringFormat=Penning Gauge({0})}" TextBoxValue="{Binding PenningPressure,StringFormat='F5'}"/>
 
 
 

+ 3 - 3
Venus/Venus_MainPages/Views/OverKepler2200BView.xaml

@@ -978,9 +978,9 @@
                 <ctrls:Pipe2     Canvas.Left="1212" Canvas.Top="195" HorizontalAlignment="Left" VerticalAlignment="Top" RotateTransformValue="-90" />
 
                 <!--chamber管道标签-->
-                <ctrls:TextBlockWithLabel  Canvas.Top="157" Canvas.Left="1296" LabelValue="{Binding PressureType, StringFormat=CM2({0})}" TextBoxValue="{Binding ChamberPressure,StringFormat='F1'}"/>
-                <ctrls:TextBlockWithLabel  Canvas.Top="247" Canvas.Left="1288" LabelValue="{Binding PressureType, StringFormat=CM1({0})}" TextBoxValue="{Binding ProcessPressure,StringFormat='F1'}"/>
-                <ctrls:TextBlockWithLabel  Canvas.Top="316" Canvas.Left="1300" LabelValue="{Binding PressureType, StringFormat=Penning Gauge({0})}" TextBoxValue="{Binding PenningPressure,StringFormat='F1'}"/>
+                <ctrls:TextBlockWithLabel  Canvas.Top="157" Canvas.Left="1296" LabelValue="{Binding PressureType, StringFormat=CM2({0})}"            TextBoxValue="{Binding ChamberPressure,StringFormat='F1'}"/>
+                <ctrls:TextBlockWithLabel  Canvas.Top="247" Canvas.Left="1288" LabelValue="{Binding PressureType, StringFormat=CM1({0})}"            TextBoxValue="{Binding ProcessPressure,StringFormat='F1'}"/>
+                <ctrls:TextBlockWithLabel  Canvas.Top="316" Canvas.Left="1300" LabelValue="{Binding PressureType, StringFormat=Penning Gauge({0})}"  TextBoxValue="{Binding PenningPressure,StringFormat='F5'}"/>
 
 
 

+ 19 - 0
Venus/Venus_MainPages/Views/TMOperationView.xaml

@@ -25,6 +25,7 @@
         <converters:BoolToColor2  x:Key="boolToColor2"/>
         <converters:BoolToColor4  x:Key="boolToColor4"/>
         <converters:BoolToVisibility4 x:Key="BoolToVisibility"/>
+        <converters:ToBoolMultiValueConverter  x:Key="toBoolMultiValueConverter"/>
 
         <converters2:AllMultiValueConverter  x:Key="AllMultiValueConverter"/>
         <converters2:AnyMultiValueConverter  x:Key="AnyMultiValueConverter"/>
@@ -35,6 +36,12 @@
                       
         <Canvas Canvas.Top="-20">
             <userControls:Pump Canvas.Left="486" Canvas.Top="764" Width="35" Height="35" IsOpen="{Binding RtDataValues[LLA.PumpIsRunning],Mode=TwoWay}">
+                <userControls:Pump.IsEnabled>
+                    <MultiBinding Converter="{StaticResource toBoolMultiValueConverter}">
+                        <Binding Path="LLAIsOFFline"></Binding>
+                        <Binding Path="LLAIsEnablePumpSwitch"></Binding>
+                    </MultiBinding>
+                </userControls:Pump.IsEnabled>
                 <userControls:Pump.ContextMenu>
                     <ContextMenu>
                         <MenuItem Header="ON"  Command="{Binding OpenPumpCommand}"  CommandParameter="LLA" IsChecked="{Binding RtDataValues[LLA.PumpIsRunning],Mode=OneWay}" IsEnabled="{Binding RtDataValues[LLA.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}"/>
@@ -43,6 +50,12 @@
                 </userControls:Pump.ContextMenu>
             </userControls:Pump>
             <userControls:Pump Canvas.Left="786" Canvas.Top="764" Width="35" Height="35" IsOpen="{Binding RtDataValues[LLB.PumpIsRunning],Mode=TwoWay}">
+                <userControls:Pump.IsEnabled>
+                    <MultiBinding Converter="{StaticResource toBoolMultiValueConverter}">
+                        <Binding Path="LLBIsOFFline"></Binding>
+                        <Binding Path="LLBIsEnablePumpSwitch"></Binding>
+                    </MultiBinding>
+                </userControls:Pump.IsEnabled>
                 <userControls:Pump.ContextMenu>
                     <ContextMenu>
                         <MenuItem Header="ON"  Command="{Binding OpenPumpCommand}"  CommandParameter="LLB" IsChecked="{Binding RtDataValues[LLB.PumpIsRunning],Mode=OneWay}" IsEnabled="{Binding RtDataValues[LLB.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}"/>
@@ -51,6 +64,12 @@
                 </userControls:Pump.ContextMenu>
             </userControls:Pump>
             <userControls:Pump Canvas.Left="636" Canvas.Top="664" Width="35" Height="35" IsOpen="{Binding RtDataValues[TM.PumpIsRunning],Mode=TwoWay}">
+                <userControls:Pump.IsEnabled>
+                    <MultiBinding Converter="{StaticResource toBoolMultiValueConverter}">
+                        <Binding Path="TMIsOFFline"></Binding>
+                        <Binding Path="TMIsEnablePumpSwitch"></Binding>
+                    </MultiBinding>
+                </userControls:Pump.IsEnabled>
                 <userControls:Pump.ContextMenu>
                     <ContextMenu>
                         <MenuItem Header="ON"  Command="{Binding OpenPumpCommand}"  CommandParameter="TM" IsChecked="{Binding RtDataValues[TM.PumpIsRunning],Mode=OneWay}" IsEnabled="{Binding RtDataValues[TM.PumpIsRunning],Converter={StaticResource BoolToBool},Mode=OneWay}"/>

+ 37 - 0
Venus/Venus_RT/Config/EquipmentVariables.xml

@@ -636,6 +636,43 @@
 		<StatusVariable id="620101331" valueType="F8" logicalName="IO.PMA.AO_Space_Heater_Heat_Temp_Setpoint" eventTrigger="" units="" />
 		<StatusVariable id="620101332" valueType="F8" logicalName="IO.PMA.AO_Space_Heater_Temp_High_Limit_Setpoint" eventTrigger="" units="" />
 		<StatusVariable id="620101333" valueType="F8" logicalName="IO.PMA.AO_CHB_H_HT_Power_Distribute_Percent" eventTrigger="" units="" />
+		<StatusVariable id="620101334" valueType="F8" logicalName="PMA.RecipeStartTime" eventTrigger="" units="" />
+		<StatusVariable id="620101335" valueType="F8" logicalName="PMA.RecipeEndTime" eventTrigger="" units="" />
+		<StatusVariable id="620101336" valueType="F8" logicalName="PMA.RecipeStepTime" eventTrigger="" units="" />
+		<StatusVariable id="620101337" valueType="F8" logicalName="PMA.RecipeRfOntime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101338" valueType="F8" logicalName="PMB.RecipeStartTime" eventTrigger="" units="" />
+		<StatusVariable id="620101339" valueType="F8" logicalName="PMB.RecipeEndTime" eventTrigger="" units="" />
+		<StatusVariable id="620101340" valueType="F8" logicalName="PMB.RecipeStepTime" eventTrigger="" units="" />
+		<StatusVariable id="620101341" valueType="F8" logicalName="PMB.RecipeRfOntime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101342" valueType="F8" logicalName="PMC.RecipeStartTime" eventTrigger="" units="" />
+		<StatusVariable id="620101343" valueType="F8" logicalName="PMC.RecipeEndTime" eventTrigger="" units="" />
+		<StatusVariable id="620101344" valueType="F8" logicalName="PMC.RecipeStepTime" eventTrigger="" units="" />
+		<StatusVariable id="620101345" valueType="F8" logicalName="PMC.RecipeRfOntime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101346" valueType="F8" logicalName="PMD.RecipeStartTime" eventTrigger="" units="" />
+		<StatusVariable id="620101347" valueType="F8" logicalName="PMD.RecipeEndTime" eventTrigger="" units="" />
+		<StatusVariable id="620101348" valueType="F8" logicalName="PMD.RecipeStepTime" eventTrigger="" units="" />
+		<StatusVariable id="620101349" valueType="F8" logicalName="PMD.RecipeRfOntime" eventTrigger="" units="" />
+
+
+		<StatusVariable id="620101350" valueType="U4" logicalName="PMA.WaferCounter" eventTrigger="" units="" />
+		<StatusVariable id="620101351" valueType="F8" logicalName="PMA.RfOnTime" eventTrigger="" units="" />
+		<StatusVariable id="620101352" valueType="F8" logicalName="PMA.PumpOnTime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101353" valueType="U4" logicalName="PMB.WaferCounter" eventTrigger="" units="" />
+		<StatusVariable id="620101354" valueType="F8" logicalName="PMB.RfOnTime" eventTrigger="" units="" />
+		<StatusVariable id="620101355" valueType="F8" logicalName="PMB.PumpOnTime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101356" valueType="U4" logicalName="PMC.WaferCounter" eventTrigger="" units="" />
+		<StatusVariable id="620101357" valueType="F8" logicalName="PMC.RfOnTime" eventTrigger="" units="" />
+		<StatusVariable id="620101358" valueType="F8" logicalName="PMC.PumpOnTime" eventTrigger="" units="" />
+
+		<StatusVariable id="620101359" valueType="U4" logicalName="PMA.WaferCounter" eventTrigger="" units="" />
+		<StatusVariable id="620101360" valueType="F8" logicalName="PMA.RfOnTime" eventTrigger="" units="" />
+		<StatusVariable id="620101361" valueType="F8" logicalName="PMA.PumpOnTime" eventTrigger="" units="" />
+		
 		<StatusVariable id="630101001" valueType="F4" logicalName="PMB.AI_CHB_M-HT_Current_Speed" eventTrigger="" units="" />
 		<StatusVariable id="630101002" valueType="F4" logicalName="PMB.AI_CHB_M-HT_Max_Power" eventTrigger="" units="" />
 		<StatusVariable id="630101003" valueType="F4" logicalName="PMB.AI_CHB_M-HT_Min_Power" eventTrigger="" units="" />

+ 2 - 2
Venus/Venus_RT/Config/System_Kepler2200.sccfg

@@ -654,7 +654,7 @@
 			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Soft Down Limit"             max="600"  min="-600" paramter="" tag="" unit="mm" type="Double" />
 			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Soft Up Limit"               max="600"  min="-600" paramter="" tag="" unit="mm" type="Double" />
 			<config default="20" name="Temperature"           nameView="Temperature"              description="Temperature"                 max="1000" min="20"    paramter="" tag="" unit="℃" type="Double" />
-			<config default="130" name="Ratio"                 nameView="Ratio"                    description="Ratio"                      max="200"  min="50"     paramter="" tag="" unit="N/A" type="Double" />
+			<config default="130" name="Ratio"                 nameView="Ratio"                    description="Ratio"                      max="260"  min="50"     paramter="" tag="" unit="N/A" type="Double" />
 			<config default="true" name="IsOn" nameView="Is On" description="IsOn" max="0" min="0" paramter="" tag="" unit="N/A" type="Bool" />
 			<config default="50" name="N2WarningTemperatureLimit"           nameView="N2 Warning Temperature Limit"              description="N2 Warning Temperature Limit"                 max="1000" min="20"    paramter="" tag="" unit="℃" type="Double" />
 
@@ -984,7 +984,7 @@
 			<config default="60" name="SoftDownLimit"         nameView="Soft Down Limit"          description="Soft Down Limit"             max="600"  min="-600" paramter="" tag="" unit="mm" type="Double" />
 			<config default="60" name="SoftUpLimit"           nameView="Soft Up Limit"            description="Soft Up Limit"               max="600"  min="-600" paramter="" tag="" unit="mm" type="Double" />
 			<config default="20" name="Temperature"           nameView="Temperature"              description="Temperature"                  max="1000" min="20"    paramter="" tag="" unit="℃" type="Double" />
-			<config default="130" name="Ratio"                 nameView="Ratio"                    description="Ratio"                       max="200"  min="50"    paramter="" tag="" unit="N/A"   type="Double" />
+			<config default="130" name="Ratio"                 nameView="Ratio"                    description="Ratio"                       max="260"  min="50"    paramter="" tag="" unit="N/A"   type="Double" />
 			<config default="true" name="IsOn" nameView="Is On" description="IsOn" max="0" min="0" paramter="" tag="" unit="N/A" type="Bool" />
 			<config default="50" name="N2WarningTemperatureLimit"           nameView="N2 Warning Temperature Limit"              description="N2 Warning Temperature Limit"                 max="1000" min="20"    paramter="" tag="" unit="℃" type="Double" />
 

+ 5 - 1
Venus/Venus_RT/Devices/EFEM/JetEfem.cs

@@ -740,6 +740,11 @@ namespace Venus_RT.Devices.EFEM
 
                 EfemMessage rec_msg = msg.ToMessage();
 
+                //2024/09/15,添加unknow状态,解决天车主发inf信号,软件报警
+                if (rec_msg.Operation == EfemOperation.UnKnow)
+                {
+                    return;
+                }
                 switch (rec_msg.Head)
                 {
                     case EfemMessage.MsgHead.ACK:
@@ -923,7 +928,6 @@ namespace Venus_RT.Devices.EFEM
                     return;
                 }
             }
-
             switch (message.Operation)
             {
                 case EfemOperation.ClearError:

File diff suppressed because it is too large
+ 1086 - 1086
Venus/Venus_RT/Devices/EFEM/Loadport.cs


+ 27 - 7
Venus/Venus_RT/Devices/EdwardsPump.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections;
+using System.Diagnostics;
 using System.Text;
 using System.Xml;
 using Aitex.Core.Common.DeviceData;
@@ -109,6 +110,8 @@ namespace Venus_RT.Devices
         private StatsDataItemRFAndPump _statPumpOnTime;
         // --------------------------Properties------------------------
         //
+        private Stopwatch _pumpOnTimeWatch = new Stopwatch();
+
         public EdwardsPumpState StatusDry { get; set; }
 
         public string LastPMTime
@@ -254,6 +257,8 @@ namespace Venus_RT.Devices
             _timerControlStatus.Start(CHK_CONTROL_INTERVAL);
             _timerReceiveStatus.Start(CHK_REC_INTERVAL);
 
+
+            DATA.Subscribe($"{Module}.PumpOnTime",()=>DaysFromLastPM);
             return true;
         }
 
@@ -369,13 +374,13 @@ namespace Venus_RT.Devices
             try
             {
                 // 状态查询
-                if (_timerQueryStatus.IsTimeout() && this.StatusDry != EdwardsPumpState.ERROR)
+                if (_timerQueryStatus.IsTimeout())
                 {
                     this.SendCmd(EdwardsPumpMessage.QUERY_Pump_Status);
                     _timerQueryStatus.Start(CHK_ST_INTERVAL);
                 }
 
-                if (_timerReceiveStatus.IsTimeout() && this.StatusDry != EdwardsPumpState.ERROR)
+                if (_timerReceiveStatus.IsTimeout())
                 {
                     _trigReceiveStatus.CLK = true;
                     if (_trigReceiveStatus.Q)
@@ -394,6 +399,8 @@ namespace Venus_RT.Devices
                     _fromLast = DaysFromLastPM;
                     _timerTotal.Start(0);
                     _timerFromLast.Start(0);
+                    _pumpOnTimeWatch.Start();
+
                 }
 
                 //第一次检测到从打开到关闭状态
@@ -403,10 +410,18 @@ namespace Venus_RT.Devices
                 }
 
                 //如果开着,就更新SC
-                if (_trigOnOff.M)
+                if (_trigOnOff.M && _pumpOnTimeWatch.ElapsedMilliseconds > 1000)
                 {
-                    TotalDays = Convert.ToSingle( _timerTotal.GetElapseTime() / 1000 / 60 / 60);
-                    DaysFromLastPM =Convert.ToSingle( _timerFromLast.GetElapseTime() / 1000 / 60 / 60);
+                    TotalDays = (float)1 / 60 / 60;
+                    DaysFromLastPM = (float)1 / 60 / 60;
+                    _pumpOnTimeWatch.Restart();
+
+                    //_timerTotal.Restart(0);
+                    //_timerFromLast.Restart(0);
+                    if (ModuleHelper.IsPm(Module))
+                    {
+                        StatsDataManager.Instance.Increase($"{Module}.PumpOnTime", $"{Module} PumpOnTime", DaysFromLastPM, TotalDays);
+                    }
                 }
 
                 if (PMIntervalDays > 0)
@@ -422,8 +437,8 @@ namespace Venus_RT.Devices
                     }
                 }
 
-                if (ModuleHelper.IsPm(Module))
-                    StatsDataManager.Instance.Increase($"{Module}.PumpOnTime", $"{Module} PumpOnTime", DaysFromLastPM, TotalDays);
+                //if (ModuleHelper.IsPm(Module))
+                //    StatsDataManager.Instance.Increase($"{Module}.PumpOnTime", $"{Module} PumpOnTime", DaysFromLastPM, TotalDays);
 
             }
             catch (Exception ex)
@@ -475,5 +490,10 @@ namespace Venus_RT.Devices
         {
             SendCmd(on ? EdwardsPumpMessage.COMMAND_Switch_on_Pump : EdwardsPumpMessage.COMMAND_Switch_off_Pump_Fast_shut_down);
         }
+
+        public override bool ReConnect()
+        {
+            return _serial.ReConnect();
+        }
     }
 }

+ 1 - 1
Venus/Venus_RT/Devices/IODevices/IoHeartbeat.cs

@@ -19,7 +19,7 @@ namespace Venus_RT.Devices.IODevices
     /// </summary>
     public class IoHeartbeat : BaseDevice, IDevice
     {
-        private readonly int PLC_Heart_Beat_Timeout_ms = 1000 * 5;
+        private readonly int PLC_Heart_Beat_Timeout_ms = 1000 * 10;
         private readonly AIAccessor _ai;
         private readonly AOAccessor _ao;
         private readonly DeviceTimer _updateTimer = new DeviceTimer();  //更新 AO信号 给PLC

+ 5 - 0
Venus/Venus_RT/Devices/IODevices/IoHighTemperatureHeater.cs

@@ -438,6 +438,11 @@ namespace Venus_RT.Devices.IODevices
 
             DATA.Subscribe($"{Module}.{Name}.PurgeN2Flow", () => GetAiValue($"{Module}.AI_Heater_Purge_N2_Flow"));
 
+            DATA.Subscribe($"{Module}.{Name}.ShaftTCTemp",  () => GetAiValue($"{Module}.AI_HTR_Shaft_TC_Temp"));
+            DATA.Subscribe($"{Module}.{Name}.SourceTCTemp", () => GetAiValue($"{Module}.AI_Source_TC_Temp"));
+
+
+
 
 
             DATA.Subscribe($"{Module}.{Name}.Ratio", () => HighTemperatureHeaterRatio);

+ 2 - 2
Venus/Venus_RT/Devices/PendulumValve.cs

@@ -187,8 +187,8 @@ namespace Venus_RT.Devices
             Operation.GetPressure,
             Operation.GetPosition,
             Operation.GetDeviceStatus,
-            Operation.GetP,
-            Operation.GetI
+            //Operation.GetP,
+            //Operation.GetI
         };
         BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
         private JetChamber   m_JetChamber;

+ 1 - 1
Venus/Venus_RT/Instances/ToolLoader.cs

@@ -117,7 +117,7 @@ namespace Venus_RT.Instances
             else
             {
                 string eapName;
-                if (obj.Source == "EFEM" || obj.Source == "System" || obj.Source=="TM")
+                if (obj.Source == "EFEM" || obj.Source == "System" || obj.Source=="TM" || obj.Source == "TMRobot" || obj.Source == "EFEMRobot")
                 {
                     eapName = obj.EventEnum;
                 }

+ 19 - 1
Venus/Venus_RT/Modules/PMs/GasBoxLeakCheckRoutine.cs

@@ -41,6 +41,9 @@ namespace Venus_RT.Modules.PMs
         StringBuilder  gasLines=new StringBuilder();
         public string CurrentStep;
         PressureType _pressureType = PressureType.mTorr;
+        private bool _readPenningGuagePressureFlag;
+        private double _penningGuagePressure;
+
         public GasBoxLeakCheckRoutine(JetPMBase chamber) : base(chamber)
         {
             Name = "GasBox Leakcheck";
@@ -200,6 +203,12 @@ namespace Venus_RT.Modules.PMs
 
         private bool PumpingDelay()
         {
+            if (_leakCheckTimer.ElapsedMilliseconds > (_leakcheckPumpTime - 5) * 1000 && _readPenningGuagePressureFlag == false)
+            {
+                _penningGuagePressure = _chamber.PenningGuagePressure;
+                pMLeakCheckResult.BasePressure = _penningGuagePressure;
+                _readPenningGuagePressureFlag = true;
+            }
             if (_leakCheckTimer.ElapsedMilliseconds >= _leakcheckPumpTime * 1000)
             {
                 if (_chamber.ProcessPressure <= _leakCheckBasePressure)
@@ -240,7 +249,16 @@ namespace Venus_RT.Modules.PMs
                 Stop($"GasBox Leakcheck失败, 腔体漏率 [{LeakRate}] {_pressureType}/min, 高于 [{_leakRate}] {_pressureType}/min");
                 pMLeakCheckResult.Result = "Fail";
             }
-            LeakCheckDataRecorder.Add(_leakcheckHoldTime, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, pMLeakCheckResult.Result, pMLeakCheckResult.CheckMode, _chamber.Name, gasLines.ToString());
+            if (RtInstance.ConfigType == ConfigType.Kepler2200)
+            {
+                LeakCheckDataRecorder.AddKepler2200(_leakcheckHoldTime, pMLeakCheckResult.BasePressure, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, pMLeakCheckResult.Result, pMLeakCheckResult.CheckMode, _chamber.Name, gasLines.ToString());
+
+            }
+            else
+            {
+                //LeakCheckDataRecorder.Add(_leakcheckHoldTime, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, pMLeakCheckResult.Result, "ChamberOnly", _chamber.Name);
+                LeakCheckDataRecorder.Add(_leakcheckHoldTime, Math.Round(_startPressure, 1), Math.Round(_endPressure, 1), LeakRate, pMLeakCheckResult.Result, pMLeakCheckResult.CheckMode, _chamber.Name, gasLines.ToString());
+            }
 
             _chamber.StopAllGases();
             _chamber.TurnPendulumValve(true);

+ 1 - 1
Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs

@@ -138,7 +138,7 @@ namespace Venus_RT.Modules.PMs
                 IsVenus = false;
 
             DATA.Subscribe($"{chamber.Module}.RecipeStartTime", Eap_StartRecipeTime);
-            DATA.Subscribe($"{chamber.Module}.RecipeEndTime",   Eap_StartRecipeTime);
+            DATA.Subscribe($"{chamber.Module}.RecipeEndTime",   Eap_EndRecipeTime);
             DATA.Subscribe($"{chamber.Module}.StepTime",       ()=> _processHelper.EAP_StepTime);
             DATA.Subscribe($"{chamber.Module}.RecipeRfOntime", () => Eap_RecipeRFOnTime);
 

+ 3 - 3
Venus/Venus_RT/Modules/PMs/ProcessDefine.cs

@@ -289,7 +289,7 @@ namespace Venus_RT.Modules.PMs
             {
                 Chamber.SetMatchWorkMode(MatchWorkMode.Manual);
             }
-            _scRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.Rf.PowerAlarmTime");
+            _scRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.Rf.ReflectPowerAlarmTime");
 
             rfMatchC1.Clear();
             rfMatchC1.Clear();
@@ -435,7 +435,7 @@ namespace Venus_RT.Modules.PMs
                 toleranceObjects.Add(new ToleranceObject("BiasRF", ProcessUnit.BiasRFPower, ProcessUnit.RFPowerWarningRange, ProcessUnit.RFPowerAlarmRange, ProcessUnit.ToleranceDelayTime, ProcessUnit.ToleranceMode));
                 _BiasRFToleranceChecker.Start(toleranceObjects, step.Type == StepType.Stable);
             }
-            _scBiasRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.BiasRf.PowerAlarmTime");
+            _scBiasRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.BiasRf.ReflectPowerAlarmTime");
             biasRfMatchC1.Clear();
             biasRfMatchC1.Clear();
             biasRfMatchC1C2Index = 0;
@@ -1119,7 +1119,7 @@ namespace Venus_RT.Modules.PMs
             {
                 Chamber.SetMatchWorkMode(MatchWorkMode.Manual);
             }
-            _scRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.Rf.PowerAlarmTime");
+            _scRFPowerAlarmTime = SC.GetValue<double>($"{Chamber.Name}.Rf.ReflectPowerAlarmTime");
 
             rfMatchC1.Clear();
             rfMatchC1.Clear();

+ 14 - 1
Venus/Venus_RT/Modules/RouteManager.cs

@@ -33,6 +33,7 @@ using Newtonsoft.Json;
 using Newtonsoft.Json.Linq;
 using System.Xml;
 using System.IO;
+using Venus_RT.Devices.YASKAWA;
 
 namespace Venus_RT.Modules
 {
@@ -1544,6 +1545,18 @@ namespace Venus_RT.Modules
         private bool FaUnLoad(string lp, out string reason)
         {
             reason = "";
+
+            Loadport loadport = FaGetLoadPort(lp, out reason);
+            if (loadport!=null && !loadport.IsLoaded)
+            {
+                var dvid = new SerializableDictionary<string, string>
+                {
+                    ["CarrierID"] = loadport.CarrierId ?? "",
+                    ["PortID"] = loadport.PortId.ToString()
+                };
+                EV.Notify("CARRIER_UNLOADED", dvid);
+            }
+
             if (RtInstance.ConfigType == ConfigType.VenusSE || RtInstance.ConfigType == ConfigType.VenusDE)
             {
                 VceEntity vce = GetVceEntity(lp, out reason);
@@ -1551,7 +1564,7 @@ namespace Venus_RT.Modules
             }
             else
             {
-                Loadport loadport = FaGetLoadPort(lp, out reason);
+
                 if (loadport != null)
                 {
                     loadport.Unload();

+ 9 - 1
Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs

@@ -318,10 +318,18 @@ namespace Venus_RT.Modules.TM
             string _origin_module = $"LP{WaferManager.Instance.GetWafer(_targetModule, _targetSlot).OriginStation}";
             int _origin_slot = WaferManager.Instance.GetWafer(_targetModule, _targetSlot).OriginSlot;
             //查询完毕 插入数据
+            //OffsetDataRecorder.RecordOffsetData(
+            //    Guid.NewGuid().ToString(),
+            //    _targetModule, _targetSlot,
+            //    ModuleName.TMRobot, 0,
+            //    _origin_module, _origin_slot,
+            //    _hand, RobotArmPan.None,
+            //    _robot.Offset_X, _robot.Offset_Y, _robot.Offset_D,
+            //    _starttime, DateTime.Now);
             OffsetDataRecorder.RecordOffsetData(
                 Guid.NewGuid().ToString(),
-                _targetModule, _targetSlot,
                 ModuleName.TMRobot, 0,
+                _targetModule, _targetSlot,
                 _origin_module, _origin_slot,
                 _hand, RobotArmPan.None,
                 _robot.Offset_X, _robot.Offset_Y, _robot.Offset_D,

+ 98 - 0
Venus/Venus_RT/Modules/TM/MFPMSwapRoutine.cs

@@ -14,6 +14,7 @@ using MECF.Framework.Common.Schedulers;
 using System.Collections.Generic;
 using System;
 using Aitex.Core.RT.Device;
+using MECF.Framework.Common.DBCore;
 
 namespace Venus_RT.Modules.TM
 {
@@ -45,8 +46,14 @@ namespace Venus_RT.Modules.TM
             OpenSlitDoor,
             PickPrepare,
             Picking,
+            QueryPickAWCData,
+            SavePickAWCData,
+            CheckPickAWCData,
             PlacePrepare,
             Placing,
+            QueryPlaceAWCData,
+            SavePlaceAWCData,
+            CheckPlaceAWCData,
             CloseSlitDoor,
             NotifyDone,
         }
@@ -65,6 +72,14 @@ namespace Venus_RT.Modules.TM
         private Hand _placeHand;
         double maxPressureDifference;
 
+
+        private bool _pickQueryAWC;
+        private bool _placeQueryAWC;
+        private Hand _hand;
+        private DateTime _starttime;
+        private int _robotTransferAWCOffset;
+
+
         public MFPMSwapRoutine(JetTM tm, ITransferRobot robot) : base(ModuleName.TMRobot)
         {
             _JetTM = tm;
@@ -129,6 +144,23 @@ namespace Venus_RT.Modules.TM
             _pickDelayTime = SC.GetValue<int>($"{_targetModule}.PickDelayTime");
             _placeDelayTime = SC.GetValue<int>($"{_targetModule}.PlaceDelayTime");
             maxPressureDifference = SC.GetValue<double>("System.PMTMMaxPressureDifference");
+
+            int queryAWCType = SC.GetValue<int>($"TM.QueryAWCOption");
+            if (queryAWCType == 1)
+            {
+                _pickQueryAWC = true;
+            }
+            else if (queryAWCType == 2)
+            {
+                _placeQueryAWC = true;
+            }
+            else if (queryAWCType == 3)
+            { 
+                _pickQueryAWC = true;
+                _placeQueryAWC = true;
+            }
+            _robotTransferAWCOffset = SC.GetValue<int>("TM.EnterPMAWCAlarmLimit");
+
             return Runner.Start(Module, $"Swap with {_targetModule}");
         }
 
@@ -181,8 +213,18 @@ namespace Venus_RT.Modules.TM
                           .Wait(SwapWithHeaterStep.WaitPressreStable, TMPMPressureIsOK, _delay_60s)
                           .Run(SwapWithHeaterStep.OpenSlitDoor,       OpenPMSlitDoor,                      OpenPMSlitDoorIsOK)
                           .Run(SwapWithHeaterStep.Picking,            Picking,                             WaitPickDone)
+
+                          .RunIf(SwapWithHeaterStep.QueryPickAWCData, _pickQueryAWC, QueryAWC,             WaitRobotQueryDone)
+                          .RunIf(SwapWithHeaterStep.SavePickAWCData,  _pickQueryAWC, RecordAWCData,        NullFun)
+                          .RunIf(SwapWithHeaterStep.CheckPickAWCData, _pickQueryAWC, CheckAwc)
+
                           .Run(SwapWithHeaterStep.PlacePrepare,       PlacePrepare,                        IsModuleReadyForPlace)
                           .Run(SwapWithHeaterStep.Placing,            Placing,                             WaitPlaceDone)
+
+                          .RunIf(SwapWithHeaterStep.QueryPlaceAWCData, _placeQueryAWC, QueryAWC,      WaitRobotQueryDone)
+                          .RunIf(SwapWithHeaterStep.SavePlaceAWCData,  _placeQueryAWC, RecordAWCData, NullFun)
+                          .RunIf(SwapWithHeaterStep.CheckPlaceAWCData, _placeQueryAWC, CheckAwc)
+
                           .Run(SwapWithHeaterStep.CloseSlitDoor,      ClosePMSlitDoor,                     ClosePMSlitDoorIsOK)
                           .End(SwapWithHeaterStep.NotifyDone,         NotifyPMDone,                        _delay_50ms);
                     break;
@@ -292,6 +334,9 @@ namespace Venus_RT.Modules.TM
                 Runner.Stop($"不允许Pick,传片位置信号满足,但不在Position1");
                 return false;
             }
+            _hand = _pickHand;
+            _starttime=DateTime.Now;
+
             return _robot.Pick(_targetModule, _targetSlot, _pickHand);
 
             //if (_jetPM.PreparePickIsOK())
@@ -304,7 +349,58 @@ namespace Venus_RT.Modules.TM
             //    return false;
             //}
         }
+        private bool QueryAWC()
+        {
+            return _robot.QueryAwc();
+        }
+        private bool RecordAWCData()
+        {
+
+            //已经move后的数据
+            string _origin_module = $"LP{WaferManager.Instance.GetWafer(_targetModule, _targetSlot).OriginStation}";
+            int _origin_slot = WaferManager.Instance.GetWafer(_targetModule, _targetSlot).OriginSlot;
+            //查询完毕 插入数据
+            OffsetDataRecorder.RecordOffsetData(
+                Guid.NewGuid().ToString(),
+                ModuleName.TMRobot, 0,
+                _targetModule, _targetSlot,
+                _origin_module, _origin_slot,
+                _hand, RobotArmPan.None,
+                _robot.Offset_X, _robot.Offset_Y, _robot.Offset_D,
+                _starttime, DateTime.Now);
+            return true;
+        }
+        private bool CheckAwc()
+        {
+            if (Math.Abs(_robot.Offset_X) > _robotTransferAWCOffset)
+            {
+                Stop($"Check AWC 失败, 当前 X AWC [{_robot.Offset_X}um], 高于Alarm最大值: [{_robotTransferAWCOffset}]um");
+                return false;
+            }
+            if (Math.Abs(_robot.Offset_Y) > _robotTransferAWCOffset)
+            {
+                Stop($"Check AWC 失败, 当前 Y AWC [{_robot.Offset_Y}um], 高于Alarm最大值: [{_robotTransferAWCOffset}]um");
+                return false;
+            }
+            return true;
+        }
 
+        private bool WaitRobotQueryDone()
+        {
+            if (_robot.Status == RState.Running)
+            {
+                return false;
+            }
+            else if (_robot.Status == RState.End)
+            {
+                return true;
+            }
+            else
+            {
+                Runner.Stop($"TM Robot Query Awc failed, {_robot.Status}");
+                return true;
+            }
+        }
         private bool WaitPickDone()
         {
             if (_robot.Status == RState.Running)
@@ -336,6 +432,8 @@ namespace Venus_RT.Modules.TM
                 Runner.Stop($"不允许Place,传片位置信号满足,但不在Position1");
                 return false;
             }
+            _hand = _placeHand;
+            _starttime = DateTime.Now;
             return _robot.Place(_targetModule, _targetSlot, _placeHand);
 
         }

+ 2 - 2
Venus/Venus_Simulator/Devices/EdwardsPumpMockPMA.cs

@@ -18,11 +18,11 @@ namespace Venus_Simulator.Devices
         public static SimEdwardsPumpStatus _simPumpControlStatus;
         private const string EOF = "\r\n";
         private const char MSG_DELIMITER = ' ';
-        private const string MOCKUP_PORT = "COM102";
+        private const string MOCKUP_PORT = "COM21";
 
         public EdwardsPumpMockPMA() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
         {
-            _simPumpStatus = SimEdwardsPumpStatus.Close;
+            _simPumpStatus = SimEdwardsPumpStatus.Open;
             _simPumpControlStatus = SimEdwardsPumpStatus.OffLine;
         }
 

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

@@ -15,7 +15,7 @@ namespace Venus_Simulator.Devices
         public static SimPumpStatus _simPumpStatus;
         private const string EOF = "\r\n";
         private const char MSG_DELIMITER = ' ';
-        private const string MOCKUP_PORT = "COM21";
+        private const string MOCKUP_PORT = "COM102";
 
         public SkyPumpMockPMA() : base(MOCKUP_PORT, -1, EOF, MSG_DELIMITER)
         {