Pārlūkot izejas kodu

update double wafers scheduler

chenkui 2 mēneši atpakaļ
vecāks
revīzija
8c811f7802

+ 2 - 1
CyberX8_Core/RtState.cs

@@ -122,7 +122,8 @@ namespace CyberX8_Core
         WaitForLoad,
         WaitForPick,
         Retrying,
-        ConfirmCompleting
+        ConfirmCompleting,
+        WaitForFlip
     }
     public enum TransporterState
     {

+ 3 - 50
CyberX8_MainPages/Unity/WaferStatusImp.cs

@@ -1,5 +1,6 @@
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.SubstrateTrackings;
 using OpenSEMI.ClientBase;
 using System;
 using System.Collections.Generic;
@@ -40,7 +41,7 @@ namespace CyberX8_MainPages.Unity
             wafer.SlotIndex = slotid + 1;
             wafer.WaferID = awafer.WaferID;
             wafer.SourceName = awafer.WaferOrigin;
-            wafer.WaferStatus = WaferStatusConverter(awafer);
+            wafer.WaferStatus = WaferManager.Instance.WaferStatusConverter(awafer);
             if (!string.IsNullOrEmpty(awafer.SequenceName))
             {
                 wafer.SequenceName = awafer.SequenceName;
@@ -54,55 +55,7 @@ namespace CyberX8_MainPages.Unity
         //3:cyan
         //4:green
         //5:error
-        private int WaferStatusConverter(ACC.WaferInfo awafer)
-        {
-            if (awafer.Status == ACC.WaferStatus.Empty)
-                return 0;
-
-            if (awafer.Status == ACC.WaferStatus.Normal)
-            {
-                if (awafer.WaferType == ACC.WaferType.Assit)
-                {
-                    return 6;
-                }
-                else
-                {
-                    switch (awafer.ProcessState)
-                    {
-                        case ACC.EnumWaferProcessStatus.InProcess: return 3;
-                        case ACC.EnumWaferProcessStatus.Completed: return 4;
-                        case ACC.EnumWaferProcessStatus.Failed: return 5;
-                        case ACC.EnumWaferProcessStatus.Idle:
-                            return awafer.ProcessJob == null ? 1 : 2;
-                        case ACC.EnumWaferProcessStatus.Canceled:
-                            return 7;
-                        case ACC.EnumWaferProcessStatus.MisProcessed:
-                            return 8;
-                        case ACC.EnumWaferProcessStatus.MisSrdProcess:
-                            return 9;
-                    }
-                }
-            }
-            else if (awafer.Status == ACC.WaferStatus.Crossed)
-            {
-                return 10;
-            }
-            else if (awafer.Status == ACC.WaferStatus.Double)
-            {
-                return 11;
-            }
-            else if (awafer.Status == ACC.WaferStatus.Unknown)
-            {
-                return 0;
-            }
-
-            if (awafer.Status == ACC.WaferStatus.Dummy)
-            {
-                return 6;
-            }
-
-            return 1;
-        }
+        
 
         private IQueryDataService DataService;
     }

+ 18 - 3
CyberX8_RT/Devices/Loader/LoaderRotationAxisInterLock.cs

@@ -149,10 +149,25 @@ namespace CyberX8_RT.Devices.Loader
             if (loaderTransporterInstalled)
             {
                 JetAxisBase loadTransporterGantryAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter2}.Gantry");
-                if (loadTransporterGantryAxis != null && !loadTransporterGantryAxis.JudgeCompareTargetStation("Loader", "Right"))
+
+                if (loadTransporterGantryAxis != null)
                 {
-                    LOG.WriteLog(eEvent.ERR_PUF, Module, "loader transporter axis is in loader station, Cannot execute GotoSavedPosition");
-                    return false;
+                    double loaderGantryPosition = loadTransporterGantryAxis.MotionData.MotorPosition;
+                    if (loadTransporterGantryAxis.CheckPositionIsInStation(loaderGantryPosition, "Loader"))
+                    {
+                        JetAxisBase loaderTransporterElevatorAxis = DEVICE.GetDevice<JetAxisBase>($"{ModuleName.Transporter2}.Elevator");
+                        double loaderElevatorPosition = loaderTransporterElevatorAxis.MotionData.MotorPosition;
+                        if (!loaderTransporterElevatorAxis.CheckPositionIsInStation(loaderElevatorPosition, "UP"))
+                        {
+                            LOG.WriteLog(eEvent.ERR_PUF, Module, $"loader transporter axis is in loader station and elevator {loaderElevatorPosition} is not in up, Cannot execute GotoSavedPosition");
+                            return false;
+                        }
+                    }
+                    else if (!loadTransporterGantryAxis.JudgeCompareTargetStation("Loader", "Right"))
+                    {
+                        LOG.WriteLog(eEvent.ERR_PUF, Module, "loader transporter axis is not in loader Right position, Cannot execute GotoSavedPosition");
+                        return false;
+                    }
                 }
             }
             return true;

