Browse Source

enhance the duplicated wafer functions.

sangwq 1 year ago
parent
commit
991036681f

+ 29 - 0
Venus/Framework/Common/SubstrateTrackings/WaferInfo.cs

@@ -455,4 +455,33 @@ namespace Aitex.Core.Common
 			return newValue;
 		}
 	}
+
+	[Serializable]
+	[DataContract]
+	public class DulicatedWaferInfo
+	{
+		[DataMember]
+		public Guid waferId { get; set; }
+
+		[DataMember]
+		public int source { get; set; }
+
+		[DataMember]
+		public int sourceSlot { get; set; }
+
+		[DataMember]
+		public int destination { get; set; }
+
+		[DataMember]
+		public int destSlot { get; set; }
+
+		public DulicatedWaferInfo(Guid id, int Source, int SrcSlot, int Destination, int DestSlot)
+		{
+			waferId = id;
+			source = Source;
+			sourceSlot = SrcSlot;
+			destination = Destination;
+			destSlot = DestSlot;
+		}
+	}
 }

+ 13 - 24
Venus/Framework/Common/SubstrateTrackings/WaferManager.cs

@@ -15,24 +15,6 @@ using MECF.Framework.Common.Schedulers;
 
 namespace MECF.Framework.Common.SubstrateTrackings
 {
-    struct DulicatedWaferInfo
-    {
-        public Guid        waferId;
-        public ModuleName  source;
-        public int         sourceSlot;
-        public ModuleName  destination;
-        public int         destSlot;
-
-        public DulicatedWaferInfo(Guid id, ModuleName Source, int SrcSlot, ModuleName Destination, int DestSlot)
-        {
-            waferId     = id;
-            source      = Source;
-            sourceSlot  = SrcSlot;
-            destination = Destination;
-            destSlot    = DestSlot;
-        }
-    }
-
     public class WaferManager : Singleton<WaferManager>
     {
          Dictionary<string, WaferInfo> _dict = new Dictionary<string, WaferInfo>();
@@ -60,6 +42,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     if (_locationWafers != null)
                     {
                         BinarySerializer<Dictionary<ModuleName, Dictionary<int, WaferInfo>>>.ToStream(_locationWafers, "WaferManager");
+                        BinarySerializer<List<DulicatedWaferInfo>>.ToStream(_duplicatedWafers, "DuplicatedWafers");
                     }
                 }
                 catch (Exception ex)
@@ -88,6 +71,12 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     }
                     _locationWafers = ccc;
                 }
