ChargeJob.cs 6.1 KB
using System;
using AGVControl_Steel;

namespace Model
{
    /// <summary>
    /// 充电工作
    /// </summary>
    public class ChargeJob : Job
    {
        private string id;
        private JobStep<ChargeStep> chargeStep;

        /// <summary>
        /// 充电工作
        /// </summary>
        public ChargeJob()
        {
            chargeStep = new JobStep<ChargeStep>(ChargeStep.None);
        }

        /// <summary>
        /// 任务执行
        /// </summary>
        /// <param name="info"></param>
        public override Job Execute(AgvInfo info)
        {
            if (chargeStep.IsEqual(ChargeStep.None))
            {
                None(info);
            }
            else if (chargeStep.IsEqual(ChargeStep.WaitWorkshopDoor))
            {
                WaitWorkshopDoor(info);
            }
            else if (chargeStep.IsEqual(ChargeStep.WaitChargeStation))
            {
                WaitChargeStation(info);
            }
            else if (chargeStep.IsEqual(ChargeStep.Charging))
            {
                if (info.Battery == info.BatteryMax)
                {
                    chargeStep.NextStep(ChargeStep.End);
                    chargeStep.Msg = info.FullName + "电量达到" + info.BatteryMax + ",充电工作结束";
                }
                else if (info.Battery > info.BatteryMin)
                {
                    Job job = Common.steelManage.GetSteelJob();
                    if (job != null) return job;
                }
            }
            else if (chargeStep.IsEqual(ChargeStep.End))
            {
                Common.log.Info(info.FullName + "ChargeJob结束,切换StandbyJob");
                return new StandbyJob();
            }
            return this;
        }



        private void None(AgvInfo info)
        {
            if (info.IsSelfWorkshop())
            {
                if (info.Workshop == Common.WORKSHOP_4D)
                    mission = Common.MISSION_CHARGE_4D;
                else if (info.Workshop == Common.WORKSHOP_4C)
                    mission = Common.MISSION_CHARGE_4C;

                rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
                if (rtn)
                {
                    chargeStep.NextStep(ChargeStep.WaitChargeStation);
                    chargeStep.Msg = info.FullName + "在" + info.Workshop + "车间,去充电位";
                }
                else
                {
                    chargeStep.Msg = info.FullName + "发送" + mission + "任务失败";
                }
            }
            else
            {
                if (info.Workshop == Common.WORKSHOP_4D)
                    mission = Common.MISSION_MOVE_4C_4D;
                else if (info.Workshop == Common.WORKSHOP_4C)
                    mission = Common.MISSION_MOVE_4D_4C;

                rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
                if (rtn)
                {
                    chargeStep.NextStep(ChargeStep.WaitWorkshopDoor);
                    chargeStep.Msg = info.FullName + "在" + info.Workshop + "车间,先过车间门";
                }
                else
                {
                    chargeStep.Msg = info.FullName + "发送" + mission + "任务失败";
                }
            }
        }

        private void WaitWorkshopDoor(AgvInfo info)
        {
            rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
            if (rtn)
            {
                if (state == MissionState.Done.ToString())
                {
                    if (info.Workshop == Common.WORKSHOP_4D)
                        mission = Common.MISSION_CHARGE_4D;
                    else if (info.Workshop == Common.WORKSHOP_4C)
                        mission = Common.MISSION_CHARGE_4C;

                    rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
                    if (rtn)
                    {
                        chargeStep.NextStep(ChargeStep.WaitChargeStation);
                        chargeStep.Msg = info.FullName + "在" + info.Workshop + "车间,去充电位";
                    }
                    else
                    {
                        chargeStep.Msg = info.FullName + "发送" + mission + "任务失败";
                    }
                }
                else if (state == MissionState.Aborted.ToString())
                {
                    chargeStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
                }
            }
            else
            {
                chargeStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
            }
        }

        private void WaitChargeStation(AgvInfo info)
        {
            rtn = Common.mir.Get_Register(info.IP, info.Authorization, 20, out int value);
            if (rtn)
            {
                if (value == 1)
                {
                    chargeStep.NextStep(ChargeStep.Charging);
                    chargeStep.Msg = info.FullName + "到达充电位,准备充电";
                }
            }
            else
            {
                chargeStep.Msg = info.FullName + "获取PLC20失败";
            }
        }





        /// <summary>
        /// 充电步骤
        /// </summary>
        private enum ChargeStep
        {
            /// <summary>
            /// 无
            /// </summary>
            None,
            /// <summary>
            /// 充电结束
            /// </summary>
            End,
            /// <summary>
            /// 移动到车间门口
            /// </summary>
            WaitWorkshopDoor,
            /// <summary>
            /// 移动到充电位置
            /// </summary>
            WaitChargeStation,
            /// <summary>
            /// 移动到待机位
            /// </summary>
            WaitStandby,
            /// <summary>
            /// 充电中
            /// </summary>
            Charging,
            /// <summary>
            /// 发送任务
            /// </summary>
            SendMission
        }

    }
}