AC_BOX_Bean_AGV.cs 4.6 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public partial class AC_BOX_Bean
    {
        /// <summary>
        /// 设置出入口AGV状态
        /// </summary>
        /// <param name="mark"></param>
        /// <param name="shelfId"></param>
        /// <param name="action"></param>
        /// <param name="level"></param>
        /// <param name="isMust"></param>
        public void setAgvStatus(string mark = "0", string shelfId = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low, bool isMust = false)
        {
            AgvClient.SetStatus(Config.AgvNodeName, mark, shelfId, action, level, isMust);
        }
        internal bool ProcessAGVAction(string name, string rfid, ClientAction action)
        {
            string logN = name + "收到调度" + name + "=" + action + ",RFID[" + rfid + "]";

            //Arrive收到后打开门
            if (!action.Equals(ClientAction.Arrive))
            {
                LogUtil.info(Name + logN + " ,未找到相关处理");
                return false;

            }
            //出库处理中不处理

            if (MoveInfo.MoveStep.Equals(StoreMoveStep.BS_03_WaitEmptyAgv))
            {
                if (!rfid.Equals(""))
                {
                    string mark = GetMarkInfo();
                    LogUtil.error(Name + logN + " 当前 BS_03_WaitEmptyAgv,RFID[" + rfid + "]不是空车,不处理agv,重发 NeedLeave [" + mark + "][" + CurrShelfID + "]");
                    Task.Factory.StartNew(new Action(() =>
                    {
                        setAgvStatus(mark, CurrShelfID, ClientAction.MayNot, ClientLevel.High, true);
                        Thread.Sleep(10000);
                        setAgvStatus(mark, CurrShelfID, ClientAction.NeedLeave, ClientLevel.High, true);
                    }));

                    return false;
                }

                //等待空车到达
                LogUtil.info(Name + logN + ",当前 BS_03_WaitEmptyAgv,正在等待料架到达");
                MoveInfo.NextMoveStep(StoreMoveStep.BS_04_DoorOpen);
                InOutStoreLog("送出料架等待空车,agv到达,打开入料口移门");
                DoorBean.StartOpen(MoveInfo);
                return true;
            }
            else if (MoveInfo.MoveType.Equals(StoreMoveType.OutStore) && MoveInfo.MoveStep.Equals(StoreMoveStep.BI_00_ReadyShelf))
            {
                if (rfid.Equals(""))
                {
                    string mark = GetMarkInfo();
                    LogUtil.error(Name + logN + " 当前出库中 BI_00_ReadyShelf,RFID无效,不处理agv,重发 NeedEnter [" + mark + "][" + MoveInfo.MoveParam.rfid + "]");
                    Task.Factory.StartNew(new Action(() =>
                    {
                        setAgvStatus(mark, CurrShelfID, ClientAction.MayNot, ClientLevel.High, true);
                        Thread.Sleep(10000);
                        setAgvStatus(mark, MoveInfo.MoveParam.rfid, ClientAction.NeedEnter, ClientLevel.High, true);
                    }));

                    return false;
                }

                //出库等待料架到达
                LogUtil.info(Name + logN + ",当前出库中 BI_00_ReadyShelf,正在等待料架到达");
                MoveInfo.NextMoveStep(StoreMoveStep.BI_01_DoorOpen);
                InOutStoreLog("出库等待料架,agv已到达,打开入料口移门");
                DoorBean.StartOpen(MoveInfo);
                return true;

            }
            else if (storeRunStatus.Equals(StoreRunStatus.Runing) &&
                MoveInfo.MoveType.Equals(StoreMoveType.None) &&
                IOValue(IO_Type.LineTake_Check).Equals(IO_VALUE.LOW))
            {
                //agv到达,开始处理 
                if (rfid.Equals(""))
                {
                    LogUtil.error(Name + logN + " ,RFID无效,不需要入库处理");
                    return false;
                }
                LogUtil.info(Name + logN + " ,检测到料架,开始料架入库");
                StartShelfInStore();
                return true;
            }
            else
            {
                LogUtil.error(Name + logN + " ,[" + MoveInfo.MoveType + "][" + MoveInfo.MoveStep + "]未找到相关处理");
            }

            return false;
        }
    }
}