using Rs.Controls; using Rs.Framework; using Rs.Motion; using Rs.Motion.Base; using Rs.MotionPlat.Commom; using Rs.MotionPlat.Flow; using System.Threading; namespace Rs.AutoDischarge.V3.Flow { enum ETrayTestStep { 等待命令, 到下料降速位, 等待到下料降速位, 到下料结束位, 等待到下料结束位, 到下料托盘气缸下方, 等待到下料托盘气缸下方, 顶起托盘, 等待托盘顶起, 下料完成回原点, 等待下料完成回原点, 到上料接料盘位, 等待到上料接料盘位, 上料下降到托料盘位, 等待上料下降到托料盘位, 上料到原点位, 等待上料到原点位, 到上料降速位, 等待到上料降速位, 到上料终点位, 等待到上料终点位 } public enum ETrayStatus { /// /// 空闲 /// IDLE, /// /// 上料中 /// Loading, /// /// 上料完成 /// Loaded, /// /// 下料中 /// Unloading, /// /// 下料完成 /// Unloaded, /// /// 未知 /// UnKnown } public class TrayTest:BaseFlow { public ETrayStatus Status { get; set; } = ETrayStatus.IDLE; public bool NeedUnload = false; public bool NeedLoad = false; private bool finished = false; private bool m_bWholeLoad = true; //double baseHeight = -1; //private static StockTest instance; int stockNo = -1;//料仓编号 //double trayHeight = -1; //public static StockTest Instance //{ // get // { // if(instance == null) // instance = new StockTest(); // return instance; // } //} public TrayTest(int _stockNo) { stockNo = _stockNo; StockFlow = AxisControl.GetAxis($"StockFlow{stockNo}"); StockZ = AxisControl.GetAxis($"StockZ{stockNo}"); //baseHeight = GlobalVar.Instance.GetValue($"Stock{stockNo}BaseHeight"); //trayHeight = GlobalVar.Instance.GetValue("TrayHeight"); } private ETrayTestStep Step= ETrayTestStep.等待命令; bool bStop= false; IAxis StockFlow = null; IAxis StockZ=null; public override void Run() { switch (Step) { case ETrayTestStep.等待命令: if (StockZ.HomeStatus == EHomeStatus.Finished) { if (NeedUnload) { Status = ETrayStatus.Unloading; //下料 IoManager.Instance.WriteOut($"{stockNo}号料仓斜推气缸", 0); Thread.Sleep(200); finished = false; NeedUnload = false; Step = ETrayTestStep.到下料降速位; } else if (NeedLoad) { //上料 finished = false; NeedLoad = false; if (m_bWholeLoad) Step = ETrayTestStep.到上料接料盘位; else Step = ETrayTestStep.到上料终点位; } } break; case ETrayTestStep.到下料降速位: StockFlow.MoveOffset(SysConfigParam.GetValue("HighSpeedDistance"), GlobalVar.WholeSpeed); Step = ETrayTestStep.等待到下料降速位; break; case ETrayTestStep.等待到下料降速位: StockFlow.IsStop(out bStop); if (bStop) { Step = ETrayTestStep.到下料结束位; } break; case ETrayTestStep.到下料结束位: StockFlow.MoveOffset(SysConfigParam.GetValue("LowSpeedDistance"), 3); Step = ETrayTestStep.等待到下料结束位; break; case ETrayTestStep.等待到下料结束位: if (IoManager.Instance.ReadIn($"{stockNo}号料仓上料位光电检测") == 1) { Thread.Sleep(1000); StockFlow.Stop(); Thread.Sleep(200); Step = ETrayTestStep.到下料托盘气缸下方; } break; case ETrayTestStep.到下料托盘气缸下方: StockZ.MovePos(SysConfigParam.GetValue($"Stock{stockNo}BaseHeight") - SysConfigParam.GetValue("TrayHeight"), GlobalVar.WholeSpeed); Step = ETrayTestStep.等待到下料托盘气缸下方; break; case ETrayTestStep.等待到下料托盘气缸下方: StockZ.IsStop(out bStop); if (bStop) { IoManager.Instance.WriteOut($"{stockNo}号料仓托盘气缸", 0); Thread.Sleep(200); Step = ETrayTestStep.顶起托盘; } break; case ETrayTestStep.顶起托盘: StockZ.MoveOffset(10, GlobalVar.WholeSpeed); Step = ETrayTestStep.等待托盘顶起; break; case ETrayTestStep.等待托盘顶起: StockZ.IsStop(out bStop); if (bStop) { IoManager.Instance.WriteOut($"{stockNo}号料仓托盘气缸", 1); Thread.Sleep(200); Step = ETrayTestStep.下料完成回原点; } break; case ETrayTestStep.下料完成回原点: StockZ.MovePos(0, GlobalVar.WholeSpeed); Step = ETrayTestStep.等待下料完成回原点; break; case ETrayTestStep.等待下料完成回原点: StockZ.IsStop(out bStop); if (bStop) { Status = ETrayStatus.Unloaded; finished = true; Step = ETrayTestStep.等待命令; StockZ.Home(); Thread.Sleep(200); } break; case ETrayTestStep.到上料接料盘位: //把料盘顶起一点点 Status = ETrayStatus.Loading; StockZ.MovePos(SysConfigParam.GetValue($"Stock{stockNo}BaseHeight"), GlobalVar.WholeSpeed); Step = ETrayTestStep.等待到上料接料盘位; break; case ETrayTestStep.等待到上料接料盘位: StockZ.IsStop(out bStop); if (bStop) { IoManager.Instance.WriteOut($"{stockNo}号料仓托盘气缸",0); Thread.Sleep(500); Step = ETrayTestStep.上料下降到托料盘位; } break; case ETrayTestStep.上料下降到托料盘位: StockZ.MovePos(SysConfigParam.GetValue($"Stock{stockNo}BaseHeight") - (SysConfigParam.GetValue("TrayHeight")), GlobalVar.WholeSpeed); Step = ETrayTestStep.等待上料下降到托料盘位; break; case ETrayTestStep.等待上料下降到托料盘位: StockZ.IsStop(out bStop); if (bStop) { Thread.Sleep(500); IoManager.Instance.WriteOut($"{stockNo}号料仓托盘气缸", 1); Thread.Sleep(500); Step = ETrayTestStep.上料到原点位; } break; case ETrayTestStep.上料到原点位: StockZ.MovePos(0, GlobalVar.WholeSpeed); Step = ETrayTestStep.等待上料到原点位; break; case ETrayTestStep.等待上料到原点位: StockZ.IsStop(out bStop); if (bStop) { StockZ.Home(); Step = ETrayTestStep.到上料降速位; } break; case ETrayTestStep.到上料降速位: StockFlow.MoveOffset(SysConfigParam.GetValue("HighSpeedDistance")*-1, GlobalVar.WholeSpeed); Step = ETrayTestStep.等待到上料降速位; break; case ETrayTestStep.等待到上料降速位: StockFlow.IsStop(out bStop); if (bStop) { Step = ETrayTestStep.到上料终点位; } break; case ETrayTestStep.到上料终点位: StockFlow.MoveOffset(-1* SysConfigParam.GetValue("LowSpeedDistance"), 3); Step = ETrayTestStep.等待到上料终点位; break; case ETrayTestStep.等待到上料终点位: if (IoManager.Instance.ReadIn($"{stockNo}号料仓料盘到位光电检测") == 1) { switch (stockNo) { case 1: GlobalTray.Empty1Tray.ResetTray(); GlobalTray.Empty1Tray.Clear(); break; case 2: GlobalTray.InputTray.ResetTray(); GlobalTray.InputTray.Fill(); break; case 3: GlobalTray.OkTary.ResetTray(); GlobalTray.OkTary.Clear(); break; case 4: GlobalTray.NgTray.ResetTray(); GlobalTray.NgTray.Clear(); break; case 5: GlobalTray.MultiTray.ResetTray(); GlobalTray.MultiTray.Clear(); break; case 6: GlobalTray.Empty2Tray.ResetTray(); GlobalTray.Empty2Tray.Clear(); break; default: break; } Thread.Sleep(500); StockFlow.Stop(); Thread.Sleep(200); IoManager.Instance.WriteOut($"{stockNo}号料仓斜推气缸", 1); Thread.Sleep(200); finished = true; Status = ETrayStatus.Loaded; Step = ETrayTestStep.等待命令; Thread.Sleep(200); } break; } } public void Unload() { finished = false; NeedUnload = true; } public void Load(bool bWholeLoad) { m_bWholeLoad = bWholeLoad; finished = false; NeedLoad = true; } public bool Finished() { return finished; } public bool IsLastTray() { if(IoManager.Instance.ReadIn($"{stockNo}号料仓最后一盘")==1) { return true; } return false; } public ETrayStatus GetStatus() { return Status; } } }