EmptyShelfBackJob.cs 9.3 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>
    /// 载空料架返回任务
    /// </summary>
    public class EmptyShelfBackJob : Job
    {
        /// <summary>
        /// 载空料架返回任务
        /// </summary>
        /// <param name="lineName">产线的节点名称</param>
        public EmptyShelfBackJob(string emptyShelfPlace, eShelfType shelfType, string emptyShelfTargetPlace)
        {
            EmptyShelfPlace = emptyShelfPlace;
            this.shelfType = shelfType;
            EmptyShelfTargetPlace = emptyShelfTargetPlace;
        }

        /// <summary>
        /// 空料架的产线位置
        /// </summary>
        public 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} ", shelfType.ToString(), CurTaskID, 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 (EmptyShelfPlace.Equals(SettingString.A1) && AGVManager.CheckBoxNeedShelfState(agv, out string nodeName))
                {
                    EmptyShelfTargetPlace = nodeName;
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_Target);
                    runInfo = "从线体 [" + EmptyShelfPlace + "]送往" + EmptyShelfTargetPlace;
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    if (!EmptyShelfTargetPlace.Equals(""))
                    {
                        MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                        UpdateJobTaskInfo(agv);
                    }

                }
                else if (AGVManager.CheckShelfStorageInState(agv))
                {
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_Target);
                    EmptyShelfTargetPlace = SettingString.A2;
                    runInfo = "云仓暂不需要空料架,从线体[" + EmptyShelfPlace + "]到料架缓存处";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                    UpdateJobTaskInfo(agv);
                }
                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);
                }

            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (AGVManager.CheckNeedEmptyShelf(agv, out string nodeName))
                {
                    EmptyShelfTargetPlace = nodeName;
                    jobStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_Target);
                    runInfo = "待机位检测到" + EmptyShelfTargetPlace + "需要料架,送往 " + EmptyShelfTargetPlace;
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, EmptyShelfTargetPlace);
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_Target))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState))
                {
                    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_LINE);
                        runInfo = "收到入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Leave);
                        UpdateJobTaskInfo(agv);
                    }

                }
                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);
                }
            }
            else if (jobStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                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(EmptyShelfTargetPlace);
                    }

                }
                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>
            /// 等待小车到达目的地
            /// </summary>
            WAIT_AGV_REACH_Target,
            /// <summary>
            /// 等待双层线回应
            /// </summary>
            WAIT_DOUBLE_LINE_RESPONSE,
            /// <summary>
            /// 等待料架进入线体
            /// </summary>
            WAIT__EMPTY_SHELF_IN_LINE,
            /// <summary>
            /// A5,A6暂时不需要,等待AGV到达待机位
            /// </summary>
            WAIT_AGV_REACH_STANDBY,
            /// <summary>
            /// 送上双层线
            /// </summary>
            END
        }
    }

}