SendFullShelfToLineJob.cs 14.7 KB
using Common;
using System;

namespace DeviceLibrary
{
    /// <summary>
    /// 从A6向产线运行任务(出满料)
    /// </summary>
    public class SendFullShelfToLineJob : Job
    {
        /// <summary>
        /// 从A6向产线运行任务(出满料)
        /// </summary>
        /// <param name="palce">产线名</param>
        /// <param name="rfid">料架RFID</param>
        /// <param name="isIgNoreBigShelf">是否忽略大料架</param>
        public SendFullShelfToLineJob(HttpManager.BoxDestInfo boxDestInfo, bool isIgNoreBigShelf = false)
        {
            FullShelfPlace = boxDestInfo.location;
            RFID = boxDestInfo.id;
            BoxDestInfo = boxDestInfo;
            IsIgnoreBigShelf = isIgNoreBigShelf;
            JobName = "送满料任务";
        }

        /// <summary>
        /// 满料架目标位置点
        /// </summary>
        public string FullShelfPlace { get; set; }

        public string RFID { get; set; }

        public HttpManager.BoxDestInfo BoxDestInfo { get; private set; }
        /// <summary>
        /// 是否忽略大料架移库解绑
        /// </summary>
        public bool IsIgnoreBigShelf { get; private set; }


