EmptyShelfBackJob.cs 12.8 KB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.ModelBinding;
using System.Windows.Forms;
using Common;
namespace DeviceLibrary
{

    /// <summary>
    /// 载空料架返回任务,A5,A6需要则直接去,否则在待机位等待
    /// </summary>
    public class EmptyShelfBackJob : Job
    {
        /// <summary>
        /// 载空料架返回任务
        /// </summary>
        /// <param name="lineName">产线的节点名称</param>
        public EmptyShelfBackJob(string lineName, eShelfType shelfType)
        {
            EmptyShelfPlace = lineName;
            this.shelfType = shelfType;
        }

        /// <summary>
        /// 空料架的产线位置
        /// </summary>
        private string EmptyShelfPlace { get; set; }
        /// <summary>
        /// 空料架目的地
        /// </summary>
        public string EmptyShelfTargetPlace { get; set; } = "";

        private int tryTimes = 0;
        private eShelfType shelfType;
        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("空料架[{0}][{1}][{2}]返回:{3} ",shelfType.ToString(), CurTaskID, CurTaskState, runInfo); }
        }


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

        /// <summary>
        /// 空架任务执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 空料架[{1}]返回: ", agv.Name, shelfType.ToString());
            //bool rtn = false;
            //runInfo = "空料架返回:";
            if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
            {
                if (AGVManager.CheckIsInAirDoor(EmptyShelfPlace))//C车间风淋门
                {
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
                    runInfo = string.Format("从产线{0}过{1}风淋门", EmptyShelfPlace,SettingString.RoomC_Name);
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.DoorAirOut);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
                else if (EmptyShelfPlace.StartsWith(SettingString.RoomC_Name_Prefix))//C车间
                {
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
                    runInfo = string.Format("从产线{0}前往{1}门", EmptyShelfPlace,SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.DoorCToD);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
                else
                {
                    if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
                    {
                        EmptyShelfTargetPlace = nodeName;
                        jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                        runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        if (!EmptyShelfTargetPlace.Equals(""))
                        {
                            MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                            UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        }

                    }
                    else
                    {
                        jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
                        runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
                {
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
                    runInfo = string.Format("出风淋门,前往{0}门",SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.DoorCToD);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
                    {
                        EmptyShelfTargetPlace = nodeName;
                        jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                        runInfo = string.Format("进{0}门,送往双层线{1}",SettingString.RoomD_Name, EmptyShelfTargetPlace);
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else
                    {
                        jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
                        runInfo = string.Format("进{0}门,双层线暂不需要空料架,到待机位", SettingString.RoomD_Name);
                        runInfo = "进4D门,双层线暂不需要空料架,到待机位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (AGVManager.CheckA5A6State(agv, shelfType, out string nodeName))
                {
                    EmptyShelfTargetPlace = nodeName;
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
                    runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith(SettingString.DoubleLine_Name_Prefix))
                {
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
                    runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    AGVManager.server.ReadyEnter(EmptyShelfTargetPlace);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE))
            {
                int id = AGVManager.FindNode(EmptyShelfTargetPlace);
                ClientNode node = AGVManager.nodeInfo[id];
                if (node.StateEquals(eNodeStatus.MayEnter))
                {
                    if (!agv.CurTarName.Equals(SettingString.Leave))
                    {
                        jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
                        runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Leave);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }

                }
                else if (jobStep.IsTimeOut(15000, out double timeOutValue))
                {
                    tryTimes++;
                    if (tryTimes < 3)
                        return this;
                    tryTimes = 0;
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
                    runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Standby);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState))
                {
                    agv.RFID = "";
                    Job job = AGVManager.control.GetJob(agv);
                    if (job != null)
                    {
                        runInfo = "在双层线检测到任务,执行任务";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        return job;
                    }
                    else
                    {
                        runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        agv.RFID = "";
                        agv.BoxDestInfo = "";
                        return new ChargeJob(SettingString.DoubleLine_Name_Prefix);
                    }

                }
                else if (jobStep.IsTimeOut(60000, out double timeOutValue))
                {
                    runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
                }

            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.END))
            {
            }

            return this;
        }

        /// <summary>
        /// AGV载空料架回收流程
        /// </summary>
        private enum EMPTY_SHELF_BACK_STEP
        {
            /// <summary>
            /// 料架已进入小车,寻找目的地
            /// </summary>
            NONE,
            /// <summary>
            /// 等待到达4C风淋门
            /// </summary>
            WAIT_AGV_REACH_AIR_DOOR,
            /// <summary>
            /// 等待AGV到达门
            /// </summary>
            WAIT_AGV_REACH_DOOR,
            /// <summary>
            /// 等待小车到达A5,A6
            /// </summary>
            WAIT_AGV_REACH_A5A6,
            /// <summary>
            /// 等待双层线回应
            /// </summary>
            WAIT_DOUBLE_LINE_RESPONSE,
            /// <summary>
            /// 等待料架进入双层线
            /// </summary>
            WAIT__EMPTY_SHELF_IN_DOUBLE_LINE,
            /// <summary>
            /// A5,A6暂时不需要,等待AGV到达待机位
            /// </summary>
            WAIT_AGV_REACH_STANDBY,
            /// <summary>
            /// 送上双层线
            /// </summary>
            END
        }
    }

}