+ 14 - 0
CyberX8_RT/Dispatch/WaferHolderTaskManager.cs

@@ -69,6 +69,10 @@ namespace CyberX8_RT.Dispatch
                     }
                     else
                     {
+                        if(!CheckWaferMatchedWaferHolderTaskNotCreated(waferInfo))
+                        {
+                            return false;
+                        }
                         string waferHasMatch = WaferTaskManager.Instance.CheckWaferHasMatch(waferInfo.WaferID);
                         if(string.IsNullOrEmpty(waferHasMatch))
                         {
@@ -98,6 +102,16 @@ namespace CyberX8_RT.Dispatch
             return false;
         }
         /// <summary>
+        /// 查看Wafer对应的WaferHolderTask是否已经创建
+        /// </summary>
+        /// <param name="waferInfo"></param>
+        /// <returns></returns>
+        private bool CheckWaferMatchedWaferHolderTaskNotCreated(WaferInfo waferInfo)
+        {
+            WaferHolderTask waferHolderTask = WaferTaskManager.Instance.GetWaferHolderTaskByWaferId(waferInfo.WaferID);
+            return waferHolderTask == null || CheckWaferHolderNotExist(waferHolderTask.WaferHolderInfo);
+        }
+        /// <summary>
         /// 检验是否可以创建WaferHolderTask
         /// </summary>
         /// <returns></returns>

+ 2 - 1
CyberX8_RT/Dispatch/WaferTask.cs

@@ -135,6 +135,7 @@ namespace CyberX8_RT.Dispatch
                 {
                     OnTaskComplete(WaferId);
                 }
+                WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(WaferId);
                 return;
             }
             SchedulerSequence sequence = _schedulerSequences[_currentSequenceIndex];
@@ -145,6 +146,7 @@ namespace CyberX8_RT.Dispatch
                 {
                     OnTaskComplete(WaferId);
                 }
+                WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(WaferId);
                 return;
             }
             if (!_isStart)
@@ -155,7 +157,6 @@ namespace CyberX8_RT.Dispatch
                     return;
                 }
                 _isStart = true;
-                WaferTaskManager.Instance.RemoveWaferIdMatchWaferHolderTaskDic(WaferId);
             }
             //暂停中
             if(sequence.State==RState.Init&&_currentSequenceIndex>=_pausedIndex&&_pausedIndex!=-1)

+ 8 - 8
CyberX8_RT/Modules/Buffer/BufferEntity.cs

