ChargeJob.cs 7.8 KB
using Common;
using DeviceLibrary.bean;
namespace DeviceLibrary
{
    /// <summary>
    /// 充电任务
    /// </summary>
    public class ChargeJob : Job
    {
        /// <summary>
        /// 充电任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置</param>
        public ChargeJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "充电任务";
        }
        int BatteryMax = ChargePileManager.GetChargePiles().BatteryMax;
        int BatteryMin = ChargePileManager.GetChargePiles().BatteryMin;
        /// <summary>
        /// 充电任务
        /// </summary>
        /// <param name="agv"></param>
        public override Job Run(Agv_Info agv)
        {
            if (JobRunStep.IsStep(RunStep.NONE))
            {
                {
                    if (JobParam.SrcNode.Area.Equals(Area.Air_C))
                    {
                        JobRunStep.ToNextStep(RunStep.WAIT_OUT_AIR_DOOR);
                        runInfo = string.Format("电量{0}%小于最大电量{1}%,从{2}回到充电位,先过风淋门", agv.Battery, BatteryMax, JobParam.SrcNode);
                        JobRunStep.Msg = runInfo;

                        AllocateTask(agv, SettingString.DoorAirOut);
                    }
                    else if (JobParam.SrcNode.Area.Equals(Area.C))
                    {
                        JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_D);
                        runInfo = string.Format("电量{0}%小于最大电量{1}%,从{2}回到充电位,先过门", agv.Battery, BatteryMax, JobParam.SrcNode.Name);
                        JobRunStep.Msg = runInfo;

                        AllocateTask(agv, SettingString.DoorCToD);
                    }
                    else
                    {

                        if (!ChargePileManager.HasEmpty(agv,out string chargename))
                        {
                            runInfo = "充电桩有小车,从" + JobParam.SrcNode + "回到待机位";
                            JobRunStep.Msg = runInfo;
                            return new StandyJob(new JobParam(JobParam.TargetNode.ToCopy(),manager.NodeManager.GetNodeByType(NodeType.Standby)));
                        }
                        else
                        {
                            JobRunStep.ToNextStep(RunStep.CHARGE_WAIT_REACH_CHARGE);
                            runInfo = "电量" + agv.Battery + "%小于最大电量" + BatteryMax + "%,从" + JobParam.SrcNode + "去充电位";
                            JobRunStep.Msg = runInfo;
                            AllocateTask(agv, chargename);
                            ChargePileManager.StartCharge(agv, chargename);
                        }
                    }
                }

            }
            else if (JobRunStep.IsStep(RunStep.WAIT_OUT_AIR_DOOR))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.WAIT_IN_ROOM_D);
                    runInfo = string.Format("从{1}回到充电位,先过门", agv.Battery, JobParam.SrcNode);
                    JobRunStep.Msg = runInfo;

                    AllocateTask(agv, SettingString.DoorCToD);
                }
            }
            else if (JobRunStep.IsStep(RunStep.WAIT_IN_ROOM_D))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {

                    if (!ChargePileManager.HasEmpty(agv, out string chargename))
                    {
                        runInfo = "充电桩有小车,从" + JobParam.SrcNode + "回到待机位";
                        JobRunStep.Msg = runInfo;
                        JobRunStep.EndJob();
                        return new StandyJob(new JobParam(JobParam.TargetNode.ToCopy(),manager.NodeManager.GetNodeByType(NodeType.Standby)));
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.CHARGE_WAIT_REACH_CHARGE);
                        runInfo = "电量" + agv.Battery + "%小于最大电量" + BatteryMax + "%,从" + JobParam.SrcNode + "回到充电位";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, chargename);
                        ChargePileManager.StartCharge(agv,chargename);
                    }

                }
            }
            else if (JobRunStep.IsStep(RunStep.CHARGE_WAIT_REACH_CHARGE))
            {
                if (agv.TaskRunState.CheckAllocateOk())
                {
                    JobRunStep.ToNextStep(RunStep.CHARGE_WAIT_CHARGE_OK);
                    runInfo = "开始充电任务";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.CHARGE_WAIT_CHARGE_OK))
            {
                if (CheckRandomCharge(agv))
                {
                    if (agv.Battery >= BatteryMax)
                    {
                        runInfo = "电量充足,回待机位";
                        JobRunStep.Msg = runInfo;
                        ChargePileManager.StopCharge(agv);
                        JobRunStep.EndJob();
                        return new StandyJob(new JobParam(JobParam.SrcNode.ToCopy()));
                    }
                    else if (agv.Battery >= BatteryMin)
                    {
                        Job job = AGVManager.control.GetJob(agv);
                        if (job != null && ((job is ChargeJob) || (job is StandyJob)))
                        {
                        }
                        else if (job != null)
                        {
                            ChargePileManager.StopCharge(agv);
                            runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + BatteryMin + "%,中断充电执行任务";
                            JobRunStep.Msg = runInfo;
                            JobRunStep.EndJob();
                            return job;
                        }
                    }
                }
                else//固定充电桩
                {
                    if (agv.Battery >= ChargePileManager.GetChargePiles().BatteryMax)
                    {
                        runInfo = "充电完成";
                        JobRunStep.Msg = runInfo;
                        JobRunStep.EndJob();
                        return new StandyJob(new JobParam(JobParam.TargetNode.ToCopy()));
                    }
                    else if (agv.Battery >= ChargePileManager.GetChargePiles().BatteryMin)
                    {
                        Job job = AGVManager.control.GetJob(agv);
                        if (job != null && ((job is ChargeJob) || (job is StandyJob)))
                        {
                        }
                        else if (job != null)
                        {
                            ChargePileManager.StopCharge(agv);
                            runInfo = "充电过程检测到任务,电量" + agv.Battery + "%大于最小电量" + BatteryMin + "%,中断充电执行任务";
                            JobRunStep.Msg = runInfo;
                            JobRunStep.EndJob();
                            return job;
                        }
                    }
                }


            }
            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return this;
        }

        /// <summary>
        /// 检查当前小车是否是共用充电桩的小车
        /// </summary>
        /// <returns></returns>
        private bool CheckRandomCharge(Agv_Info agv)
        {
            if (ChargePileManager.CheckIsRandom(agv))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

}