StandyJob.cs 4.9 KB
using Common;
using System;

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


        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";

        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("待机任务:{0}", runInfo); }
        }

        private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_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;
            StartJobTime = curJobStep.startTime;
            CurTaskState = CommonVar.GetTakJobState(agv);
            if (curJobStep.IsStep(EXECUTE_STEP.NONE))
            {
                agv.HasError = false;
                if (agvPlace.Equals(SettingString.Standby))//在待机位不操作
                    {
                    curJobStep.ToNextStep(EXECUTE_STEP.END);
                        runInfo = "在待机位,不执行操作";
                        msg += runInfo;
                    curJobStep.Msg = msg;
                    }

                    else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
                    {
                    curJobStep.ToNextStep(EXECUTE_STEP.WAIT_AGV_REACH_4D_DOOR);
                        runInfo = "从当前位置" + agvPlace + "回到待机位,先到4D门";
                        msg += runInfo;
                    curJobStep.Msg = msg;
                        CommonVar.DoorMission(agv, SettingString.DoorCToD);
                         UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                    curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
                        runInfo = "从当前位置" + agvPlace + "回到待机位";
                        msg += runInfo;
                    curJobStep.Msg = msg;

                        CommonVar.MoveToNode(agv, SettingString.Standby);
                         UpdateJobTaskInfo(agv);
                    }

            }

            else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_AGV_REACH_4D_DOOR))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, SettingString.DoorCToD);
                    curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
                    runInfo = "从4D门回到待机位";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.MoveToNode(agv, SettingString.Standby);
                     UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_REACH_STANDBY))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, SettingString.Standby);
                    curJobStep.ToNextStep(EXECUTE_STEP.END);
                    runInfo = "到达待机位";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.END))
            {
                Job job = CommonVar.control.GetJob(agv);
                if (job != null && !(job is StandyJob))
                {
                    runInfo = "在待机位检测到任务,执行任务";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    return job;
                }
            }
            return this;
        }

        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 
            /// </summary>
            NONE,

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

}