Browse Source

添加初版kepler2200A Pick/Place功能(PLC点位未跟新)

lixiang 1 year ago
parent
commit
c48ba3a928
27 changed files with 724 additions and 188 deletions
  1. 3 0
      Venus/Framework/Common/CommonData/RobotMoveInfo.cs
  2. 1 1
      Venus/Framework/Common/DBCore/LeakCheckDataRecorder.cs
  3. 26 7
      Venus/Venus_MainPages/Unity/ModuleManager.cs
  4. 34 24
      Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs
  5. 1 1
      Venus/Venus_MainPages/Views/EfemView.xaml
  6. 2 2
      Venus/Venus_MainPages/Views/OperationOverView.xaml
  7. 2 2
      Venus/Venus_MainPages/Views/OverKepler2200AView.xaml
  8. BIN
      Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200ADeviceModel.xml
  9. BIN
      Venus/Venus_RT/Config/PM/Kepler2300/Kepler2300DeviceModel.xml
  10. 84 21
      Venus/Venus_RT/Devices/JetKepler2200APM.cs
  11. 76 1
      Venus/Venus_RT/Devices/JetKepler2300PM.cs
  12. 96 39
      Venus/Venus_RT/Devices/JetPMBase.cs
  13. 79 1
      Venus/Venus_RT/Devices/JetVenusPM.cs
  14. 9 2
      Venus/Venus_RT/Devices/SMCChiller.cs
  15. 1 1
      Venus/Venus_RT/Modules/PMs/GasBoxLeakCheckRoutine.cs
  16. 57 36
      Venus/Venus_RT/Modules/PMs/PMEntity.cs
  17. 16 9
      Venus/Venus_RT/Modules/PMs/PMGasVerificationRoutine.cs
  18. 1 1
      Venus/Venus_RT/Modules/PMs/PMLeakCheckRoutine.cs
  19. 1 1
      Venus/Venus_RT/Modules/PMs/PMProcessRoutine.cs
  20. 1 1
      Venus/Venus_RT/Modules/PMs/PMRoutineBase.cs
  21. 59 11
      Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs
  22. 61 10
      Venus/Venus_RT/Modules/TM/MFPMPlaceRoutine.cs
  23. 100 14
      Venus/Venus_RT/Modules/TM/MFPMSwapRoutine.cs
  24. 1 1
      Venus/Venus_Themes/UserControls/Chamber.xaml
  25. 2 2
      Venus/Venus_Themes/UserControls/EFEM.xaml
  26. 4 0
      Venus/Venus_UI/Venus_UI.csproj
  27. 7 0
      Venus/Venus_UI/Views/ShellView.xaml.cs

+ 3 - 0
Venus/Framework/Common/CommonData/RobotMoveInfo.cs

@@ -45,6 +45,9 @@ namespace MECF.Framework.Common.CommonData
 
         [EnumMember]
         Rotating,
+
+        [EnumMember]
+        Homing,
     }
 
     [Serializable]

+ 1 - 1
Venus/Framework/Common/DBCore/LeakCheckDataRecorder.cs

