GetFullShelfJob.cs 10.0 KB


using Common;

namespace DeviceLibrary
{
    /// <summary>
    /// 送满料任务:取满料架
    /// </summary>
    public class GetFullShelfJob : Job
    {
        /// <summary>
        /// 送满料任务:取满料架
        /// </summary>
        /// <param name="agvPlae">agv当前位置</param>
        /// <param name="tarPlace">目的地</param>
        public GetFullShelfJob(string agvPlae, string tarPlace, string rfid)
        {
            this.agvPlace = agvPlae;
            TargetPlace = tarPlace;
            RFID = rfid;
        }

        bool recyMark = false;
        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";
        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))
            {

                if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(SettingString.AutoCharge))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE);
                    runInfo = "待机位/充电位收到任务,开始执行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    Context.MoveToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
                else
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE);
                    runInfo = "默认位置收到任务,开始执行";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    Context.MoveToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
            }

            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_OUT_SHELF_PLACE))
            {
                if (Context.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_STATION_STATE);
                    runInfo = "到达云仓出料口 " + TargetPlace;
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_STATION_STATE))
            {
                if (BoxOutJobType.CheckFullTask(RFID,out string tarname))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                    runInfo = RFID + " 满料任务确认存在,目的地为"+ tarname + ",并向线体" + TargetPlace + "发送出料请求";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    Context.server.Ready(TargetPlace, "");
                }
                else
                {
                    string rfid = "";
                    if (JobType.FindNeedLeave(agv, TargetPlace, out rfid, false))
                    {
                        if (rfid.Equals(RFID))
                        {
                            curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                            runInfo = RFID + " 无满料任务,转为回收任务,向线体" + TargetPlace + "发送出料请求";
                            msg += runInfo;
                            curJobStep.Msg = msg;
                            recyMark = true;
                            Context.server.Ready(TargetPlace, "");
                        }
                        else
                        {
                            if (BoxOutJobType.CheckFullTask(rfid,out string tarname1))
                            {
                                curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                                RFID=rfid;
                                runInfo = RFID + " 满料任务存在,目的地为"+ tarname1 + ",并向线体" + TargetPlace + "发送出料请求";
                                msg += runInfo;
                                curJobStep.Msg = msg;

                                Context.server.Ready(TargetPlace, "");
                            }
                            else
                            {
                                curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                                runInfo = RFID + " 无满料任务,转为 " + rfid + " 回收任务,向线体" + TargetPlace + "发送出料请求";
                                msg += runInfo;
                                curJobStep.Msg = msg;
                                recyMark = true;
                                Context.server.Ready(TargetPlace, "");
                            }
                        }
                    }
                    else
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P12_END);
                        runInfo = "任务 " + RFID + " 在" + TargetPlace + "不存在,任务结束";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
            {
                curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
                runInfo = "线体" + TargetPlace + "允许出料,链条运行";
                msg += runInfo;
                curJobStep.Msg = msg;
                rtn = agv.AssignTask(SettingString.Enter);
                UpdateJobTaskInfo(agv);

            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV))
            {
                if (Context.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
                {
                    //Context.server.CloseDoor(TargetPlace);

                    if (recyMark)
                    {
                        runInfo = RFID + " 进入小车完成,回收该料架";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new SendShelfJob(TargetPlace, SettingString.A2, RFID);
                    }
                    if (BoxOutJobType.CheckFullTask(RFID,out string tarname))
                    {
                        runInfo = RFID+"料架进入小车完成";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        RequestManager.AgvRemoveRfid(RFID);
                        return new SendFullShelfJob(TargetPlace,tarname,"",RFID);
                    }
                    else
                    {
                        runInfo = "料架进入小车完成,回收该料架";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new RecycleEmptyShelf(agvPlace, SettingString.A2, true);
                    }

                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P12_END))
            {
                return null;
            }
            return this;
        }
        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            P1_NONE,
            /// <summary>
            /// 等待到达设备出料口
            /// </summary>
            P2_WAIT_REACH_OUT_SHELF_PLACE,
            /// <summary>
            /// 确认云仓是否有该出满料任务,防止该任务被手动出掉
            /// </summary>
            P3_CHECK_STATION_STATE,
            /// <summary>
            /// 等待线体回复
            /// </summary>
            P4_WAIT_LINE_RESPONSE,
            /// <summary>
            /// 等待料架进入AGV
            /// </summary>
            P5_WAIT_SHELF_IN_AGV,
            /// <summary>
            /// 等待到达包装仓
            /// </summary>
            P6_WAIT_REACH_PACKING_STATION,
            /// <summary>
            /// 到达包装仓,再次确认是否有任务,防止该任务被手动出掉
            /// </summary>
            P7_CHECK_PACKING_STATION_STATE,
            /// <summary>
            /// 等待包装仓回复
            /// </summary>
            P8_WAIT_PACKING_STATION_RESPONSE,
            /// <summary>
            /// 等待AGV停靠完成
            /// </summary>
            P9_WAIT_AGV_DOCK_FINISH,
            /// <summary>
            /// 等待料架进入包装仓
            /// </summary>
            P10_WAIT_SHELF_IN_STATION,


            /// <summary>
            /// 等待到达空料架回收处
            /// </summary>
            P11_WAIT_REACH_RECYCLE_STATION,
            /// <summary>
            /// 任务结束
            /// </summary>
            P12_END
        }
    }

}