StandyJob.cs 3.4 KB
using Common;

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


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

        private string runInfo = "";
        /// <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;

            CurTaskState = Context.GetTakJobState(agv);
            if (curJobStep.IsStep(EXECUTE_STEP.NONE))
            {
                if (agvPlace.Equals(SettingString.Standby))//在待机位不操作
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.END);
                    runInfo = "在待机位,不执行操作";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }

                else
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.WAIT_REACH_STANDBY);
                    runInfo = "从当前位置" + agvPlace + "回到待机位";
                    msg += runInfo;
                    curJobStep.Msg = msg;

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

            }
            else if (curJobStep.IsStep(EXECUTE_STEP.WAIT_REACH_STANDBY))
            {
                if (Context.CheckTaskMoveFinished(agv, SettingString.Standby, CurTaskState))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.END);
                    runInfo = "到达待机位";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.END))
            {
                Job job = Context.control.GetJob(agv);
                if (job != null && !(job is StandyJob))
                {
                    runInfo = "在待机位检测到任务,执行任务";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    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
        }
    }

}