Control.cs 10.2 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;
using System.Xml.Linq;
using Common;
using DeviceLibrary.manager;
using log4net.Util;
using RestSharp;

namespace DeviceLibrary
{
    public class Control
    {
        private static log4net.ILog log = log4net.LogManager.GetLogger("Control");
        static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();

        private System.Timers.Timer AgvCallTimer;
        private System.Timers.Timer AgvStateTimer;
        private System.Timers.Timer NodeStateTimer;
        private const int REG_STATUS = 20;
       
        //public event AgvChangedEvent NodeChangedEvent;
        public Control()
        {
            AgvCallTimer = new System.Timers.Timer
            {
                Interval = 500,
                AutoReset = true,
                Enabled = false
            };
            AgvCallTimer.Elapsed += AgvCallTimer_Elapsed;

            AgvStateTimer = new System.Timers.Timer
            {
                Interval = 1000,
                AutoReset = true,
                Enabled = false
            };
            AgvStateTimer.Elapsed += AgvStateTimer_Elapsed;
            NodeStateTimer = new System.Timers.Timer
            {
                Interval = 2000,
                AutoReset = true,
                Enabled = false
            };
            NodeStateTimer.Elapsed += NodeStateTimer_Elapsed;
        }


        public void Start()
        {
            AgvCallTimer.Enabled = true;
            AgvStateTimer.Enabled = true;
            NodeStateTimer.Enabled = true;
            AgvCallTimer.Start();
            AgvStateTimer.Start();
            NodeStateTimer.Start();
        }

        public void Stop()
        {
            AgvCallTimer.Enabled = false;
            AgvStateTimer.Enabled = false;
            NodeStateTimer.Enabled = false;
            AgvCallTimer.Stop();
            AgvStateTimer.Stop();
            NodeStateTimer.Stop();
        }
        private bool NodeStateInProcess = false;
        private void NodeStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (NodeStateInProcess) return;
            NodeStateInProcess = true;
            try
            {
                foreach (string item in AGVManager.sysClients)
                {
                    List<AgvInfo> agvs = AGVManager.agvInfo.FindAll(s => s.Client.Equals(item) && s.Auto && !s.IsDebug && s.IsCon.Equals(true)// 
                    && s.Scope != null && s.JobContext != null && s.JobContext.MissionId.Equals(""));//&& s.Scope.Remark != null
                    if (agvs != null && agvs.Count > 0)
                    {
                        foreach (AgvInfo agv in agvs)
                        {
                            string[] lifts = agv.Scope.Remark.Split(',');
                            foreach (string eleva in lifts)
                            {
                                lift.LiftContext.UpdateStatus(new lift.ClientStatus() { hasIdleAgv = true, liftId = eleva, sourceClient = item });
                            }
                        }

                    }
                    else
                    {
                        agvs = AGVManager.agvInfo.FindAll(s => s.Client.Equals(item));
                        foreach (AgvInfo agv in agvs)
                        {
                            string[] lifts = agv.Scope.Remark.Split(',');
                            foreach (string eleva in lifts)
                            {
                                lift.LiftContext.UpdateStatus(new lift.ClientStatus() { hasIdleAgv = false, liftId = eleva, sourceClient = item });
                            }
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                LogUtil.error("UpdateStatus " + ex.StackTrace);
            }
            NodeStateInProcess = false;
        }
        private bool AgvStateInProcess = false;
        //private eAGVState preAGVState = eAGVState.None;
        private void AgvStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (AgvStateInProcess) return;
            AgvStateInProcess = true;
            HttpManager.AUOIsUsingD2(out MissionManager.AUOResult);
            manager.UploadManager.UploadAgvState();
            AgvStateInProcess = false;
        }
        /// <summary>
        /// 从节点获取任务
        /// </summary>
        /// <param name="agv_Info"></param>
        /// <returns></returns>
        public Job GetJob(AgvInfo agv_Info)
        {
            foreach (JobType jobType in AGVManager.jobTypes)
            {
                Job job = null;
                if (agv_Info.Auto)
                    job = jobType.GetNewJob(agv_Info);
                else
                    return null;
                if (job != null)
                {
                    return job;
                }
            }
            return null;
        }

        private bool AgvCallInProcess = false;
        private void AgvCallTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (AgvCallInProcess) return;
            AgvCallInProcess = true;
            for (int i = 0; i < AGVManager.agvInfo.Count; i++)
            {
                try
                {
                    AgvInfo agv = AGVManager.agvInfo[i];
                    if (!agv.IsCon) continue;   //AGV网络连接
                    if (!AGVManager.agvInfo[i].Auto) continue;   //AGV是否可用
                    if (AGVManager.agvInfo[i].StateID.Equals(eAGVState.Error))
                    {
                        MiR_API.Clear_Error(AGVManager.agvInfo[i]);
                        continue;
                    }
                    if (AGVManager.agvInfo[i].StateID.Equals(eAGVState.Pause))
                    {
                        MiR_API.State_Ready(AGVManager.agvInfo[i]);
                    }
                    //if (!AGVManager.agvInfo[i].StateID.Equals(eAGVState.Ready)
                    //    && !AGVManager.agvInfo[i].StateID.Equals(eAGVState.Executing) && !AGVManager.agvInfo[i].StateID.Equals(eAGVState.None))
                    //{
                    //    continue;
                    //}
                    //if (!agv.TaskRunState.IsAllocatingTask && agv.Auto && agv.CurJob != null && agv.TaskRunState.TaskID.Equals(-1)
                    //        && agv.TaskRunState.Task != null && !string.IsNullOrEmpty(agv.TaskRunState.Task.Guid))
                    //{
                    //    if (!MiR_API.Get_MissionByDescrp(agv))
                    //    {
                    //        LogUtil.info($"{agv.Name}:Task=-1处理,Fleet无任务,重发任务:{agv.TaskRunState.Task.Name}");
                    //        agv.CurJob.ResendTask(agv);
                    //    }
                    //    else
                    //    {
                    //        LogUtil.info($"{agv.Name}:Task=-1处理,Fleet有任务,自动赋值FleetTaskID={agv.TaskRunState.TaskID}");
                    //    }
                    //}
                    if (agv.TaskRunState.DeWaitTaskQueue(out AgvTask task))
                    {
                        if (agv.CurJob != null)
                        {
                            agv.CurJob.ResendTask(agv);
                        }
                        else
                        {
                            agv.TaskRunState.ClearWaitTaskQueue();
                        }
                    }
                    if (agv.CurJob == null)
                    {
                        Job job = GetJob(agv);
                        if (job != null)
                        {
                            agv.CurJob = job;
                            LogUtil.info($"{agv.Name} 收到任务 {job?.JobParam?.GetMissionInfo()?.missionId??""}");
                        }
                    }
                    else
                    {
                        agv.CurJob = agv.CurJob.Execute(agv);
                        if(agv.CurJob==null)
                        {
                            LogUtil.info($"{agv.Name} 任务完成");
                        }
                    }
                }
                catch (Exception ex)
                {
                    log.Error("AgvCall " + ex.Message + ex.StackTrace);
                }
            }

            AgvCallInProcess = false;

        }


