EnterLeaveShelfJob.cs 5.3 KB
using System.Threading.Tasks;

namespace DeviceLibrary
{
    /// <summary>
    /// 小车进出料类型
    /// </summary>
    public enum eEnterLeaveType
    {
        /// <summary>
        /// 小车进料
        /// </summary>
        Enter,
        /// <summary>
        /// 小车出料
        /// </summary>
        Leave,
    }

    /// <summary>
    /// 进出料任务
    /// </summary>
    public class EnterLeaveShelfJob : Job
    {
        /// <summary>
        ///  进出料任务
        /// </summary>
        /// <param name="curNode">位置点</param>
        /// <param name="rfid">RFID</param>
        public EnterLeaveShelfJob(ClientNode curNode, eEnterLeaveType type,string rfid="")
        {
            CurNode = curNode;
            RFID = rfid;
            ActionType = type;
            runInfo = type.Equals(eEnterLeaveType.Enter) ? "小车进料任务:" : "小车出料任务:" +curNode.AliceName+" ";
        }

        /// <summary>
        /// 位置点信息
        /// </summary>
        public ClientNode CurNode { get; set; }

        public string RFID { get; set; }
        /// <summary>
        /// 动作类型
        /// </summary>
        public eEnterLeaveType ActionType { get; set; }

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


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

        public override Job Execute(Agv_Info agv)
        {
            string msg = agv.Name+ " ";
            bool rtn = false;
            agv.Msg = runInfo;
            if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.NONE))
            {
                if (ActionType.Equals(eEnterLeaveType.Leave))
                {
                    EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE);
                    runInfo += "小车链条运行";
                    msg += runInfo;
                    EnterLeaveShelfStep.Msg = msg;
                    rtn = agv.AssignTask(Common.SettingString.Leave);
                     UpdateJobTaskInfo(agv);
                }
                else if(ActionType.Equals(eEnterLeaveType.Enter))
                {
                    EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE);
                    runInfo +="小车链条运行";
                    msg += runInfo;
                    EnterLeaveShelfStep.Msg = msg;
                    rtn = agv.AssignTask(Common.SettingString.Enter);
                     UpdateJobTaskInfo(agv);
                }
            }
            else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_IN_LINE))
            {
                CurTaskState = CommonVar.GetTakJobState(agv);
                if (CommonVar.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
                {

                    //EnterLeaveShelfStep.ToNextStep(ENTER_LEAVE_SHELF_STEP.END);
                    runInfo+= "料架/料串进入完成 [" + RFID + "]";
                    msg += runInfo;
                    EnterLeaveShelfStep.Msg = msg;
                    agv.RFID = "";
                   // return new EmptyAGVBackJob(LineName);

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

            }
            else if (EnterLeaveShelfStep.IsStep(ENTER_LEAVE_SHELF_STEP.WAIT__SHELF_OUT_LINE))
            {
                CurTaskState = CommonVar.GetTakJobState(agv);
                if (CommonVar.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
                {

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

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

            return this;
        }

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