using System; using System.Collections.Generic; using System.Linq; using Aitex.Sorter.Common; using Aitex.Core.Util; using Aitex.Core.RT.Log; using Aitex.Core.Common; using Aitex.Core.RT.Device; using System.Threading; using Aitex.Core.RT.Event; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; namespace Aitex.Sorter.RT.Module { public class TransferManager { public bool empty { get { return moves.Count == 0; } } public bool PassAligner { get { foreach (var move in moves) { if ((((MoveOption)move.option & MoveOption.Align) == MoveOption.Align) || (((MoveOption)move.option & MoveOption.ReadID) == MoveOption.ReadID) || (((MoveOption)move.option & MoveOption.ReadID2) == MoveOption.ReadID2) ) { return true; } } return false; } } public bool PassTurnOver { get { foreach (var move in moves) { if ((((MoveOption)move.option & MoveOption.Turnover) == MoveOption.Turnover)) { return true; } } return false; } } public bool PassLoadLock { get { foreach (var move in moves) { if ((((MoveOption)move.option & MoveOption.LoadLock1) == MoveOption.LoadLock1) || (((MoveOption)move.option & MoveOption.LoadLock2) == MoveOption.LoadLock2) || (((MoveOption)move.option & MoveOption.LoadLock3) == MoveOption.LoadLock3) || (((MoveOption)move.option & MoveOption.LoadLock4) == MoveOption.LoadLock4) ) { return true; } } return false; } } public bool PassBuffer { get { foreach (var move in moves) { if (((MoveOption)move.option & MoveOption.Buffer) == MoveOption.Buffer) { return true; } } return false; } } private List moves = new List(); private List checks = new List(); public List TaskLoadPort { get; set; } //private int cyclestep = 0; //private bool A2B = true; public TransferManager() { TaskLoadPort = new List(); } public void AddMove(Move move) { moves.Add(move); } public List GetTask() { List tasks = new List(); foreach (Move move in moves) { MoveTask task = new MoveTask(); task.WaferID = move.WaferID; task.SourceStaion = (ModuleName)move.SourceStaion; task.SourceSlot = move.SourceSlot; task.DestStaion = (ModuleName)move.DestStaion; task.DestSlot = move.DestSlot; task.swap = move.swap; task.option = (MoveOption)move.option; task.Notch = move.Angle; // task.VerifyAny = move.VerifyAny; task.VerifyLaserMaker = move.VerifyLaserMaker; task.LaserMaker = move.LaserMaker; task.VerifyT7Code = move.VerifyT7Code; task.T7Code = move.T7Code; tasks.Add(task); } return tasks; } public void Clear() { moves.Clear(); } public bool CreateTransferTask(TransferInfo[] transfers) { TaskLoadPort.Clear(); if (!Convert(transfers, ref moves)) { return false; } checks = new List(moves.ToArray()); return CheckMoves(); } public bool CreateCycleTransferTask(ModuleName source) { moves.Clear(); if (!LoadAlignerCycleTask(source, ref moves)) return false; checks = new List(moves.ToArray()); return CheckMoves(); } private bool LoadAlignerCycleTask(ModuleName source, ref List moves) { int option = 0; if (!SC.GetValue("Process.CycleEnableAlign") && !SC.GetValue("Process.CycleEnableLaserMarker1") && !SC.GetValue("Process.CycleEnableLaserMarker2")) { EV.PostWarningLog("System", "Cycle in same port need through aligner"); return false; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); SCConfigItem _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch"); if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10) { for (int i = 0; i < 25; i++) { if (WaferManager.Instance.CheckHasWafer(source, i)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)source; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } } return true; } public bool CreateCycleTransferTask(ModuleName source, ModuleName target) { moves.Clear(); int cyclemode = SC.ContainsItem("Process.CyclePlaceMode") ? SC.GetValue("Process.CyclePlaceMode") : 1; switch(cyclemode) { case 1: LoadOppositeSlot(source, target, ref moves); break; case 2: LoadSameSlot_V1(source, target, ref moves); break; case 3: LoadEmptySlotFromTop(source, target, ref moves); break; case 4: LoadEmptySlotFromBottom(source, target, ref moves); break; case 5: LoadSameSlot(source, target, ref moves); //For JRH Only break; default: LoadOppositeSlot(source, target, ref moves); break; } checks = new List(moves.ToArray()); return CheckMoves(); } public bool CreateCycleTransferTask(ModuleName source, ModuleName target, MoveOption option) { moves.Clear(); PassThroughCycle(source, target, option, ref moves); checks = new List(moves.ToArray()); return CheckMoves(); } private bool LoadSameSlot(ModuleName source, ModuleName dest, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); SCConfigItem _scLP2Pitch; if (SC.ContainsItem("OcrReader.DefaultReader")) { _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch"); } else { _scLP2Pitch = null; } if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10) { if (ModuleHelper.IsLoadPort(source) && ModuleHelper.IsLoadPort(dest)) { for (int i = 0; i < 25; i++) { if ((WaferManager.Instance.CheckHasWafer(source, i)) && (WaferManager.Instance.CheckNoWafer(dest, i))) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } } else if (ModuleHelper.IsBuffer(source)) { int y = 0; for (int i = 0; i < 25; i++) { if (y > 5) break; if (WaferManager.Instance.CheckHasWafer(source, y)) { if (WaferManager.Instance.CheckNoWafer(dest, i)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = y; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); y++; } } else { y++; i--; } } } else if (ModuleHelper.IsBuffer(dest)) { int y = 0; for (int i = 0; i < 25; i++) { if (y > 5) break; if (WaferManager.Instance.CheckNoWafer(dest, y)) { if (WaferManager.Instance.CheckHasWafer(source, i)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = y; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); y++; } } else { y++; i--; } } } } else { SCConfigItem _scEnable; if (SC.ContainsItem("LoadPort.EnableSlot1OnLP2")) { _scEnable = SC.GetConfigItem("LoadPort.EnableSlot1OnLP2"); } else { _scEnable = null; } if (source == ModuleName.LP2) { Move moveLast = new Move(); bool isContinue = false; for (int i = 0; i < 25; i++) { if (isContinue && !WaferManager.Instance.CheckHasWafer(source, i)) isContinue = false; if (!WaferManager.Instance.CheckHasWafer(source, i) || !WaferManager.Instance.CheckNoWafer(dest, i)) continue; if (_scEnable == null) { if (!(moveLast.SourceStaion == (int)source && moveLast.SourceSlot == i - 1 && moves.Contains(moveLast)) && (i > 0 && !WaferManager.Instance.CheckNoWafer(source, i - 1))) { isContinue = true; continue; } } else { if (!_scEnable.BoolValue && i == 0) { isContinue = true; continue; } if (!(moveLast.SourceStaion == (int)source && moveLast.SourceSlot == i - 1 && moves.Contains(moveLast)) && (i > 0 && !WaferManager.Instance.CheckNoWafer(source, i - 1))) { isContinue = true; continue; } } if (isContinue) continue; Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); moveLast = move; } } else { for (int i = 24; i >= 0; i--) { if (!(WaferManager.Instance.CheckHasWafer(source, i) && WaferManager.Instance.CheckNoWafer(dest, i)) || (_scEnable != null && !_scEnable.BoolValue && i == 0) || (i > 0 && WaferManager.Instance.CheckHasWafer(dest, i - 1))) continue; Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } } return true; } private bool LoadSameSlot_V1(ModuleName source, ModuleName dest, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); List dtslotReserved = new List(); for (int i = 0; i < 25; i++) { if (!WaferManager.Instance.CheckHasWafer(source, i)) continue; if (WaferManager.Instance.CheckHasWafer(dest, i)) continue; if (dtslotReserved.Contains(i)) continue; dtslotReserved.Add(i); Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); //break; } return true; } private bool LoadEmptySlotFromTop(ModuleName source, ModuleName dest, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); List dtslotReserved = new List(); for (int i = 0; i < 25; i++) { if (!WaferManager.Instance.CheckHasWafer(source, i)) continue; for (int j = 24; j >= 0; j--) { if (WaferManager.Instance.CheckHasWafer(dest, j)) continue; if (dtslotReserved.Contains(j)) continue; dtslotReserved.Add(j); Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = j; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); break; } } return true; } private bool LoadEmptySlotFromBottom(ModuleName source, ModuleName dest, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); List dtslotReserved = new List(); for (int i = 0; i < 25; i++) { if (!WaferManager.Instance.CheckHasWafer(source, i)) continue; for (int j = 0; j <25; j++) { if (WaferManager.Instance.CheckHasWafer(dest, j)) continue; if (dtslotReserved.Contains(j)) continue; dtslotReserved.Add(j); Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = j; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); break; } } return true; } private bool LoadOppositeSlot(ModuleName source, ModuleName dest, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("Process.CycleEnableTurnOver")) if (SC.GetValue("Process.CycleEnableTurnOver")) { option |= (int)MoveOption.Turnover; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); List dtslotReserved = new List(); for (int i = 0; i < 25; i++) { if (!WaferManager.Instance.CheckHasWafer(source, i)) continue; if (WaferManager.Instance.CheckHasWafer(dest, 24-i)) continue; if (dtslotReserved.Contains(24 - i)) continue; dtslotReserved.Add(24 - i); Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = 24 - i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); //break; } return true; } private bool PassThroughCycle(ModuleName source, ModuleName dest, MoveOption passThrough, ref List moves) { int option = 0; if (SC.ContainsItem("Process.CycleEnableAlign")) if (SC.GetValue("Process.CycleEnableAlign")) { option |= (int)MoveOption.Align; } if (SC.ContainsItem("Process.CycleEnableLaserMarker1")) if (SC.GetValue("Process.CycleEnableLaserMarker1")) { option |= (int)MoveOption.ReadID; } if (SC.ContainsItem("Process.CycleEnableLaserMarker2")) if (SC.GetValue("Process.CycleEnableLaserMarker2")) { option |= (int)MoveOption.ReadID2; } if (SC.ContainsItem("OcrReader.DefaultReader")) option |= (int)(SC.GetValue("OcrReader.DefaultReader") == 1 ? MoveOption.Reader1 : MoveOption.Reader2); SCConfigItem _scLP2Pitch; if (SC.ContainsItem("OcrReader.DefaultReader")) { _scLP2Pitch = SC.GetConfigItem("LoadPort.LoadPort2Pitch"); } else { _scLP2Pitch = null; } if (_scLP2Pitch == null || _scLP2Pitch.IntValue == 10) { if (ModuleHelper.IsLoadPort(source) && ModuleHelper.IsLoadPort(dest)) { for (int i = 0; i < 25; i++) { if ((WaferManager.Instance.CheckHasWafer(source, i)) && (WaferManager.Instance.CheckNoWafer(dest, i))) { ModuleName? midStation = null; if ((passThrough & MoveOption.LoadLock1) == MoveOption.LoadLock1) { midStation = ModuleName.LL1; Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } if ((passThrough & MoveOption.LoadLock2) == MoveOption.LoadLock2) { if (midStation != null) { Move move = new Move(); move.SourceStaion = (int)midStation; move.SourceSlot = 0; midStation = ModuleName.LL2; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { Move move = new Move(); midStation = ModuleName.LL2; move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } if ((passThrough & MoveOption.LoadLock3) == MoveOption.LoadLock3) { if (midStation != null) { Move move = new Move(); move.SourceStaion = (int)midStation; move.SourceSlot = 0; midStation = ModuleName.LL3; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { Move move = new Move(); midStation = ModuleName.LL3; move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } if ((passThrough & MoveOption.LoadLock4) == MoveOption.LoadLock4) { if (midStation != null) { Move move = new Move(); move.SourceStaion = (int)midStation; move.SourceSlot = 0; midStation = ModuleName.LL4; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { Move move = new Move(); midStation = ModuleName.LL4; move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } if ((passThrough & MoveOption.Buffer) == MoveOption.Buffer) { if (midStation != null) { Move move = new Move(); move.SourceStaion = (int)midStation; move.SourceSlot = 0; midStation = ModuleName.Buffer; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { Move move = new Move(); midStation = ModuleName.Buffer; move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)midStation; move.DestSlot = 0; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } if (midStation == null || midStation == dest) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { Move move = new Move(); move.SourceStaion = (int)midStation; move.SourceSlot = 0; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } } } else if (ModuleHelper.IsBuffer(source)) { int y = 0; for (int i = 0; i < 25; i++) { if (y > 5) break; if (WaferManager.Instance.CheckHasWafer(source, y)) { if (WaferManager.Instance.CheckNoWafer(dest, i)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = y; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); y++; } } else { y++; i--; } } } else if (ModuleHelper.IsBuffer(dest)) { int y = 0; for (int i = 0; i < 25; i++) { if (y > 5) break; if (WaferManager.Instance.CheckNoWafer(dest, y)) { if (WaferManager.Instance.CheckHasWafer(source, i)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = y; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); y++; } } else { y++; i--; } } } } else { SCConfigItem _scEnable; if (SC.ContainsItem("LoadPort.EnableSlot1OnLP2")) { _scEnable = SC.GetConfigItem("LoadPort.EnableSlot1OnLP2"); } else { _scEnable = null; } if (source == ModuleName.LP2) { bool isContinue = false; for (int i = 0; i < 25; i++) { if (isContinue && !WaferManager.Instance.CheckHasWafer(source, i)) isContinue = false; if (!WaferManager.Instance.CheckHasWafer(source, i) || !WaferManager.Instance.CheckNoWafer(dest, i)) continue; if (_scEnable == null) { if ((i > 0 && !WaferManager.Instance.CheckNoWafer(dest, i - 1))) { isContinue = true; continue; } } else { if (!_scEnable.BoolValue && i == 0 || (i > 0 && !WaferManager.Instance.CheckNoWafer(dest, i - 1))) { isContinue = true; continue; } } if (isContinue) continue; Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } else { for (int i = 24; i >= 0; i--) { if (!(WaferManager.Instance.CheckHasWafer(source, i) && WaferManager.Instance.CheckNoWafer(dest, i)) || (_scEnable != null && !_scEnable.BoolValue && i == 0) || (i > 0 && WaferManager.Instance.CheckHasWafer(dest, i - 1))) continue; Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = i; move.option = option; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } } return true; } public bool CheckResult() { bool ret = true; foreach (Move move in checks) { string waferID = WaferManager.Instance.GetWaferID((ModuleName)move.DestStaion, move.DestSlot); if (waferID == move.WaferID) { LOG.Info(string.Format("Transfer Task Ok. {0}:{1} ---> {2}:{3}.", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } else { LOG.Info(string.Format("Transfer Task Failed. {0}:{1} ---> {2}:{3}.", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); ret = false; } } return ret; } public bool LoadSence(string file, ref List moves) { try { string line; moves.Clear(); using (System.IO.StreamReader sr = new System.IO.StreamReader(file)) { while ((line = sr.ReadLine()) != null) { string[] words = line.Split(','); Move move = new Move(); move.SourceStaion = int.Parse(words[0]); move.SourceSlot = int.Parse(words[1]); move.DestStaion = int.Parse(words[2]); move.DestSlot = int.Parse(words[3]); move.option = int.Parse(words[4]); move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); } } } catch (Exception e) { LOG.Warning(String.Format("读取文件失败:{0},{1}", file, e.Message)); return false; } return true; } public bool Convert(TransferInfo[] Source, ref List dest) { dest.Clear(); bool bDupliacte = Source.GroupBy(x => x.WaferID).Any(g => g.Count() > 1); if (bDupliacte) { EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultAlarm, "Check transfer task failed:duplicated source"); return false; } bDupliacte = Source.GroupBy(x => new { x.Station, x.Slot }).Any(g => g.Count() > 1); if (bDupliacte) { EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultAlarm, "Check transfer task failed:duplicated destination"); return false; } foreach (var item in Source) { WaferInfo[] wafers = WaferManager.Instance.GetWafer(item.WaferID); if (wafers.Length == 0) { EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultAlarm, "Check transfer task failed:wafer id not exist"); return false; } if (wafers.Length > 1) { EV.PostMessage(ModuleName.System.ToString(), EventEnum.DefaultAlarm, "Check transfer task failed:wafer id duplicated in the system"); return false; } Move move = new Move(); move.WaferID = item.WaferID; move.SourceStaion = wafers[0].Station; move.SourceSlot = wafers[0].Slot; move.DestStaion = (int)item.Station; move.DestSlot = item.Slot; move.option = (int)item.Option; move.Angle = item.Angle; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); move.VerifyAny = item.VerifyAny; move.VerifyLaserMaker = item.VerifyLaserMaker; move.LaserMaker = item.LaserMaker; move.VerifyT7Code = item.VerifyT7Code; move.T7Code = item.T7Code; dest.Add(move); } return true; } private bool CheckMoves() { foreach (Move move in moves) { /* move.swap = moves.Any(g => g.SourceStaion == move.DestStaion && g.SourceSlot == move.DestSlot); if (WaferManager.Instance.CheckHasWafer((UnitName)move.DestStaion, move.DestSlot)) move.swap = true; if ((move.DestStaion == move.SourceStaion) && (move.DestSlot == move.SourceSlot)) move.swap = false; */ LOG.Info(string.Format("Transfer Task. {0}:{1} ---> {2}:{3}.", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); if (!TaskLoadPort.Contains((ModuleName)move.SourceStaion)) TaskLoadPort.Add((ModuleName)move.SourceStaion); if (!TaskLoadPort.Contains((ModuleName)move.DestStaion)) TaskLoadPort.Add((ModuleName)move.DestStaion); } return true; } private int GetRandomSeed() { byte[] bytes = new byte[4]; System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); rng.GetBytes(bytes); return BitConverter.ToInt32(bytes, 0); } private int[] RandArray(int[] arr) { int[] newarr = new int[arr.Length]; Random rand = new Random(); List list = new List(); for (int j = 0; j < arr.Length; j++) list.Add(arr[j]); for (int i = arr.Length; i > 0; i--) { int c = rand.Next(0, i); newarr[i - 1] = list[c]; list.Remove(list[c]); } return newarr; } //private void PostMsg(params object[] objs) //{ // Singleton.Instance.PostMsg(RouteManager.MSG.MoveWafer, objs); //} //sorted private bool LoadSortedSence(bool bLoadportA, ref List moves) { ModuleName chamber = ModuleName.LP1; if (!bLoadportA) chamber = ModuleName.LP2; int[] source = new int[24]; for (int i = 0; i < source.Length; i++) { source[i] = i; } int[] dest = RandArray(source); for (int i = 0; i < source.Length; i++) { if (WaferManager.Instance.CheckHasWafer(chamber, source[i])) { Move move = new Move(); move.SourceStaion = (int)chamber; move.SourceSlot = source[i]; move.DestStaion = (int)chamber; move.DestSlot = dest[i]; move.option = (int)MoveOption.Align; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } return true; } //sorted private bool LoadOneToMultiSence(bool bLoadportA, ref List moves) { int[] source = new int[24]; for (int i = 0; i < source.Length; i++) { source[i] = i; } int[] dest = RandArray(source); for (int i = 0; i < source.Length; i++) { ModuleName chamber; if (bLoadportA) chamber = ModuleName.LP1; else chamber = ModuleName.LP2; if (WaferManager.Instance.CheckHasWafer(chamber, source[i])) { Move move = new Move(); move.SourceStaion = (int)chamber; move.SourceSlot = source[i]; Random random = new Random(GetRandomSeed()); Thread.Sleep(100); if (random.Next() % 2 == 0) { move.DestStaion = (int)ModuleName.LP1; } else { move.DestStaion = (int)ModuleName.LP2; } move.DestSlot = dest[i]; move.option = (int)MoveOption.Align; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); } } return true; } //sorted private bool LoadMultiToOneSence(bool bLoadportA, ref List moves) { ModuleName source = ModuleName.LP2; ModuleName dest = ModuleName.LP1; if (bLoadportA) { source = ModuleName.LP1; dest = ModuleName.LP2; } int k = 0; for (int i = 0; i < 25; i++) { if (WaferManager.Instance.CheckHasWafer(source, i)) { for (int j = k; j < 25; j++) { if (WaferManager.Instance.CheckNoWafer(dest, j)) { Move move = new Move(); move.SourceStaion = (int)source; move.SourceSlot = i; move.DestStaion = (int)dest; move.DestSlot = j; move.option = (int)MoveOption.Align; move.WaferID = WaferManager.Instance.GetWaferID((ModuleName)move.SourceStaion, move.SourceSlot); moves.Add(move); k = j + 1; LOG.Info(string.Format("Wafer Moved.{0},{1:D2} --->{2}{3:D2}", ((ModuleName)move.SourceStaion).ToString(), move.SourceSlot, ((ModuleName)move.DestStaion).ToString(), move.DestSlot)); break; } } } } return true; } } }