EmptyShelfBackJob.cs 8.6 KB

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

namespace AGVControl
{

    public enum eShelfType
    {
        BigShelf,
        SmallShelf
    }
    /// <summary>
    /// 载空料架返回任务,A5,A6需要则直接去,否则在待机位等待
    /// </summary>
    public class EmptyShelfBackJob : Job
    {
        /// <summary>
        /// 载空料架返回任务
        /// </summary>
        /// <param name="lineName">产线的节点名称</param>
        public EmptyShelfBackJob(string lineName,eShelfType shelfType)
        {
            EmptyShelfPlace = lineName;
            this.shelfType = shelfType;
        }

        /// <summary>
        /// 空料架的产线位置
        /// </summary>
        private string EmptyShelfPlace { get; set; }
        /// <summary>
        /// 空料架目的地
        /// </summary>
        private string EmptyShelfTargetPlace { get; set; }
        /// <summary>
        /// 运行信息
        /// </summary>
        public string RunInfo { get; set; }

        private eShelfType shelfType;
        public override bool IsEnd { get {return EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.END); } }

        private JobStep<EMPTY_SHELF_BACK_STEP> EmptyBackStep = new JobStep<EMPTY_SHELF_BACK_STEP>(EMPTY_SHELF_BACK_STEP.NONE);

        /// <summary>
        /// 空架任务执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = "";
            bool rtn = false;

            if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
            {
                Common.DelEmptyShelfTask(EmptyShelfPlace);
                if (EmptyShelfPlace.StartsWith("G"))//4车间
                {
                    EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
                    msg = "空料架从产线"+ EmptyShelfPlace + "前往4D门";
                    EmptyBackStep.Msg = msg;
                    Common.DoorMission(agv, SettingString.MoveDoorCToD);
                }
                else
                {
                    if (Common.CheckA5A6State(agv,shelfType, out string nodeName))
                    {
                        EmptyShelfTargetPlace = nodeName;
                        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                        msg = "空料架从产线 [" + EmptyShelfTargetPlace + "] 送往双层线";
                        EmptyBackStep.Msg = msg;
                    }
                    else
                    {
                        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
                        msg = "双层线暂不需要空料架,从产线[" + EmptyShelfTargetPlace + "]到待机位";
                        EmptyBackStep.Msg = msg;
                        Common.MoveToNode(agv, SettingString.MoveStandby);
                    }
                }
            }
            else if(EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
            {
                if(agv.Place.Equals(SettingString.D4_DOOR_Name) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    if (Common.CheckA5A6State(agv, shelfType, out string nodeName))
                    {
                        EmptyShelfTargetPlace = nodeName;
                        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                        msg = "空料架从产线 [" + EmptyShelfTargetPlace + "] 送往双层线";
                        EmptyBackStep.Msg = msg;
                    }
                    else
                    {
                        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
                        msg = "双层线暂不需要空料架,从产线[" + EmptyShelfTargetPlace + "]到待机位";
                        EmptyBackStep.Msg = msg;
                        Common.MoveToNode(agv, SettingString.MoveStandby);
                    }
                }
            }
            else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
            {
                if (Common.CheckA5A6State(agv, shelfType, out string nodeName))
                {
                    EmptyShelfTargetPlace = nodeName;
                    EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                    msg = "待机位检测到双层线需要料架,送往双层线 "+EmptyShelfTargetPlace;
                    EmptyBackStep.Msg = msg;
                }
            }
            else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
            {
                if(agv.Place.Equals(EmptyShelfTargetPlace) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    msg = "AGV到达 " + EmptyShelfTargetPlace;
                    EmptyBackStep.Msg = msg;
                    return new EnterLeaveShelfJob(EmptyShelfTargetPlace,eEnterLeaveType.Leave,shelfType);
                    //EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
                    //msg = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
                    //EmptyBackStep.Msg = msg;
                    //Common.server.ReadyEnter(EmptyShelfTargetPlace);
                }
            }
            //else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE))
            //{
            //    int id = Common.FindNode(EmptyShelfTargetPlace);
            //    ClientNode node = Common.nodeInfo[id];
            //    if (node.StateEquals(eNodeStatus.MayEnter))
            //    {
            //        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
            //        msg = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
            //        EmptyBackStep.Msg = msg;
            //        rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission["Leave"]);
            //        agv.TaskSend = rtn ? "Leave" : "";
            //    }
            //    else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue))
            //    {
            //        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
            //        msg = "AGV到达 " + EmptyShelfTargetPlace + ",15秒后重新向双层线发送入料架请求[ReadyEnter]";
            //        EmptyBackStep.Msg = msg;
            //    }
            //}
            //else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
            //{
            //    if (agv.Place.Equals(EmptyShelfTargetPlace) && agv.PlaceState.Equals(ePlaceState.LeaveFinish))
            //    {

            //        EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.END);
            //        msg = "空料架进入" + EmptyShelfTargetPlace + "完成";
            //        EmptyBackStep.Msg = msg;
            //    }
            //    else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue))
            //    {
            //        //链条停止
            //        msg = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
            //        EmptyBackStep.Msg = msg;
            //    }

            //}
            //else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.END))
            //{
            //}
            RunInfo = EmptyBackStep.Msg;
            return this;
        }

        /// <summary>
        /// AGV载空料架回收流程
        /// </summary>
        private enum EMPTY_SHELF_BACK_STEP
        {
            /// <summary>
            /// 料架已进入小车,寻找目的地
            /// </summary>
            NONE,
            /// <summary>
            /// 等待AGV到达门
            /// </summary>
            WAIT_AGV_REACH_DOOR,
            /// <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,
            /// <summary>
            /// 送上双层线
            /// </summary>
            END
        }
    }

}