ChargeJob.cs 7.4 KB
using Common;
using System;

namespace DeviceLibrary
{
    /// <summary>
    /// 充电任务
    /// </summary>
    public class ChargeJob : Job
    {
        /// <summary>
        /// 出完满料后-空车返回任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
        public ChargeJob(string agvPlae)
        {
            this.agvPlace = agvPlae;
            StartJobTime = DateTime.Now;
        }
        /// <summary>
        /// 接收任务时,agv的位置
        /// </summary>
        private string agvPlace = "";

        /// <summary>
        /// 运行信息
        /// </summary>
        public override string RunInfo
        {
            get { return string.Format("{0}", runInfo); }
        }
        private JobStep<CHARGE_STEP> curJobStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);

        /// <summary>
        /// 空车返回执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = "";
            bool rtn = false;
            agv.Msg = runInfo;
            JobName = "充电任务";
            StartJobTime = curJobStep.startTime;
            CurTaskState = CommonVar.GetTakJobState(agv);
            if (curJobStep.IsStep(CHARGE_STEP.NONE))
            {
                agv.HasError = false;
                if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
                {
                    curJobStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR);
                    runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "回到充电位,先到3D门";
                    msg += runInfo;
                    curJobStep.Msg = msg;

                    CommonVar.DoorMission(agv, SettingString.DoorCToD);
                     UpdateJobTaskInfo(agv);
                }
                else
                {

                    if (!CommonVar.Charge.StartCharge(agv))
                    {
                        runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],由于充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return new StandyJob(agv.Place);
                    }
                    else
                    {
                        curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                        runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                         UpdateJobTaskInfo(agv);
                    }
                }
            }

            else if (curJobStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_3D_DOOR))
            {
                if (CommonVar.CheckTaskMoveFinished(agv, SettingString.DoorCToD, CurTaskState))
                {
                    if (agv.Battery > CommonVar.Charge.BatteryMax)
                    {
                        runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "去到待机位";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return new StandyJob(agv.Place);
                    }
                    else
                    {
                        if (!CommonVar.Charge.StartCharge(agv))
                        {
                            runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                            msg += runInfo;
                            curJobStep.Msg = msg;
                            RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                            return new StandyJob(agv.Place);
                        }
                        else
                        {
                            curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                            runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + CommonVar.Charge.BatteryMax + "%],从当前位置" + agvPlace + "去到充电位";
                            msg += runInfo;
                            curJobStep.Msg = msg;
                             UpdateJobTaskInfo(agv);
                        }
                    }

                }
            }
            else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
            {
                if (CommonVar.CheckChargeIsStarting(agv))
                {
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    curJobStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
                    runInfo = "充电任务分配完成,去充电且等待任务";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                }
            }
            else if (curJobStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
            {
                if (agv.Battery > CommonVar.Charge.BatteryMax)
                {
                    runInfo = "充电完成,回待机位";
                    msg += runInfo;
                    curJobStep.Msg = msg;
                    CommonVar.Charge.DelOccupyInfoByAGV(agv);
                    RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                    return new StandyJob(agv.Place);
                }
                else if(agv.Battery > CommonVar.Charge.BatteryMin)
                {
                    Job job = CommonVar.control.GetJob(agv);
                    if (job != null && !(job is ChargeJob) && !(job is StandyJob))
                    {
                        runInfo = "在充电位检测到任务,电量[" + agv.Battery + " %]大于最小电量[" + CommonVar.Charge.BatteryMin + " %],可执行任务";
                        msg += runInfo;
                        curJobStep.Msg = msg;
                        CommonVar.Charge.DelOccupyInfoByAGV(agv);
                        RecordRunLog(agv, curJobStep.CurStep(), runInfo, agv.Place);
                        return job;
                    }
                }

            }
            else if (curJobStep.IsStep(CHARGE_STEP.END))
            {
            }
            return this;
        }

        /// <summary>
        /// AGV充电流程
        /// </summary>
        private enum CHARGE_STEP
        {
            /// <summary>
            /// 
            /// </summary>
            NONE,

            /// <summary>
            /// 等待到达4D门
            /// </summary>
            WAIT_AGV_REACH_3D_DOOR,
            /// <summary>
            /// 等待AGV到达充电位
            /// </summary>
            WAIT_REACH_CHARGE_STATION,
            /// <summary>
            /// 等待充电完成
            /// </summary>
            WAIT_REACH_CHARGE_OK,
            /// <summary>
            /// 充电完成去待机位
            /// </summary>
            WAIT_REACH_STANDBY,
            /// <summary>
            /// 
            /// </summary>
            END
        }
    }

}