Bladeren bron

enhance ReturnWafer for VenusSE && fix bugs in VCE Routine, HongHuTM

zhouhr 1 jaar geleden
bovenliggende
commit
f5a709d29f

+ 28 - 1
Venus/Venus_MainPages/ViewModels/VenusSeOperationOverViewModel.cs

@@ -17,6 +17,8 @@ using Venus_MainPages.Unity;
 using Microsoft.VisualBasic;
 using ExcelLibrary.BinaryFileFormat;
 using MECF.Framework.Common.Schedulers;
+using Venus_MainPages.Views;
+using System.Windows;
 
 namespace Venus_MainPages.ViewModels
 {
@@ -340,7 +342,32 @@ namespace Venus_MainPages.ViewModels
 
         private void OnReturnAllWafer(object obj)
         {
-            InvokeClient.Instance.Service.DoOperation("System.ReturnAllSEWafer");
+            WaferDialogView dialog = new WaferDialogView()
+            {
+                Owner = Application.Current.MainWindow,
+            };
+            dialog.Height = 300;
+            dialog.Width = 400;
+            double angel = 0;
+            double coolingtime = 0;
+            string message = "Please Confirm Return Wafer";
+            WaferDialogViewModel vm = new WaferDialogViewModel();
+            vm.ConfirmText = message;
+            dialog.DataContext = vm;
+            if (dialog.ShowDialog() == true)
+            {
+                if ((bool)dialog.AlignFlag == true && !string.IsNullOrEmpty(dialog.Angle))
+                {
+                    angel = Convert.ToDouble(dialog.Angle);
+                }
+
+                if ((bool)dialog.CoolingFlag == true && !string.IsNullOrEmpty(dialog.CoolingTime))
+                {
+                    coolingtime = Convert.ToDouble(dialog.CoolingTime);
+                }
+
+                InvokeClient.Instance.Service.DoOperation("System.ReturnAllSEWafer", dialog.CoolingFlag, coolingtime, dialog.AlignFlag, angel);
+            }
         }
 
         private void OnCreateJob(object obj)

+ 1 - 0
Venus/Venus_MainPages/Views/VenusSeOperationOverView.xaml

@@ -26,6 +26,7 @@
     </UserControl.Resources>
     <Grid>
         <Canvas>
+            
             <!-- Recipe -->
             <Grid Width="280" Height="170" Canvas.Left="240" Canvas.Top="380"  unity:GridOptions.LineBrush="#afb4db"  unity:GridOptions.ShowBorder="True" Background="#E9EDF4" Visibility="{Binding PMAIsInstalled,Converter={StaticResource bool2VisibilityConverter}}">
                 <Grid.RowDefinitions>

+ 1 - 1
Venus/Venus_RT/Devices/TM/HongHuTM.cs

@@ -240,7 +240,7 @@ namespace Venus_RT.Devices
                 case ModuleName.VCE1:
                     if (bOn && Math.Abs(_TMPressure.Value - _VCEPressure.Value)> MaxPressureDifference)
                     {
-                        LOG.Write(eEvent.ERR_TM, $"cannot open door cause pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEPressure.Value}");
+                        LOG.Write(eEvent.ERR_TM, ModuleName.SETM, $"cannot open door cause pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEPressure.Value}");
                         return false;
                     }
                     return _VCESlitDoor.SetCylinder(bOn, out _);

+ 40 - 19
Venus/Venus_RT/Modules/RouteManager.cs

@@ -516,30 +516,51 @@ namespace Venus_RT.Modules
         {
             ModuleName target = ModuleHelper.Converter(args[0].ToString());
             int slot = (int)args[1];
-
-            if (ModuleHelper.IsLoadPort(target))
+            if (seTM != null && VCE != null)
             {
-                LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("Wafer already at LoadPort {0} {1}, return operation is not valid", target.ToString(), slot + 1));
-                return false;
+                if (ModuleHelper.IsVCE(target))
+                {
+                    LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("Wafer already at vce {0} {1}, return operation is not valid", target.ToString(), slot + 1));
+                    return false;
+                }
+                WaferInfo wafer = WaferManager.Instance.GetWafer(target,slot);
+                if (wafer.IsEmpty)
+                {
+                    LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("No wafer at {0} {1}, return operation is not valid", target.ToString(), slot + 1));
+                    return false;
+                }
+                return CheckToPostMessage((int)MSG.SEMoveWafer,
+                        target, slot,
+                        (ModuleName)wafer.OriginStation, wafer.OriginSlot,
+                        false, 0, false, 0, "Blade1");
             }
