ChargeJob.cs 5.8 KB
using System;
using Model;

namespace BLL
{
    public class ChargeJob : IJob
    {
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        private JobStep<ChargeStep> chargeStep;
       private IJob job;
        private const int CHARGE_PLC = 20;

        public ChargeJob()
        {
            chargeStep = new JobStep<ChargeStep>(ChargeStep.None);
            Common.log.Debug("加载ChargeJob");
        }

        public bool IsEnd { get; private set; }

        public string Msg
        {
            get
            {
                return chargeStep.Msg;
            }
        }

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (chargeStep.Equals(ChargeStep.None))
            {
                _info.From = "";
                _info.Place = "";
                _info.LogJson.SetMissionStart("充电任务", "充电桩");
                _info.LogJson.SetMissionStep("开始执行任务", ChargeStep.None.ToString());

                if (_info.IsWorkspace())
                    MoveWash();
                else
                    PassDoor();
            }
            else if (chargeStep.Equals(ChargeStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    MoveWash();
                    _info.LogJson.SetMissionStep("已过门", ChargeStep.PassDoor.ToString());
                }
            }
            else if (chargeStep.Equals(ChargeStep.WaitWashPoint))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.LogJson.SetMissionStep("到达" + _info.Workshop + "清洗房", ChargeStep.WaitWashPoint.ToString());
                    MoveCharge();
                }
            }
            else if (chargeStep.Equals(ChargeStep.MoveStation))
            {
                move.Execute(_info);
                MoveStation();
            }
            else if (chargeStep.Equals(ChargeStep.Charging))
            {
                Common.log.Info(string.Format("{0} 充电中 当前{1} 最小{2} 最大{3}", _info.Name, _info.Battery, _info.BatteryMin, _info.BatteryMax));

                move.Execute(_info);
                if (_info.Battery == _info.BatteryMax)
                {
                    chargeStep.Msg = _info.Name + " 电量达到" + _info.BatteryMax;
                    chargeStep.NextStep(ChargeStep.End);
                    _info.LogJson.SetMissionStep("结束充电", ChargeStep.Charging.ToString());
                }
                else if (_info.Battery > _info.BatteryMin)
                {
                    job = SteelManage.GetSteelJob(_info);
                    if (job != null)
                    {
                        _info.LogJson.SetMissionStep("结束充电", ChargeStep.Charging.ToString());
                        Common.log.Info(_info.Name + " 结束充电,接收到任务" + job.ToString());
                        move.DeleteTask(_info);
                        chargeStep.NextStep(ChargeStep.DeleteTask);
                    }
                }
            }
            else if (chargeStep.Equals(ChargeStep.DeleteTask))
            {
                move.Execute(_info);
                if (move.IsEnd)
                    return job;
                else
                    move.DeleteTask(_info); //没有成功删除时继续发删除
            }
            else if (chargeStep.Equals(ChargeStep.End))
            {
                _info.Place = "充电结束";
                //_info.LogJson.SetMissionStep("充电任务结束", ChargeStep.End.ToString());

                Common.mir.Del_Mission(_info.IP, _info.Authorization);
                chargeStep.Msg = _info.Name + " 充电工作结束,回待机位";
                return new StandbyJob();
            }

            return this;
        }





        private void MoveWash()
        {
            mission = Common.MISSION_MOVE_WASH + _info.Workshop;
            _info.Place = string.Format("去{0}清洗点", _info.Workshop);
            move = new MoveJob(mission);
            move.Execute(_info);
            chargeStep.NextStep(ChargeStep.WaitWashPoint);
            chargeStep.Msg = _info.Name + " 发送回清洗点任务 " + mission;
        }

        private void MoveCharge()
        {
            mission = Common.MISSION_CHARGE + _info.Workshop;
            _info.Place = "去充电位";
            move = new MoveJob(mission);
            move.Execute(_info);
            chargeStep.NextStep(ChargeStep.MoveStation);
            chargeStep.Msg = _info.Name + " 发送充电任务 " + mission;
        }

        private void PassDoor()
        {
            mission = Common.MISSION_PASS_DOOR_INTO + _info.Workshop;
            _info.Place = string.Format("去{0}车间", _info.Workshop);
            move = new MoveJob(mission);
            move.Execute(_info);
            chargeStep.NextStep(ChargeStep.PassDoor);
            chargeStep.Msg = _info.Name + " 发送过车间门任务 " + mission;
        }

        private void MoveStation()
        {
            bool rtn = Common.mir.Get_Register(_info.IP, _info.Authorization, CHARGE_PLC, out int value);
            if (rtn)
            {
                if (value == 1)
                {
                    _info.Place = "充电中";
                    chargeStep.Msg = _info.Name + " 到达充电位,准备充电";
                    chargeStep.NextStep(ChargeStep.Charging);
                    _info.LogJson.SetMissionStep("到达充电位", ChargeStep.MoveStation.ToString());

                }
            }
        }

        private enum ChargeStep
        {
            None,
            End,
            PassDoor,
            MoveStation,
            GoWashPoint,
            WaitWashPoint,
            Charging,
            DeleteTask
        }
    }

}