ChargeJob.cs 12.0 KB

using AGVControl;
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 AGVControl
{
    /// <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 { get; set; }

        public override bool IsEnd { get { return ChargeStep.IsStep(CHARGE_STEP.END); } }

        private JobStep<CHARGE_STEP> ChargeStep = new JobStep<CHARGE_STEP>(CHARGE_STEP.NONE);

        /// <summary>
        /// 空车返回执行
        /// </summary>
        /// <param name="agv"></param>
        public override Job Execute(Agv_Info agv)
        {
            string msg = agv.Name + " ";
            bool rtn = false;
            agv.Msg = ChargeStep.Msg;
            if (ChargeStep.IsStep(CHARGE_STEP.NONE))
            {
                if (agv.Battery > Common.chargeStatus.chargeMax)
                {
                    if (agv.Place.StartsWith(SettingString.Standby_Name_Prefix))//在待机位不操作
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.END);
                        msg += "在待机位,电量充足[" + agv.Battery + "%],等待任务";
                        ChargeStep.Msg = msg;
                    }

                    else if (agvPlace.StartsWith("G"))
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
                        msg += "电量充足["+ agv.Battery + "%],从当前位置4C-" + agvPlace + "回到待机位,先到4D门";
                        ChargeStep.Msg = msg;
                        Common.DoorMission(agv, SettingString.DoorCToD);
                    }
                    else
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        msg += "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
                        ChargeStep.Msg = msg;
                        //Common.StatusCharge(agv);
                        Common.MoveToNode(agv, SettingString.Standby);
                    }
                }
                else
                {
                    if (agvPlace.StartsWith("G"))
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
                        msg += "电量[" + agv.Battery + "%]小于最大电量["+ Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门";
                        ChargeStep.Msg = msg;
                        Common.DoorMission(agv, SettingString.DoorCToD);
                    }
                    else
                    {

                        if(!Common.StatusCharge(agv))
                        {
                            ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                            msg += "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                            ChargeStep.Msg = msg;
                            Common.MoveToNode(agv, SettingString.Standby);
                        }
                        else
                        {
                            ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                            msg += "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位";
                            ChargeStep.Msg = msg;
                        }
                    }
                }

            }

            else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
            {
                if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, agv.CurTaskGUID))
                {
                    if (agv.Battery > Common.chargeStatus.chargeMax)
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        msg += "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位";
                        ChargeStep.Msg = msg;
                        Common.MoveToNode(agv, SettingString.Standby);
                    }
                    else
                    {
                        if (!Common.StatusCharge(agv))
                        {
                            ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                            msg += "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],充电桩有小车,从当前位置" + agvPlace + "回到待机位";
                            ChargeStep.Msg = msg;
                            Common.MoveToNode(agv, SettingString.Standby);
                        }
                        else
                        {
                            ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION);
                            msg += "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位";
                            ChargeStep.Msg = msg;
                        }
                    }

                }
            }
            else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_STATION))
            {
                if (Common.CheckTaskFinished(agv, agv.CurTaskName))
                {
                    ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
                    msg += "充电任务分配完成,去充电且等待任务";
                    ChargeStep.Msg = msg;
                }
            }
            else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK))
            {
                if (CheckRandomCharge(agv))
                {
                    if (agv.Battery >= Common.chargeStatus.chargeMax)
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_STANDBY);
                        msg += "电量充足,回待机位";
                        ChargeStep.Msg = msg;
                        if (Common.chargeStatus.charge3.Equals(agv.Name))
                        {
                            Common.chargeStatus.charge3 = "";
                        }
                        if (Common.chargeStatus.charge4.Equals(agv.Name))
                        {
                            Common.chargeStatus.charge4 = "";
                        }
                        Common.MoveToNode(agv, SettingString.Standby);
                    }
                    else if (agv.Battery >= Common.chargeStatus.chargeMin)
                    {
                        Job job = Common.control.GetJob(agv);
                        if (job != null && !(job is ChargeJob))
                        {
                            if (Common.chargeStatus.charge3.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge3 = "";
                            }
                            if (Common.chargeStatus.charge4.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge4 = "";
                            }
                            msg += "充电过程检测到任务,电量["+agv.Battery+"]大于最小电量["+Common.chargeStatus.chargeMin+"],中断充电执行任务";
                            ChargeStep.Msg = msg;
                            if (Common.chargeStatus.charge3.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge3 = "";
                            }
                            if (Common.chargeStatus.charge4.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge4 = "";
                            }
                            return job;
                        }

                    }
                }
                else
                {
                    if (agv.Battery >= Common.chargeStatus.chargeMax)
                    {
                        ChargeStep.ToNextStep(CHARGE_STEP.END);
                        msg += "充电完成";
                        ChargeStep.Msg = msg;
                    }
                    else if (agv.Battery >= Common.chargeStatus.chargeMin)
                    {
                        Job job = Common.control.GetJob(agv);
                        if (job != null && !(job is ChargeJob))
                        {
                            msg += "充电过程检测到任务,电量[" + agv.Battery + "]大于最小电量[" + Common.chargeStatus.chargeMin + "],中断充电执行任务";
                            ChargeStep.Msg = msg;
                            if (Common.chargeStatus.charge3.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge3 = "";
                            }
                            if (Common.chargeStatus.charge4.Equals(agv.Name))
                            {
                                Common.chargeStatus.charge4 = "";
                            }
                            return job;
                        }
                    }
                }


            }
            else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_REACH_STANDBY))
            {
                if (Common.CheckTaskFinished(agv, SettingString.Standby, agv.CurTaskGUID))
                {
                    ChargeStep.ToNextStep(CHARGE_STEP.END);
                    msg += "充电完成,到达待机位";
                    ChargeStep.Msg = msg;
                }
            }
            else if (ChargeStep.IsStep(CHARGE_STEP.END))
            {
                Job job = Common.control.GetJob(agv);
                if (job != null && !(job is ChargeJob))
                {
                    msg += "在待机位检测到任务,执行任务";
                    ChargeStep.Msg = msg;
                    if (Common.chargeStatus.charge3.Equals(agv.Name))
                    {
                        Common.chargeStatus.charge3 = "";
                    }
                    if (Common.chargeStatus.charge4.Equals(agv.Name))
                    {
                        Common.chargeStatus.charge4 = "";
                    }
                    return job;
                }
            }
            return this;
        }

        /// <summary>
        /// 检查当前小车是否是共用充电桩的小车
        /// </summary>
        /// <returns></returns>
        private bool CheckRandomCharge(Agv_Info agv)
        {
            if (agv.IP.Equals(SettingString.RandomCharge_IP1) || agv.IP.Equals(SettingString.RandomCharge_IP2) ||
                agv.IP.Equals(SettingString.RandomCharge_IP3) || agv.IP.Equals(SettingString.RandomCharge_IP4))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        /// <summary>
        /// AGV充电流程
        /// </summary>
        private enum CHARGE_STEP
        {
            /// <summary>
            /// 
            /// </summary>
            NONE,

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

}