SendFullShelfJob.cs 6.1 KB
using Common;

namespace DeviceLibrary
{
    /// <summary>
    /// 将满料架送往线体
    /// </summary>
    public class SendFullShelfJob : Job
    {
        /// <summary>
        /// 将满料架送往线体
        /// </summary>
        /// <param name="agvPlae">agv当前位置</param>
        /// <param name="tarPlace">目的地</param>
        /// <param name="mark">标志:出库任务则显示mark;入库任务显示Mark=InStore</param>
        public SendFullShelfJob(string agvPlae, string tarPlace, string mark,string RFID= "")
        {
            this.agvPlace = agvPlae;
            TargetPlace = tarPlace;
            this.RFID = RFID;
        }


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

        private string RFID = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; private set; }

        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get
            {
                int t1 = Context.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
                string from = "";
                if (t1 > -1)
                    from = Context.nodeInfo[t1].AliceName;
                else
                    from = agvPlace;
                int t2 = Context.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
                string to = "";
                if (t2 > -1)
                    to = Context.nodeInfo[t2].AliceName;
                else
                    to = TargetPlace;
                return string.Format("送满料架任务:{0} [RFID={1}][目的地={2}][任务名称={3}][任务状态={4}]", runInfo, RFID ,to,CurTaskName,CurTaskState);
            }
        }

        private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_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.P1_NONE))
            {
                curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_FEEDER);
                runInfo = "收到送满料任务,向" + "Feeder" + "运行";
                msg += runInfo;
                curJobStep.Msg = msg;
                Context.MoveToNode(agv, "Feeder");
                UpdateJobTaskInfo(agv);

            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_FEEDER))
            {
                CurTaskState = Context.GetTakJobState(agv);
                if (Context.CheckTaskMoveFinished(agv, "Feeder", CurTaskState))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_OPERATION_ON_FEEDER);
                    runInfo = "到达" + "Feeder" + ",等待挑拣首套料";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_OPERATION_ON_FEEDER))
            {
                MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                System.Threading.Thread.Sleep(500);
                if ((input != null && input[0]))
                {

                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_LINE);
                    runInfo = "料架上的首套料在" + TargetPlace + "挑拣完成";//,向线体"+TargetPlace+"运行
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    //Context.MoveToNode(agv, TargetPlace);
                    //UpdateJobTaskInfo(agv);
                    RequestManager.AgvRemoveRfid(RFID);
                    return new RecycleEmptyShelf(TargetPlace, "", true);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_LINE))
            {
                CurTaskState = Context.GetTakJobState(agv);
                if (Context.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                        curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_MANNUAL_OPERATION);
                        runInfo = "到达线体" + TargetPlace + ",等待卸料";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P3_WAIT_MANNUAL_OPERATION))
            {
                MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                System.Threading.Thread.Sleep(500);
                if ((input != null && input[0]))
                {
                    runInfo = "料架上的料在" + TargetPlace + "卸料完成.";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    RequestManager.AgvRemoveRfid(RFID);
                    return new RecycleEmptyShelf(TargetPlace,"",true);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P4_END))
            {
                return null;
            }
            return this;
        }

        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            P1_NONE,
            /// <summary>
            /// 先到Feeder
            /// </summary>
            P2_WAIT_REACH_FEEDER,
            /// <summary>
            /// 等待feeder人员操作
            /// </summary>
            P2_WAIT_OPERATION_ON_FEEDER,
            /// <summary>
            /// 等待到达线体
            /// </summary>
            P2_WAIT_REACH_LINE,
            /// <summary>
            /// 到达线体,等待卸料
            /// </summary>
            P3_WAIT_MANNUAL_OPERATION,

            /// <summary>
            /// 任务结束
            /// </summary>
            P4_END
        }
    }

}