using Aitex.Common.Util; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Event; using Aitex.Core.RT.OperationCenter; using System.Collections.Generic; using Aitex.Core.Common.DeviceData; using Aitex.Core.RT.Device; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; //using Venus_RT.Device.YASKAWA; //using Venus_RT.Devices.EFEM; using Venus_RT.FAs; using Venus_RT.Modules; using Aitex.Core.RT.Log; namespace Venus_RT.HostWrapper { class FaManager : FaHost, IHostCallback { private const string PROCESS_START_INQUIRY = "PROCESS_START_INQUIRY"; private class DataName { public const string CommunicationStatus = "CommunicationStatus"; public const string ControlStatus = "ControlStatus"; public const string ControlSubStatus = "ControlSubStatus"; public const string SpoolingState = "SpoolingState"; public const string SpoolingActual = "SpoolingActual"; public const string SpoolingTotal = "SpoolingTotal"; public const string SpoolingFullTime = "SpoolingFullTime"; public const string SpoolingStartTime = "SpoolingStartTime"; public const string IsSpoolingEnable = "IsSpoolingEnable"; } private Dictionary _dicPortModule = new Dictionary() { {"1", ModuleName.LP1}, {"2", ModuleName.LP2}, }; public void Initialize() { base.Initialize(this, PathManager.GetCfgDir() + "ClusterGemModel.xml"); OP.Subscribe("System.FACommand", InvokeFaCommand); DATA.Subscribe("System.CommunicationStatus", () => FaCommunicationState); DATA.Subscribe("System.ControlStatus", () => FaControlState); DATA.Subscribe("System.ControlSubStatus", () => FaControlSubState); DATA.Subscribe("System.SpoolingState", () => SpoolingState); DATA.Subscribe("System.SpoolingActual", () => SpoolingActual); DATA.Subscribe("System.SpoolingTotal", () => SpoolingTotal); DATA.Subscribe("System.SpoolingFullTime", () => SpoolingFullTime); DATA.Subscribe("System.SpoolingStartTime", () => SpoolingStartTime); DATA.Subscribe("System.IsSpoolingEnable", () => IsSpoolingEnable); EV.Subscribe(new EventItem(PROCESS_START_INQUIRY)); } private bool InvokeFaCommand(string arg1, object[] arg2) { LOG.Write(eEvent.INFO_FA, ModuleName.System, arg1 + ":" + arg2[0]); Invoke(arg2[0].ToString(), null); return true; } public string GetSvidValue(string svName) { if (svName == "PMA.RecipeProcessTime") svName = "PMA.RecipeTotalElapsedSeconds"; else if (svName == "PMB.RecipeProcessTime") svName = "PMB.RecipeTotalElapsedSeconds"; object data = DATA.Poll(svName); if (data != null) { return data.ToString(); } return ""; } public List GetListSvidValue(string svName) { List result = new List(); foreach (var VARIABLE in result) { } return result; } public bool MapCassette(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice==null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette ) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Protrusion) //{ // reason = $"{portId} cassette wafer protrude"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} if (SC.ContainsItem("EFEM.CheckSideDoorOnEAPMap") && SC.GetValue("EFEM.CheckSideDoorOnEAPMap")) { //if (Singleton.Instance.EFEM.EfemDevice.DoorSwitch != LidState.Close) { reason = $"EFEM side door not closed, can not map {portId}"; return false; } } if (SC.ContainsItem("EFEM.CheckCassetteDoorOnEAPMap") && SC.GetValue("EFEM.CheckCassetteDoorOnEAPMap")) { //if (Singleton.Instance.EFEM.EfemDevice.CassetteDoor != LidState.Close) { reason = $"Cassette door not closed, can not map {portId}"; return false; } } OP.DoOperation($"{_dicPortModule[portId]}.Map"); reason = string.Empty; return true; } public bool PPSelect(string portId, string jobId, string lotId, string[] slotSequence, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //if (!Singleton.Instance.IsAutoMode) //{ // reason = $"System not in auto mode"; // return false; //} Dictionary param = new Dictionary() { {"JobId", jobId}, {"LotId", lotId}, {"Module", _dicPortModule[portId].ToString()}, {"SlotSequence", slotSequence}, {"AutoStart", false}, }; OP.DoOperation("System.CreateJob", param); reason = string.Empty; return true; } public bool StartJob(string jobId, out string reason) { var param = new object[] { jobId }; OP.DoOperation("System.StartJob", param); reason = string.Empty; return true; } public bool AbortJob(string jobId, out string reason) { var param = new object[] { jobId }; OP.DoOperation("System.AbortJob", param); reason = string.Empty; return true; } public bool PauseJob(string jobId, out string reason) { var param = new object[] { jobId }; OP.DoOperation("System.PauseJob", param); reason = string.Empty; return true; } public bool ResumeJob(string jobId, out string reason) { var param = new object[] { jobId }; OP.DoOperation("System.ResumeJob", param); reason = string.Empty; return true; } public bool StopJob(string jobId, out string reason) { var param = new object[] { jobId }; OP.DoOperation("System.StopJob", param); reason = string.Empty; return true; } public bool Load(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.Load"); reason = string.Empty; return true; } public bool Unload(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} //if (SC.GetValue("EFEM.AutoUnlockAfterUnload") ) //{ // OP.DoOperation($"{_dicPortModule[portId]}.Unload"); //} //else //{ // OP.DoOperation($"{_dicPortModule[portId]}.Undock"); //} reason = string.Empty; return true; } public bool Lock(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.Clamp"); reason = string.Empty; return true; } public bool Unlock(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.Unclamp"); reason = string.Empty; return true; } public bool ReadID(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.ReadCarrierId"); reason = string.Empty; return true; } public bool ReadTag(string portId, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.ReadTagData"); reason = string.Empty; return true; } public bool WriteID(string portId, string carrierID, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.WriteCarrierID", carrierID); reason = string.Empty; return true; } public bool WriteTag(string portId, string tagData, out string reason) { if (!_dicPortModule.ContainsKey(portId)) { reason = $"{portId} not valid"; return false; } //var LPDevice = Singleton.Instance.EFEM.EfemDevice[_dicPortModule[portId]] as Loadport; //if (LPDevice == null) //{ // reason = $"{portId} not valid"; // return false; //} //if (!LPDevice.HasCassette) //{ // reason = $"{portId} cassette not placed"; // return false; //} //if (LPDevice.Status == DeviceState.Error) //{ // reason = $"{portId} port in error, need reset"; // return false; //} OP.DoOperation($"{_dicPortModule[portId]}.WriteTagData", tagData); reason = string.Empty; return true; } } }