EnterLeaveShelfJob.cs 9.0 KB
using Common;
namespace DeviceLibrary
{
    /// <summary>
    /// 小车进出料类型
    /// </summary>
    public enum eEnterLeaveType
    {
        /// <summary>
        /// 小车进料
        /// </summary>
        Enter,
        /// <summary>
        /// 小车出料
        /// </summary>
        Leave,
    }

    /// <summary>
    /// 进出料任务
    /// </summary>
    public class EnterLeaveShelfJob : Job
    {
        /// <summary>
        ///  进出料任务
        /// </summary>
        /// <param name="palce">位置点名称</param>
        /// <param name="rfid">RFID</param>
        public EnterLeaveShelfJob(string palce, eEnterLeaveType type,eShelfType shelfType= eShelfType.SmallShelf,string rfid="")
        {
            LineName = palce;
            RFID = rfid;
            ActionType = type;
            this.shelfType = shelfType;
        }

        /// <summary>
        /// 位置名
        /// </summary>
        public new string LineName { get; set; }

        public string RFID { get; set; }

        public eEnterLeaveType ActionType { get; set; }

        private eShelfType shelfType;
        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return runInfo; }
        }


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

        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 进出料: ", agv.Name, shelfType.ToString());
            //bool rtn = false;
            //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
            //    CurTaskState = st;
            if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.NONE))
            {
                if (ActionType.Equals(eEnterLeaveType.Leave))
                {
                    //EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT_LINE_ReadyEnter_RESPONSE);
                    //msg = "AGV到达 " + LineName + ",并发送入料架请求[ReadyEnter]";
                    //EnterLeaveShelfStep.Msg = msg;
                    //Common.server.ReadyEnter(LineName);
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE);
                    runInfo = LineName + "入料架,小车链条运行";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Leave);
                    UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                }
                else if(ActionType.Equals(eEnterLeaveType.Enter))
                {
                    //EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT_LINE_ReadyLeave_RESPONSE);
                    //msg = "AGV到达 " + LineName + ",并发送出料架请求[ReadyLeave]";
                    //EnterLeaveShelfStep.Msg = msg;
                    //Common.server.ReadyLeave(LineName);
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE);
                    runInfo = LineName + "出料架,小车链条运行";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Enter);
                    UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                }
            }
            else if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT_LINE_ReadyEnter_RESPONSE))
            {
                int id = AGVManager.FindNode(LineName);
                ClientNode node = AGVManager.nodeInfo[id];
                if (node.StateEquals(eNodeStatus.MayEnter))
                {
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE);
                    runInfo= "收到产线入料架请求[ReadyEnter]的响应, " + LineName + "入料架,小车链条运行";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Leave);
                    UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                }
                else if (jobStep.IsTimeOut(15000, out double timeOutValue))
                {
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
                    runInfo = "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                }
            }
            else if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT_LINE_ReadyLeave_RESPONSE))
            {
                int id = AGVManager.FindNode(LineName);
                ClientNode node = AGVManager.nodeInfo[id];
                if (node.StateEquals(eNodeStatus.MayLeave))
                {
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE);
                    runInfo= "收到产线出料架请求[ReadyLeave]的响应, " + LineName + "出料架,小车链条运行";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.Enter);
                    UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
                }
                else if (jobStep.IsTimeOut(15000, out double timeOutValue))
                {
                    jobStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.NONE);
                    runInfo= "AGV到达 " + LineName + ",15秒后重新向产线发送入料架请求[ReadyLeave]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                }
            }
            else if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv,SettingString.Leave, CurTaskState))
                {

                    //EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
                    runInfo= "料架进入" + LineName + "完成 [" + RFID + "]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    agv.RFID = "";
                    return new EmptyAGVBackJob(LineName);

                }
                else if (jobStep.IsTimeOut(60000, out double timeOutValue))
                {
                    //链条停止
                    runInfo= "料架在[" + LineName + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
                    //msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    //EnterLeaveShelfStep.Msg = msg;
                }

            }
            else if (jobStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(CurTaskID);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState))
                {

                    //EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
                    runInfo = "料架在" + LineName + "出去完成 [" + RFID + "]";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    AGVManager.unlockManager.DelMission(LineName,RFID);
                    return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
                }
                else if (jobStep.IsTimeOut(60000, out double timeOutValue))
                {
                    //链条停止
                    runInfo= "料架在[" + LineName + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
                    //msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    //EnterLeaveShelfStep.Msg = msg;
                }

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

            return this;
        }

    }
    /// <summary>
    /// AGV进出料
    /// </summary>
    public enum ENTER_LEAVE_SHELF_STEP
    {
        /// <summary>
        /// 
        /// </summary>
        NONE,
        /// <summary>
        /// 等待产线ReadyEnter回应
        /// </summary>
        WAIT_LINE_ReadyEnter_RESPONSE,
        /// <summary>
        /// 等待产线ReadyLeave回应
        /// </summary>
        WAIT_LINE_ReadyLeave_RESPONSE,
        /// <summary>
        /// 等待料架离开产线
        /// </summary>
        WAIT__SHELF_OUT_LINE,
        /// <summary>
        /// 等待料架进入产线
        /// </summary>
        WAIT__SHELF_IN_LINE,
        /// <summary>
        /// 进入/离开完成
        /// </summary>
        END
    }
}