+
+                var duplicatedWafers = BinarySerializer<List<DulicatedWaferInfo>>.FromStream("DuplicatedWafers");
+                if (duplicatedWafers != null)
+                {
+                    _duplicatedWafers = duplicatedWafers;
+                }
             }
             catch (Exception ex)
             {
@@ -497,7 +486,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
             _locationWafers[source][sourceSlot].IsDuplicated = true;
 
             WaferInfo wafer = CopyWaferInfo(destination, destSlot, _locationWafers[source][sourceSlot]);
-            _duplicatedWafers.Add(new DulicatedWaferInfo(wafer.InnerId, source, sourceSlot, destination, destSlot));
+            _duplicatedWafers.Add(new DulicatedWaferInfo(wafer.InnerId, (int)source, sourceSlot, (int)destination, destSlot));
 
             LOG.Write(eEvent.EV_WAFER_DUPLICATED, ModuleName.System, waferOrigin, source.ToString(), (source + 1).ToString(), destination.ToString(), (destSlot + 1).ToString());
 
@@ -507,7 +496,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
         private void deleteDuplicatedWafer(ModuleName module, int slot)
         {
             var id = _locationWafers[module][slot].InnerId;
-            var infoIndex = _duplicatedWafers.FindIndex(info => info.waferId == id && ((info.source == module && info.sourceSlot == slot) || (info.destination == module && info.destSlot == slot)));
+            var infoIndex = _duplicatedWafers.FindIndex(info => info.waferId == id && ((info.source == (int)module && info.sourceSlot == slot) || (info.destination == (int)module && info.destSlot == slot)));
             if(infoIndex == -1)
             {
                 LOG.Write(eEvent.ERR_WAFER_MANAGER_FAILED, ModuleName.System, string.Format("Delete Duplicated Wafer failed, {0},{1}", module, slot + 1));
@@ -515,16 +504,16 @@ namespace MECF.Framework.Common.SubstrateTrackings
             }
 
             var duplicatgedInfo = _duplicatedWafers[infoIndex];
-            var peerModule = duplicatgedInfo.source == module ? duplicatgedInfo.destination : duplicatgedInfo.source;
-            var peerSlot = duplicatgedInfo.source == module ? duplicatgedInfo.destSlot : duplicatgedInfo.sourceSlot;
-            if(_locationWafers[peerModule][peerSlot].IsEmpty ||!_locationWafers[peerModule][peerSlot].IsDuplicated)
+            var peerModule = duplicatgedInfo.source == (int)module ? duplicatgedInfo.destination : duplicatgedInfo.source;
+            var peerSlot = duplicatgedInfo.source == (int)module ? duplicatgedInfo.destSlot : duplicatgedInfo.sourceSlot;
+            if((_locationWafers[(ModuleName)peerModule][peerSlot].IsEmpty || !_locationWafers[(ModuleName)peerModule][peerSlot].IsDuplicated) && !ModuleHelper.IsLoadPort((ModuleName)peerModule))
             {
                 LOG.Write(eEvent.ERR_WAFER_MANAGER_FAILED, ModuleName.System, string.Format("Delete Duplicated Wafer failed, the opponent wafer at {0},{1} is not a duplicated wafer", peerModule, peerSlot + 1));
                 return;
             }
 
             _locationWafers[module][slot].SetEmpty();
-            _locationWafers[peerModule][peerSlot].IsDuplicated = false;
+            _locationWafers[(ModuleName)peerModule][peerSlot].IsDuplicated = false;
             _duplicatedWafers.RemoveAt(infoIndex);
         }
 

+ 2 - 0
Venus/Venus_RT/Modules/EFEM/EfemPickRoutine.cs

@@ -139,6 +139,7 @@ namespace Venus_RT.Modules.EFEM
             }
             else if (_efem.Status != RState.Running)
             {
+                WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot, ModuleName.EfemRobot, (int)_hand);
                 LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot picking failed: {_efem.Status}");
                 return true;
             }
@@ -160,6 +161,7 @@ namespace Venus_RT.Modules.EFEM
             }
             else if (_efem.Status != RState.Running)
             {
+                WaferManager.Instance.CreateDuplicatedWafer(_targetModule, _targetSlot2, ModuleName.EfemRobot, (int)_hand2);
                 LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot picking failed: {_efem.Status}");
                 return true;
             }

+ 4 - 0
Venus/Venus_RT/Modules/EFEM/EfemPlaceRoutine.cs

@@ -148,6 +148,8 @@ namespace Venus_RT.Modules.EFEM
             }
             else if (_efem.Status != RState.Running)
             {
+                WaferManager.Instance.CreateDuplicatedWafer(ModuleName.EfemRobot, (int)_hand, _targetModule, _targetSlot);
+
                 LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot place failed: {_efem.Status}");
                 return true;
             }
@@ -169,6 +171,8 @@ namespace Venus_RT.Modules.EFEM
             }
             else if (_efem.Status != RState.Running)
             {
+                WaferManager.Instance.CreateDuplicatedWafer(ModuleName.EfemRobot, (int)_hand2, _targetModule2, _targetSlot2);
+
                 LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Efem robot place failed: {_efem.Status}");
                 return true;
             }

+ 1 - 0
Venus/Venus_RT/Modules/EFEM/EfemSwapRoutine.cs

@@ -215,6 +215,7 @@ namespace Venus_RT.Modules.EFEM
             }
             else
             {
+                WaferManager.Instance.CreateDuplicatedWafer(_currentAction.SourceModule, _currentAction.SourceSlot, _currentAction.DestinationModule, _currentAction.DestinationSlot);
                 Runner.Stop($"EFEM Robot moving wafer failed, {_efem.Status}");
                 return true;
             }