PackingJob_GetShelf.cs 15.0 KB


using Common;

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

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


        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";
        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} [Mark={2}][目的地={1}][任务名称={3}][任务状态={4}]", runInfo,to, mark, 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 = CommonVar.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_PACKING_SHELF_PLACE);
                    runInfo = "待机位/充电位收到任务,开始执行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.MoveToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
                else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P1_1_WAIT_REACH_4D_DOOR);
                    runInfo = "4C车间收到任务,先到4D门";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.DoorMission(agv, SettingString.DoorCToD);
                    UpdateJobTaskInfo(agv);
                }
                else
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE);
                    runInfo = "默认位置收到任务,开始执行";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.MoveToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P1_1_WAIT_REACH_4D_DOOR))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE);
                    runInfo = "到达4D门,去包装料架处" + TargetPlace;
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.MoveToNode(agv, TargetPlace);
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_PACKING_SHELF_PLACE))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                    if (PackingJobType.IsInStoreMark(mark))
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                        runInfo = "到达包装料架处" + TargetPlace + ",并向线体发送出料请求";
                        msg += runInfo;
                        curJobStep.Msg = msg;

                        CommonVar.server.Ready(TargetPlace, "");
                    }
                    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))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                    runInfo = "当前任务" + mark + "确认存在,并向线体" + TargetPlace + "发送出料请求";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.server.Ready(TargetPlace, "");
                }
                else//
                {
                    PackingJobType.DelMark(mark);
                    int nodeId = PackingJobType.CheckOutStroePackingJob();
                    if (nodeId == -1)
                    {
                        curJobStep.ToNextStep(EXECUTE_STEP.P12_END);
                        runInfo = "当前任务" + mark + "不存在,且无其他包装任务";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                    }
                    else if (nodeId > -1)
                    {
                        mark = CommonVar.nodeInfo[nodeId].Mark;
                        //修改mark状态
                        PackingJobType.ChangeMarkState(mark, eMarkState.Assigned);
                        curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE);
                        runInfo = "切换任务为" + mark + ",并向线体" + TargetPlace + "发送出料请求";
                        msg += runInfo;
                        curJobStep.Msg = msg;

                        CommonVar.server.Ready(TargetPlace, "");
                    }
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_LINE_RESPONSE))
            {
                int i = CommonVar.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
                if (i > -1)
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV);
                    runInfo = "线体" + TargetPlace + "允许出料,链条运行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    RFID = CommonVar.nodeInfo[i].RFID;
                    rtn = agv.AssignTask(SettingString.Enter);
                    UpdateJobTaskInfo(agv);
                }

            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P5_WAIT_SHELF_IN_AGV))
            {
                if (CommonVar.CheckEnterOrLeaveFinished(agv, SettingString.Enter, CurTaskState))
                {
                    CommonVar.server.CloseDoor(TargetPlace);
                    if (PackingJobType.IsInStoreMark(mark))
                    {
                        if (RFID.StartsWith(SettingString.ReelString_RFID_Prefix) || RFID.StartsWith("0"))
                        {
                            runInfo = "料串进入小车完成,由于当前任务是料架任务,将该料串送回,修改mark状态"+ mark+"="+eMarkState.None.ToString();
                            msg += runInfo;
                            curJobStep.Msg = msg;
                            //return new PackingJob_SendShelf(TargetPlace, SettingString.A2, mark, RFID);
                            PackingJobType.ChangeMarkState(mark, eMarkState.None);
                            return new SendShelfJob(TargetPlace, SettingString.A2, RFID);
                        }
                    }
                    if (FindPackingPlace(agv, out string packingPlace, out string rfid))
                    {
                        runInfo = "包装料架进入小车完成";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new PackingJob_SendShelf(TargetPlace, packingPlace, mark, rfid);
                    }
                    else
                    {
                        runInfo = "包装料架进入小车完成,包装仓无剩余任务," + packingPlace + "回收该料架";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        return new RecycleEmptyShelf(agvPlace, packingPlace, true, ShelfType.PackingShelf);
                    }

                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P12_END))
            {
                return null;
            }
            return this;
        }
        /// <summary>
        /// 查找包装仓目的地
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="packPlace"></param>
        /// <returns></returns>
        private bool FindPackingPlace(Agv_Info agv, out string packPlace, out string rfid)
        {
            if (mark.Equals(SettingString.InStore_Mark))
            {
                packPlace = SettingString.A2;//
                rfid = "A#";
                int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals("0") && s.StateEquals(eNodeStatus.NeedEnter) && s.IsUse);
                if (i > -1)
                {
                    packPlace = CommonVar.nodeInfo[i].Name;
                    LogUtil.info(string.Format("{0} 查找包装仓目的地{1}[Mark={2}][Marks={3}]", agv.Name, packPlace, mark, PackingJobType.GetMarks()));
                    return true;
                }
                else
                {
                    PackingJobType.DelMark(mark);
                    //int nodeIdx = PackingJobType.CheckOutStroePackingJob();
                    //if (nodeIdx > -1)
                    //{
                    //    string _mark = CommonVar.nodeInfo[nodeIdx].Mark;
                    //    //PackingJobType.ChangeMarkState(_mark, eMarkState.Executing);
                    //    packPlace = CommonVar.nodeInfo[nodeIdx].Name;
                    //    rfid = CommonVar.nodeInfo[nodeIdx].RFID;
                    //    CommonVar.log.Info(string.Format("{0} 找不到Mark={1}任务,切换为包装仓{2}的Mark={3}的任务[Marks={4}]", agv.Name, mark, packPlace, _mark, PackingJobType.GetMarks()));
                    //    mark = _mark;
                    //    return true;
                    //}
                }
            }
            else
            {
                packPlace = SettingString.A3;//默认为回收料架处
                rfid = "00";
                int i = CommonVar.nodeInfo.FindIndex(s => s.Mark.Equals(mark) && s.StateEquals(eNodeStatus.NeedEnter) && s.IsUse);
                if (i > -1)
                {
                    packPlace = CommonVar.nodeInfo[i].Name;
                    LogUtil.info(string.Format("{0} 查找包装仓目的地{1}[Mark={2}][Marks={3}]", agv.Name, packPlace, mark, PackingJobType.GetMarks()));
                    return true;
                }
                else
                {
                    PackingJobType.DelMark(mark);
                    int nodeIdx = PackingJobType.CheckOutStroePackingJob();
                    if (nodeIdx > -1)
                    {
                        string _mark = CommonVar.nodeInfo[nodeIdx].Mark;
                        //PackingJobType.ChangeMarkState(_mark, eMarkState.Executing);
                        packPlace = CommonVar.nodeInfo[nodeIdx].Name;
                       LogUtil.info(string.Format("{0} 找不到Mark={1}任务,切换为包装仓{2}的Mark={3}的任务[Marks={4}]", agv.Name, mark, packPlace, _mark, PackingJobType.GetMarks()));
                        mark = _mark;
                        return true;
                    }
                }
            }

            LogUtil.info(string.Format("{0} 找不到Mark={1}任务及其他包装任务,将该料架送往回收处。[{2}]", agv.Name, mark, PackingJobType.GetMarks()));
            return false;
        }
        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            P1_NONE,
            /// <summary>
            /// 等待到达4D
            /// </summary>
            P1_1_WAIT_REACH_4D_DOOR,
            /// <summary>
            /// 等待到达包装料架处
            /// </summary>
            P2_WAIT_REACH_PACKING_SHELF_PLACE,
            /// <summary>
            /// 确认包装仓是否有该任务,防止该任务被手动出掉
            /// </summary>
            P3_CHECK_PACKING_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
        }
    }

}