        private string runInfo = "";
        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("送满料任务[RFID={0}][{1}]:{2}", RFID, CurTaskID, runInfo); }
        }


        private JobStep<SEND_FULL_SHELF_STEP> curJobStep = new JobStep<SEND_FULL_SHELF_STEP>(SEND_FULL_SHELF_STEP.NONE);

        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 送满料任务[RFID={1}]: ", agv.Name, RFID);
            //bool rtn = false;
            agv.RFID = RFID;
            StartJobTime = curJobStep.startTime;
            if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
            {
                HttpManager.AgvRemoveRfid(RFID);
                if (AGVManager.CheckIsInAirDoor(FullShelfPlace))
                {
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_1);
                    runInfo = "送满料,去风淋门停留点[" + FullShelfPlace + "]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.DoorAirIn}-1");
                    UpdateJobTaskInfo(agv);
                }
                else
                {
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
                    runInfo = "从双层线A6送往[" + FullShelfPlace + "]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, FullShelfPlace);
                    UpdateJobTaskInfo(agv);
                }

            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_1))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirIn}-1", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_2);
                    runInfo = string.Format("{0}到达风淋门停留点,进入{1}风淋门", agv.Place, SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.DoorAirIn}-2");
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_2))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirIn}-2", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_3);
                    runInfo = string.Format("{0}进入风淋门,准备出{1}风淋门", agv.Place, SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.DoorAirIn}-3");
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.IN_AIR_DOOR_3))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirIn}-3", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
                    runInfo = "送往[" + FullShelfPlace + "]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, FullShelfPlace);
                    UpdateJobTaskInfo(agv);

                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, FullShelfPlace, CurTaskState))
                {
                    //if (FullShelfPlace.Equals(SettingString.C4FeederIn))
                    //{
                    //    runInfo = "AGV到达 " + FullShelfPlace + "完成";
                    //    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    //    SendFullShelfStep.Msg = msg;
                    //    return new EnterLeaveShelfJob(FullShelfPlace, eEnterLeaveType.Leave);
                    //}
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    if (IsIgnoreBigShelf)
                    {
                        curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
                        runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        AGVManager.server.ReadyEnter(FullShelfPlace);
                    }
                    else
                    {
                        if (FullShelfPlace.Equals("D0"))
                        {
                            curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
                            runInfo = "AGV到达 " + FullShelfPlace + ",并等待4楼工单料架移库操作";
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            MissionSys.AssignMission(agv, "Play");
                        }
                        else if (RFID.StartsWith(SettingString.BigShelf_Prefix) && !FullShelfPlace.Equals(SettingString.RoomDFeederIn) && !FullShelfPlace.Equals(SettingString.RoomCFeederIn))
                        {
                            curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK);
                            runInfo = "AGV到达 " + FullShelfPlace + ",并等待大料架移库操作";
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            MissionSys.AssignMission(agv, "Play");
                        }
                        else
                        {
                            curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE);
                            runInfo = "AGV到达 " + FullShelfPlace + ",并发送入料架请求[ReadyEnter]";
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            AGVManager.server.ReadyEnter(FullShelfPlace);
                        }
                    }

                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_BIG_SHELF_UNLOCK))
            {
                MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                System.Threading.Thread.Sleep(50);
                if (HttpManager.GetRackBy(RFID, out string lineName) || (input != null && input[0]))
                {
                    MissionSys.AssignMission(agv, "Stop");
                    runInfo = "大料架在" + FullShelfPlace + "移库完成[" + agv.BoxDestInfo + "]";
                    agv.BoxDestInfo = "";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    if (RFID.StartsWith("D"))
                    {
                        return new EmptyShelfBackJob(FullShelfPlace, eShelfType.SmallShelf);
                    }
                    else
                    {
                        return new EmptyShelfBackJob(FullShelfPlace, eShelfType.BigShelf);
                    }

                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_LINE_RESPONSE))
            {
                int id = AGVManager.FindNode(FullShelfPlace);
                ClientNode node = AGVManager.nodeInfo[id];
                MiR_API.Get_IO_Status(agv, out bool[] input, out bool[] output);
                System.Threading.Thread.Sleep(50);
                if (node.StateEquals(eNodeStatus.MayEnter))
                {
                    if (!agv.CurTarName.Equals(SettingString.Leave))
                    {
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE);
                        runInfo = "收到产线入料架请求[ReadyEnter]的响应 " + FullShelfPlace + "入料架,小车链条运行";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Leave);
                        UpdateJobTaskInfo(agv);
                    }

                }
                else if (input != null && !input[3] && input[0])
                {
                    agv.HasError = false;
                    runInfo = "手动操作:满料架进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    agv.RFID = "";
                    agv.BoxDestInfo = "";
                    HttpManager.UpdateStatus(RFID, FullShelfPlace);
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    return new EmptyAGVBackJob(FullShelfPlace);
                }
                else if (curJobStep.IsTimeOut(15000, out TimeSpan timeOutValue))
                {
                    curJobStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
                    runInfo = "AGV到达 " + FullShelfPlace + ",15秒后重新向产线发送入料架请求[ReadyEnter]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    agv.HasError = true;
                    agv.SetErrorMsg("AGV到达 " + FullShelfPlace + ",向产线发送入料架请求[ReadyEnter]异常", timeOutValue.TotalMinutes.ToString("f2"));
                }
            }
            else if (curJobStep.IsStep(SEND_FULL_SHELF_STEP.WAIT__SHELF_IN_LINE))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Leave, CurTaskState))
                {
                    agv.HasError = false;
                    runInfo = "满料进入" + FullShelfPlace + "完成[" + agv.BoxDestInfo + "]";
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    agv.RFID = "";
                    agv.BoxDestInfo = "";
                    HttpManager.UpdateStatus(RFID, FullShelfPlace);
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    return new EmptyAGVBackJob(FullShelfPlace);
                }
                else if (curJobStep.IsTimeOut(60000, out TimeSpan timeOutValue))
                {
                    //链条停止
                    runInfo = "满料在[" + FullShelfPlace + "]离开小车超时,请检查料架离开小车的情况";
                    //msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    //SendFullShelfStep.Msg = msg;
                    agv.HasError = true;
                    agv.SetErrorMsg("满料架在[" + FullShelfPlace + "]离开小车超时", timeOutValue.TotalMinutes.ToString("f2"));
                }

            }
            //else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.END))
            //{

            //}
            return this;
        }

    }
    /// <summary>
    /// AGV送满料架到产线
    /// </summary>
    public enum SEND_FULL_SHELF_STEP
    {
        /// <summary>
        /// 料架已进入小车,去目的地
        /// </summary>
        NONE,
        /// <summary>
        /// 去进3D风淋门等待位
        /// </summary>
        IN_AIR_DOOR_1,
        /// <summary>
        /// 进风淋门
        /// </summary>
        IN_AIR_DOOR_2,
        /// <summary>
        /// 出风淋门
        /// </summary>
        IN_AIR_DOOR_3,
        /// <summary>
        /// 等待小车到达目的地
        /// </summary>
        WAIT_AGV_REACH_LINE,
        /// <summary>
        /// 等待大料架解绑
        /// </summary>
        WAIT_BIG_SHELF_UNLOCK,
        /// <summary>
        /// 等待AGV载大料架返回双层线
        /// </summary>
        WAIT_BIG_SHELF_BACK_DOUBLE_LINE,
        /// <summary>
        /// 等待AGV到达停车位
        /// </summary>
        WAIT_BIG_SHELF_BACK_STANDYBY,
        /// <summary>
        /// 等待产线回应
        /// </summary>
        WAIT_LINE_RESPONSE,
        /// <summary>
        /// 等待料架进入产线
        /// </summary>
        WAIT__SHELF_IN_LINE,

        /// <summary>
        /// 进入产线完成
        /// </summary>
        END
    }
}