using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Event; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.Communications; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using MECF.Framework.RT.EquipmentLibrary.Core.Extensions; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Common; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.HwinRobort; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.HwinRobort.Errors; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.RobotBase; namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.HwinRobot { public class HwinRobotB : HwinRobot { public HwinRobotB(string module, string name, string endof = "\r\n") : base(module, name) { OP.Subscribe($"{Module}.SetPosition", (string cmd, object[] args) => { MoveInfo = new RobotMoveInfo() { Action = RobotAction.Picking, ArmTarget = RobotArm.ArmA, BladeTarget = "ArmA." + args[0].ToString(), }; return true; }); ModuleAssociateStationDic = new Dictionary() { {$"{ModuleName.LoadLock }", "B" }, {$"{ModuleName.CassBL}", "A"}, {$"{ModuleName.LoadLock }.Pick", "C" }, {$"{ModuleName.LoadLock }.Place", "B" }, }; } public override void NoteActionCompleted() { //Blade1Target = ModuleName.System; //Blade2Target = ModuleName.System; CheckToPostMessage((int)RobotMsg.ActionDone); } #region Command Functions public override void RobotPickB(object[] args) { if (args.Length >= 2) { _lstHandler.Clear(); lock (_locker) { _lstHandler.AddLast(new HwinRobotBGETBHandler(this, args[0].ToString(), Convert.ToInt32(args[1]))); } } } public override void RobotPlaceB(object[] args) { if (args.Length >= 2) { _lstHandler.Clear(); lock (_locker) { _lstHandler.AddLast(new HwinRobotBPUTBHandler(this, args[0].ToString(), Convert.ToInt32(args[1]))); } } } public override void SetWaferData(string data) { //0:未扫片 1:有 2:没有 3:斜放 4:两片 5:薄片 string errorMessage = ""; int waferCount = 1; if (CurrentInteractModule == ModuleName.CassBL) { waferCount = 8; } if (data.Length == 25)//Wafer Cassette { for (int i = 0; i < waferCount; i++) { string waferStatue = data.Substring(i, 1); if (waferStatue == "1") { if (!WaferManager.Instance.CheckHasTray(CurrentInteractModule, i)) { WaferManager.Instance.CreateTray(CurrentInteractModule, i); } } else if (waferStatue == "0" || waferStatue == "X") { if (WaferManager.Instance.CheckHasTray(CurrentInteractModule, i)) { WaferManager.Instance.DeleteWafer(CurrentInteractModule, i); } } else { if (!WaferManager.Instance.CheckHasTray(CurrentInteractModule, i)) { WaferManager.Instance.CreateTray(CurrentInteractModule, i,Aitex.Core.Common.TrayStatus.Crossed); } errorMessage += $"slot {i + 1} has crossed wafer!" + "\r\n"; } } } else if (data.Length == 1) { if (data == "0") { if (!WaferManager.Instance.CheckHasTray(ModuleHelper.Converter(Module), 0)) { WaferManager.Instance.CreateTray(ModuleHelper.Converter(Module), 0); } } else if (data == "1") { if (WaferManager.Instance.CheckHasTray(ModuleHelper.Converter(Module), 0)) { WaferManager.Instance.DeleteWafer(ModuleHelper.Converter(Module), 0); } } } if (!String.IsNullOrEmpty(errorMessage)) { EV.PostWarningLog(Module, $"Module {CurrentInteractModule} {errorMessage}"); } } //internal override bool ParseErrData(string response) //{ // try // { // var errs = new HiwinRobotAggregatedErrors(response).AggregateErrorMessages; // if (errs != null) // { // foreach (var err in errs) // { // EV.PostWarningLog(Module, err); // } // } // return true; // } // catch (Exception ex) // { // return true; // } //} public override void InputA() { _lstHandler.Clear(); lock (_locker) { _lstHandler.AddLast(new HwinRobotBINPUTHandler(this)); } } public override void RobotRsr() { _lstHandler.Clear(); lock (_locker) { _lstHandler.AddLast(new HwinRobotBRSRHandler(this)); } } public override void RobotConnectHomeAll() { IsBusy = false; base.Connection.ForceClear(); _lstHandler.Clear(); lock (_locker) { _lstHandler.AddLast(new HwinRobotRespHandler(this)); _lstHandler.AddLast(new HwinRobotRemsHandler(this)); _lstHandler.AddLast(new HwinRobotSVONHandler(this)); _lstHandler.AddLast(new HwinRobotHomeHandler(this, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotBINPUTHandler(this)); } } #endregion #region Note Functions public void ContineHome() { fAbort(null); _lstHandler.AddLast(new HwinRobotHomeHandler(this, _scHomeTimeout.IntValue)); } public override bool ReadParameter(object[] param) { IsBusy = true; return CheckToPostMessage((int)RobotMsg.ReadData, param); } protected override bool fStartMapWafer(object[] param) { try { if (param.Length >= 1) { lock (_locker) { _lstHandler.AddLast(new HwinRobotMapHandler(this, param[0].ToString(), _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotBRSRHandler(this, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotHomeHandler(this, _scMotionTimeout.IntValue)); } } } catch (Exception ex) { LOG.Write(ex); return false; } return true; } protected override bool fStartPlaceWafer(object[] param) { try { //arm, station, slot if (param.Length >= 3) { lock (_locker) { if (param[1].ToString() == ModuleName.LoadLock.ToString()) { /* 1.打开夹爪 * 2.取盘位置低位 * 3.抬升托盘 */ int _rDistance = SC.GetValue("TrayRobot.PlaceRMoveDistance"); _lstHandler.AddLast(new HwinRobotBOPTPHandler(this, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotMTCSPHandler(this, $"{param[1].ToString()}", "Place", _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotMOVRPHandler(this, _rDistance, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotRETHHandler(this, _scMotionTimeout.IntValue)); //_lstHandler.AddLast(new HwinRobotBOPTClosePHandler(this, _scMotionTimeout.IntValue)); } else { _lstHandler.AddLast(new HwinRobotBPUTBHandler(this, param[1].ToString(), Convert.ToInt32(param[2]), _scMotionTimeout.IntValue)); } } } } catch (Exception ex) { LOG.Write(ex); return false; } return true; } //(module, slot) protected override bool fStartPickWafer(object[] param) { try { //Load 高位B,Load 低位C //arm, station, slot if (param.Length >= 3) { lock (_locker) { if (param[1].ToString() == ModuleName.LoadLock.ToString()) { /* 1.打开夹爪 * 2.取盘位置低位 * 3.抬升托盘 * 4.收回 */ int _rDistance = SC.GetValue("TrayRobot.PickRMoveDistance"); _lstHandler.AddLast(new HwinRobotBOPTPHandler(this, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotMTCSPHandler(this, $"{param[1].ToString()}", "Pick", _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotMOVRGHandler(this, _rDistance, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotRETHHandler(this, _scMotionTimeout.IntValue)); _lstHandler.AddLast(new HwinRobotBOPTClosePHandler(this, _scMotionTimeout.IntValue)); } else { string str = $"{param[1]} {Convert.ToInt32(param[2])}"; _lstHandler.AddLast(new HwinRobotBGETBHandler(this, param[1].ToString(), Convert.ToInt32(param[2]), _scMotionTimeout.IntValue)); } } } } catch (Exception ex) { LOG.Write(ex); return false; } return true; } protected override bool fPlaceComplete(object[] param) { IsBusy = false; return true; } protected override bool fPickComplete(object[] param) { IsBusy = false; return true; } protected override bool fReset(object[] param) { _trigError.RST = true; Connection.SetCommunicationError(false, ""); _trigCommunicationError.RST = true; _trigRetryConnect.RST = true; if (_isAlarm) { lock (_locker) { //_lstHandler.AddLast(new HwinRobotBResetHandler(this)); } Thread.Sleep(100); CheckToPostMessage((int)RobotMsg.ActionDone); } IsBusy = false; return true; } //[module][slot] protected override bool fStartExtendForPick(object[] param) { try { //if (param.Length >= 2) //{ // lock (_locker) // { // _lstHandler.AddLast(new HwinRobotBGETSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 1, _scMotionTimeout.IntValue)); // _lstHandler.AddLast(new HwinRobotBGETSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 2, _scMotionTimeout.IntValue)); // } //} } catch (Exception ex) { LOG.Write(ex); return false; } return true; } protected override bool fStartExtendForPlace(object[] param) { try { //if (param.Length >= 2) //{ // lock (_locker) // { // _lstHandler.AddLast(new HwinRobotBPUTSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 1, _scMotionTimeout.IntValue)); // _lstHandler.AddLast(new HwinRobotBPUTSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 2, _scMotionTimeout.IntValue)); // } //} } catch (Exception ex) { LOG.Write(ex); return false; } return true; } /// /// 开始从Pick处缩回 /// /// /// protected override bool fStartRetractFromPick(object[] param) { try { //if (param.Length >= 2) //{ // lock (_locker) // { // _lstHandler.AddLast(new HwinRobotBGETSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 3, _scMotionTimeout.IntValue)); // _lstHandler.AddLast(new HwinRobotBGETSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 4, _scMotionTimeout.IntValue)); // } //} } catch (Exception ex) { LOG.Write(ex); return false; } return true; } /// /// 开始从Place处缩回 /// /// /// protected override bool fStartRetractFromPlace(object[] param) { try { //if (param.Length >= 2) //{ // lock (_locker) // { // _lstHandler.AddLast(new HwinRobotBPUTSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 3, _scMotionTimeout.IntValue)); // _lstHandler.AddLast(new HwinRobotBPUTSPHandler(this, param[0].ToString(), Convert.ToInt32(param[1]), 4, _scMotionTimeout.IntValue)); // } //} } catch (Exception ex) { LOG.Write(ex); return false; } return true; } #endregion } }