EmptyAGVBackJob.cs 8.0 KB

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

namespace AGVControl
{
    /// <summary>
    /// 空车返回待机位任务
    /// </summary>
    public class EmptyAGVBackJob : Job
    {
        /// <summary>
        /// 出完满料后-空车返回任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
        /// <param name="palce">空料架位置点</param>
        public EmptyAGVBackJob(string agvPlae)
        {
            this.agvPlace = agvPlae;
        }


        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace { get; set; }

        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return runInfo; }
        }


        private JobStep<EMPTY_AGV_BACK_STEP> EmptyAGVBackStep = new JobStep<EMPTY_AGV_BACK_STEP>(EMPTY_AGV_BACK_STEP.NONE);

        /// <summary>
        /// 空车返回执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = agv.Name + " ";
            bool rtn = false;
            agv.Msg = runInfo;
            //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
            //    CurTaskState = st;
            CurTaskState = Common.GetTakJobState(CurTaskID);
            if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
            {

                if (Common.FindEmptyShelfNode(agv, out string nodeName, true))
                {
                    int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName));
                    if(i==-1)
                    {
                        runInfo= "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return new GoEmptyShelfLineJob(agvPlace, nodeName);
                    }
                    else
                    {

                        if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
                        {
                            EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
                            runInfo= "从产线" + agvPlace + "回待机位,先到4D门";
                            msg += runInfo;
                            EmptyAGVBackStep.Msg = msg;
                            Common.DoorMission(agv, SettingString.DoorCToD);
                            UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                        }
                        else
                        {
                            EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                            runInfo= "从产线" + agvPlace + "回待机位";
                            msg += runInfo; 
                            EmptyAGVBackStep.Msg = msg;
                            Common.MoveToNode(agv, SettingString.Standby);
                            UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                        }
                    }
                    //EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.END);

                }
                else
                {
                    if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
                    {
                        EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
                        runInfo= "从产线" + agvPlace + "回待机位,先到4D门";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        Common.DoorMission(agv, SettingString.DoorCToD);
                        UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                    }
                    else
                    {
                        EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                        runInfo= "从产线" + agvPlace + "回待机位";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        Common.MoveToNode(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                    }
                }
            }
            else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
            {
                CurTaskState = Common.GetTakJobState(CurTaskID);
                if (Common.CheckTaskFinished(agv, SettingString.Standby,CurTaskState))
                {
                    Job job = Common.control.GetJob(agv);
                    if (job == null && agv.Battery < Common.chargeStatus.chargeMax)
                    {
                        runInfo= "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return new ChargeJob("");
                    }
                    else
                    {
                        runInfo= "到达待机位,检测到新任务,执行任务";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return job;
                    }

                }
                else
                {
                    if (Common.FindFullShelfTask(agv))
                    {
                        runInfo= "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return new GoFullShelfStationJob(SettingString.Standby);
                    }
                    //else
                    //{
                    //    msg = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
                    //    EmptyAGVBackStep.Msg = msg;
                    //    return new ChargeJob(SettingString.D4_DOOR_Name);
                    //}
                }

            }
            else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
            {
                CurTaskState = Common.GetTakJobState(CurTaskID);
                if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    if (Common.FindFullShelfTask(agv))
                    {
                        runInfo= "从产线" + agvPlace + "到达4D门,检测到A6出满料,去A6";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return new GoFullShelfStationJob(SettingString.DoorCToD);
                    }
                    else
                    {
                        runInfo= "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
                        msg += runInfo;
                        EmptyAGVBackStep.Msg = msg;
                        return new ChargeJob(SettingString.DoorCToD);
                    }
                }
            }
            return this;
        }


        /// <summary>
        /// AGV回收空料架流程
        /// </summary>
        private enum EMPTY_AGV_BACK_STEP
        {
            /// <summary>
            /// 查询任务
            /// </summary>
            NONE,

            /// <summary>
            /// 等待到达4D门
            /// </summary>
            WAIT_AGV_REACH_4D_DOOR,
            /// <summary>
            /// 等待AGV到达待机位
            /// </summary>
            WAIT_REACH_STANDBY,

            /// <summary>
            /// 
            /// </summary>
            END
        }
    }

}