GoFullShelfStationJob.cs 11.5 KB
using Common;
namespace DeviceLibrary
{
    /// <summary>
    /// 检查AGV是否有负载,去A6入料口并装车
    /// </summary>
    public class GoFullShelfStationJob : Job
    {
        /// <summary>
        /// 去云仓出料口任务
        /// </summary>
        /// <param name="agvCurPlace">接到任务时,AGV的位置(空表示待机位)</param>
        /// <param name="palce"></param>
        public GoFullShelfStationJob(string palce, string agvCurPlace, string rfid)
        {
            FullShelfStationPlace = palce;
            agvPlace = agvCurPlace;
            RFID = rfid;
        }

        /// <summary>
        /// 出满料位置点
        /// </summary>
        public string FullShelfStationPlace { get; set; }
        public string RFID { get; set; }
        /// <summary>
        /// 接到任务时,AGV的位置
        /// </summary>
        public string agvPlace { get; set; }
        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("接满料任务[{0}][rfid={1}]:{2}", CurTaskID, RFID, runInfo); }
        }
        private bool noneTargetHandle = false;
        /// <summary>
        /// AGV上是否有负载
        /// </summary>
        public bool IsLoadOnAGV { get; private set; } = false;

        public HttpManager.BoxDestInfo FullShelfDestInfo = null;

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

        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 接满料任务: ", agv.Name);
            //bool rtn = false;
            if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
            {
                jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT);
                runInfo = "检查AGV负载";
                msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                jobStep.Msg = msg;
                MissionSys.AssignMission(agv, SettingString.CheckShelf);
                UpdateJobTaskInfo(agv);
            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_CHECK_RESULT))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.CheckShelf, CurTaskState))
                {
                    if (agv.IsExistShelf)
                    {
                        jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
                        runInfo = "车上有料架,无法去云仓接满料";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        IsLoadOnAGV = true;
                    }
                    else if (!agv.IsExistShelf)
                    {
                        //if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
                        {
                            jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_SMD);
                            runInfo = "无负载,去云仓接满料" + FullShelfStationPlace;
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                            jobStep.Msg = msg;
                            MissionSys.AssignMission(agv, FullShelfStationPlace);
                            UpdateJobTaskInfo(agv);
                        }
                    }

                }

            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_SMD))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, FullShelfStationPlace, CurTaskState))
                {
                    if (HttpManager.FindFullShelfTarget(RFID, out FullShelfDestInfo))
                    {
                        if (FullShelfDestInfo != null && AGVManager.GetLineNameByNodeName(FullShelfDestInfo.data, out string line))
                        {
                            jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE);
                            runInfo = "AGV到达 " + FullShelfStationPlace + ",并发送出料架请求[ReadyLeave]";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                            jobStep.Msg = msg;
                            AGVManager.server.ReadyLeave(FullShelfStationPlace);
                        }
                        else
                        {
                            jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY);
                            runInfo = "从" + FullShelfStationPlace + "回到待机位,因不存在该节点" + FullShelfDestInfo.data;
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                            jobStep.Msg = msg;
                            MissionSys.AssignMission(agv, SettingString.Standby);
                            UpdateJobTaskInfo(agv);
                        }

                    }
                    else
                    {
                        noneTargetHandle = true;
                        jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE);
                        runInfo = "AGV到达 " + FullShelfStationPlace + ",并发送出料架请求[ReadyLeave][该料架无目的地]";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        AGVManager.server.ReadyLeave(FullShelfStationPlace);
                    }



                }
            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_STANDBY))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
                {
                    jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.END);
                    runInfo = "到达待机位";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                }
            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_DOUBLE_LINE_RESPONSE))
            {
                int id = AGVManager.FindNode(FullShelfStationPlace);
                if (id == -1)
                {
                    runInfo = "未找到节点:" + FullShelfStationPlace;
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                    jobStep.Msg = msg;
                    return this;
                }
                ClientNode node = AGVManager.nodeInfo[id];
                if (node.StateEquals(eNodeStatus.MayLeave))
                {
                    if (!agv.CurTarName.Equals("Enter"))
                    {
                        jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV);
                        runInfo = "收到请求[ReadyLeave]的响应 " + FullShelfStationPlace + "出料架,小车链条运行";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Enter);
                        UpdateJobTaskInfo(agv);
                    }

                }
                else if (jobStep.IsTimeOut(15000, out double timeOutValue))
                {
                    jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_SMD);
                }


            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT__FULL_SHELF_IN_AGV))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Enter, CurTaskState))
                {
                    HttpManager.AgvRemoveRfid(RFID);
                    if (noneTargetHandle)
                    {
                        jobStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_TEMP_PLACE);
                        runInfo = FullShelfStationPlace + "满料架进入小车完成,由于该料架无目的地,去临时点卸料";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        //FullShelfStationPlace = SettingString.A2;
                        MissionSys.AssignMission(agv, SettingString.A2);
                        UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                        runInfo = FullShelfStationPlace + "满料架进入小车完成";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        return new SendFullShelfToLineJob(FullShelfDestInfo, RFID);
                    }

                }
                else if (jobStep.IsTimeOut(60000, out double timeOutValue))
                {
                    //链条停止
                    runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
                    //msg +=runInfo;
                    //GoFullShelfStationStep.Msg = msg;
                }

            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_REACH_TEMP_PLACE))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.A2, CurTaskState))
                {
                    MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                    System.Threading.Thread.Sleep(500);
                    if ((input != null && (input[0] || input[1])))
                    {
                        runInfo = "人员在临时区卸料完成[无目的地],回收料架";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        AGVManager.CheckBoxNeedShelfState(agv, out string nodeName);
                        return new EmptyShelfBackJob(SettingString.A2, eShelfType.SmallShelf,nodeName);
                    }
                }

            }
            else if (jobStep.IsStep(GO_FULL_SHELF_STATION_STEP.END))
            {
                return null;
            }
            return this;
        }

    }
    /// <summary>
    /// 出满料步骤
    /// </summary>
    public enum GO_FULL_SHELF_STATION_STEP
    {
        /// <summary>
        /// 负载检查
        /// </summary>
        NONE,
        /// <summary>
        /// 负载检查结果
        /// </summary>
        WAIT_CHECK_RESULT,
        /// <summary>
        /// 等待到达云仓
        /// </summary>
        WAIT_AGV_REACH_SMD,
        /// <summary>
        /// 等待双层线回应
        /// </summary>
        WAIT_DOUBLE_LINE_RESPONSE,
        /// <summary>
        /// 等待料架进入小车
        /// </summary>
        WAIT__FULL_SHELF_IN_AGV,
        /// <summary>
        /// 等待AGV到达待机位
        /// </summary>
        WAIT_REACH_STANDBY,
        /// <summary>
        /// 无目的地,放到临时位置
        /// </summary>
        WAIT_REACH_TEMP_PLACE,
        /// <summary>
        /// 送上双层线
        /// </summary>
        END
    }
}