        public static bool CheckOnline(AgvInfo agv)
        {
            bool rtn = MiR_API.CheckIP(agv.IP);
            if (rtn)
            {
                if (agv.IsCon)
                {
                    //log.Debug(AGVManager.agvInfo[idx].Name + " Online");
                }
                else
                {
                    agv.IsCon = true;
                    log.Info(agv.Name + " Online");
                }
            }
            else
            {
                if (agv.IsCon)
                {
                    agv.IsCon = false;
                    log.Info(agv.Name + " Offline");
                }
                else
                {
                    //log.Debug(AGVManager.agvInfo[idx].Name + " Offline");
                }
            }
            return rtn;
        }

    }
}
public class RunInfo
{
    /// <summary>
    /// AGV编号
    /// </summary>
    public string AGVNum { get; set; } = "";
    /// <summary>
    /// 时间
    /// </summary>
    public string DateTime { get; set; } = "";
    /// <summary>
    /// 任务信息
    /// </summary>
    public string MissionInfo { get; set; } = "";
    public RunInfo(string AGVNum, string missionInfo)
    {
        //2006-01-02 15:04:05
        DateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
        this.AGVNum = AGVNum;
        MissionInfo = missionInfo;
    }
    public RunInfo() { }
    public override bool Equals(object obj)
    {
        if (obj is RunInfo)
        {
            RunInfo info = (RunInfo)obj;
            if (this.MissionInfo.Equals(info.MissionInfo))
                return true;
            this.MissionInfo = info.MissionInfo;
        }
        return false;
    }
    public override string ToString()
    {
        return JsonHelper.SerializeObject(this);
    }
}