EmptyAGVBackJob.cs 11.4 KB

using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.PeerResolvers;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary
{
    /// <summary>
    /// 空车返回任务
    /// </summary>
    public class EmptyAGVBackJob : Job
    {
        /// <summary>
        /// 出完满料后-空车返回任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
        public EmptyAGVBackJob(string agvPlae)
        {
            this.agvPlace = agvPlae;
            JobName = "返回任务";
        }


        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace { get; set; }

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


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

        /// <summary>
        /// 空车返回执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = string.Format("{0} 返回任务: ", agv.Name);
            //bool rtn = false;
            StartJobTime = curJobStep.startTime;
            CurTaskState = MissionSys.GetTakJobState(agv);
            if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
            {
                if (AGVManager.FindEmptyShelfNode(agv, out string nodeName))
                {
                    int i = AGVManager.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName));
                    if (i == -1)
                    {
                        ClientNode clientNode = AGVManager.nodeInfo.Find(s => s.Name.Equals(nodeName));
                        if (AGVManager.CheckStationState(clientNode, out string rfid))
                        {
                            runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                            return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
                        }
                        else
                        {
                            if (AGVManager.CheckIsInAirDoor(agvPlace))
                            {
                                curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_1);
                                runInfo = string.Format("从产线{0}回待机位,先到{1}风淋门停留点", agvPlace, SettingString.RoomD_Name);
                                msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                                curJobStep.Msg = msg;
                                MissionSys.AssignMission(agv, $"{SettingString.DoorAirOut}-1");
                                UpdateJobTaskInfo(agv);
                            }
                            else
                            {
                                curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                                runInfo = "从产线" + agvPlace + "回待机位";
                                msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                                curJobStep.Msg = msg;
                                MissionSys.AssignMission(agv, SettingString.Standby);
                                UpdateJobTaskInfo(agv);
                            }
                        }
                    }
                    else
                    {
                        if (AGVManager.CheckIsInAirDoor(agvPlace))
                        {
                            curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_1);
                            runInfo = string.Format("从产线{0}回待机位,先到{1}风淋门停留点", agvPlace, SettingString.RoomD_Name);
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            MissionSys.AssignMission(agv, $"{SettingString.DoorAirOut}-1");
                            UpdateJobTaskInfo(agv);
                        }
                        else
                        {
                            curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                            runInfo = "从产线" + agvPlace + "回待机位";
                            msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                            curJobStep.Msg = msg;
                            MissionSys.AssignMission(agv, SettingString.Standby);
                            UpdateJobTaskInfo(agv);
                        }
                    }

                }
                else
                {
                    if (AGVManager.CheckIsInAirDoor(agvPlace))
                    {
                        curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_1);
                        runInfo = string.Format("从产线{0}回待机位,先到{1}风淋门停留点", agvPlace, SettingString.RoomD_Name);
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        MissionSys.AssignMission(agv, $"{SettingString.DoorAirOut}-1");
                        UpdateJobTaskInfo(agv);
                    }
                    else
                    {
                        curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                        runInfo = "从产线" + agvPlace + "回待机位";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv);
                    }
                }
            }
            else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_1))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirOut}-1", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_2);
                    runInfo = string.Format("{0}到达风淋门停留点,进入{1}风淋门", agvPlace, SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.DoorAirOut}-2");
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_2))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirOut}-2", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_3);
                    runInfo = string.Format("{0}进入风淋门,准备出{1}风淋门", agvPlace, SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.DoorAirOut}-3");
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.OUT_AIR_DOOR_3))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, $"{SettingString.DoorAirOut}-3", CurTaskState))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
                    runInfo = string.Format("{0}出风淋门,去待机点", agvPlace, SettingString.RoomD_Name);
                    msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                    curJobStep.Msg = msg;
                    MissionSys.AssignMission(agv, $"{SettingString.Standby}");
                    UpdateJobTaskInfo(agv);
                }
            }
            else if (curJobStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
            {
                CurTaskState = MissionSys.GetTakJobState(agv);
                if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
                {
                    Job job = AGVManager.control.GetJob(agv);
                    if (job == null && agv.Battery < AGVManager.Charge.BatteryMax)
                    {
                        runInfo = "到达待机位,电量" + agv.Battery + "小于最大电量" + AGVManager.Charge.BatteryMax + ",暂无任务,去充电";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return new ChargeJob(SettingString.Standby);
                    }
                    else
                    {
                        runInfo = "到达待机位,检测到新任务,执行任务";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return job;
                    }

                }
                else
                {
                    if (AGVManager.FindFullShelfTask(agv))
                    {
                        runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
                        msg += string.Format("[{0}] {1}", curJobStep.CurStep(), runInfo);
                        curJobStep.Msg = msg;
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return new GoFullShelfStationJob(SettingString.Standby);
                    }
                }

            }
            return this;
        }
        /// <summary>
        /// 空AGV返回流程
        /// </summary>
        private enum EMPTY_AGV_BACK_STEP
        {
            /// <summary>
            /// 查询任务
            /// </summary>
            NONE,
            /// <summary>
            /// 去出3D风淋门等待位
            /// </summary>
            OUT_AIR_DOOR_1,
            /// <summary>
            /// 进风淋门
            /// </summary>
            OUT_AIR_DOOR_2,
            /// <summary>
            /// 出风淋门
            /// </summary>
            OUT_AIR_DOOR_3,
            /// <summary>
            /// 等待AGV到达待机位
            /// </summary>
            WAIT_REACH_STANDBY,

            /// <summary>
            /// 
            /// </summary>
            END
        }
    }

}