GoEmptyShelfLineJob.cs 9.0 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 GoEmptyShelfLineJob : Job
    {
        /// <summary>
        /// 去空料架任务点
        /// </summary>
        /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
        /// <param name="palce">空料架位置点</param>
        public GoEmptyShelfLineJob(string agvPlae, string palce)
        {
            EmptyShelfPlace = palce;
            this.agvPlae = agvPlae;
        }

        /// <summary>
        /// 空料架位置点
        /// </summary>
        public string EmptyShelfPlace { get; set; }

        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlae { get; set; }
        /// <summary>
        /// 运行信息
        /// </summary>
        public string RunInfo { get; set; }

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

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

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

            if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
            {
                if (agvPlae.StartsWith("G") && EmptyShelfPlace.StartsWith("E"))//4C->4D
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
                    msg = "去空料架产线" + EmptyShelfPlace + ",先前往4D门["+ agvPlae +"->"+ EmptyShelfPlace + "]";
                    TakeEmptyStep.Msg = msg;
                    Common.DoorMission(agv, SettingString.MoveDoorCToD);
                }
                else if (agvPlae.StartsWith("E") && EmptyShelfPlace.StartsWith("G"))//4D->4C
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
                    msg = "去空料架产线" + EmptyShelfPlace + ",先前往4C门[" + agvPlae + "->" + EmptyShelfPlace + "]";
                    TakeEmptyStep.Msg = msg;
                    Common.DoorMission(agv, SettingString.MoveDoorDToC);
                }
                else
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
                    msg = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR))
            {
                if(agv.Place.Equals(SettingString.C4_DOOR_Name) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
                    msg = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
                    TakeEmptyStep.Msg = msg;
                }
            }
            else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR))
            {
                if (agv.Place.Equals(SettingString.D4_DOOR_Name) && agv.PlaceState.Equals(ePlaceState.MoveFinish))
                {
                    TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
                    msg = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]";
                    TakeEmptyStep.Msg = msg;
                }
            }
            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))
                {
                    msg = "AGV到达 " + EmptyShelfPlace;
                    TakeEmptyStep.Msg = msg;
                    return new EnterLeaveShelfJob(EmptyShelfPlace, eEnterLeaveType.Enter);
                    //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];
            //        node.AgvName = "";
            //        //回收空料架数量减少1
            //        node.DecreEmptyShelfCnt();
            //        TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.END);
            //        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))
            {

            }
            RunInfo= TakeEmptyStep.Msg;
            return this;
        }


        /// <summary>
        /// AGV回收空料架流程
        /// </summary>
        private enum TAKE_EMPTY_STEP
        {
            /// <summary>
            /// 准备,发送给AGV
            /// </summary>
            NONE,
            /// <summary>
            /// 等待到达4C门
            /// </summary>
            WAIT_AGV_REACH_4C_DOOR,
            /// <summary>
            /// 等待到达4D门
            /// </summary>
            WAIT_AGV_REACH_4D_DOOR,
            /// <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>
            /// 料架进入小车完成
            /// </summary>
            END
        }
    }

}