ChargeJob.cs 5.3 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 = "充电任务";
        }
        public ChargeJob() : base() { JobName = "充电任务"; }
        int BatteryMax = ChargePileManager.GetChargePiles().BatteryMax;
        int BatteryMin = ChargePileManager.GetChargePiles().BatteryMin;
        /// <summary>
        /// 充电任务
        /// </summary>
        /// <param name="agv"></param>
        public override Job Run(AgvInfo agv)
        {
            agv.SetJobContext(new bean.agv.JobContext()
            {
            });
            if (JobRunStep.IsStep(RunStep.NONE))
            {
                ClearLiftNodeOccupied(agv);
                if (!ChargePileManager.HasEmpty(agv, out ChargePile charge))
                {
                    runInfo = $"无空闲充电桩,从" + JobParam.SrcNode + "回到待机位";
                    JobRunStep.Msg = runInfo;
                    return new StandyJob(new JobParam(JobParam.SrcNode.ToCopy()));
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.CHARGE_WAIT_REACH_CHARGE);
                    runInfo = $"当前电量{agv.Battery}小于最大电量{BatteryMax},从{JobParam.SrcNode}去{charge.AliceName}";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, charge);
                    ChargePileManager.StartCharge(agv, charge.Name);
                }
            }
            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
                        {
                           
                        }
                    }
                }
                else//固定充电桩
                {
                    if (agv.Battery >= ChargePileManager.GetChargePiles().BatteryMax)
                    {
                        runInfo = "充电完成";
                        JobRunStep.Msg = runInfo;
                        JobRunStep.EndJob();
                        return new StandyJob(new JobParam(agv.Place));
                    }
                    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(AgvInfo agv)
        {
            if (ChargePileManager.CheckIsRandom(agv))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

}