PackingJob_SendShelf.cs 9.3 KB
using Common;

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

            }
            else
            {
                //修改mark状态
                PackingJobType.ChangeMarkState(mark, eMarkState.Executing);
            }
        }


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

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

        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 = CommonVar.GetTakJobState(agv);
            if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
            {

                curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION);
                runInfo = "收到任务,向包装仓" + TargetPlace + "运行";
                msg += runInfo;
                curJobStep.Msg = msg;
                CommonVar.MoveToNode(agv, TargetPlace);
                UpdateJobTaskInfo(agv);

            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_STATION))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                    if (PackingJobType.IsInStoreMark(mark))
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
                        runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.server.Arrive(TargetPlace, RFID);
                    }
                    else
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
                        runInfo = "到达包装仓" + TargetPlace;
                        msg += runInfo;
                        curJobStep.Msg = msg;
                    }

                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE))
            {
                if (PackingJobType.CheckNodeMark(mark, TargetPlace))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE);
                    runInfo = "到达包装仓" + TargetPlace + ",并发送到达信号";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.server.Arrive(TargetPlace, RFID);
                }
                else
                {
                    if (PackingJobType.IsInStoreMark(mark))
                    {
                        runInfo = "包装仓" + TargetPlace + "无入库任务,回收该料架";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new SendShelfJob(TargetPlace,SettingString.A2,RFID);
                    }
                    else
                    {
                        runInfo = "包装仓" + TargetPlace + "无任务,回收该料架";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new RecycleEmptyShelf(agvPlace, "", true, ShelfType.PackingShelf);
                    }

                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_PACKING_STATION_RESPONSE))
            {
                int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.MayEnter));
                if (i > -1)
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH);
                    runInfo = "收到线体对接请求,开始停靠";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.DockToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
                else if (curJobStep.IsTimeOut(6000, out double timeOutTime))
                {
                    runInfo = string.Format("线体[{0}]允许对接信号[{1}]超时{2}秒", TargetPlace, eNodeStatus.MayEnter, timeOutTime.ToString("f2"));
                    msg += string.Format("线体[{0}]允许对接信号[{1}]超时", TargetPlace, eNodeStatus.MayEnter);
                    curJobStep.Msg = msg;
                    curJobStep.ToNextStep(EXECUTE_STEP.P3_CHECK_PACKING_STATION_STATE);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_AGV_DOCK_FINISH))
            {
                if (CommonVar.CheckTaskDockFinished(agv, TargetPlace, CurTaskState))
                {
                    CommonVar.server.Ready(TargetPlace);
                    curJobStep.ToNextStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_STATION);
                    runInfo = "停靠包装仓完成,链条运行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    rtn = agv.AssignTask(SettingString.Leave);
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P6_WAIT_SHELF_IN_STATION))
            {
                if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
                {
                    CommonVar.server.CloseDoor(TargetPlace);
                    //int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace) && s.StateEquals(eNodeStatus.FinishEnter));
                    //if (i > -1)
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P7_END);
                        runInfo = "包装料架进入包装仓"+TargetPlace+"完成";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P7_END))
            {
                //Job job = CommonVar.control.GetJob(agv);
                //if (job != null)
                //{
                //    runInfo = "送料架任务完成,检测到任务,开始执行";
                //    msg += runInfo;
                //    curJobStep.Msg = msg;
                //    return job;
                //}
                return null;
            }
            return this;
        }

        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            P1_NONE,
            /// <summary>
            /// 等待到达包装仓
            /// </summary>
            P2_WAIT_REACH_PACKING_STATION,
            /// <summary>
            /// 到达包装仓,再次确认是否有任务,防止该任务被手动出掉
            /// </summary>
            P3_CHECK_PACKING_STATION_STATE,
            /// <summary>
            /// 等待包装仓回复
            /// </summary>
            P4_WAIT_PACKING_STATION_RESPONSE,
            /// <summary>
            /// 等待AGV停靠完成
            /// </summary>
            P5_WAIT_AGV_DOCK_FINISH,
            /// <summary>
            /// 等待料架进入包装仓
            /// </summary>
            P6_WAIT_SHELF_IN_STATION,

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

}