MissionJob.cs 6.8 KB
/*
 * 这是一个子job,只运行一个小车任务,需要其他job来调用
 * 
 */

using System;
using Model;

namespace BLL
{
    public class MissionJob : IJob
    {
        private string _id;
        private string _mission;
        private AgvInfo _info;
        private int _times;  //发送次数
        private DateTime _getTime;  //用于调用API的间隔时间
        private JobStep<MissionStep> missionStep;

        public MissionJob(string mission)
        {
            _times = 0;
            _mission = mission;

            IsEnd = false;
            missionStep = new JobStep<MissionStep>(MissionStep.Send);
            Common.log.Debug(string.Format("加载MissionJob[{0}]", _mission));
        }

        public bool IsEnd { get; private set; }

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

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (missionStep.Equals(MissionStep.Send))
                Send();
            else if (missionStep.Equals(MissionStep.Working))
                Working();
            else if (missionStep.Equals(MissionStep.Error))
                Error();
            else if (missionStep.Equals(MissionStep.End))
                IsEnd = true;
            return this;
        }



        private void Send()
        {
            bool rtn;
            string log;
            _info.MissionName = _mission;

            if (Common.FleetSend)
                rtn = Common.mir.Add_Mission_Fleet(_info.FleetID, _info.Authorization, _mission, out _id);
            else
                rtn = Common.mir.Add_Mission(_info.IP, _info.Authorization, _mission, out _id);

            if (rtn)
            {
                _times = 0;
                _info.TaskName = _mission;
                log = string.Format("MissionJob To:{0},[{1}]发送成功", _info.Name, _mission);
                Common.log.Info(log);
                _getTime = DateTime.Now;
                missionStep.NextStep(MissionStep.Working);
            }
            else
            {
                _times++;
                log = string.Format("MissionJob To:{0},[{1}]发送失败{2}次", _info.Name, _mission, _times);
                Common.log.Warn(log);
            }
        }

        private void Working()
        {
            //TimeSpan span = DateTime.Now - _getTime;
            //if (span.TotalMilliseconds >= 5000)
            //{
                bool rtn;
                string state;
                string log;

                if (Common.FleetSend)
                    rtn = Common.mir.Get_MissionState_Fleet(_info.Authorization, _id, out state);
                else
                    rtn = Common.mir.Get_MissionState(_info.IP, _info.Authorization, _id, out state);

                if (rtn)
                {
                    log = string.Format("MissionJob To:{0},[{1}]任务状态{2}", _info.Name, _mission, state);
                    if (state == MissionState.Done.ToString())
                    {
                        missionStep.NextStep(MissionStep.End);
                        Common.log.Info(log);
                    }
                    else if (state == MissionState.Aborted.ToString())
                    {
                        missionStep.NextStep(MissionStep.Error);
                        Common.log.Warn(log);
                    }
                    else if (state == MissionState.Executing.ToString())
                    {
                        _getTime = DateTime.Now;
                        Common.log.Debug(log);
                    }
                    else if (state == MissionState.Pending.ToString())
                    {
                        _getTime = DateTime.Now;
                        Common.log.Debug(log);
                    }
                }
                else
                {
                    log = string.Format("MissionJob To:{0},[{1}]获取状态失败", _info.Name, _mission);
                    Common.log.Warn(log);
                }
            //}
        }

        private void Error()
        {
            Common.log.Info(string.Format("MissionJob To:{0},[{1}]重新发送", _info.Name, _mission));
            Common.mir.Clear_Error(_info.IP, _info.Authorization);
            System.Threading.Thread.Sleep(200);
            Common.mir.Del_Mission(_info.IP, _info.Authorization);
            missionStep.NextStep(MissionStep.Send);




            ////顶升机构上升PLC8=1,顶升机构下降PLC7=1
            //bool rtn = Common.mir.Get_Register(_info.IP, _info.Authorization, 8, out int reg8);
            //System.Threading.Thread.Sleep(200);
            //rtn = Common.mir.Get_Register(_info.IP, _info.Authorization, 7, out int reg7);
            //Common.log.Info(string.Format("顶升机构,上升PLC8={0},下降PLC7={1},ExistShelf={2}", reg8, reg7, _info.ExistShelf));

            //if (_info.ExistShelf == 1 && reg8 == 1)
            //{
            //    //机构上升,说明架子已经在小车上,即使任务后面报错,不应该重新发送任务拉取架子
            //    Common.log.Info(_info.Name + ", " + _mission + ", 虽然任务报错,但货架已经在小车身上,继续后面步骤");
            //    missionStep.NextStep(MissionStep.End);
            //}
            //else if (_info.ExistShelf == 0 && reg7 == 1)
            //{
            //    //机构下降,说明架子已经离开小车,即使任务后面报错,不应该重新发送任务释放架子
            //    Common.log.Info(_info.Name + ", " + _mission + ", 虽然任务报错,但货架已经离开小车,继续后面步骤");
            //    missionStep.NextStep(MissionStep.End);
            //}
            //else
            //{
            //    System.Threading.Thread.Sleep(100);
            //    Common.log.Info(string.Format("MissionJob To:{0},[{1}]重新发送", _info.Name, _mission));
            //    Common.mir.Clear_Error(_info.IP, _info.Authorization);
            //    System.Threading.Thread.Sleep(200);
            //    Common.mir.Del_Mission(_info.IP, _info.Authorization);
            //    missionStep.NextStep(MissionStep.Send);
            //}
        }

        private enum MissionStep
        {
            Send,
            Working,
            Error,
            End
        }

        private enum MissionState
        {
            /// <summary>
            /// 异常
            /// </summary>
            Aborted,
            /// <summary>
            /// 正在执行
            /// </summary>
            Executing,
            /// <summary>
            /// 未发送(fleet收到任务,还未分配给小车)
            /// </summary>
            Pending,
            /// <summary>
            /// 完成
            /// </summary>
            Done
        }
    }
}