SendFullShelfToLineJob.cs 7.6 KB
using Common;
using System.Collections.Generic;

namespace DeviceLibrary
{
    /// <summary>
    /// 从云仓向产线运行任务(出满料)
    /// </summary>
    public class SendFullShelfToLineJob : Job
    {
        /// <summary>
        /// 从A6向产线运行任务(出满料)
        /// </summary>
        /// <param name="palce">产线名</param>
        /// <param name="rfid">料架RFID</param>
        /// <param name="isIgNoreBigShelf">是否忽略大料架</param>
        public SendFullShelfToLineJob(HttpManager.BoxDestInfo boxDestInfo, string rfid,bool isIgNoreBigShelf = false)
        {
            FullShelfPlace = boxDestInfo.data;
            RFID =rfid;
            BoxDestInfo = boxDestInfo;
            IsIgnoreBigShelf = isIgNoreBigShelf;
        }

        /// <summary>
        /// 满料架目标位置点
        /// </summary>
        public string FullShelfPlace { get; set; }

        public string RFID { get; set; }

        public HttpManager.BoxDestInfo BoxDestInfo { get; private set; }
        /// <summary>
        /// 是否忽略大料架移库解绑
        /// </summary>
        public bool IsIgnoreBigShelf { get; private set; }


        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("送满料任务[RFID={0}][{1}]:{2}", RFID, CurTaskID, runInfo); }
        }


        private JobStep<SEND_FULL_SHELF_STEP> jobStep = new JobStep<SEND_FULL_SHELF_STEP>(SEND_FULL_SHELF_STEP.NONE);

        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 送满料任务[RFID={1}]: ", agv.Name, RFID);
            //bool rtn = false;
            agv.RFID = RFID;
            if (jobStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
            {
                if(CheckLineTargetOccupy(agv, FullShelfPlace))
                {
                    jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_REACH_STANDY);
                    runInfo = "产线[" + FullShelfPlace + "]目前有其他车,先去待机位";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Standby);
                    UpdateJobTaskInfo(agv);
                }
                else
                {
                    jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
                    runInfo = "从云仓送往[" + FullShelfPlace + "]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, FullShelfPlace);
                    UpdateJobTaskInfo(agv);
                }


            }
            else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_STANDY))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
                {
                    if (!CheckLineTargetOccupy(agv, FullShelfPlace))
                    {
                        jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
                        runInfo = "[" + FullShelfPlace + "]的车辆已返回,开始去产线";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, FullShelfPlace);
                        UpdateJobTaskInfo(agv);
                    }

                }


            }
            else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, FullShelfPlace, CurTaskState))
                {
                    //jobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
                    //runInfo = "AGV到达 " + FullShelfPlace + ",等待人员操作";
                    //msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    //jobStep.Msg = msg;
                    runInfo = "人员在" + FullShelfPlace + "卸料完成";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    AGVManager.CheckBoxNeedShelfState(agv, out string nodeName);
                    return new EmptyShelfBackJob(FullShelfPlace, eShelfType.SmallShelf, nodeName);
                }
            }
            else if (jobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK))
            {
                MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                System.Threading.Thread.Sleep(500);
                if ((input != null && (input[0]|| input[1])))
                {
                    runInfo = "人员在" + FullShelfPlace + "卸料完成";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    AGVManager.CheckBoxNeedShelfState(agv, out string nodeName);
                    return new EmptyShelfBackJob(FullShelfPlace, eShelfType.SmallShelf,nodeName);
                }
            }

            return this;
        }
        /// <summary>
        /// 检查该目的地是否有车占用
        /// </summary>
        /// <param name="nodeName"></param>
        /// <returns>false:未被占用</returns>
        private bool CheckLineTargetOccupy(Agv_Info agv, string nodeName)
        {

            List<Agv_Info> agvs = AGVManager.agvInfo.FindAll(s => !s.IP.Equals(agv.IP) && (s.CurJob is SendFullShelfToLineJob || s.CurJob is EmptyShelfBackJob)
            ); 
            if (agvs.Count.Equals(0))
                return false;
            else if (agvs.Count > 0)
            {
                foreach (Agv_Info item in agvs)
                {
                    if (item.CurJob is EmptyShelfBackJob)
                    {
                        if (((EmptyShelfBackJob)item.CurJob).EmptyShelfPlace.Equals(nodeName))
                        {
                            LogUtil.debug(item.Name + " 在目的地:" + ((EmptyShelfBackJob)item.CurJob).EmptyShelfPlace + " " + agv.Name + "暂不去" + nodeName);
                            return true;
                        }

                    }
                    else if (item.CurJob is SendFullShelfToLineJob)
                    {
                        if (((SendFullShelfToLineJob)item.CurJob).FullShelfPlace.Equals(nodeName) && item.CurTarName.Equals(nodeName))
                        {
                            LogUtil.debug(item.Name + " 在目的地:" + ((SendFullShelfToLineJob)item.CurJob).FullShelfPlace + " " + agv.Name + "暂不去" + nodeName);
                            return true;
                        }

                    }
                }
            }
            return false;
        }
    }
    /// <summary>
    /// AGV送满料架到产线
    /// </summary>
    public enum SEND_FULL_SHELF_STEP
    {
        /// <summary>
        /// 料架已进入小车,去目的地
        /// </summary>
        NONE,
        /// <summary>
        /// 等待到达待机位
        /// </summary>
        WAIT_REACH_STANDY,
        /// <summary>
        /// 等待小车到达目的地
        /// </summary>
        WAIT_AGV_REACH_LINE,
        /// <summary>
        /// 等待大料架解绑
        /// </summary>
        WAIT_BIG_SHELF_UNLOCK,
        /// <summary>
        /// 进入产线完成
        /// </summary>
        END
    }
}