using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Sorter.Common; using MECF.Framework.Common.Equipment; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Venus_Core; using Venus_RT.Devices; using Venus_RT.Devices.PreAligner; using Venus_RT.Devices.TM; namespace Venus_RT.Modules.TM.VenusEntity { public class SEMFHomeRoutine : ModuleRoutineBase, IRoutine { private enum HomeStep { seRobotHome, seRobotBlade1CheckLoad, seRobotBlade2CheckLoad, QueryARMA, QueryARMB, seRobotDelay, seSlitDoor, seSlitDoorDelay, seAlignerHome, seEnd, } private int _robotHomingTimeout = 120 * 1000; private int _slitDoorHomingTimeout = 20 * 1000; private int _Aligner1HomingTimeout = 20 * 1000; private bool _TMHomeRBFlag = false; //是否仅仅home robot private readonly TMBase _HongHuTM; private readonly ITransferRobot _robot; private readonly IPreAlign _vpa; public int currentStepNo; public SEMFHomeRoutine(TMBase HongHuTM, ITransferRobot robot,IPreAlign vpa,ModuleName module) : base(module) { _HongHuTM = HongHuTM; _robot = robot; _vpa = vpa; Name = "SE TM Home"; } public RState Start(params object[] objs) { if (objs.Length > 0 && objs[0].ToString() == "TMRobot") _TMHomeRBFlag = true; currentStepNo = 0; //没有Lid传感 检查 Reset(); _robotHomingTimeout = SC.GetValue($"{Module}.HomeTimeout") * 1000; return Runner.Start(Module, Name); } //模式 指令名称 执行命令 检查结束命令 超时时长 public RState Monitor() { if(!_TMHomeRBFlag) Runner.Run(HomeStep.seRobotHome, HomeRobot, CheckRobotReady, _robotHomingTimeout) .Run(HomeStep.seRobotBlade1CheckLoad, Blade1CheckLoad, CheckRobotReady, _robotHomingTimeout) .Run(HomeStep.seRobotBlade2CheckLoad, Blade2CheckLoad, CheckRobotReady, _robotHomingTimeout) .Run(HomeStep.QueryARMA, ReQueryLoadA, CheckRobotReady, _robotHomingTimeout) .Run(HomeStep.QueryARMB, ReQueryLoadB, CheckRobotReady, _robotHomingTimeout) .Delay(HomeStep.seRobotDelay, 500) .Run(HomeStep.seSlitDoor, HomeSlitDoor, CheckSlitDoorReady, _slitDoorHomingTimeout) .Delay(HomeStep.seSlitDoorDelay, 500) .Run(HomeStep.seAlignerHome, HomeAligner1, CheckAligner1Ready, _Aligner1HomingTimeout) .End(HomeStep.seEnd, NullFun, _delay_50ms); else Runner.Run(HomeStep.seRobotHome, HomeRobot, CheckRobotReady, _robotHomingTimeout) .End(HomeStep.seEnd, NullFun, _delay_50ms); return Runner.Status; } private bool CheckAligner1Ready() { //vpa 检查 return _vpa.Status == RState.End; //return true; } private bool ReQueryLoadA() { return _robot.ReQueryLoadA(); } private bool ReQueryLoadB() { return _robot.ReQueryLoadB(); } private bool HomeAligner1() { //vpa home //11.3 直接跳过vpa return _vpa.Home(); //return true; } private bool CheckSlitDoorReady() { if (RtInstance.ConfigType == ConfigType.VenusSE) { //检查门状态 if (_HongHuTM.AllPMSlitDoorClosed && _HongHuTM.VCESlitDoorClosed(ModuleName.VCE1)) return true; else return false; } if (RtInstance.ConfigType == ConfigType.VenusDE) { //检查门状态 if (_HongHuTM.AllPMSlitDoorClosed && _HongHuTM.VCESlitDoorClosed(ModuleName.VCEA)&&_HongHuTM.VCESlitDoorClosed(ModuleName.VCEB)) return true; else return false; } return false; } private bool HomeSlitDoor() { _HongHuTM.HomeVceSlitDoor(); currentStepNo = 2; return _HongHuTM.CloseAllSlitDoor(); } private bool CheckRobotReady() { //robot状态结束 return _robot.Status == RState.End; } private bool Blade1CheckLoad() { return _robot.CheckLoad(Hand.Blade1); } private bool Blade2CheckLoad() { return _robot.CheckLoad(Hand.Blade2); } private bool HomeRobot() { //robot开始Home currentStepNo = 1; return _robot.Home(); } public void Abort() { } } }