@@ -125,14 +125,14 @@ namespace CyberX8_RT.Modules.Buffer
         /// </summary>
         private void InitializeSvid()
         {
-            DATA.Subscribe($"{Module}.LotID", () => (WaferHolderInfo != null ? WaferHolderInfo.LotId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WSID", () => (WaferHolderInfo != null ? WaferHolderInfo.Id : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSAID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSBID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.SequenceRecipe", () => (WaferHolderInfo != null ? WaferHolderInfo.SequenceId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferAID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferBID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo != null ? WaferHolderInfo.CurrentControlJobId : "", SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId , SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
         }
         public bool Check(int msg, out string reason, params object[] args)
         {

+ 9 - 9
CyberX8_RT/Modules/Dryer/DryerEntity.cs

@@ -309,17 +309,17 @@ namespace CyberX8_RT.Modules.Dryer
         private void InitializeSvid()
         {
             DATA.Subscribe($"{Module}.State", () => ((RinseState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LotID", () => (WaferHolderInfo != null ? WaferHolderInfo.LotId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WSID", () => (WaferHolderInfo != null ? WaferHolderInfo.Id : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSAID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSBID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.ModuleRecipe", () => (_currentRecipe != null ? _currentRecipe.Ppid : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.SequenceRecipe", () => (WaferHolderInfo != null ? WaferHolderInfo.SequenceId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferAID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferBID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.ModuleRecipe", () => _currentRecipe?.Ppid, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TotalTime", () => _dryTime, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TimeRemain", () => _dryTime - _cycleManualProcessRoutine.ElapsedMilliseconds / 1000, SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo!=null? WaferHolderInfo.CurrentControlJobId:"", SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
         }
         /// <summary>

+ 15 - 1
CyberX8_RT/Modules/Loader/LoaderEntity.cs

@@ -333,6 +333,9 @@ namespace CyberX8_RT.Modules.Loader
             Transition(LOADERSTATE.Unloading, FSM_MSG.TIMER, UnloadSideMonitor, LOADERSTATE.WaitForLoad);
             Transition(LOADERSTATE.WaitForLoad, LoaderMSG.LoadSide, LoadSide, LOADERSTATE.Loading);
             Transition(LOADERSTATE.Loading, FSM_MSG.TIMER, LoadSideMonitor, LOADERSTATE.Idle);
+            //Flip
+            Transition(LOADERSTATE.Idle, LoaderMSG.WaitFlip, NullFunc, LOADERSTATE.WaitForFlip);
+            Transition(LOADERSTATE.WaitForFlip,LoaderMSG.PrepareForPlace, PrePareForPlace, LOADERSTATE.PrepreForPlacing);
             //Retry
             Transition(LOADERSTATE.Error, LoaderMSG.Retry, NullFunc, LOADERSTATE.Retrying);
             Transition(LOADERSTATE.Retrying,FSM_MSG.TIMER,LoaderRetry,LOADERSTATE.Retrying);
@@ -365,6 +368,16 @@ namespace CyberX8_RT.Modules.Loader
             }
             return true;
         }
+        /// <summary>
+        /// 检验Loader两边waferSize不一致
+        /// </summary>
+        /// <returns></returns>
+        public bool CheckLoaderWaferSizeNotEqual()
+        {
+            int sideAWaferSize = SC.GetValue<int>($"Loader1.SideAWaferSize");
+            int sideBWaferSize = SC.GetValue<int>($"Loader1.SideBWaferSize");
+            return sideAWaferSize != sideBWaferSize;
+        }
         #region Abort
         private bool Abort(object parameter)
         {
@@ -986,6 +999,7 @@ namespace CyberX8_RT.Modules.Loader
         UnloadSide,
         LoadSide,
         Retry,
-        ConfirmComplete
+        ConfirmComplete,
+        WaitFlip,
     }
 }

+ 9 - 9
CyberX8_RT/Modules/Metal/MetalEntity.cs

@@ -340,17 +340,17 @@ namespace CyberX8_RT.Modules.Metal
         private void InitializeSVID()
         {
             DATA.Subscribe($"{Module}.State", () => ((MetalState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LotID", () => (WaferHolderInfo != null ? WaferHolderInfo.LotId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WSID", () => (WaferHolderInfo != null ? WaferHolderInfo.Id : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSAID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSBID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.ModuleRecipe", () => (_currentRecipe != null ? _currentRecipe.Ppid : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.SequenceRecipe", () => (WaferHolderInfo != null ? WaferHolderInfo.SequenceId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferAID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferBID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId , SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.ModuleRecipe", () => _currentRecipe?.Ppid, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.SequenceRecipe", () =>WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TotalTime", () => _recipeTime, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TimeRemain", () => _recipeTime != 0 && _currentRunRecipeRoutine != null ? (_recipeTime - Math.Round((double)_currentRunRecipeRoutine.ElapsedMilliseconds / 1000, 0)) : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo != null ? WaferHolderInfo.CurrentControlJobId : "", SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TotalUsage", () => MetalUsage != null ? MetalUsage.TotalUsage : 0, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Module}.TotalUsage.WarningLimit", () => SC.GetValue<double>($"Metal.{Module}.MetalTotalAmpHoursWarningLimit"), SubscriptionAttribute.FLAG.IgnoreSaveDB);

+ 8 - 8
CyberX8_RT/Modules/Transporter/TransporterEntity.cs

@@ -310,14 +310,14 @@ namespace CyberX8_RT.Modules.Transporter
         private void InitializeSvid()
         {
             DATA.Subscribe($"{Module}.State", () => ((TransporterState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LotID", () => (WaferHolderInfo != null ? WaferHolderInfo.LotId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WSID", () => (WaferHolderInfo != null ? WaferHolderInfo.Id : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSAID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.LSBID", () => (WaferHolderInfo != null ? WaferHolderInfo.CrsBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.SequenceRecipe", () => (WaferHolderInfo != null ? WaferHolderInfo.SequenceId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferAID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferAId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.WaferBID", () => (WaferHolderInfo != null ? WaferHolderInfo.WaferBId : ""), SubscriptionAttribute.FLAG.IgnoreSaveDB);
-            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo != null ? WaferHolderInfo.CurrentControlJobId : "", SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LotID", () => WaferHolderInfo?.LotId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WSID", () => WaferHolderInfo?.Id, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSAID", () => WaferHolderInfo?.CrsAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.LSBID", () => WaferHolderInfo?.CrsBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.SequenceRecipe", () => WaferHolderInfo?.SequenceId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferAID", () => WaferHolderInfo?.WaferAId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.WaferBID", () => WaferHolderInfo?.WaferBId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.Task", () => WaferHolderInfo?.CurrentControlJobId, SubscriptionAttribute.FLAG.IgnoreSaveDB);
         }
         /// <summary>
         /// 初始化Routine

+ 2 - 0
CyberX8_RT/Schedulers/Loader/LoaderParameter.cs

@@ -11,5 +11,7 @@ namespace CyberX8_RT.Schedulers.Loader
         public int WaferCount { get; set; }
 
         public string LoadCompleteToTransporterSide { get; set; }
+
+        public bool NeedWaitFlip { get; set; }
     }
 }

+ 24 - 2
CyberX8_RT/Schedulers/Loader/SchedulerLoader.cs

@@ -26,6 +26,7 @@ namespace CyberX8_RT.Schedulers.Loader
     {
         private enum SchedulerStep
         {
+            None,
             WaitUnload,
             WaitLoad,
             LoadingFirst,
@@ -106,6 +107,7 @@ namespace CyberX8_RT.Schedulers.Loader
             }
             LoaderParameter loaderParameter =(LoaderParameter)schedulerSequence.Parameters;
             bool loadComplete = loaderParameter.WaferCount == _currentWaferIndex;
+            bool needFlip = loaderParameter.NeedWaitFlip;
             if (_currentStep == SchedulerStep.WaitLoad)
             {
                 if (_loaderEntity.State != (int)LOADERSTATE.WaitForLoad)
@@ -124,7 +126,21 @@ namespace CyberX8_RT.Schedulers.Loader
                 {
                     if (loaderParameter.WaferCount == 1)
                     {
-                        _state = RState.End;
+                        if (needFlip)
+                        {
+                            bool loaderResult= _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, Module.ToString(),
+                                (int)LoaderMSG.WaitFlip);
+                            if (loaderResult)
+                            {
+                                _state = RState.End;
+                                _currentStep = SchedulerStep.None;
+                            }
+                        }
+                        else
+                        {
+                            _state = RState.End;
+                            _currentStep = SchedulerStep.None;
+                        }
                     }
                     else
                     {
@@ -153,11 +169,17 @@ namespace CyberX8_RT.Schedulers.Loader
                 if (_loaderEntity.IsIdle)
                 {
                     _state = RState.End;
+                    _currentStep = SchedulerStep.None;
                 }
             }
             return true;
         }
-
+        /// <summary>
+        /// 执行Loader Load动作
+        /// </summary>
+        /// <param name="loadComplete"></param>
+        /// <param name="completeSide"></param>
+        /// <returns></returns>
         private bool ExecuteLoadSide(bool loadComplete,string completeSide)
         {
             if (_puf1Entity.State == (int)PUFSTATE.AferSwapParkStation || (_puf1Entity.IsIdle && _puf1Entity.IsBackToParkStation))

+ 8 - 8
CyberX8_RT/Schedulers/Puf/SchedulerPuf.cs

@@ -230,15 +230,15 @@ namespace CyberX8_RT.Schedulers.Puf
         /// </summary>
         private void PostLoaderEntityUnloadAllSide()
         {
-            //当前loader状态机为WaitForUnload
-            if (_loaderEntity.State == (int)LOADERSTATE.WaitForUnload&&_currentOperation==OperationStep.WaitForLoaderUnloadComplete)
-            {
-                //触发loaderEntity UnloadAll
-                _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, ModuleName.Loader1.ToString(),
-                    (int)LoaderMSG.UnloadSide,_side);
-            }
+            //当前loader状态机为WaitForUnload,Unload放在SchedulerLoad中了
+            //if (_loaderEntity.State == (int)LOADERSTATE.WaitForUnload&&_currentOperation==OperationStep.WaitForLoaderUnloadComplete)
+            //{
+            //    //触发loaderEntity UnloadAll
+            //    _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, ModuleName.Loader1.ToString(),
+            //        (int)LoaderMSG.UnloadSide,_side);
+            //}
             //若Loader Unload操作完成,状态变更为WaitForLoad,puf操作变更为Swap
-            else if (_loaderEntity.State == (int)LOADERSTATE.WaitForLoad)
+            if (_loaderEntity.State == (int)LOADERSTATE.WaitForLoad)
             {
                 _currentOperation = OperationStep.Swap;
                 LOG.WriteLog(eEvent.INFO_PUF, Module.ToString(), "Current Operation is Swap");

+ 27 - 6
CyberX8_RT/Schedulers/SchedulerSequenceManager.cs

@@ -150,14 +150,16 @@ namespace CyberX8_RT.Schedulers
             List<SchedulerSyncModuleMessage> synModules = GenerateLoaderTransporterSyncModuleMessage(strTRNP);
             SchedulerSequence bufferToLoaderSequence = CreateLoaderTransporterSequence(transporterAction,synModules, ref index);
             schedulerSequences.Add(bufferToLoaderSequence);
+            //尺寸不一致
+            bool needFlip = CheckLoaderWaferSizeNotEqual() && waferCount == 2;
             //Loader
             LoaderParameter parameter = new LoaderParameter();
-            parameter.WaferCount= waferCount;
+            parameter.WaferCount= needFlip?1: waferCount;
             parameter.LoadCompleteToTransporterSide = strTRNP;
+            parameter.NeedWaitFlip = needFlip;
             SchedulerSequence loaderSequence = CreateLoaderSequence(parameter,ref index);
             schedulerSequences.Add(loaderSequence);
-            //尺寸不一致
-            if (CheckLoaderWaferSizeNotEqual()&&waferCount==2)
+            if (needFlip)
             {
                 string reverse = GetReverseTransporterLocation(strTRNP);
                 TransporterAction flipAction = GenerateTransporterFlipAction(reverse);
@@ -165,9 +167,10 @@ namespace CyberX8_RT.Schedulers
                 schedulerSequences.Add(flipSequence);
                 //Loader
                 LoaderParameter reverseParameter = new LoaderParameter();
-                reverseParameter.WaferCount = waferCount;
+                reverseParameter.WaferCount = 1;
                 reverseParameter.LoadCompleteToTransporterSide = reverse;
-                SchedulerSequence reverseLoadSequence = CreateLoaderSequence(parameter, ref index);
+                reverseParameter.NeedWaitFlip = false; 
+                SchedulerSequence reverseLoadSequence = CreateLoaderSequence(reverseParameter, ref index);
                 schedulerSequences.Add(reverseLoadSequence);
             }
             //wafer holder装载后的recipe工序
@@ -279,12 +282,30 @@ namespace CyberX8_RT.Schedulers
             TransporterAction transporterAction = GenerateTransporterTransferAction(currentLocationModuleName, ModuleType.Buffer, ModuleName.Loader1, ModuleType.Loader);
             SchedulerSequence bufferToLoaderSequence = CreateLoaderTransporterSequence(transporterAction,synModules, ref index);
             schedulerSequences.Add(bufferToLoaderSequence);
+
+            //尺寸不一致
+            bool needFlip = CheckLoaderWaferSizeNotEqual() && waferCount == 2;
             //Loader
             LoaderParameter parameter = new LoaderParameter();
-            parameter.WaferCount = waferCount;
+            parameter.WaferCount = needFlip ? 1 : waferCount; ;
             parameter.LoadCompleteToTransporterSide = strTRNP;
+            parameter.NeedWaitFlip = needFlip;
             SchedulerSequence loaderSequence = CreateLoaderSequence(parameter,ref index);
             schedulerSequences.Add(loaderSequence);
+            if (needFlip)
+            {
+                string reverse = GetReverseTransporterLocation(strTRNP);
+                TransporterAction flipAction = GenerateTransporterFlipAction(reverse);
+                SchedulerSequence flipSequence = CreateLoaderTransporterSequence(flipAction, null, ref index);
+                schedulerSequences.Add(flipSequence);
+                //Loader
+                LoaderParameter reverseParameter = new LoaderParameter();
+                reverseParameter.WaferCount = 1;
+                reverseParameter.LoadCompleteToTransporterSide = reverse;
+                reverseParameter.NeedWaitFlip = false;
+                SchedulerSequence reverseLoadSequence = CreateLoaderSequence(reverseParameter, ref index);
+                schedulerSequences.Add(reverseLoadSequence);
+            }
             //Loader To Buffer
             TransporterAction loaderMoveToBufferAction=GenerateTransporterTransferAction (ModuleName.Loader1, ModuleType.Loader,
                 bufferModule, ModuleType.Buffer);

+ 95 - 3
CyberX8_RT/Schedulers/Transporter/SchedulerLoaderTransporter.cs

@@ -19,6 +19,7 @@ using Aitex.Core.RT.Device;
 using CyberX8_RT.Devices.AXIS;
 using MECF.Framework.Common.WaferHolder;
 using Aitex.Core.RT.Log;
+using MECF.Framework.Common.Schedulers;
 
 namespace CyberX8_RT.Schedulers.Transporter
 {
@@ -34,6 +35,15 @@ namespace CyberX8_RT.Schedulers.Transporter
             Place,
             End
         }
+
+        private enum TransporterFlip
+        {
+            None,
+            WaitPickUp,
+            LoaderFlip,
+            WaitLoader,
+            WaitPlace,
+        }
         #region 内部变量
         private LoaderEntity _loaderEntity;
         private TransporterEntity _loaderTransporterEntity;
@@ -41,6 +51,7 @@ namespace CyberX8_RT.Schedulers.Transporter
         private TransBufferToLoaderStep _transBufferToLoaderStep = TransBufferToLoaderStep.None;
         private SchedulerPostMsg _schedulerPostMsg = new SchedulerPostMsg();
         private bool _postMsgResult = false;
+        private TransporterFlip _transporterFlip=TransporterFlip.None;
         #endregion
 
         #region 属性
@@ -137,14 +148,35 @@ namespace CyberX8_RT.Schedulers.Transporter
             }
             else if (action.ActionMsg == TransporterMSG.Flip)
             {
-
+                return FlipLoader();
             }
             return true;
         }
-
+        /// <summary>
+        /// Loader 开始Flip
+        /// </summary>
+        /// <returns></returns>
         private bool FlipLoader()
         {
-            return true;
+            if (_loaderEntity.WaferHolderInfo == null)
+            {
+                return false;
+            }
+
+            if (_loaderTransporterEntity.WaferHolderInfo != null)
+            {
+                return false;
+            }
+            bool result = _loaderTransporterEntity.CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.WARN_TRANSPORTER,
+                Module.ToString(), (int)TransporterMSG.PickUpFrom, "Loader");
+            if (result)
+            {
+                _state = RState.Running;
+                _schedulerPostMsg.Reset();
+                _postMsgResult = false;
+                _transporterFlip = TransporterFlip.WaitPickUp;
+            }
+            return result;
         }
         /// <summary>
         /// WaferHolder从Loader移动至Buffer
@@ -357,9 +389,69 @@ namespace CyberX8_RT.Schedulers.Transporter
                     _transBufferToLoaderStep=TransBufferToLoaderStep.None;
                 }
             }
+            else if (action.ActionMsg == TransporterMSG.Flip)
+            {
+                LoaderTransporterFlip();
+            }
             return true;
         }
         /// <summary>
+        /// Flip
+        /// </summary>
+        private void LoaderTransporterFlip()
+        {
+            if(_transporterFlip==TransporterFlip.WaitPickUp)
+            {
+                //检验PostMsg的结果
+                if (!_postMsgResult)
+                {
+                    if (_loaderTransporterEntity.IsError)
+                    {
+                        return;
+                    }
+                    _postMsgResult = _schedulerPostMsg.PostMsg<TransporterState, TransporterMSG>(_loaderTransporterEntity, _loaderTransporterEntity.State,
+                        eEvent.WARN_TRANSPORTER, Module.ToString(), (int)TransporterMSG.PickUpFrom,(int)TransporterState.PickUping, "Loader");
+                    if (!_postMsgResult)
+                    {
+                        return;
+                    }
+                }
+
+                if (_loaderTransporterEntity.IsIdle && _loaderTransporterEntity.WaferHolderInfo != null)
+                {
+                    _transporterFlip = TransporterFlip.LoaderFlip;
+                }
+            }
+            else if (_transporterFlip == TransporterFlip.LoaderFlip)
+            {
+                bool result = _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace, "TRNPB");
+                if (result)
+                {
+                    _transporterFlip = TransporterFlip.WaitLoader;
+                }
+            }
+            else if(_transporterFlip==TransporterFlip.WaitLoader)
+            {
+                if (_loaderEntity.State == (int)LOADERSTATE.WaitForUnload)
+                {
+                    bool result = _loaderTransporterEntity.CheckToPostMessage<TransporterState, TransporterMSG>(eEvent.WARN_TRANSPORTER,
+                                    Module.ToString(), (int)TransporterMSG.Place, "Loader");
+                    if (result)
+                    {
+                        _transporterFlip = TransporterFlip.WaitPlace;
+                    }
+                }
+            }
+            else if (_transporterFlip == TransporterFlip.WaitPlace)
+            {
+                if (_loaderTransporterEntity.IsIdle && _loaderTransporterEntity.WaferHolderInfo == null)
+                {
+                    _state = RState.End;
+                    _transporterFlip = TransporterFlip.None;
+                }
+            }
+        } 
+        /// <summary>
         /// 检验PostMsg的结果
         /// </summary>
         /// <param name="waferHolderMoveItem"></param>

+ 4 - 66
Framework/Common/SubstrateTrackings/MaterialTrackerManager.cs

@@ -145,7 +145,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
                         if(WaferManager.Instance.CheckHasWafer(module,0))
                         {
                             WaferInfo info = WaferManager.Instance.GetWafer(module, 0);
-                            moduleMaterial.SideAWaferStatus = WaferStatusConverter(info);
+                            moduleMaterial.SideAWaferStatus =WaferManager.Instance.WaferStatusConverter(info);
                             moduleMaterial.SideAWaferId = waferHolderInfo.WaferAId;
                             WaferType waferType = (WaferType)waferHolderInfo.WaferAType;
                             moduleMaterial.SideAWaferType = waferType.ToString();
@@ -159,7 +159,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
                         if (WaferManager.Instance.CheckHasWafer(module, 1))
                         {
                             WaferInfo info = WaferManager.Instance.GetWafer(module, 1);
-                            moduleMaterial.SideBWaferStatus = WaferStatusConverter(info);
+                            moduleMaterial.SideBWaferStatus =WaferManager.Instance.WaferStatusConverter(info);
                             moduleMaterial.SideBWaferId = waferHolderInfo.WaferBId;
                             WaferType waferType = (WaferType)waferHolderInfo.WaferBType;
                             moduleMaterial.SideBWaferType = waferType.ToString();
@@ -189,7 +189,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     if (WaferManager.Instance.CheckHasWafer(module, 0))
                     {
                         WaferInfo waferAInfo = WaferManager.Instance.GetWafer(module, 0);
-                        moduleMaterial.SideAWaferStatus = WaferStatusConverter(waferAInfo);
+                        moduleMaterial.SideAWaferStatus =WaferManager.Instance.WaferStatusConverter(waferAInfo);
                         moduleMaterial.SideAWaferId = waferAInfo.WaferID;
                         moduleMaterial.SideAWaferType = waferAInfo.WaferType.ToString();
                     }
@@ -202,7 +202,7 @@ namespace MECF.Framework.Common.SubstrateTrackings
                     if (WaferManager.Instance.CheckHasWafer(module, 1))
                     {
                         WaferInfo waferBInfo = WaferManager.Instance.GetWafer(module, 1);
-                        moduleMaterial.SideBWaferStatus = WaferStatusConverter(waferBInfo);
+                        moduleMaterial.SideBWaferStatus =WaferManager.Instance.WaferStatusConverter(waferBInfo);
                         moduleMaterial.SideBWaferId = waferBInfo.WaferID;
                         moduleMaterial.SideBWaferType = waferBInfo.WaferType.ToString();
                     }
@@ -216,67 +216,5 @@ namespace MECF.Framework.Common.SubstrateTrackings
                 
             }
         }
-
-        /// <summary>
-        /// WaferStatus color converter
-        /// 
-        /// </summary>
-        /// <param name="awafer"></param>
-        /// <returns></returns>
-        private int WaferStatusConverter(WaferInfo awafer)
-        {
-            //if (awafer.Status == WaferStatus.Empty)
-            //    return 0;
-
-            //if (awafer.Status == WaferStatus.Normal)
-            //{
-            //    switch (awafer.ProcessState)
-            //    {
-            //        case EnumWaferProcessStatus.InProcess: return 3;
-            //        case EnumWaferProcessStatus.Completed: return 4;
-            //        case EnumWaferProcessStatus.Failed: return 5;
-            //        case EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
-            //    }
-            //}
-
-            //if (awafer.Status == WaferStatus.Dummy)
-            //{
-            //    return 1;
-            //}
-
-            //return 5;
-            if (awafer.Status == WaferStatus.Empty)
-                return 0;
-            if (awafer.Status == WaferStatus.Normal)
-            {
-                if (awafer.WaferType == WaferType.Assit)
-                {
-                    return 6;
-                }
-                else
-                {
-                    switch (awafer.ProcessState)
-                    {
-                        case EnumWaferProcessStatus.InProcess: return 3;
-                        case EnumWaferProcessStatus.Completed: return 4;
-                        case EnumWaferProcessStatus.Failed: return 5;
-                        case EnumWaferProcessStatus.Idle:
-                            return awafer.ProcessJob == null ? 1 : 2;
-                        case EnumWaferProcessStatus.Canceled:
-                            return 7;
-                        case EnumWaferProcessStatus.MisProcessed:
-                            return 8;
-                        case EnumWaferProcessStatus.MisSrdProcess:
-                            return 9;
-                    }
-                }
-            }
-
-            if (awafer.Status == WaferStatus.Dummy)
-            {
-                return 6;
-            }
-            return 1;
-        }
     }
 }

+ 50 - 0
Framework/Common/SubstrateTrackings/WaferManager.cs

@@ -818,5 +818,55 @@ namespace MECF.Framework.Common.SubstrateTrackings
             }
             return true;
         }
+
+        public int WaferStatusConverter(WaferInfo awafer)
+        {
+            if (awafer.Status == WaferStatus.Empty)
+                return 0;
+
+            if (awafer.Status == WaferStatus.Normal)
+            {
+                if (awafer.WaferType == WaferType.Assit)
+                {
+                    return 6;
+                }
+                else
+                {
+                    switch (awafer.ProcessState)
+                    {
+                        case EnumWaferProcessStatus.InProcess: return 3;
+                        case EnumWaferProcessStatus.Completed: return 4;
+                        case EnumWaferProcessStatus.Failed: return 5;
+                        case EnumWaferProcessStatus.Idle:
+                            return awafer.ProcessJob == null ? 1 : 2;
+                        case EnumWaferProcessStatus.Canceled:
+                            return 7;
+                        case EnumWaferProcessStatus.MisProcessed:
+                            return 8;
+                        case EnumWaferProcessStatus.MisSrdProcess:
+                            return 9;
+                    }
+                }
+            }
+            else if (awafer.Status == WaferStatus.Crossed)
+            {
+                return 10;
+            }
+            else if (awafer.Status == WaferStatus.Double)
+            {
+                return 11;
+            }
+            else if (awafer.Status == WaferStatus.Unknown)
+            {
+                return 0;
+            }
+
+            if (awafer.Status == WaferStatus.Dummy)
+            {
+                return 6;
+            }
+
+            return 1;
+        }
     }
 }

+ 5 - 2
Framework/Common/WaferHolder/WaferHolderManager.cs

@@ -86,7 +86,8 @@ namespace MECF.Framework.Common.WaferHolder
                 }
                 if (!string.IsNullOrEmpty(item.WaferAId))
                 {
-                    if (item.WaferAType == (int)WaferType.Production)
+                    WaferInfo waferInfo=WaferManager.Instance.GetWaferByWaferId(item.WaferAId);
+                    if (item.WaferAType == (int)WaferType.Production||waferInfo.WaferType==WaferType.Production)
                     {
                         WaferManager.Instance.DeleteWaferById(item.WaferAId);
                         item.WaferAId = $"{item.Id}.01";
@@ -113,7 +114,8 @@ namespace MECF.Framework.Common.WaferHolder
                 }
                 if (!string.IsNullOrEmpty(item.WaferBId))
                 {
-                    if (item.WaferBType == (int)WaferType.Production)
+                    WaferInfo waferInfo = WaferManager.Instance.GetWaferByWaferId(item.WaferBId);
+                    if (item.WaferBType == (int)WaferType.Production||waferInfo.WaferType==WaferType.Production)
                     {
                         WaferManager.Instance.DeleteWaferById(item.WaferBId);
                         item.WaferBId = $"{item.Id}.02";
@@ -161,6 +163,7 @@ namespace MECF.Framework.Common.WaferHolder
                 waferInfo.WaferOrigin = waferId;
                 waferInfo.WaferID = waferId;
                 waferInfo.OrginalWaferHolder = item.Id;
+                waferInfo.ProcessState = EnumWaferProcessStatus.Idle;
             }
         }
         /// <summary>