SendShelfJob.cs 6.8 KB
using Common;

namespace DeviceLibrary
{
    /// <summary>
    ///送料串
    /// </summary>
    public class SendShelfJob : Job
    {
        /// <summary>
        /// 送料串
        /// </summary>
        /// <param name="agvPlae">agv当前位置</param>
        /// <param name="tarPlace">目的地</param>
        public SendShelfJob(string agvPlae, string tarPlace, string RFID = "")
        {
            this.agvPlace = agvPlae;
            TargetPlace = tarPlace;
            this.RFID = RFID;
        }


        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";

        private string RFID = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; private set; }
        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get
            {
                int t1 = Context.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
                string from = "";
                if (t1 > -1)
                    from = Context.nodeInfo[t1].AliceName;
                else
                    from = agvPlace;
                int t2 = Context.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
                string to = "";
                if (t2 > -1)
                    to = Context.nodeInfo[t2].AliceName;
                else
                    to = TargetPlace;
                return string.Format("送料串任务[RFID={4}]:{0} [目的地={1}][任务名称={2}][任务状态={3}]", runInfo, to, CurTaskName, CurTaskState, RFID);
            }
        }

        private JobStep<EXECUTE_STEP> curJobStep = new JobStep<EXECUTE_STEP>(EXECUTE_STEP.P1_NONE);

        private string GetShowInfo()
        {
            int t1 = Context.nodeInfo.FindIndex(s => s.Name.Equals(agvPlace));
            string from = "";
            if (t1 > -1)
                from = Context.nodeInfo[t1].AliceName;
            else
                from = agvPlace;
            int t2 = Context.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));
            string to = "";
            if (t2 > -1)
                to = Context.nodeInfo[t2].AliceName;
            else
                to = TargetPlace;
            return string.Format("送料串任务: {0} [{1}->{2}]", runInfo, from, to);
        }
        /// <summary>
        /// 任务执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = agv.Name + " ";
            bool rtn = false;
            agv.Msg = GetShowInfo();
            agv.RFID = RFID;
            CurTaskState = Context.GetTakJobState(agv);
            if (curJobStep.IsStep(EXECUTE_STEP.P1_NONE))
            {
                curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
                runInfo = "收到任务,向" + TargetPlace + "运行";
                msg += runInfo;
                curJobStep.Msg = msg;
                Context.MoveToNode(agv, TargetPlace);
                UpdateJobTaskInfo(agv);
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P2_WAIT_REACH_STATION))
            {
                CurTaskState = Context.GetTakJobState(agv);
                if (Context.CheckTaskMoveFinished(agv, TargetPlace, CurTaskState))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P3_WAIT_STATION_RESPONSE);
                    runInfo = "到达" + TargetPlace + ",并发送进料请求";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    Context.server.Ready(TargetPlace, RFID);
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P3_WAIT_STATION_RESPONSE))
            {
                int i = Context.nodeInfo.FindIndex(s => s.Name.Equals(TargetPlace));//&& s.StateEquals(eNodeStatus.MayEnter)
                if (i > -1)
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P4_WAIT_SHELF_IN_STATION);
                    runInfo = "收到线体允许进料信号,链条运行";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    rtn = agv.AssignTask(SettingString.Leave);
                    UpdateJobTaskInfo(agv);
                }
                if (curJobStep.IsTimeOut(15000, out double timeOutTime))
                {
                    curJobStep.ToNextStep(EXECUTE_STEP.P2_WAIT_REACH_STATION);
                    runInfo = string.Format("线体[{0}]允许进料信号[{1}]超时{2}秒,重发进料请求", TargetPlace, Agv.ClientAction.MayEnter, timeOutTime.ToString("f2"));
                    msg += string.Format("线体[{0}]允许进料信号[{1}]超时15S,重发进料请求", TargetPlace, Agv.ClientAction.MayEnter);
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P4_WAIT_SHELF_IN_STATION))
            {
                CurTaskState = Context.GetTakJobState(agv);
                if (Context.CheckEnterOrLeaveFinished(agv, SettingString.Leave, CurTaskState))
                {
                    //Context.server.CloseDoor(TargetPlace);
                    curJobStep.ToNextStep(EXECUTE_STEP.P5_END);
                    runInfo = "料架进入" + TargetPlace + "完成";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
                else if (curJobStep.IsTimeOut(60000, out double timeOutTime))
                {
                    runInfo = string.Format("线体[{0}]出料超时{1}秒,请检查料架情况", TargetPlace, timeOutTime.ToString("f2"));
                    msg += string.Format("线体[{0}]出料超时,请检查料架情况", TargetPlace);
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(EXECUTE_STEP.P5_END))
            {
                return null;
            }
            return this;
        }

        private bool IsPlace(string place)
        {
            return TargetPlace.Equals(place);
        }

        /// <summary>
        /// 执行流程
        /// </summary>
        private enum EXECUTE_STEP
        {
            /// <summary>
            /// 接收到任务
            /// </summary>
            P1_NONE,
            /// <summary>
            /// 等待到达目的地
            /// </summary>
            P2_WAIT_REACH_STATION,
            /// <summary>
            /// 等待线体回复
            /// </summary>
            P3_WAIT_STATION_RESPONSE,
            /// <summary>
            /// 等待料架进入线体
            /// </summary>
            P4_WAIT_SHELF_IN_STATION,

            /// <summary>
            /// 任务结束
            /// </summary>
            P5_END
        }
    }

}