TakeEmptyShelfJob.cs 10.8 KB

using AGVControl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace AGVControl
{
    /// <summary>
    /// 回收空料架任务
    /// </summary>
    public class TakeEmptyShelfJob : Job
    {
        public TakeEmptyShelfJob(string palce, ePriority priority)
        {
            EmptyShelfPlace = palce;
            _priority = priority;
        }

        /// <summary>
        /// 空料架位置点
        /// </summary>
        private string EmptyShelfPlace { get; set; }
        /// <summary>
        /// 空料架目的地
        /// </summary>
        private string EmptyShelfTargetPlace="";
        /// <summary>
        /// 优先级
        /// </summary>
        private ePriority _priority;

        private JobStep<TAKE_EMPTY_STEP> TakeEmptyStep = new JobStep<TAKE_EMPTY_STEP>(TAKE_EMPTY_STEP.NONE);

        /// <summary>
        /// 空架任务执行
        /// </summary>
        /// <param name="agv"></param>
        public override void Execute(Agv_Info agv)
        {
            string msg = "";
            bool rtn = false;
            int nodeIdx = Common.FindNode(EmptyShelfPlace);

            if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
            {
                TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
                msg = "开始执行回收空料架任务";
                TakeEmptyStep.Msg = msg;
                EmptyShelfTargetPlace = "";
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK))
            {

                if (nodeIdx > -1)
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
                    msg = "AGV 添加任务:移动到" + EmptyShelfPlace;
                    TakeEmptyStep.Msg = msg;
                    Common.MoveToNode(agv, EmptyShelfPlace);
                }
                else
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
                    msg = EmptyShelfPlace + " 不存在或未开启调用";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK))
            {
                if(agv.PlaceState.Equals(ePlaceState.Move))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
                    msg = "AGV开始向目的地["+EmptyShelfPlace+"]移动";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE))
            {
                if (agv.Place.Equals(EmptyShelfPlace) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
                    msg = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]";
                    TakeEmptyStep.Msg = msg;
                    Common.server.ReadyLeave(EmptyShelfPlace);
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
            {
                ClientNode node = Common.nodeInfo[nodeIdx];
                if (node.StateEquals(eNodeStatus.MayLeave))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
                    msg = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行";
                    TakeEmptyStep.Msg = msg;
                    rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Enter"]);
                    agv.TaskSend = rtn ? "Enter" : "";
                }
                else if(TakeEmptyStep.IsTimeOut(15000,out double timeOutValue))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
                    msg = "AGV到达 " + EmptyShelfPlace + ",15秒后重新向产线发送出料架请求[ReadyLeave]";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
            {
                if(agv.PlaceState.Equals(ePlaceState.EnterFinish))
                {
                    ClientNode node = Common.nodeInfo[nodeIdx];
                    //回收空料架数量减少1
                    if (Common.CheckA5A6State_SmallShelf(agv, node,out EmptyShelfTargetPlace))
                    {
                        TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_A5A6);
                        msg = "空料架在[" + EmptyShelfPlace + "]进入小车完成,送往双层线";
                        TakeEmptyStep.Msg = msg;
                    }
                    else
                    {
                        TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_STANDBY_TEMP);
                        msg = "空料架在[" + EmptyShelfPlace + "]进入小车完成,双层线暂不需要,到待机位";
                        TakeEmptyStep.Msg = msg;
                    }

                }
                else if(TakeEmptyStep.IsTimeOut(60000,out double timeOutValue))
                {
                    //链条停止
                    msg = "空料架在[" + EmptyShelfPlace + "]进入小车超时["+ timeOutValue.ToString("f1") + "秒],停止链条运行,请检查料架进入小车的情况";
                    TakeEmptyStep.Msg = msg;
                }

            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_STANDBY_TEMP))
            {

            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_A5A6))
            {
                if(agv.Place.Equals(EmptyShelfTargetPlace) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_DOUBLE_LINE_RESPONSE);
                    msg = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
                    TakeEmptyStep.Msg = msg;
                    Common.server.ReadyEnter(EmptyShelfTargetPlace);
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_DOUBLE_LINE_RESPONSE))
            {
                int id = Common.FindNode(EmptyShelfTargetPlace);
                ClientNode node = Common.nodeInfo[id];
                if (node.StateEquals(eNodeStatus.MayEnter))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
                    msg = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
                    TakeEmptyStep.Msg = msg;
                    rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Leave"]);
                    agv.TaskSend = rtn ? "Leave" : "";
                }
                else if (TakeEmptyStep.IsTimeOut(15000, out double timeOutValue))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_A5A6);
                    msg = "AGV到达 " + EmptyShelfTargetPlace + ",15秒后重新向双层线发送入料架请求[ReadyEnter]";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_RECYCLE_EMPTY_SHELF))
            {
                TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.END);
                msg = "空料架送往双层线";
                TakeEmptyStep.Msg = msg;
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
            {
                if (agv.PlaceState.Equals(ePlaceState.EnterFinish))
                {
                    ClientNode node = Common.nodeInfo[nodeIdx];
                    //回收空料架数量减少1
                    if (Common.CheckA5A6State_SmallShelf(agv, node, out EmptyShelfTargetPlace))
                    {
                        TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_A5A6);
                        msg = "空料架在[" + EmptyShelfPlace + "]进入小车完成,送往双层线";
                        TakeEmptyStep.Msg = msg;
                    }
                    else
                    {
                        TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_STANDBY_TEMP);
                        msg = "空料架在[" + EmptyShelfPlace + "]进入小车完成,双层线暂不需要,到待机位";
                        TakeEmptyStep.Msg = msg;
                    }

                }
                else if (TakeEmptyStep.IsTimeOut(60000, out double timeOutValue))
                {
                    //链条停止
                    msg = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],停止链条运行,请检查料架进入小车的情况";
                    TakeEmptyStep.Msg = msg;
                }

            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.END))
            {

            }
        }

        private void MoveToNode(string name)
        {

        }
        public override ePriority GetPriority()
        {
            return _priority;
        }

        public override bool IsEnd()
        {
            return TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.END);
        }

        /// <summary>
        /// AGV回收空料架流程
        /// </summary>
        private enum TAKE_EMPTY_STEP
        {
            /// <summary>
            /// 准备,发送给AGV
            /// </summary>
            NONE,
            /// <summary>
            /// 给AGV分配任务
            /// </summary>
            ASSIGN_AGV_TASK,
            /// <summary>
            /// 等待AGV开始执行去取架点任务
            /// </summary>
            WAIT_AGV_START_TASK,
            /// <summary>
            /// 等待AGV到达取架点
            /// </summary>
            WAIT_REACH_PLACE,
            /// <summary>
            /// 等待产线回应
            /// </summary>
            WAIT_LINE_RESPONSE,

            /// <summary>
            /// 等待料架进入小车
            /// </summary>
            WAIT_TAKE_EMPTY_SHELF,
            /// <summary>
            /// 等待小车到达A5,A6
            /// </summary>
            WAIT_AGV_REACH_A5A6,
            /// <summary>
            /// 等待双层线回应
            /// </summary>
            WAIT_DOUBLE_LINE_RESPONSE,
            /// <summary>
            /// 等待料架进入双层线
            /// </summary>
            WAIT__EMPTY_SHELF_IN_DOUBLE_LINE,
            /// <summary>
            /// A5,A6暂时不需要,等待AGV到达临时待机位
            /// </summary>
            WAIT_AGV_REACH_STANDBY_TEMP,
            /// <summary>
            /// 送上双层线
            /// </summary>
            END
        }
    }

}