using Rs.AutoDischarge.V3.Flow; using Rs.Framework; using Rs.MotionPlat.Commom; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Rs.MotionPlat.Flow { enum EStockCheckStep { 空闲, Input料仓是否就绪, Ok料仓是否就绪, Ng料仓是否就绪, Multi料仓是否就绪, 等待搬运料盘就绪, 等待所有料仓就绪 } public class WorkEnvironment { string logInfo = string.Empty; EStockCheckStep step= EStockCheckStep.Input料仓是否就绪; EStockCheckStep restoreStep; public bool EnvironmentOk { get; set; } = false; public ManualResetEvent EnvReadyOkEvent = new ManualResetEvent(false); private static WorkEnvironment instance; public static WorkEnvironment Instance { get { if (instance == null) instance = new WorkEnvironment(); return instance; } } public void Ready() { step = EStockCheckStep.Input料仓是否就绪; EnvReadyOkEvent.Reset(); Task.Run(() => { EnvironmentOk = false; while(true && !EnvironmentOk) { Thread.Sleep(5); switch (step) { case EStockCheckStep.Input料仓是否就绪: if (!StockManager.Instance.GetStock(ETrayType.Input).HasTray() || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"{ETrayType.Input}料仓无料,开始给{ETrayType.Input}料仓上料"; MessageQueue.Instance.Insert(logInfo); Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Input).Load(EStockTrayLoadMode.Whole, null);//.Load(EStockType.Input, EStockTrayLoadMode.Whole); }); } if (!StockManager.Instance.GetStock(ETrayType.Empty2).HasTray() || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"{ETrayType.Empty2}料仓无料,开始给{ETrayType.Empty2}料仓上料"; MessageQueue.Instance.Insert(logInfo); Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null);//.Load(EStockType.Empty2, EStockTrayLoadMode.Whole); }); } step = EStockCheckStep.Ok料仓是否就绪; break; case EStockCheckStep.Ok料仓是否就绪: if (!StockManager.Instance.GetStock(ETrayType.Ok).HasTray() || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"{ETrayType.Ok}料仓无料,开始给{ETrayType.Ok}料仓上料"; MessageQueue.Instance.Insert(logInfo); //if (StockManager.Instance.HasTray(EStockType.Empty2)) { //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Ok"); if(TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ok, () => { GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null); Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); }); }, null, () => { Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Ok).Load(EStockTrayLoadMode.AfterTakeTray, null); }); })) { step = EStockCheckStep.Ng料仓是否就绪; } //restoreStep = EStockCheckStep.Ng料仓是否就绪; } } else { step = EStockCheckStep.Ng料仓是否就绪; } break; case EStockCheckStep.Ng料仓是否就绪: if (!StockManager.Instance.GetStock(ETrayType.Ng).HasTray() || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"{ETrayType.Ng}料仓无料,开始给{ETrayType.Ng}料仓上料"; MessageQueue .Instance.Insert(logInfo); //if (StockManager.Instance.HasTray(EStockType.Empty2)) { //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Ng"); if (TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Ng, () => { GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null); Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); }); }, null, () => { Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Ng).Load(EStockTrayLoadMode.AfterTakeTray, null); } ); })) { step = EStockCheckStep.Multi料仓是否就绪; } //restoreStep = EStockCheckStep.Multi料仓是否就绪; } } else { step = EStockCheckStep.Multi料仓是否就绪; } break; case EStockCheckStep.Multi料仓是否就绪: if (!StockManager.Instance.GetStock(ETrayType.Multi).HasTray() || GlobalVar.VirtualAxis) { logInfo = GetClassName() + $"{ETrayType.Multi}料仓无料,开始给{ETrayType.Multi}料仓上料"; MessageQueue.Instance.Insert(logInfo); //if (StockManager.Instance.HasTray(EStockType.Empty2)) { //LogHelper.Debug("Empty2料仓有料,开始搬运Empty2->Multi"); if(TakeTrayFlow.Instance.Take(ETrayType.Empty2, ETrayType.Multi, () => { GlobalTray.GetTray(ETrayType.Empty2).ChangeStatus(Controls.ESlotStatus.Null); Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Empty2).Load(EStockTrayLoadMode.Whole, null); }); }, null, () => { Task.Run(() => { StockManager.Instance.GetStock(ETrayType.Multi).Load(EStockTrayLoadMode.AfterTakeTray, null); }); })) { step = EStockCheckStep.等待所有料仓就绪; } //restoreStep = EStockCheckStep.等待所有料仓就绪; } } else { step = EStockCheckStep.等待所有料仓就绪; } break; //case EStockCheckStep.等待搬运料盘就绪: // if(TakeTrayFlow.Instance.TakeStatus == ETakeStatus.TakeOK) // { // MessageQueue.Instance.Insert("搬运OK"); // step = restoreStep; // restoreStep = EStockCheckStep.空闲; // } // break; case EStockCheckStep.等待所有料仓就绪: if(StockManager.Instance.IsReady()) { MessageQueue.Instance.Insert("所有料仓准备就绪"); EnvironmentOk = true; EnvReadyOkEvent.Set(); } break; } } }); } private string GetClassName() { return this.GetType().Name + "-"; } } }