ChargeJob.cs 15.2 KB
using Common;

namespace DeviceLibrary
{
    /// <summary>
    /// 充电任务
    /// </summary>
    public class ChargeJob : Job
    {
        /// <summary>
        /// 充电任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置</param>
        public ChargeJob(string agvPlae)
        {
            this.agvPlace = agvPlae;
        }


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

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

        private JobStep<CHARGE_STEP> jobStep = new JobStep<CHARGE_STEP>(CHARGE_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;
            CurTaskState = MissionSys.GetTakJobState(CurTaskID);
            if (jobStep.IsStep(CHARGE_STEP.NONE))
            {
                if (agv.Battery > AGVManager.Charge.BatteryMax)
                {
                    if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位
                    {
                        jobStep.ToNextStep(CHARGE_STEP.END);
                        runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv,SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace))
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
                        runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}风淋门", agv.Battery,agvPlace,SettingString.RoomC_Name);
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv,SettingString.DoorAirOut);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
                        runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门", agv.Battery, agvPlace, SettingString.RoomC_Name);
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv,SettingString.DoorCToD);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;

                        MissionSys.AssignMission(agv,SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                }
                else
                {
                    if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix) && AGVManager.CheckIsInAirDoor(agvPlace))
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
                        runInfo =string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}风淋门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace,SettingString.RoomC_Name);
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(), runInfo);
                        jobStep.Msg = msg;

                        MissionSys.AssignMission(agv,SettingString.DoorAirOut);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else if (agvPlace.StartsWith(SettingString.RoomC_Name_Prefix))
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
                        runInfo = string.Format("电量{0}%小于最大电量{1}%,从当前位置{2}回到充电位,先过{3}门", agv.Battery, AGVManager.Charge.BatteryMax, agvPlace, SettingString.RoomC_Name);
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;

                        MissionSys.AssignMission(agv,SettingString.DoorCToD);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else
                    {

                        if (!AGVManager.Charge.StartCharge(agv))
                        {
                            jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                            runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;
                            MissionSys.AssignMission(agv,SettingString.Standby);
                            UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        }
                        else
                        {
                            jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                            runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "去充电位";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;
                            UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        }
                    }
                }

            }
            else if (jobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
            {
                if (MissionSys.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
                {
                    jobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR);
                    runInfo = string.Format("电量充足{0}%,从当前位置{1}回到待机位,先过{2}门",agv.Battery, agvPlace,SettingString.RoomC_Name);
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    MissionSys.AssignMission(agv, SettingString.DoorCToD);
                    UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                }
            }
            else if (jobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_ROOMD_DOOR))
            {
                if (MissionSys.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    if (agv.Battery >AGVManager.Charge.BatteryMax)
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        runInfo = "电量充足" + agv.Battery + "%,从当前位置" + agvPlace + "回到待机位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        MissionSys.AssignMission(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else
                    {
                        if (!AGVManager.Charge.StartCharge(agv))
                        {
                            jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                            runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;

                            MissionSys.AssignMission(agv, SettingString.Standby);
                            UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        }
                        else
                        {
                            jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                            runInfo = "电量" + agv.Battery + "%小于最大电量" + AGVManager.Charge.BatteryMax + "%,从当前位置" + agvPlace + "回到充电位";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;
                            UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                        }
                    }

                }
            }
            else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
            {
                if (MissionSys.CheckTaskIsOK(agv, CurTarName,CurTaskState))
                {
                    jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
                    runInfo = "开始充电任务";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                }
            }
            else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
            {
                if (CheckRandomCharge(agv))
                {
                    if (agv.Battery >= AGVManager.Charge.BatteryMax)
                    {
                        jobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        runInfo = "电量充足,回待机位";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                        AGVManager.Charge.DelOccupyInfo(agv);
                        MissionSys.AssignMission(agv, SettingString.Standby);
                        UpdateJobTaskInfo(agv.CurTarName, agv.CurTaskID);
                    }
                    else if (agv.Battery >= AGVManager.Charge.BatteryMin)
                    {
                        Job job = AGVManager.control.GetJob(agv);
                        if (job != null && !(job is ChargeJob))
                        {
                            AGVManager.Charge.DelOccupyInfo(agv);
                            runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;
                            return job;
                        }

                    }
                }
                else//固定充电桩
                {
                    if (agv.Battery >= AGVManager.Charge.BatteryMax)
                    {
                        jobStep.ToNextStep(CHARGE_STEP.END);
                        runInfo = "充电完成";
                        msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                        jobStep.Msg = msg;
                    }
                    else if (agv.Battery >= AGVManager.Charge.BatteryMin)
                    {
                        Job job = AGVManager.control.GetJob(agv);
                        if (job != null && !(job is ChargeJob))
                        {
                            runInfo = "充电过程中检测到任务,电量" + agv.Battery + "%大于最小电量" + AGVManager.Charge.BatteryMin + "%,中断充电执行任务";
                            msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                            jobStep.Msg = msg;
                            AGVManager.Charge.DelOccupyInfo(agv);
                            return job;
                        }
                    }
                }


            }
            else if (jobStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY))
            {
                if (MissionSys.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
                {
                    jobStep.ToNextStep(CHARGE_STEP.END);
                    runInfo = "充电完成,到达待机位";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                }
            }
            else if (jobStep.IsStep(CHARGE_STEP.END))
            {
                runInfo = "等待任务";
                Job job = AGVManager.control.GetJob(agv);
                if (job != null && !(job is ChargeJob))
                {
                    runInfo = "在待机位检测到任务,执行任务";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    AGVManager.Charge.DelOccupyInfo(agv);
                    return job;
                }
                else if (job == null && agv.Battery < AGVManager.Charge.BatteryMax / 2)
                {
                    jobStep.ToNextStep(CHARGE_STEP.NONE);
                    runInfo = "在待机位暂无任务,且当前电量小于" + AGVManager.Charge.BatteryMax / 2 + "%,去充电位";
                    msg += string.Format("[{0}] {1}", jobStep.CurStep(),runInfo);
                    jobStep.Msg = msg;
                    AGVManager.Charge.DelOccupyInfo(agv);
                }
            }
            return this;
        }

        /// <summary>
        /// 检查当前小车是否是共用充电桩的小车
        /// </summary>
        /// <returns></returns>
        private bool CheckRandomCharge(Agv_Info agv)
        {
            if (SettingString.RandomCharge_IPs.Contains(agv.IP))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// AGV充电流程
        /// </summary>
        private enum CHARGE_STEP
        {
            /// <summary>
            /// 
            /// </summary>
            NONE,
            /// <summary>
            /// 等待到达风淋门
            /// </summary>
            WAIT_AGV_REACH_AIR_DOOR,
            /// <summary>
            /// 等待到达4D门
            /// </summary>
            WAIT_AGV_REACH_ROOMD_DOOR,
            /// <summary>
            /// 等待AGV到达充电位
            /// </summary>
            WAIT_REACH_CHARGE_STATION,
            /// <summary>
            /// 等待充电完成
            /// </summary>
            WAIT_REACH_CHARGE_OK,
            /// <summary>
            /// 充电完成去待机位
            /// </summary>
            WAIT_REACH_STANDBY,
            /// <summary>
            /// 
            /// </summary>
            END
        }
    }

}