OutShelfBean_AgvPro.cs 10.4 KB
using AGVLib;
using DeviceLibrary.DeviceLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System; 
using System.Threading;
using System.Threading.Tasks; 

namespace DeviceLibrary
{
    partial class OutShelfBean
    {
        internal bool CheckNeedLeave(bool IsReset = true)
        {
            if (IsDis())
            {
                return false;
            }
            if (CurrShelf.IsNeedLeave)
            {
                return true;
            }
            if (CurrShelf.EmptyPos <= 0)
            {
                CurrShelf.IsNeedLeave = true;
                LogUtil.info(Name + "  " + CurrShelf.ToStr() + " 没有空位需要离开 ");
                if (IsReset)
                {
                    Reset();
                }
                return true;
            }
            return false;
        }
        #region AGV状态处理 
        private void AgvStatusPro()
        {
            if (ShelfReady())
            {
                if (CheckNeedLeave())
                { 
                    return;
                }
                AgvClient.SetToNone(agvId, agvName);
            }
            else if ((CurrShelf==null|| CurrShelf.realRFID.Equals("") )&& IOManager.IOValue(Shelf_Front_Check).Equals(IO_VALUE.LOW) && IOManager.IOValue(Shelf_Back_Check).Equals(IO_VALUE.LOW))
            {
                if (locationCylinder.IsLow())
                {
                    //暂无料架,需要料架
                    AgvClient.NeedEnter(agvId, agvName, "");
                }
                else
                {
                    locationCylinder.ToLow(null);
                    AgvClient.SetToNone(agvId, agvName);
                }
            }
            else if (IOManager.IOValue(Shelf_Front_Check).Equals(IO_VALUE.HIGH) && IOManager.IOValue(Shelf_Back_Check).Equals(IO_VALUE.HIGH) && CurrShelf.IsNeedLeave)
            {
                if ( locationCylinder.IsLow())
                {
                    //设置等待离开
                    AgvClient.NeedLeave(agvId, agvName, CurrShelf.realRFID);
                }
                else
                {
                    locationCylinder.ToLow(null);
                    AgvClient.SetToNone(agvId, agvName);
                }
            }
            else
            {
                AgvClient.SetToNone(agvId, agvName);
            }
        }

        #endregion

        internal void AgvArrive(Node node)
        {
            string theAgvName = node.name;
            string logN = Name + "收到 AgvArrive 事件 [" + node.id + "-"+node.name+"] [" + node.shelf_id + "] ";
            if (theAgvName.Equals(agvName))
            {
            } 
            LogUtil.info(logN + ":" + "暂无处理");
        }

        internal void AgvRequestEnter(Node node)
        {
            string theAgvName = node.name;
            string logN = Name + "收到 AgvRequestEnter 事件 [" + node.id + "-" + node.name + "] [" + node.shelf_id + "] ";

            if (theAgvName.Equals(agvName))
            {
                if (IOManager.IOValue(Shelf_Front_Check).Equals(IO_VALUE.HIGH) || IOManager.IOValue(Shelf_Back_Check).Equals(IO_VALUE.HIGH))
                {
                    LogUtil.info(logN + " ,已有料架,暂不处理,设置 [" + theAgvName + "] 状态为 RejectEnter");
                    AgvClient.SetStatus(node.id,node.name,"",NodeStatus.RejectEnter,NodeLevel.High);
                    return;
                }
                ShelfEnterProcess();
            }
        }
        internal void AgvRequestLeave(Node node)
        {
            string theAgvName = node.name;
            string logN = Name + "收到 AgvRequestLeave 事件 [" + node.id + "-" + node.name + "] [" + node.shelf_id + "] ";

            if (theAgvName.Equals(agvName))
            {
                if (IOManager.IOValue(Shelf_Front_Check).Equals(IO_VALUE.LOW) && IOManager.IOValue(Shelf_Back_Check).Equals(IO_VALUE.LOW))
                {
                    LogUtil.info(logN + " ,未检测到料架,暂不处理,设置 [" + theAgvName + "] 状态为 RejectLeave");
                    AgvClient.SetStatus(node.id,node.name,"",NodeStatus.RejectLeave, NodeLevel.High);
                    return;
                }
                ShelfLeaveProcess();
            }
        }
        private bool ProcessShelfEnter = false;
        private bool ProcessShelfOut = false;