-
-            if (!WaferManager.Instance.IsWaferSlotLocationValid(target, slot))
+            else 
             {
-                LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("Invalid position,{0},{1}", target.ToString(), slot.ToString()));
-                return false;
-            }
+                if (ModuleHelper.IsLoadPort(target))
+                {
+                    LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("Wafer already at LoadPort {0} {1}, return operation is not valid", target.ToString(), slot + 1));
+                    return false;
+                }
 
-            WaferInfo wafer = WaferManager.Instance.GetWafer(target, slot);
-            if (wafer.IsEmpty)
-            {
-                LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("No wafer at {0} {1}, return operation is not valid", target.ToString(), slot + 1));
-                return false;
-            }
+                if (!WaferManager.Instance.IsWaferSlotLocationValid(target, slot))
+                {
+                    LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("Invalid position,{0},{1}", target.ToString(), slot.ToString()));
+                    return false;
+                }
 
-            return CheckToPostMessage((int)MSG.MoveWafer,
-                target, slot,
-                (ModuleName)wafer.OriginStation, wafer.OriginSlot,
-                false, 0, false, 0, "Blade1");
+                WaferInfo wafer = WaferManager.Instance.GetWafer(target, slot);
+                if (wafer.IsEmpty)
+                {
+                    LOG.Write(eEvent.WARN_ROUTER, "System", string.Format("No wafer at {0} {1}, return operation is not valid", target.ToString(), slot + 1));
+                    return false;
+                }
+
+                return CheckToPostMessage((int)MSG.MoveWafer,
+                    target, slot,
+                    (ModuleName)wafer.OriginStation, wafer.OriginSlot,
+                    false, 0, false, 0, "Blade1");
+            }
+            
         }
 
         public PMEntity GetPM(ModuleName mod)

+ 11 - 7
Venus/Venus_RT/Modules/SEManualTransfer.cs

@@ -192,6 +192,8 @@ namespace Venus_RT.Modules
         private SEManualTransfer _transfer = null;
         private Queue<MoveItem> _ReturnQueue = new Queue<MoveItem> ();//all wafer enqueue
         private List<ModuleName> modulelist = new List<ModuleName>();