@@ -8,7 +8,7 @@ namespace MECF.Framework.Common.DBCore
 {
     public class LeakCheckDataRecorder
     {
-        public static void Add(int leakCheckTime, int beginPressure, int endPressure, double leakRate, string status, string mode,string moduleName,string gaslines="")
+        public static void Add(int leakCheckTime, double beginPressure, double endPressure, double leakRate, string status, string mode,string moduleName,string gaslines="")
         {
             string sql = string.Format(
                 "INSERT INTO \"leak_check_data\"(\"guid\", \"operate_time\", \"status\" , \"leak_rate\", \"start_pressure\", \"stop_pressure\", \"mode\", \"leak_check_time\" , \"module_name\", \"gasline_selection\")VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}','{8}','{9}' );",

+ 26 - 7
Venus/Venus_MainPages/Unity/ModuleManager.cs

@@ -1,13 +1,19 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using MECF.Framework.Common.DataCenter;
 using OpenSEMI.ClientBase;
+using Venus_Themes.Unity;
 
 namespace Venus_MainPages.Unity
 {
     public static class ModuleManager
     {
+        public static event Action<FlashWaferInformation> FlashWaferEvent;
+        public static void OnFlashWafer(FlashWaferInformation para)
+        {
+            FlashWaferEvent?.Invoke(para);
+        }
 
-        
         /// <summary>
         /// all module need init
         /// </summary>
@@ -34,13 +40,21 @@ namespace Venus_MainPages.Unity
                 ModulesID.Add("PMD");
             if (installModules.Contains("VCE1"))
                 ModulesID.Add("VCE1");
-            if(installModules.Contains("VPA"))
+            if (installModules.Contains("VPA"))
                 ModulesID.Add("VPA");
+
+            FlashWaferEvent += ModuleManager_FlashWaferEvent;
+        }
+
+        private static void ModuleManager_FlashWaferEvent(FlashWaferInformation obj)
+        {
+
+
         }
 
         public static void Initialize()
         {
-            
+
             ModuleInfos.Clear();
             foreach (string moduleID in ModulesID)
             {
@@ -50,8 +64,8 @@ namespace Venus_MainPages.Unity
         }
         public static WaferStatusHandler CreateWaferStatusManager()
         {
-           WaferStatusHandler WaferStatusManager;
-           WaferStatusImp waferStatusImp = new WaferStatusImp(QueryDataClient.Instance.Service);
+            WaferStatusHandler WaferStatusManager;
+            WaferStatusImp waferStatusImp = new WaferStatusImp(QueryDataClient.Instance.Service);
             WaferStatusManager = new WaferStatusHandler(waferStatusImp.GetWaferStatus, ModuleManager.ModulesID);
             WaferStatusManager.Handle();
             return WaferStatusManager;
@@ -59,7 +73,7 @@ namespace Venus_MainPages.Unity
         private static ModuleInfo CreateModule(string p_modid, bool p_install)
         {
             ModuleInfo m_data;
-            
+
             if (p_install)
                 m_data = new ModuleInfo(p_modid, p_install, CreateWaferStatusManager().WaferStatusDic[p_modid], false);
             else
@@ -68,4 +82,9 @@ namespace Venus_MainPages.Unity
             return m_data;
         }
     }
+    public class FlashWaferInformation
+    {
+        public string ModuleName { get; set; }
+        public int SoltId { get; set; }
+    }
 }

+ 34 - 24
Venus/Venus_MainPages/ViewModels/OverKepler2200AViewModel.cs

@@ -97,9 +97,10 @@ namespace Venus_MainPages.ViewModels
         private AITMfcData m_MFCHeData;
         private AITMfcData m_MFCN2Data;
 
-        private AITHeaterData m_ValveHeaterData;
-        private AITHeaterData m_ForelineHeaterData;
-        private AITHeaterData m_WallHeaterData;
+        //private AITHeaterData m_ValveHeaterData;
+        //private AITHeaterData m_ForelineHeaterData;
+        //private AITHeaterData m_WallHeaterData;
+        private AITHeaterData m_PendulumHeaterData;
 
         private AITRfData m_SRFData;
         private AITRfData m_BRFData;
@@ -558,21 +559,21 @@ namespace Venus_MainPages.ViewModels
             get { return m_MFCN2Data; }
             set { SetProperty(ref m_MFCN2Data, value); }
         }
-        public AITHeaterData ValveHeaterData
-        {
-            get { return m_ValveHeaterData; }
-            set { SetProperty(ref m_ValveHeaterData, value); }
-        }
-        public AITHeaterData ForelineHeaterData
-        {
-            get { return m_ForelineHeaterData; }
-            set { SetProperty(ref m_ForelineHeaterData, value); }
-        }
-        public AITHeaterData WallHeaterData
-        {
-            get { return m_WallHeaterData; }
-            set { SetProperty(ref m_WallHeaterData, value); }
-        }
+        //public AITHeaterData ValveHeaterData
+        //{
+        //    get { return m_ValveHeaterData; }
+        //    set { SetProperty(ref m_ValveHeaterData, value); }
+        //}
+        //public AITHeaterData ForelineHeaterData
+        //{
+        //    get { return m_ForelineHeaterData; }
+        //    set { SetProperty(ref m_ForelineHeaterData, value); }
+        //}
+        //public AITHeaterData WallHeaterData
+        //{
+        //    get { return m_WallHeaterData; }
+        //    set { SetProperty(ref m_WallHeaterData, value); }
+        //}
 
         public AITRfData SRFData
         {
@@ -910,6 +911,11 @@ namespace Venus_MainPages.ViewModels
             get { return m_HighTemperatureHeaterTemperatureSetpoint; }
             set { SetProperty(ref m_HighTemperatureHeaterTemperatureSetpoint, value); }
         }
+        public AITHeaterData PendulumHeaterData
+        {
+            get { return m_PendulumHeaterData; }
+            set { SetProperty(ref m_PendulumHeaterData, value); }
+        }
         #endregion
 
         #region 命令
@@ -1588,9 +1594,10 @@ namespace Venus_MainPages.ViewModels
             //ESCHVData= CommonFunction.GetValue<AITHVData>(RtDataValues, $"{ModuleName}.{VenusDevice.ESCHV}.DeviceData");
 
 
-            ValveHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ValveHeater.DeviceData"];
-            ForelineHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ForelineHeater.DeviceData"];
-            WallHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.WallHeater.DeviceData"];
+            //ValveHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ValveHeater.DeviceData"];
+            //ForelineHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.ForelineHeater.DeviceData"];
+            //WallHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.WallHeater.DeviceData"];
+            //PendulumHeaterData = (AITHeaterData)RtDataValues[$"{ModuleName}.PendulumHeater.DeviceData"];
 
             ProcessHighPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessHighPressure");
             ProcessLowPressure = CommonFunction.GetValue<float>(RtDataValues, $"{ModuleName}.ProcessLowPressure");
@@ -1758,9 +1765,12 @@ namespace Venus_MainPages.ViewModels
             //m_RtDataKeys.Add($"{ModuleName}.WallTempFeedBack");
             m_RtDataKeys.Add($"{ModuleName}.Chiller.IsOn");
 
-            m_RtDataKeys.Add($"{ModuleName}.ValveHeater.DeviceData");
-            m_RtDataKeys.Add($"{ModuleName}.ForelineHeater.DeviceData");
-            m_RtDataKeys.Add($"{ModuleName}.WallHeater.DeviceData");
+            //m_RtDataKeys.Add($"{ModuleName}.ValveHeater.DeviceData");
+            //m_RtDataKeys.Add($"{ModuleName}.ForelineHeater.DeviceData");
+            //m_RtDataKeys.Add($"{ModuleName}.WallHeater.DeviceData");
+            //m_RtDataKeys.Add($"{ModuleName}.PendulumHeater.DeviceData");
+
+
             m_RtDataKeys.Add($"{ModuleName}.FsmState");
 
             m_RtDataKeys.Add($"{ModuleName}.IsTurboPumpAtSpeed");

File diff suppressed because it is too large
+ 1 - 1
Venus/Venus_MainPages/Views/EfemView.xaml


+ 2 - 2
Venus/Venus_MainPages/Views/OperationOverView.xaml

@@ -60,8 +60,8 @@
             <!--<customControls:WaferRobotControl OriginT="PMA"    Canvas.Left="310" Canvas.Top="453"   Width="160" Height="240"    RobotTAction="{Binding Robot3TAction}" RobotXAction="{Binding Robot3XAction}"  RobotWafer="{Binding EFEMBladeAWafer}"/>
             <customControls:WaferRobotControl OriginT="PMD"    Canvas.Left="310" Canvas.Top="453"   Width="160" Height="240"    RobotTAction="{Binding Robot4TAction}" RobotXAction="{Binding Robot4XAction}"  RobotWafer="{Binding EFEMBladeBWafer}"/>-->
 
-            <customControls:WaferRobotControl OriginT="PMA"    Canvas.Left="310" Canvas.Top="160"   Width="160" Height="240"     RobotTAction="{Binding Robot1TAction}" RobotXAction="{Binding Robot1XAction}"  RobotWafer="{Binding TMBladeAWafer}" IsEnabled="False" Opacity="{Binding RtDataValues[TM.IsOnline],Converter={StaticResource IsOnlineToOpacityConverter}}"/>
-            <customControls:WaferRobotControl OriginT="PMD"    Canvas.Left="310" Canvas.Top="160"   Width="160" Height="240"     RobotTAction="{Binding Robot2TAction}" RobotXAction="{Binding Robot2XAction}"  RobotWafer="{Binding TMBladeBWafer}" IsEnabled="False" Opacity="{Binding RtDataValues[TM.IsOnline],Converter={StaticResource IsOnlineToOpacityConverter}}"/>
+            <customControls:WaferRobotControl OriginT="T_Origin"    Canvas.Left="310" Canvas.Top="160"   Width="160" Height="240"     RobotTAction="{Binding Robot1TAction}" RobotXAction="{Binding Robot1XAction}"  RobotWafer="{Binding TMBladeAWafer}" IsEnabled="False" Opacity="{Binding RtDataValues[TM.IsOnline],Converter={StaticResource IsOnlineToOpacityConverter}}"/>
+            <customControls:WaferRobotControl OriginT="T_Origin"    Canvas.Left="310" Canvas.Top="160"   Width="160" Height="240"     RobotTAction="{Binding Robot2TAction}" RobotXAction="{Binding Robot2XAction}"  RobotWafer="{Binding TMBladeBWafer}" IsEnabled="False" Opacity="{Binding RtDataValues[TM.IsOnline],Converter={StaticResource IsOnlineToOpacityConverter}}"/>
 
 
             <TextBlock Text="{Binding RobotMoveInfo}"     FontSize="20" Canvas.Left="700" Canvas.Top="250" Visibility="Collapsed"/>

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

@@ -775,10 +775,10 @@
                 <TextBlock Text="Foreline Heater"/>
                 <Button Height="18" Width="50" Content="{Binding ForelineHeaterData.FeedBack}" ToolTip="{Binding ForelineHeaterData,Converter={StaticResource HeaterToStringConverter}}" Foreground="White" ContentStringFormat="F1"  Background="{Binding ForelineHeaterData.IsPowerOnSetPoint,Converter={StaticResource boolToColor5}}" Style="{x:Null}" Command="{Binding HeaterCommand}" CommandParameter="{Binding ForelineHeaterData}" Cursor="Hand" />
             </StackPanel>-->
-            <!--<StackPanel Canvas.Top="320" Canvas.Left="1250" Orientation="Vertical">
+            <StackPanel Canvas.Top="320" Canvas.Left="1250" Orientation="Vertical">
                 <TextBlock Text="Pendulum Heater"/>
                 <Button Height="18" Width="50" Content="{Binding PendulumHeaterData.FeedBack}" ToolTip="{Binding PendulumHeaterData,Converter={StaticResource HeaterToStringConverter}}" Foreground="White"  ContentStringFormat="F1" Background="{Binding PendulumHeaterData.IsPowerOnSetPoint,Converter={StaticResource boolToColor5}}" Style="{x:Null}" Command="{Binding HeaterCommand}" CommandParameter="{Binding PendulumHeaterData}" Cursor="Hand"/>
-            </StackPanel>-->
+            </StackPanel>
 
             <!--Chamber-->
             <ctrls:Chamber Canvas.Left="1000" Canvas.Top="224" 

BIN
Venus/Venus_RT/Config/PM/Kepler2200A/Kepler2200ADeviceModel.xml


BIN
Venus/Venus_RT/Config/PM/Kepler2300/Kepler2300DeviceModel.xml


+ 84 - 21
Venus/Venus_RT/Devices/JetKepler2200APM.cs

@@ -630,30 +630,26 @@ namespace Venus_RT.Devices
 
             //2023/03/08添加
             OpenValve(ValveType.PVN22, true);
-            //2023/04/25临时添加
-            //RetractWafer();
-
-
         }
 
-        public override bool SetLiftPin(MovementPosition dirt, out string reason)
-        {
-            reason = string.Empty;
+        //public override bool SetLiftPin(MovementPosition dirt, out string reason)
+        //{
+        //    reason = string.Empty;
 
-            switch (dirt)
-            {
-                case MovementPosition.Down:
-                    return _LiftPin.SetCylinder(false, out reason);
-                case MovementPosition.Up:
-                    return _LiftPin.SetCylinder(true, out reason);
-                case MovementPosition.Left:
-                case MovementPosition.Right:
-                case MovementPosition.Middle:
-                    throw new ArgumentException("Movement argument error");
-            }
+        //    switch (dirt)
+        //    {
+        //        case MovementPosition.Down:
+        //            return _LiftPin.SetCylinder(false, out reason);
+        //        case MovementPosition.Up:
+        //            return _LiftPin.SetCylinder(true, out reason);
+        //        case MovementPosition.Left:
+        //        case MovementPosition.Right:
+        //        case MovementPosition.Middle:
+        //            throw new ArgumentException("Movement argument error");
+        //    }
 
-            return true;
-        }
+        //    return true;
+        //}
 
         public override bool SetSlitDoor(bool open, out string reason)
         {
@@ -776,7 +772,13 @@ namespace Venus_RT.Devices
         {
             return _Chiller != null /*&& _Chiller.IsRunning*/ && !_Chiller.IsError;
         }
-
+        public override bool WaferIsDown
+        {
+            get
+            {
+                return _highTemperatureHeater.CurrentPosition == HighTemperatureHeaterPosition.Position1;
+            }
+        }
 
         public override void SetGeneratorCommunicationMode(int mode)
         {
@@ -952,5 +954,66 @@ namespace Venus_RT.Devices
             if (_backsideHe == null) return false;
             return _backsideHe.SetFlowThreshold(nMin, nMax);
         }
+        public override bool HighTemperatureHeaterGotoPosition(HighTemperatureHeaterPosition highTemperatureHeaterPosition)
+        {
+            return  _highTemperatureHeater.GotoPosition(highTemperatureHeaterPosition);           
+        }
+        public override bool PreparePlace()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            return _highTemperatureHeater.GotoPosition(HighTemperatureHeaterPosition.Position1);
+        }
+        public override bool PreparePick()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            return _highTemperatureHeater.GotoPosition(HighTemperatureHeaterPosition.Position1);
+        }
+        public override bool PreparePlaceIsOK()
+        {
+            return CheckSlitDoorOpen() && _highTemperatureHeater.CurrentPosition==HighTemperatureHeaterPosition.Position1;
+        }
+        public override bool PreparePickIsOK()
+        {
+            return CheckSlitDoorOpen() &&  _highTemperatureHeater.CurrentPosition == HighTemperatureHeaterPosition.Position1;
+        }
+        public override bool EndPlace()
+        {          
+            if (!SetSlitDoor(false, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+            if (!_highTemperatureHeater.GotoPosition(HighTemperatureHeaterPosition.Position2))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set High Temperature Heater To Posotion2 failed");
+                return false;
+            }
+            return true;
+        }
+        public override bool EndPick()
+        {         
+            if (!SetSlitDoor(false, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool EndPlaceIsOK()
+        {
+            return CheckSlitDoorClose() && _highTemperatureHeater.CurrentPosition == HighTemperatureHeaterPosition.Position2;
+        }
+        public override bool EndPickIsOK()
+        {
+            return CheckSlitDoorClose();
+        }
     }
 }

+ 76 - 1
Venus/Venus_RT/Devices/JetKepler2300PM.cs

@@ -276,7 +276,13 @@ namespace Venus_RT.Devices
         {
             return _pendulumValve.IsOpen;
         }
-
+        public override bool WaferIsDown
+        {
+            get
+            {
+                return LiftPinPosition == MovementPosition.Down;
+            }
+        }
         #region 构造函数
         public JetKepler2300PM(ModuleName moduleName) : base(moduleName)
         {
@@ -1076,5 +1082,74 @@ namespace Venus_RT.Devices
             if (_backsideHe == null) return false;
             return _backsideHe.SetFlowThreshold(nMin, nMax);
         }
+        public override bool PreparePlace()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            if (!SetLiftPin(MovementPosition.Down, out reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool PreparePick()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            if (!SetLiftPin(MovementPosition.Up, out reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool PreparePlaceIsOK()
+        {
+            return CheckSlitDoorOpen() && LiftPinIsDown;
+        }
+        public override bool PreparePickIsOK()
+        {
+            return CheckSlitDoorOpen() && LiftPinIsUp;
+        }
+        public override bool EndPlace()
+        {
+            if (!SetLiftPin(MovementPosition.Down, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Down failed:{reason}");
+                return false;
+            }
+
+            if (!SetSlitDoor(false, out reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+
+            return true;
+        }
+        public override bool EndPick()
+        {
+            if (!SetSlitDoor(false, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool EndPlaceIsOK()
+        {
+            return CheckSlitDoorClose() && LiftPinIsDown;
+        }
+        public override bool EndPickIsOK()
+        {
+            return CheckSlitDoorClose();
+        }
     }
 }

+ 96 - 39
Venus/Venus_RT/Devices/JetPMBase.cs

@@ -19,13 +19,13 @@ namespace Venus_RT.Devices
         public abstract bool IsLidClosed { get; }
         public abstract bool IsLidLoadlockClosed { get; }
 
-        public abstract bool  IsSlitDoorClosed { get; }
+        public abstract bool IsSlitDoorClosed { get; }
 
         public abstract bool IsPumpRunning { get; }
         public abstract bool IsTurboPumpRunning { get; }
         public abstract bool IsTurboPumpAtSpeed { get; }
         public abstract float TurboPumpSpeed { get; }
-        public  abstract bool HasPumpError { get; }
+        public abstract bool HasPumpError { get; }
 
         public abstract bool HasTurboPumpError { get; }
 
@@ -114,6 +114,8 @@ namespace Venus_RT.Devices
         public abstract bool PendulumValveIsOpen();
 
         public abstract double LoadlockPressure { get; }
+
+        public virtual bool WaferIsDown { get; }
         public double TMPressure { get { return Singleton<RouteManager>.Instance.TM.TMPressure; } }
 
         public bool IsTMATM { get { return Singleton<RouteManager>.Instance.TM.IsTMATM; } }
@@ -122,20 +124,20 @@ namespace Venus_RT.Devices
 
         // EndPoint 
         private readonly JetEPDBase _epdClient;
-        public  List<string> EPDCfgList => _epdClient?.CFGFileList;
+        public List<string> EPDCfgList => _epdClient?.CFGFileList;
 
         //public List<string> EPDCfgList=new List<string>() { "1","2"};
-        public  bool EPDCaptured => _epdClient.Captured;
-        public  bool EPDConnected => _epdClient.IsEPDConnected;
+        public bool EPDCaptured => _epdClient.Captured;
+        public bool EPDConnected => _epdClient.IsEPDConnected;
 
-        public JetChamber ChamberType= JetChamber.None;
+        public JetChamber ChamberType = JetChamber.None;
 
-        public JetPMBase(ModuleName module) :  base(module.ToString(), module.ToString(), module.ToString(), module.ToString())
+        public JetPMBase(ModuleName module) : base(module.ToString(), module.ToString(), module.ToString(), module.ToString())
         {
             Module = module;
 
             _epdClient = DEVICE.GetDevice<JetEPDBase>($"{Module}.{VenusDevice.EndPoint}");
-            ChamberType= (JetChamber)SC.GetValue<int>($"{Module}.ChamberType");
+            ChamberType = (JetChamber)SC.GetValue<int>($"{Module}.ChamberType");
             DATA.Subscribe($"{Name}.ForelinePressure", () => ForelinePressure);
             DATA.Subscribe($"{Name}.ProcessHighPressure", () => ProcessHighPressure);
             DATA.Subscribe($"{Name}.ProcessLowPressure", () => ProcessLowPressure);
@@ -164,7 +166,7 @@ namespace Venus_RT.Devices
 
             DATA.Subscribe($"{Name}.GetPVPosition", () => GetPVPosition());
 
-            DATA.Subscribe($"{Name}.ESCHV.Temp",      () => CoolantOutletTempFB);
+            DATA.Subscribe($"{Name}.ESCHV.Temp", () => CoolantOutletTempFB);
             DATA.Subscribe($"{Name}.Chiller.Temp", () => CoolantInletTempFB);
 
             //DATA.Subscribe($"{Name}.Chiller.IsOn", () => ChillerIsRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB);
@@ -173,7 +175,8 @@ namespace Venus_RT.Devices
 
 
 
-            OP.Subscribe($"{Module}.SetLiftPin", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetLiftPin", (cmd, args) =>
+            {
                 if ((bool)args[0] == true)
                 {
                     return SetLiftPin(MovementPosition.Up, out _);
@@ -203,7 +206,8 @@ namespace Venus_RT.Devices
                 return true;
             });
 
-            OP.Subscribe($"{Module}.SetBRf", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetBRf", (cmd, args) =>
+            {
 
                 var ison = (bool)args[1];
                 if (ison == true)
@@ -220,66 +224,79 @@ namespace Venus_RT.Devices
             });
 
 
-            OP.Subscribe($"{Module}.SetSlitDoor", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetSlitDoor", (cmd, args) =>
+            {
                 SetSlitDoor((bool)args[0], out _);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.SetESCHVIsOn", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetESCHVIsOn", (cmd, args) =>
+            {
                 OnOffSetESCHV((bool)args[0]);
                 return true;
             });
-            OP.Subscribe($"{Module}.SetESCHV", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetESCHV", (cmd, args) =>
+            {
                 SetESCClampVoltage((int)args[0]);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.SetPVPostion", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetPVPostion", (cmd, args) =>
+            {
                 SetPVPostion((int)args[0]);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.SetPVPressure", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetPVPressure", (cmd, args) =>
+            {
                 SetPVPressure((int)args[0]);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.ClosePump", (cmd, args) => {
+            OP.Subscribe($"{Module}.ClosePump", (cmd, args) =>
+            {
                 TurnDryPump(false);
                 return true;
             });
-            OP.Subscribe($"{Module}.CloseTurboPump", (cmd, args) => {
+            OP.Subscribe($"{Module}.CloseTurboPump", (cmd, args) =>
+            {
                 TurnTurboPump(false);
                 return true;
             });
-            OP.Subscribe($"{Module}.ControlValve", (cmd, args) => {
+            OP.Subscribe($"{Module}.ControlValve", (cmd, args) =>
+            {
                 OpenValve((ValveType)((int)args[0]), (bool)args[1]);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.TurnPendulumValve", (cmd, args) => {
+            OP.Subscribe($"{Module}.TurnPendulumValve", (cmd, args) =>
+            {
                 TurnPendulumValve((bool)args[0]);
                 return true;
             });
 
-            OP.Subscribe($"{Module}.HeatChiller", (cmd, args) => {
+            OP.Subscribe($"{Module}.HeatChiller", (cmd, args) =>
+            {
                 var chillerType = (ChillerType)Enum.Parse(typeof(ChillerType), args[0].ToString());
                 HeatChiller(chillerType, (float)args[1], (float)args[2]);
                 return true;
             });
-            OP.Subscribe($"{Module}.OnOffChiller", (cmd, args) => {
+            OP.Subscribe($"{Module}.OnOffChiller", (cmd, args) =>
+            {
                 var chillerType = (ChillerType)Enum.Parse(typeof(ChillerType), args[0].ToString());
                 var ison = Convert.ToBoolean(args[1]);
                 OnOffChiller(chillerType, ison);
                 return true;
             });
-            OP.Subscribe($"{Module}.WallChiller", (cmd, args) => {
+            OP.Subscribe($"{Module}.WallChiller", (cmd, args) =>
+            {
                 float value;
                 float.TryParse(args[0].ToString(), out value);
                 SetWallTCTemperature(value);
                 return true;
             });
-            OP.Subscribe($"{Module}.SetBacksideHeFlow", (cmd, args) => {
+            OP.Subscribe($"{Module}.SetBacksideHeFlow", (cmd, args) =>
+            {
                 double value;
                 double.TryParse(args[0].ToString(), out value);
                 SetBacksideHeFlow(value);
@@ -309,21 +326,21 @@ namespace Venus_RT.Devices
         public abstract void OpenValve(ValveType vlvType, bool on);
 
         public virtual void Monitor()
-        { 
-        
+        {
+
         }
         public virtual bool Initialize()
         {
             return true;
         }
         public virtual void Terminate()
-        { 
-        
+        {
+
         }
 
         public virtual void Reset()
-        { 
-        
+        {
+
         }
 
         public abstract bool OnOffSetESCHV(bool on);
@@ -339,7 +356,11 @@ namespace Venus_RT.Devices
 
         public abstract void Home();
 
-        public abstract bool SetLiftPin(MovementPosition dirt, out string reason);
+        public virtual bool SetLiftPin(MovementPosition dirt, out string reason)
+        {
+            reason = "";
+            return false;
+        }
 
         public abstract bool SetSlitDoor(bool open, out string reason);
 
@@ -364,9 +385,9 @@ namespace Venus_RT.Devices
 
         public abstract int GetPVPosition();
 
-        public abstract  void HeatChiller(ChillerType chillerType,double value, double offset);
+        public abstract void HeatChiller(ChillerType chillerType, double value, double offset);
 
-        public abstract void OnOffChiller(ChillerType chillerType,bool onoff);
+        public abstract void OnOffChiller(ChillerType chillerType, bool onoff);
 
         public abstract bool CheckChillerStatus();
 
@@ -406,7 +427,7 @@ namespace Venus_RT.Devices
                 _epdClient?.RecipeStart(recipe);
             }
             catch
-            { 
+            {
             }
         }
 
@@ -417,9 +438,9 @@ namespace Venus_RT.Devices
                 _epdClient?.RecipeStop();
             }
             catch
-            { 
+            {
             }
-            
+
         }
 
         public void EPDStepStart(string cfgName, int step)
@@ -429,7 +450,7 @@ namespace Venus_RT.Devices
                 _epdClient?.StepStart(cfgName, step);
             }
             catch
-            { 
+            {
             }
         }
 
@@ -440,7 +461,7 @@ namespace Venus_RT.Devices
                 _epdClient?.StepStop();
             }
             catch
-            { 
+            {
             }
         }
 
@@ -452,6 +473,42 @@ namespace Venus_RT.Devices
 
         public abstract bool SetBacksideHeThreshold(int nMin, int nMax);
 
-       
+        public virtual bool PreparePlace()
+        {
+            return false;
+        }
+        public virtual bool PreparePick()
+        {
+            return false;
+        }
+        public virtual bool PreparePlaceIsOK()
+        {
+            return false;
+        }
+        public virtual bool PreparePickIsOK()
+        {
+            return false;
+        }
+        public virtual bool EndPlace()
+        {
+            return false;
+        }
+        public virtual bool EndPlaceIsOK()
+        {
+            return false;
+        }
+        public virtual bool EndPick()
+        {
+            return false;
+        }
+        public virtual bool EndPickIsOK()
+        {
+            return false;
+        }
+        public virtual bool HighTemperatureHeaterGotoPosition(HighTemperatureHeaterPosition highTemperatureHeaterPosition)
+        {
+            return false;
+        }
+
     }
 }

+ 79 - 1
Venus/Venus_RT/Devices/JetVenusPM.cs

@@ -16,6 +16,7 @@ using IoMfc = Venus_RT.Devices.IODevices.IoMfc;
 using System.Threading.Tasks;
 using Aitex.Core.RT.DataCenter;
 using Venus_RT.Modules;
+using System.Windows.Media;
 
 namespace Venus_RT.Devices
 {
@@ -189,7 +190,14 @@ namespace Venus_RT.Devices
         public override float RFMatchC2 => _Match != null ? _Match.TunePosition2 : 0;
         public override float BiasRFMatchC1 => _BiasMatch != null ? _BiasMatch.TunePosition1 : 0;
         public override float BiasRFMatchC2 => _BiasMatch != null ? _BiasMatch.TunePosition1 : 0;
-
+        
+        public override bool WaferIsDown
+        {
+            get
+            {
+                return LiftPinPosition == MovementPosition.Down;
+            }
+        }
 
         public new ModuleName Module { get; }
 
@@ -970,5 +978,75 @@ namespace Venus_RT.Devices
             if (_backsideHe == null) return false;
             return _backsideHe.SetFlowThreshold(nMin, nMax);
         }
+        public override bool PreparePlace()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            if (!SetLiftPin(MovementPosition.Down, out  reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool PreparePick()
+        {
+            if (!SetSlitDoor(true, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
+                return false;
+            }
+            if (!SetLiftPin(MovementPosition.Up, out reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool PreparePlaceIsOK()
+        {
+            return CheckSlitDoorOpen() && LiftPinIsDown;
+        }
+        public override bool PreparePickIsOK()
+        {
+            return CheckSlitDoorOpen() && LiftPinIsUp;
+        }
+        public override bool EndPlace()
+        {
+            if (!SetLiftPin(MovementPosition.Down, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Down failed:{reason}");
+                return false;
+            }
+
+            if (!SetSlitDoor(false, out reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+
+            return true;
+        }
+       
+        public override bool EndPick()
+        {          
+            if (!SetSlitDoor(false, out string reason))
+            {
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+                return false;
+            }
+            return true;
+        }
+        public override bool EndPlaceIsOK()
+        {
+            return CheckSlitDoorClose() && LiftPinIsDown;
+        }
+        public override bool EndPickIsOK()
+        {
+            return CheckSlitDoorClose();
+        }
     }
 }

+ 9 - 2
Venus/Venus_RT/Devices/SMCChiller.cs

@@ -63,7 +63,7 @@ namespace Venus_RT.Devices
         BlockingCollection<string> blockingCollection = new BlockingCollection<string>();
         JetChamber jetChamber;
 
-        
+        private bool chillerIsOn;
         private void SetAlarmMsg()
         {
             AlarmMsg[0] = "Low level in tank";
@@ -153,7 +153,7 @@ namespace Venus_RT.Devices
         {
             get
             {
-                return StatusSMC == SMCChillerState.ON;
+                return chillerIsOn;
             }
         }
 
@@ -416,9 +416,16 @@ namespace Venus_RT.Devices
                 }
 
                 if (Statusflag[0])
+                {
                     this.StatusSMC = SMCChillerState.ON;
+                    chillerIsOn = true;
+                }
+
                 else
+                { 
                     this.StatusSMC = SMCChillerState.OFF;
+                    chillerIsOn = false;
+                }
 
                 for (int i = 0; i < 48; i++)
                 {

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

@@ -195,7 +195,7 @@ namespace Venus_RT.Modules.PMs
                 Stop($"GasBox Leakcheck失败, 腔体漏率 [{LeakRate}] mt/min, 高于 [{_leakRate}] mt/min");
                 pMLeakCheckResult.Result = "Fail";
             }
-            LeakCheckDataRecorder.Add(_leakcheckHoldTime, (int)_startPressure, (int)_endPressure, LeakRate, pMLeakCheckResult.Result, pMLeakCheckResult.CheckMode, _chamber.Name, gasLines.ToString());
+            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);

+ 57 - 36
Venus/Venus_RT/Modules/PMs/PMEntity.cs

@@ -164,6 +164,7 @@ namespace Venus_RT.Modules.PMs
         //private ushort _ActivatedActionID;
         //private Stopwatch _LifpinSleepTimer;
 
+        public JetChamber ChamberType => _chamber.ChamberType;
         public bool IsIdle
         {
             get { return fsm.State == (int)PMState.Idle; }
@@ -528,6 +529,7 @@ namespace Venus_RT.Modules.PMs
             Transition(PMState.ReadyForPick,    MSG.PreparePick,    null,                   PMState.ReadyForPick);
             Transition(PMState.DropDownWafer,   FSM_MSG.TIMER,      FnDropDownTimeout,      PMState.DropDownReady);
             Transition(PMState.DropDownReady,   MSG.PickReady,      FnStartFinishPick,      PMState.FinishPick);
+            Transition(PMState.ReadyForPick,    MSG.PickReady,      FnStartFinishPick,      PMState.FinishPick);
             Transition(PMState.FinishPick,      FSM_MSG.TIMER,      FnFinishPickTimeout,    PMState.Idle);
             
             
@@ -539,6 +541,7 @@ namespace Venus_RT.Modules.PMs
             Transition(PMState.ReadyForPlace,   MSG.LiftUpWafer,    FnStartLiftUpWafer,     PMState.LiftUpWafer);
             Transition(PMState.LiftUpWafer,     FSM_MSG.TIMER,      FnLiftUpTimeout,        PMState.LiftUpReady);
             Transition(PMState.LiftUpReady,     MSG.PlaceReady,     FnStartFinishPlace,     PMState.FinishPlace);
+            Transition(PMState.ReadyForPlace,   MSG.PlaceReady,     FnStartFinishPlace,     PMState.FinishPlace);
             Transition(PMState.PreparePlace,    MSG.Abort,          FnAortPlace,            PMState.Idle);
             Transition(PMState.ReadyForPlace,   MSG.Abort,          FnAortPlace,            PMState.Idle);
             Transition(PMState.ReadyForPlace,   MSG.PreparePlace,   null,                   PMState.ReadyForPlace);
@@ -1211,13 +1214,19 @@ namespace Venus_RT.Modules.PMs
         #region Exchange wafer with TM
         private bool FnStartPreparePick(object[] param)
         {
-            if(!_chamber.SetLiftPin(MovementPosition.Up, out string reason))
+            //if(!_chamber.SetLiftPin(MovementPosition.Up, out string reason))
+            //{
+            //    LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Up failed:{reason}");
+            //    return false;
+            //}
+            if (!_chamber.PreparePick())
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Up failed:{reason}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Wafer Up failed");
                 return false;
             }
+            string reason = "";
 
-            if(!_chamber.SetSlitDoor(true, out reason))
+            if (!_chamber.SetSlitDoor(true, out reason))
             {
                 LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason}");
                 return false;
@@ -1227,7 +1236,8 @@ namespace Venus_RT.Modules.PMs
         }
         private bool FnPreparePickTimeout(object[] param)
         {
-            return _chamber.LiftPinIsUp && IsSlitDoorOpen;
+            // return _chamber.WaferIsDown && IsSlitDoorOpen;
+            return _chamber.PreparePickIsOK();
         }
         private bool FnAbortPreparePick(object[] param)
         {
@@ -1236,13 +1246,14 @@ namespace Venus_RT.Modules.PMs
 
         private bool FnStartFinishPick(object[] param)
         {
-            if (!_chamber.SetSlitDoor(false, out string reason))
-            {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
-                return false;
-            }
+            //if (!_chamber.SetSlitDoor(false, out string reason))
+            //{
+            //    LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+            //    return false;
+            //}
 
-            return true;
+            //return true;
+            return _chamber.EndPick();
         }
         private bool FnAbortPick(object[] param)
         {
@@ -1250,7 +1261,8 @@ namespace Venus_RT.Modules.PMs
         }
         private bool FnFinishPickTimeout(object[] param)
         {
-            return IsSlitDoorClose;
+            //return IsSlitDoorClose;
+            return _chamber.EndPickIsOK();
         }
 
         private bool FnStartDropDownWafer(object[] param)
@@ -1271,27 +1283,34 @@ namespace Venus_RT.Modules.PMs
 
         private bool FnStartPreparePlace(object[] param)
         {
-            if (_chamber.ChamberType == JetChamber.Venus || _chamber.ChamberType == JetChamber.Kepler2300)
-            {
-                if (!_chamber.SetLiftPin(MovementPosition.Down, out string reason))
-                {
-                    LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
-                    return false;
-                }
-            }
-           
-
-            if (!_chamber.SetSlitDoor(true, out string reason2))
+            //if (_chamber.ChamberType == JetChamber.Venus || _chamber.ChamberType == JetChamber.Kepler2300)
+            //{
+            //    if (!_chamber.SetLiftPin(MovementPosition.Down, out string reason))
+            //    {
+            //        LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+            //        return false;
+            //    }
+            //}
+            if (!_chamber.PreparePlace())
             {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Open failed:{reason2}");
+                LOG.Write(eEvent.ERR_PM, Module, $"Set Wafer Down failed");
                 return false;
             }
+            //string reason = "";
+            //if (!_chamber.SetLiftPin(MovementPosition.Down, out string reason))
+            //{
+            //    LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin down failed:{reason}");
+            //    return false;
+            //}
+
+            
 
             return true;
         }
         private bool FnPreparePlaceTimeout(object[] param)
         {
-            return _chamber.LiftPinIsDown && IsSlitDoorOpen;
+            return _chamber.PreparePlaceIsOK();
+
         }
         private bool FnAbortPreparePlace(object[] param)
         {
@@ -1316,19 +1335,20 @@ namespace Venus_RT.Modules.PMs
 
         private bool FnStartFinishPlace(object[] param)
         {
-            if (!_chamber.SetLiftPin(MovementPosition.Down, out string reason))
-            {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Down failed:{reason}");
-                return false;
-            }
+            //if (!_chamber.SetLiftPin(MovementPosition.Down, out string reason))
+            //{
+            //    LOG.Write(eEvent.ERR_PM, Module, $"Set Lift Pin Down failed:{reason}");
+            //    return false;
+            //}
 
-            if (!_chamber.SetSlitDoor(false, out reason))
-            {
-                LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
-                return false;
-            }
+            //if (!_chamber.SetSlitDoor(false, out reason))
+            //{
+            //    LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
+            //    return false;
+            //}
 
-            return true;
+            //return true;
+            return _chamber.EndPlace();
         }
         private bool FnAortPlace(object[] param)
         {
@@ -1336,7 +1356,8 @@ namespace Venus_RT.Modules.PMs
         }
         private bool FnFinishPlaceTimeout(object[] param)
         {
-            return _chamber.LiftPinIsDown && IsSlitDoorClose;
+            //return _chamber.LiftPinIsDown && IsSlitDoorClose;
+            return _chamber.EndPlaceIsOK();
         }
         private bool FnStartSwapPlace(object[] param)
         {

+ 16 - 9
Venus/Venus_RT/Modules/PMs/PMGasVerificationRoutine.cs

@@ -163,14 +163,27 @@ namespace Venus_RT.Modules.PMs
                 .LoopStart(GasStep.kPumpDown_1,         $"{_mfcDevice.Name} Gas Verification",  _paramFlowSet.Count,        PumpingDown,        WaitPumpDone)
                 .LoopRun(GasStep.kGasFlow,              FlowGas,                                CheckGasStable)
                 .LoopDelay(GasStep.KDelay_2S,           2 * 1000)
-                .LoopRun(GasStep.KGetBeginPressure,     GetBeginPressure)
-                .LoopDelay(GasStep.kDelay_1,            _holdTime * 1000)
+                .LoopRun(GasStep.KGetBeginPressure,     GetBeginPressure, JudgePressure,        (_holdTime+10) * 1000)
+                //.LoopDelay(GasStep.kDelay_1,            _holdTime * 1000)
                 .LoopRun(GasStep.kGasVerification,      CalcMfcCalibration,                     _delay_2s)
                 .LoopEnd(GasStep.kStopGasFlow,          StopGasFlow,                            IsPumpDownOK)
                 .End(GasStep.kEnd,                      NullFun,                                _delay_2s);
 
             return Runner.Status;
         }
+
+        private bool JudgePressure()
+        {
+            if (_verificationDeviceTimer.GetElapseTime()<3*60*1000 && _chamber.ChamberPressure>9000)
+            {
+                return true;
+            }
+            if (_verificationDeviceTimer.GetElapseTime() >_holdTime*1000)
+            {
+                return true;
+            }
+            return false;
+        }
         public void Abort()
         {
             _verificationDeviceTimer.Stop();
@@ -288,14 +301,8 @@ namespace Venus_RT.Modules.PMs
             _elapsedTime = _verificationDeviceTimer.GetElapseTime() / (1000 * 60); //unit minutes
 
             float flow = _paramMode == VerifyMode.TenPoint ? _paramFlowSet[Runner.LoopCounter] : _mfcFlow;
-            if (_flag)
-            {
-
-            }
-            else
-            { 
             _mfcActualFlow = 273.15 * _chamberVolume / ((273.15 + _gasTemperature) * 760000) * ((_endPressure - _beginPressure) / _elapsedTime - _leakRate);
-            }
+
             Notify($"Calculate flow: calculate flow={_mfcActualFlow}, setpoint={flow}, begin pressure(mtorr)={_beginPressure:f3}, end pressure(mtorr)={_endPressure:f3}," +
                 $"elapsed time(minute)={_elapsedTime:f3}");
             _MFCCalibrationDatas.Add(new MFCCalibrationData(flow,_mfcActualFlow));

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

@@ -145,7 +145,7 @@ namespace Venus_RT.Modules.PMs
                 Stop($"PM Leakcheck失败, 腔体漏率 [{LeakRate}] mt/min, 高于 [{_leakRate}] mt/min");
                 pMLeakCheckResult.Result = "Fail";
             }
-            LeakCheckDataRecorder.Add(_leakcheckHoldTime, (int)_startPressure, (int)_endPressure, LeakRate, pMLeakCheckResult.Result, "ChamberOnly", _chamber.Name);
+            LeakCheckDataRecorder.Add(_leakcheckHoldTime, Math.Round(_startPressure,1) , Math.Round(_endPressure, 1) , LeakRate, pMLeakCheckResult.Result, "ChamberOnly", _chamber.Name);
             _chamber.OpenValve(ValveType.GasFinal, true);
             _chamber.TurnPendulumValve(true);
             pMLeakCheckResult.LeakCheckTime = (int)_routineTimer.ElapsedMilliseconds / 1000;

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

@@ -486,7 +486,7 @@ namespace Venus_RT.Modules.PMs
         {
             _currentRecipe.Steps[_currentStep].End();
 
-            RecipeFileManager.Instance.SaveAsRecipe2(Module.ToString(),_recipeType.ToString(), _currentRecipe.Header.Name, RecipeUnity.RecipeToString(_currentRecipe));
+            RecipeFileManager.Instance.SaveAsRecipe2(Module.ToString(), _currentRecipe.Header.Type.ToString(), _currentRecipe.Header.Name, RecipeUnity.RecipeToString(_currentRecipe));
             _stepTime.Stop();
             WaferManager.Instance.UpdateWaferProcessStatus(Module, 0, EnumWaferProcessStatus.Idle);
             CloseAllValves();

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

@@ -135,7 +135,7 @@ namespace Venus_RT.Modules.PMs
                 Notify($"水冷当前温度{_chamber.CoolantOutletTempFB} ℃, 大于目标 {target.ToString()} ℃");
             }
 
-            //_chamber.HeatChiller(target, offset);
+            _chamber.HeatChiller(ChillerType.Chiller,target, offset);
             Notify($"检查水冷温度值,当前温度{_chamber.CoolantOutletTempFB} ℃, 目标 {target.ToString()} ℃");
 
             return true;

+ 59 - 11
Venus/Venus_RT/Modules/TM/MFPMPickRoutine.cs

@@ -21,7 +21,7 @@ namespace Venus_RT.Modules.TM
         private enum PickStep
         {
             WaitPMReady,
-            PMPrepare,
+            PMPrepare,           
             ArmExtend,
             QueryAWC,
             DropDownWafer,
@@ -30,7 +30,15 @@ namespace Venus_RT.Modules.TM
             SavePickeData,
             NotifyDone,
         }
-
+        private enum PickStepWithHeater
+        {
+            WaitPMReady,
+            PMPrepare,
+            Picking,   
+            QueryAWC,
+            SavePickeData,
+            NotifyDone,
+        }
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
@@ -103,15 +111,32 @@ namespace Venus_RT.Modules.TM
 
         public RState Monitor()
         {
-            Runner.Wait(PickStep.WaitPMReady,  () => _pmModule.IsIdle,     _delay_60s)
-                .Run(PickStep.PMPrepare,       ModulePrepare,              IsModulePrepareReady)
-                .Run(PickStep.ArmExtend,       ArmExtend,                  WaitRobotExtendDone)
-                .Run(PickStep.QueryAWC,        QueryAWC,                   WaitRobotQueryDone,     _delay_1s)
-                .Run(PickStep.DropDownWafer,   NotifyPMPickWafer,          WaitPMWaferDropDown)
-                .Delay(PickStep.PickDelay,     _pickDelayTime)
-                .Run(PickStep.ArmRetract,      ArmRetract,                 WaitRobotRetractDone)
-                .Run(PickStep.SavePickeData,   RecordAWCData,              NullFun)
-                .End(PickStep.NotifyDone,      NotifyPMDone,               _delay_50ms);
+            switch (_pmModule.ChamberType)
+            {
+                case JetChamber.Venus:
+                case JetChamber.Kepler2300:
+
+          Runner.Wait(PickStep.WaitPMReady,          () => _pmModule.IsIdle, _delay_60s)
+                .Run(PickStep.PMPrepare,             ModulePrepare,      IsModulePrepareReady)
+                .Run(PickStep.ArmExtend,             ArmExtend,          WaitRobotExtendDone)
+                .Run(PickStep.QueryAWC,              QueryAWC,           WaitRobotQueryDone,    _delay_1s)
+                .Run(PickStep.DropDownWafer,         NotifyPMPickWafer,  WaitPMWaferDropDown)
+                .Delay(PickStep.PickDelay, _pickDelayTime)
+                .Run(PickStep.ArmRetract,            ArmRetract,         WaitRobotRetractDone)
+                .Run(PickStep.SavePickeData,         RecordAWCData,      NullFun)
+                .End(PickStep.NotifyDone,            NotifyPMDone,                               _delay_50ms);
+                break;
+
+                case JetChamber.Kepler2200A:
+         Runner.Wait(PickStepWithHeater.WaitPMReady,           () => _pmModule.IsIdle, _delay_60s)
+               .Run(PickStepWithHeater.PMPrepare,              ModulePrepare,      IsModulePrepareReady)
+               .Run(PickStepWithHeater.Picking,                Picking,            WaitPickDone)
+               .Run(PickStepWithHeater.QueryAWC,               QueryAWC,           WaitRobotQueryDone)
+               .Run(PickStepWithHeater.SavePickeData,          RecordAWCData,      NullFun)
+               .End(PickStepWithHeater.NotifyDone,             NotifyPMDone,                                 _delay_1s);
+                break;
+            }
+            
 
             return Runner.Status;
         }
@@ -126,7 +151,30 @@ namespace Venus_RT.Modules.TM
         {
             return _pmModule.Status == PMEntity.PMStatus.Ready_For_Pick && _pmModule.IsSlitDoorOpen;
         }
+        private bool Picking()
+        {
+            return _robot.Pick(_targetModule, _targetSlot, _hand);
+        }
 
+        private bool WaitPickDone()
+        {
+            if (_robot.Status == RState.Running)
+            {
+                return false;
+            }
+            else if (_robot.Status == RState.End)
+            {
+                //WaferManager.Instance.WaferMoved(ModuleName.TM, (int)_hand, _targetModule, _targetSlot);
+                WaferManager.Instance.WaferMoved(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_hand);
+
+                return true;
+            }
+            else
+            {
+                Runner.Stop($"TM Robot Picking failed, {_robot.Status}");
+                return true;
+            }
+        }
         private bool ArmExtend()
         {
             return _robot.PickExtend(_targetModule, _targetSlot, _hand);

+ 61 - 10
Venus/Venus_RT/Modules/TM/MFPMPlaceRoutine.cs

@@ -31,6 +31,16 @@ namespace Venus_RT.Modules.TM
             SavePlaceData,
             NotifyDone,
         }
+        private enum PlaceWithHeaterStep
+        {
+            WaitPMReady,
+            PreRotation,
+            PMPrepare,
+            Placing,
+            QueryAWC,
+            SavePlaceData,
+            NotifyDone,
+        }
 
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
@@ -103,16 +113,36 @@ namespace Venus_RT.Modules.TM
 
         public RState Monitor()
         {
-            Runner.Wait(PlaceStep.WaitPMReady,     () => _pmModule.IsIdle,                                          _delay_60s)
-                .RunIf(PlaceStep.PreRotation,       _JetTM.PreRotateModules.ContainsKey(_targetModule),             RotateArm,          WaitRotateDone)
-                .Run(PlaceStep.PMPrepare,          ModulePrepare,                       IsModulePrepareReady,       _delay_60s)
-                .Run(PlaceStep.ArmExtend,          ArmExtend,                           WaitRobotExtendDone,        _placingTimeout)
-                .Run(PlaceStep.QueryAWC,           QueryAWC,                            WaitRobotQueryDone,         _delay_1s)
-                .Run(PlaceStep.LiftUpWafer,        NotifyPMPlaceWafer,                  WaitPMWaferLiftUp,          _delay_30s)
-                .Delay(PlaceStep.PlaceDelay,        _placeDelayTime)
-                .Run(PlaceStep.ArmRetract,         ArmRetract,                          WaitRobotRetractDone,       _delay_30s)
-                .Run(PlaceStep.SavePlaceData,      RecordAWCData,                       NullFun)
-                .End(PlaceStep.NotifyDone,         NotifyPMDone,                                                    _delay_50ms);
+            switch (_pmModule.ChamberType)
+            {
+                case JetChamber.Venus:
+                case JetChamber.Kepler2300:
+
+                    Runner.Wait(PlaceStep.WaitPMReady,       () => _pmModule.IsIdle,                                                       _delay_60s)
+               .RunIf(PlaceStep.PreRotation,                 _JetTM.PreRotateModules.ContainsKey(_targetModule),   RotateArm,              WaitRotateDone)
+               .Run(PlaceStep.PMPrepare,                     ModulePrepare,                                        IsModulePrepareReady,   _delay_60s)
+               .Run(PlaceStep.ArmExtend,                     ArmExtend,                                            WaitRobotExtendDone,    _placingTimeout)
+               .Run(PlaceStep.QueryAWC,                      QueryAWC,                                             WaitRobotQueryDone,     _delay_1s)
+               .Run(PlaceStep.LiftUpWafer,                   NotifyPMPlaceWafer,                                   WaitPMWaferLiftUp,      _delay_30s)
+               .Delay(PlaceStep.PlaceDelay,                  _placeDelayTime)
+               .Run(PlaceStep.ArmRetract,                    ArmRetract,                                           WaitRobotRetractDone,   _delay_30s)
+               .Run(PlaceStep.SavePlaceData,                 RecordAWCData,                                        NullFun)
+               .End(PlaceStep.NotifyDone,                    NotifyPMDone,                                                                  _delay_50ms);
+
+                    break;
+
+                case JetChamber.Kepler2200A:
+                    Runner.Wait(PlaceWithHeaterStep.WaitPMReady,    () => _pmModule.IsIdle, _delay_60s)
+              .RunIf(PlaceWithHeaterStep.PreRotation,               _JetTM.PreRotateModules.ContainsKey(_targetModule),  RotateArm, WaitRotateDone)
+              .Run(PlaceWithHeaterStep.PMPrepare,                   ModulePrepare,                                       IsModulePrepareReady, _delay_60s)
+              .Run(PlaceWithHeaterStep.Placing,                     Placing,                                             WaitPlaceDone)
+              .Run(PlaceWithHeaterStep.QueryAWC,                    QueryAWC,                                            WaitRobotQueryDone, _delay_1s)
+              .Run(PlaceWithHeaterStep.SavePlaceData,               RecordAWCData,                                       NullFun)
+              .End(PlaceWithHeaterStep.NotifyDone,                  NotifyPMDone,                                        _delay_50ms);
+                    break;
+            }
+
+           
 
             return Runner.Status;
         }
@@ -150,7 +180,28 @@ namespace Venus_RT.Modules.TM
                 return true;
             }
         }
+        private bool Placing()
+        {
+            return _robot.Place(_targetModule, _targetSlot, _hand);
+        }
 
+        private bool WaitPlaceDone()
+        {
+            if (_robot.Status == RState.Running)
+            {
+                return false;
+            }
+            else if (_robot.Status == RState.End)
+            {
+                WaferManager.Instance.WaferMoved(ModuleName.TMRobot, (int)_hand, _targetModule, _targetSlot);
+                return true;
+            }
+            else
+            {
+                Runner.Stop($"TM Robot Place failed, {_robot.Status}");
+                return true;
+            }
+        }
         private bool ArmExtend()
         {
             return _robot.PlaceExtend(_targetModule, _targetSlot, _hand);

+ 100 - 14
Venus/Venus_RT/Modules/TM/MFPMSwapRoutine.cs

@@ -32,7 +32,16 @@ namespace Venus_RT.Modules.TM
             PlaceRetract,
             NotifyDone,
         }
-
+        private enum SwapWithHeaterStep
+        {
+            WaitPMReady,
+            PreRotation,
+            PickPrepare,
+            Picking,
+            PlacePrepare,
+            Placing,
+            NotifyDone,
+        }
         private readonly JetTM _JetTM;
         private readonly ITransferRobot _robot;
 
@@ -103,20 +112,51 @@ namespace Venus_RT.Modules.TM
 
         public RState Monitor()
         {
-            Runner.Wait(SwapStep.WaitPMReady,       () => _pmModule.IsIdle,                             _delay_60s)
-                .RunIf(SwapStep.PreRotation,        _JetTM.PreRotateModules.ContainsKey(_targetModule), RotateArm,              WaitRotateDone)
-                .Run(SwapStep.PickPrepare,          PickPrepare,                                        IsModuleReadyForPick)
-                .Run(SwapStep.PickExtend,           PickExtend,                                         WaitRobotExtendDone)
-                .Run(SwapStep.DropDownWafer,        NotifyPMPickWafer,                                  WaitPMWaferDropDown)
-                .Delay(SwapStep.PickDelay,          _pickDelayTime)
-                .Run(SwapStep.PickRetract,          PickRetract,                                        WaitRobotRetractDone)
-                .Run(SwapStep.PlacePrepare,         PlacePrepare,                                       IsModuleReadyForPlace)
-                .Run(SwapStep.PlaceExtend,          PlaceExtend,                                        WaitRobotExtendDone)
-                .Run(SwapStep.LiftUpWafer,          NotifyLiftUpWafer,                                  WaitPMWaferLiftUp)
-                .Delay(SwapStep.PlaceDelay,         _placeDelayTime)
-                .Run(SwapStep.PlaceRetract,         PlaceRetract,                                       WaitRobotRetractDone)
-                .End(SwapStep.NotifyDone,           NotifyPMDone,                                       _delay_50ms);
+            //Runner.Wait(SwapStep.WaitPMReady,       () => _pmModule.IsIdle,                             _delay_60s)
+            //    .RunIf(SwapStep.PreRotation,        _JetTM.PreRotateModules.ContainsKey(_targetModule), RotateArm,              WaitRotateDone)
+            //    .Run(SwapStep.PickPrepare,          PickPrepare,                                        IsModuleReadyForPick)
+            //    .Run(SwapStep.PickExtend,           PickExtend,                                         WaitRobotExtendDone)
+            //    .Run(SwapStep.DropDownWafer,        NotifyPMPickWafer,                                  WaitPMWaferDropDown)
+            //    .Delay(SwapStep.PickDelay,          _pickDelayTime)
+            //    .Run(SwapStep.PickRetract,          PickRetract,                                        WaitRobotRetractDone)
+            //    .Run(SwapStep.PlacePrepare,         PlacePrepare,                                       IsModuleReadyForPlace)
+            //    .Run(SwapStep.PlaceExtend,          PlaceExtend,                                        WaitRobotExtendDone)
+            //    .Run(SwapStep.LiftUpWafer,          NotifyLiftUpWafer,                                  WaitPMWaferLiftUp)
+            //    .Delay(SwapStep.PlaceDelay,         _placeDelayTime)
+            //    .Run(SwapStep.PlaceRetract,         PlaceRetract,                                       WaitRobotRetractDone)
+            //    .End(SwapStep.NotifyDone,           NotifyPMDone,                                       _delay_50ms);
+
+
+            switch (_pmModule.ChamberType)
+            {
+                case JetChamber.Venus:
+                case JetChamber.Kepler2300:
+
+         Runner.Wait(SwapStep.WaitPMReady,          () => _pmModule.IsIdle,                              _delay_60s)
+               .RunIf(SwapStep.PreRotation,         _JetTM.PreRotateModules.ContainsKey(_targetModule),  RotateArm,            WaitRotateDone)
+               .Run(SwapStep.PickPrepare,           PickPrepare,                                         IsModuleReadyForPick)
+               .Run(SwapStep.PickExtend,            PickExtend,                                          WaitRobotExtendDone)
+               .Run(SwapStep.DropDownWafer,         NotifyPMPickWafer,                                   WaitPMWaferDropDown)
+               .Delay(SwapStep.PickDelay,           _pickDelayTime)
+               .Run(SwapStep.PickRetract,           PickRetract,                                         WaitRobotRetractDone)
+               .Run(SwapStep.PlacePrepare,          PlacePrepare,                                        IsModuleReadyForPlace)
+               .Run(SwapStep.PlaceExtend,           PlaceExtend,                                         WaitRobotExtendDone)
+               .Run(SwapStep.LiftUpWafer,           NotifyLiftUpWafer,                                   WaitPMWaferLiftUp)
+               .Delay(SwapStep.PlaceDelay,          _placeDelayTime)
+               .Run(SwapStep.PlaceRetract,          PlaceRetract,                                        WaitRobotRetractDone)
+               .End(SwapStep.NotifyDone,            NotifyPMDone,                                        _delay_50ms);
+                break;
 
+                case JetChamber.Kepler2200A:
+          Runner.Wait(SwapStep.WaitPMReady,           () => _pmModule.IsIdle, _delay_60s)
+                .RunIf(SwapStep.PreRotation,          _JetTM.PreRotateModules.ContainsKey(_targetModule),   RotateArm,         WaitRotateDone)
+                .Run(SwapStep.PickPrepare,            PickPrepare,                                          IsModuleReadyForPick)
+                .Run(SwapWithHeaterStep.Picking,      Picking,                                              WaitPickDone)
+                .Run(SwapWithHeaterStep.PlacePrepare, PlacePrepare,                                         IsModuleReadyForPlace)
+                .Run(SwapWithHeaterStep.Placing,      Placing,                                              WaitPlaceDone)
+                .End(SwapStep.NotifyDone,             NotifyPMDone,                                         _delay_50ms);
+                break;
+            }
             return Runner.Status;
         }
 
@@ -176,6 +216,52 @@ namespace Venus_RT.Modules.TM
                 return true;
             }
         }
+        private bool Picking()
+        {
+            return _robot.Pick(_targetModule, _targetSlot, _pickHand);
+        }
+
+        private bool WaitPickDone()
+        {
+            if (_robot.Status == RState.Running)
+            {
+                return false;
+            }
+            else if (_robot.Status == RState.End)
+            {
+                //WaferManager.Instance.WaferMoved(ModuleName.TM, (int)_hand, _targetModule, _targetSlot);
+                WaferManager.Instance.WaferMoved(_targetModule, _targetSlot, ModuleName.TMRobot, (int)_pickHand);
+
+                return true;
+            }
+            else
+            {
+                Runner.Stop($"TM Robot Picking failed, {_robot.Status}");
+                return true;
+            }
+        }
+        private bool Placing()
+        {
+            return _robot.Place(_targetModule, _targetSlot, _placeHand);
+        }
+
+        private bool WaitPlaceDone()
+        {
+            if (_robot.Status == RState.Running)
+            {
+                return false;
+            }
+            else if (_robot.Status == RState.End)
+            {
+                WaferManager.Instance.WaferMoved(ModuleName.TMRobot, (int)_placeHand, _targetModule, _targetSlot);
+                return true;
+            }
+            else
+            {
+                Runner.Stop($"TM Robot Place failed, {_robot.Status}");
+                return true;
+            }
+        }
 
         private bool RotateArm()
         {

+ 1 - 1
Venus/Venus_Themes/UserControls/Chamber.xaml

@@ -5,7 +5,7 @@
              xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
              xmlns:local="clr-namespace:Venus_Themes.UserControls"
              mc:Ignorable="d" 
-             d:DesignHeight="450" d:DesignWidth="800" x:Name="chamber">
+             d:DesignHeight="300" d:DesignWidth="300" x:Name="chamber">
     <UserControl.Resources>
         <Storyboard x:Key="SlitValve_Open">
             <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Height)" >

+ 2 - 2
Venus/Venus_Themes/UserControls/EFEM.xaml

@@ -221,8 +221,8 @@
                         </Ellipse.Fill>
                     </Ellipse>-->
 
-                    <customControls:GuangChuanRobotControl  OriginT="Aligner1"  Canvas.Left="-30" Canvas.Top="-180"   Width="540" Height="810"     RobotTAction="{Binding ElementName=efem,Path=RobotATAction}"  RobotXAction="{Binding ElementName=efem,Path=RobotAXAction}" RobotWafer="{Binding ElementName=efem,Path=RobotAWaferInfo}"/>
-                    <customControls:GuangChuanRobotControl  OriginT="PMD"       Canvas.Left="-30" Canvas.Top="-180"   Width="540" Height="810"     RobotTAction="{Binding ElementName=efem,Path=RobotBTAction}"  RobotXAction="{Binding ElementName=efem,Path=RobotBXAction}" RobotWafer="{Binding ElementName=efem,Path=RobotBWaferInfo}"/>
+                    <customControls:GuangChuanRobotControl  OriginT="T_Origin"  Canvas.Left="-30" Canvas.Top="-180"   Width="540" Height="810"     RobotTAction="{Binding ElementName=efem,Path=RobotATAction}"  RobotXAction="{Binding ElementName=efem,Path=RobotAXAction}" RobotWafer="{Binding ElementName=efem,Path=RobotAWaferInfo}"/>
+                    <customControls:GuangChuanRobotControl  OriginT="T_Origin"       Canvas.Left="-30" Canvas.Top="-180"   Width="540" Height="810"     RobotTAction="{Binding ElementName=efem,Path=RobotBTAction}"  RobotXAction="{Binding ElementName=efem,Path=RobotBXAction}" RobotWafer="{Binding ElementName=efem,Path=RobotBWaferInfo}"/>
                 </Canvas>
 
 

+ 4 - 0
Venus/Venus_UI/Venus_UI.csproj

@@ -67,6 +67,10 @@
     <Reference Include="log4net">
       <HintPath>..\ThirdParty\log4net.dll</HintPath>
     </Reference>
+    <Reference Include="OpenSEMI.ClientBase, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\ThirdParty\selfbuild\OpenSEMI.ClientBase.dll</HintPath>
+    </Reference>
     <Reference Include="OpenSEMI.Core">
       <HintPath>..\ThirdParty\OpenSEMI.Core.dll</HintPath>
     </Reference>

+ 7 - 0
Venus/Venus_UI/Views/ShellView.xaml.cs

@@ -25,6 +25,7 @@ using System.Windows.Threading;
 using Venus_Themes.Unity;
 using Venus_Themes.UserControls;
 using OpenSEMI.Ctrlib.Controls;
+using OpenSEMI.ClientBase;
 
 namespace Venus_UI.Views
 {
@@ -117,6 +118,12 @@ namespace Venus_UI.Views
                 e.TranferFrom.ClearDragDropStatus();
                 e.TranferTo.ClearDragDropStatus();
             }
+            else
+            {
+                ModuleManager.OnFlashWafer(new FlashWaferInformation() { ModuleName = e.TranferFrom.ModuleID, SoltId = e.TranferFrom.SlotID });
+                //ModuleManager.OnFlashWafer(new FlashWaferInformation() { ModuleName = e.TranferTo.ModuleID, SoltId = e.TranferTo.SlotID });
+
+            }
 
         }