        internal void ShelfLeaveProcess()
        {
            //AGV已到达,将料架送入AGV中
            Task.Factory.StartNew(delegate
            {
                string logName = Name + "[" + agvName + "] 料架送入AGV ";
                try
                {
                    LogUtil.info(logName + "开始,先设置状态为 MayLeave"); 
                    AgvClient.SetStatus(agvId,agvName, CurrShelf.realRFID, NodeStatus.MayLeave, NodeLevel.High);

                    ProcessShelfOut = true;
                    LineRRun();

                    bool result = WaitIo(Shelf_Back_Check, IO_VALUE.LOW, 60000);
                    if (!result)
                    {
                        LogUtil.info(logName + "  等待 " + Shelf_Back_Check + "=LOW超时,等待60000后停止线体转动,发送FinishLeave");
                    }
                    else
                    {
                        LogUtil.info(logName + "  已收到" + Shelf_Back_Check + "=LOW ,等待60000后停止线体转动,发送FinishLeave");
                    }
                    result = WaitIo(Shelf_Front_Check, IO_VALUE.LOW, 60000);
                    if (!result)
                    {
                        LogUtil.info(logName + "  等待 " + Shelf_Front_Check + "=LOW超时,等待60000后停止线体转动,发送FinishLeave");
                    }
                    else
                    {
                        LogUtil.info(logName + "  已收到" + Shelf_Front_Check + "=LOW ,等待60000后停止线体转动,发送FinishLeave");
                    }
                    Thread.Sleep(8000);
                    LineStopRun();
                    AgvClient.SetStatus(agvId, agvName, CurrShelf.realRFID, NodeStatus.FinishLeave, NodeLevel.High);

                    Thread.Sleep(2000);
                    AgvClient.SetStatus(agvId, agvName, "", NodeStatus.None, NodeLevel.High);

                    ProcessShelfOut = false;
                    LogUtil.info(logName + ",停止转动,清空" + CurrShelf.ToStr() + ",  结束");
                    CurrShelf = new ShelfInfo();

                }
                catch (TimeoutException te)
                {
                    LogUtil.error(logName + " 超时:" + te);
                }
                catch (Exception ex)
                {
                    LogUtil.error(logName + " 出错:", ex);
                }
                finally
                {
                    AgvClient.SetStatus(agvId, agvName, "", NodeStatus.None, NodeLevel.High);
                    LineStopRun();
                    ProcessShelfOut = false;
                }
            }); 
        }
        internal void ShelfEnterProcess()
        {
            Task.Factory.StartNew(delegate
            {
                string logName = Name + "AGV料架进入 [" + agvName + "] ";
                try
                {
                    CurrShelf = new ShelfInfo();
                    LogUtil.info(logName + "   开始,清空料架信息,设置状态=MayEnter");
                    AgvClient.SetStatus(agvId,agvName, "", NodeStatus.MayEnter, NodeLevel.High, true);
                    ProcessShelfEnter = true;

                    LineFRun();
                    bool result = false;

                    //等待进料检测信号
                    result = WaitIo(Shelf_Front_Check, IO_VALUE.HIGH, 600000, logName + "等待" + Shelf_Front_Check + "信号");

                    LogUtil.info(logName + " 等待 " + Shelf_Front_Check + "=High 结果: " + result + ", 开始等待 " + Shelf_Front_Check + " 信号");

                    result = WaitIo(Shelf_Back_Check, IO_VALUE.HIGH, 600000, logName + "等待" + Shelf_Back_Check + "信号");

                    Thread.Sleep(5000);
                    LineStopRun();
                    AgvClient.SetStatus(agvId, agvName, CurrShelf.realRFID, NodeStatus.FinishEnter, NodeLevel.High);
                    //LogUtil.info(logName + " 等待  " + Shelf_Back_Check + "=High 结果: " + result + ",开始等待 FinishEnter 超时10分钟");
                    //try
                    //{
                    //    result = WaitUtil.Wait(600000, delegate ()
                    //    {
                    //        return AgvClient.GetCurrStatus(agvId).Equals(NodeStatus.FinishEnter);
                    //    }, logName + "等待FinishEnter超时");
                    //}
                    //catch (TimeoutException te)
                    //{
                    //    LogUtil.error(logName + "  超时:" + te);
                    //}
                    LogUtil.info(logName + ",完成,信号已到位 ,停止线体,发送FinishEnter");
                    LineStopRun();
                    Thread.Sleep(2000);
                    AgvClient.SetStatus(agvId,agvName, "", NodeStatus.None, NodeLevel.High, true);
                    ProcessShelfEnter = false;
                    Reset();

                }
                catch (TimeoutException te)
                {
                    LogUtil.error(logName + "  超时:" + te);
                }
                catch (Exception ex)
                {
                    LogUtil.error(logName + "   出错:", ex);
                }
                finally
                {
                    AgvClient.SetStatus(agvId, agvName, "", NodeStatus.None, NodeLevel.High, true);
                    LineStopRun();
                    ProcessShelfEnter = false;
                }
            });
        }

        public string getAgvStatus()
        {
            return AgvClient.GetCurrStatus(agvId).ToString();
        }
        protected bool WaitIo(string ioType, IO_VALUE value, int timeOut, string errName = "")
        {
            try
            {
                return WaitUtil.Wait(timeOut, delegate ()
                {
                    return value.Equals(IOManager.IOValue(ioType));
                }, errName);
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "等待" + ioType + "=" + value + "超时:" + ex.ToString());
                return false;
            }
        }
    }
}