+        private bool _alignflag;
+        private float _alignangle;
         public SEReturnWafer(SEManualTransfer transfer)
         {
             _transfer = transfer;
@@ -207,15 +209,17 @@ namespace Venus_RT.Modules
         {
             _ReturnQueue.Clear();
             //单个wafer
-            if (objs.Length > 0)
+            if (objs.Length >= 4)
             {
-                _ReturnQueue.Enqueue((MoveItem)objs[0]);
+                if (bool.TryParse(objs[2].ToString(), out bool alignflag) && float.TryParse(objs[3].ToString(), out float alignangle))
+                {
+                    _alignflag = alignflag;
+                    _alignangle = alignangle;
+                }
             }
             //all wafer return
-            else
-            {
-                AllWaferBack();
-            }
+
+            AllWaferBack();
 
             return RState.Running;
         }
@@ -228,7 +232,7 @@ namespace Venus_RT.Modules
                     case RState.Init:
                     case RState.End:
                         MoveItem moveItem = _ReturnQueue.Dequeue();
-                        return _transfer.Start(moveItem.SourceModule,moveItem.SourceSlot,moveItem.DestinationModule,moveItem.DestinationSlot,false,1,false,1,"");
+                        return _transfer.Start(moveItem.SourceModule,moveItem.SourceSlot,moveItem.DestinationModule,moveItem.DestinationSlot, _alignflag, _alignangle, false,1,"");
                     case RState.Running:
                         return RState.Running;
                     case RState.Timeout:

+ 15 - 7
Venus/Venus_RT/Modules/VCE/LoadRoutine.cs

@@ -14,6 +14,7 @@ using System.Threading.Tasks;
 using Venus_Core;
 using Venus_RT.Devices;
 using Venus_RT.Devices.VCE;
+using Venus_RT.Modules.TM.VenusEntity;
 
 namespace Venus_RT.Modules.VCE
 {
@@ -32,18 +33,20 @@ namespace Venus_RT.Modules.VCE
         VceModuleBase _vce;
         HongHuTM _tm;
         int _timeout;
+        SEMFPumpRoutine pumpRoutine;
 
         public LoadRoutine(ModuleName module, VceModuleBase vce) : base(module)
         {
             _vce = vce;
+            pumpRoutine = new SEMFPumpRoutine(DEVICE.GetDevice<HongHuTM>("SETM"),module);
         }
 
         public RState Start(params object[] objs)
         {
 
             _tm = DEVICE.GetDevice<HongHuTM>("SETM");
-            _timeout = SC.GetValue<int>("VCE.MotionTimeout");
-
+            _timeout = SC.GetValue<int>($"{Module}.MotionTimeout") *1000;
+            
             Reset();
             return Runner.Start(Module,"Vce Load Routine");
         }
@@ -51,7 +54,7 @@ namespace Venus_RT.Modules.VCE
         public RState Monitor()
         {
             Runner.Run(LoadStep.CloseOutDoor,       CloseOutDoor,       CheckVceIdle,        _timeout)
-                  .Run(LoadStep.Mapping,            Mapping,            CheckVceIdle,        _timeout)
+                  .Run(LoadStep.Mapping,            Mapping,            CheckVceIdle,        25 *1000)
                   .Run(LoadStep.ReadMap,            ReadMap,            CheckVceIdle,        _timeout)
                   .Run(LoadStep.PumpDown,           PumpDown,           CheckPumpOver)
                   .Run(LoadStep.OpenInnerDoor,      OpenInnerDoor,      CheckInnerDoorOpen)
@@ -61,23 +64,28 @@ namespace Venus_RT.Modules.VCE
 
         private bool CheckInnerDoorOpen()
         {
-            return _tm.TurnSlitDoor(Module,true);
+            return !_tm.VCESlitDoorClosed;
         }
 
         private bool OpenInnerDoor()
         {
-            return !_tm.VCESlitDoorClosed;
+            return _tm.TurnSlitDoor(Module,true);
         }
 
         //
         private bool CheckPumpOver()
         {
-            return true;
+            RState ret = pumpRoutine.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                _vce.PostMsg(VceMSG.Error);
+            }
+            return ret == RState.End;
         }
 
         private bool PumpDown()
         {
-            return true;
+            return pumpRoutine.Start() == RState.Running;
         }
 
         private bool ReadMap()

+ 15 - 4
Venus/Venus_RT/Modules/VCE/UnloadRoutine.cs

@@ -1,4 +1,5 @@
-using Aitex.Core.RT.Routine;
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Routine;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
 using MECF.Framework.Common.Equipment;
@@ -10,7 +11,10 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Venus_Core;
+using Venus_RT.Devices;
 using Venus_RT.Devices.VCE;
+using Venus_RT.Modules.TM;
+using Venus_RT.Modules.TM.VenusEntity;
 
 namespace Venus_RT.Modules.VCE
 {
@@ -25,15 +29,17 @@ namespace Venus_RT.Modules.VCE
         }
         VceModuleBase _vce;
         int _timeout;
+        SEMFVentRoutine ventRoutine;
 
         public UnloadRoutine(ModuleName module,VceModuleBase vce) : base(module)
         {
             _vce = vce;
+            ventRoutine = new SEMFVentRoutine(DEVICE.GetDevice<HongHuTM>("SETM"), module);
         }
 
         public RState Start(params object[] objs)
         {
-            _timeout = SC.GetValue<int>($"{Module}.MotionTimeout");
+            _timeout = SC.GetValue<int>($"{Module}.MotionTimeout") * 1000;
             Reset();
             return Runner.Start(Module,"VCE Unload Routine");
         }
@@ -49,12 +55,17 @@ namespace Venus_RT.Modules.VCE
 
         private bool CheckVentOver()
         {
-            return true;
+            RState ret = ventRoutine.Monitor();
+            if (ret == RState.Failed || ret == RState.Timeout)
+            {
+                _vce.PostMsg(VceMSG.Error);
+            }
+            return ret == RState.End;
         }
 
         private bool Vent()
         {
-            return true;
+            return ventRoutine.Start() == RState.Running;
         }
 
         private bool OpenOutDoor()