RecycleEmptyShelf.cs 14.5 KB


using Common;
using System;

namespace DeviceLibrary
{

    public enum ShelfType
    {
        /// <summary>
        /// 包装料架
        /// </summary>
        PackingShelf,
        /// <summary>
        /// 料串
        /// </summary>
        ReelString
    }

    /// <summary>
    /// 回收空料架
    /// </summary>
    public class RecycleEmptyShelf : Job
    {
        /// <summary>
        /// 回收空料架
        /// </summary>
        /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
        public RecycleEmptyShelf(string agvPlae, string tarPlace, bool hasLoad=false,ShelfType type = ShelfType.ReelString)
        {
            this.agvPlace = agvPlae;
            TargetPlace = tarPlace;
            shelfType = type;
            this.hasLoad = hasLoad;
            JobName = "回收空料架任务";
            StartJobTime = DateTime.Now;
        }
        /// <summary>
        /// 车上有负载
        /// </summary>
        private bool hasLoad = false;
        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; private set; }
        /// <summary>
        /// 料架类型
        /// </summary>
        public ShelfType shelfType;
        /// <summary>
        /// 回收料架处
        /// </summary>
        public string RecycleStation = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get
            {
                int t1 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
                string from = "";
                if (t1 > -1)
                    from = NodeManager.nodeInfo[t1].AliceName;
                else
                    from = agvPlace;
                int t2 = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
                string to = "";
                if (t2 > -1)
                    to = NodeManager.nodeInfo[t2].AliceName;
                else
                    to = TargetPlace;
                return string.Format("回收空料架任务:{0} [ShelfType={1}][任务名称={2}][任务状态={3}]", runInfo, shelfType.ToString(),CurTaskName,CurTaskState);
            }
        }

        private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.R1_NONE);

        /// <summary>
        /// 任务执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = agv.Name + " ";
            bool rtn = false;
            agv.Msg = runInfo;
            StartJobTime = curJobStep.startTime;
            CurTaskState = CommonVar.GetTakJobState(agv);
            if (curJobStep.IsStep(EXECUTE_STEP.R1_NONE))
            {
                agv.HasError = false;
                if (hasLoad)
                {
                    if (FindRecycleStation())
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
                        runInfo = "车上已有空料架,向" + RecycleStation + "运行";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.MoveToNode(agv, RecycleStation);
                         UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY);
                        runInfo = "车上已有空料架,由于未找到接收空料架处,先回待机位";
                        msg += runInfo;
                        curJobStep.Msg = msg;

                        CommonVar.MoveToNode(agv, SettingString.Standby);
                         UpdateJobTaskInfo(agv);
                    }
                }
                else//车上无料
                {
                    if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge))
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE);
                        runInfo = "待机位/充电位收到任务,开始执行";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.MoveToNode(agv, TargetPlace);
                         UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE);
                        runInfo = "默认位置收到任务,开始执行";
                        msg += runInfo;
                        curJobStep.Msg = msg;

                        CommonVar.MoveToNode(agv, TargetPlace);
                         UpdateJobTaskInfo(agv);
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R2_WAIT_REACH_EMPTY_SHELF_PLACE))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                    curJobStep.ToNextStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE);
                    runInfo = "到达空料架处"+TargetPlace+",向线体发送出料请求";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.server.Ready(TargetPlace, "");
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R3_WAIT_LINE_RESPONSE))
            {
                //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayLeave));
                //if (i > -1)
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV);
                    runInfo = "线体"+TargetPlace+"允许出料,链条运行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    rtn = agv.AssignTask(SettingString.Enter);
                     UpdateJobTaskInfo(agv);
                }
                //else if(curJobStep.IsTimeOut(6000,out double timeOutTime))
                //{
                //    runInfo = string.Format("线体[{0}]允许出料信号[{1}]超时{2}秒",TargetPlace,eNodeStatus.MayLeave,timeOutTime.ToString("f2"));
                //    msg += string.Format("线体[{0}]允许出料信号[{1}]超时", TargetPlace, eNodeStatus.MayLeave);;
                //    curJobStep.Msg = msg;
                //}
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R4_WAIT_SHELF_IN_AGV))
            {
                if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                    CommonVar.server.CloseDoor(TargetPlace);
                    if (FindRecycleStation())
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
                        runInfo = "空料架进入小车完成,向"+TargetPlace+"运行";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.MoveToNode(agv, RecycleStation);
                         UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY);
                        runInfo = "空料架进入小车完成,由于未找到接收空料架处,先回待机位";
                        msg += runInfo;
                        curJobStep.Msg = msg;

                        CommonVar.MoveToNode(agv, SettingString.Standby);
                         UpdateJobTaskInfo(agv);
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, RecycleStation, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                    curJobStep.ToNextStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE);
                    runInfo = "到达"+TargetPlace+",发送入料请求";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.server.Ready(RecycleStation,"00");
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R6_WAIT_RECYCLE_STATION_RESPONSE))
            {
                //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.MayEnter));
                //if (i > -1)
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE);
                    runInfo = "收到线体入料请求,链条运行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    rtn = agv.AssignTask(SettingString.Leave);
                     UpdateJobTaskInfo(agv);
                }
                //else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
                //{
                //    runInfo = string.Format("线体[{0}]允许入料信号[{1}]超时{2}秒", RecycleStation, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
                //    msg += string.Format("线体[{0}]允许入料信号[{1}]超时", RecycleStation, eNodeStatus.MayEnter);
                //    curJobStep.Msg = msg;
                //}
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R7_WAIT_SHELF_IN_LINE))
            {
                if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                    CommonVar.server.CloseDoor(RecycleStation);
                    //int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(RecycleStation) && s.StateEquals(eNodeStatus.FinishEnter));
                    //if (i > -1)
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R9_END);
                        runInfo = "空料架进入"+RecycleStation+"完成";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R8_WAIT_REACH_STANDY))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                    if (FindRecycleStation())
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.R5_WAIT_REACH_RECYCLE_STATION);
                        runInfo = "检测到"+RecycleStation+"需要空料架,向" + RecycleStation + "运行";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.MoveToNode(agv, RecycleStation);
                         UpdateJobTaskInfo(agv);
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.R9_END))
            {
                //Job job = CommonVar.control.GetJob(agv);
                //if (job != null)
                //{
                //    runInfo = "回收空料架任务完成,检测到任务,开始执行";
                //    msg += runInfo;
                //    curJobStep.Msg = msg;
                //    return job;
                //}
                RecordRunLog(agv, curJobStep.CurStep(), runInfo, TargetPlace);
                return null;
            }
            return this;
        }

        /// <summary>
        /// 搜索接收空料架的地方
        /// </summary>
        /// <returns></returns>
        private bool FindRecycleStation()
        {
            if(shelfType.Equals(ShelfType.ReelString))
            {
                int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.T4_1) && s.StateEquals(eNodeStatus.NeedEnter));
                if(i==-1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.D1) && s.StateEquals(eNodeStatus.NeedEnter));
                if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter));
                if(i>-1)
                {
                    RecycleStation = NodeManager.nodeInfo[i].Name;
                    return true;
                }

            }
            else if(shelfType.Equals(ShelfType.PackingShelf))
            {
                int i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A3) && s.StateEquals(eNodeStatus.NeedEnter));
                if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A2) && s.StateEquals(eNodeStatus.NeedEnter));
                if (i == -1) i = NodeManager.nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A8) && s.StateEquals(eNodeStatus.NeedEnter));
                if (i > -1)
                {
                    RecycleStation = NodeManager.nodeInfo[i].Name;
                    return true;
                }
            }
            return false;
        }
        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            R1_NONE,
            /// <summary>
            /// 等待到达空料架处
            /// </summary>
            R2_WAIT_REACH_EMPTY_SHELF_PLACE,
            /// <summary>
            /// 等待线体回复
            /// </summary>
            R3_WAIT_LINE_RESPONSE,
            /// <summary>
            /// 等待料架进入AGV
            /// </summary>
            R4_WAIT_SHELF_IN_AGV,
            /// <summary>
            /// 等待到达空料架回收处
            /// </summary>
            R5_WAIT_REACH_RECYCLE_STATION,
            /// <summary>
            /// 等待回收线体回复
            /// </summary>
            R6_WAIT_RECYCLE_STATION_RESPONSE,
            /// <summary>
            /// 等待料架进入线体
            /// </summary>
            R7_WAIT_SHELF_IN_LINE,
            /// <summary>
            /// 等待到达待机位
            /// </summary>
            R8_WAIT_REACH_STANDY,
            /// <summary>
            /// 任务结束
            /// </summary>
            R9_END
        }
    }

}