AgvClient.cs 8.4 KB
using Asa;
using log4net;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class AgvClient
    {
        public static bool CurrCancelState = true;
      //  public static readonly ILog LOGGER = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
        private static string ServerIp = ConfigAppSettings.GetValue(Setting_Init.AgvServerIp);
        private static Asa.AgvClient agvClient;
        private static Dictionary<string, Asa.ClientAction> actionMap = new Dictionary<string, Asa.ClientAction>();
        public static List<string> NodeList = new List<string>();
        private static bool isInit = false;
        public static void Init()
        {
            try
            {
                if (!isInit)
                {
                    isInit = true;
                    agvClient = new Asa.AgvClient(ServerIp);
                    agvClient.CancelState = true;
                    agvClient.Log += AgvClient_Log;
                    agvClient.Arrive += AgvClient_Arrive; 
                    agvClient.Ready += AgvClient_Ready;
                    agvClient.CloseDoor += AgvClient_CloseDoor;
                    agvClient.EnterShelf += AgvClient_EnterShelf;
                    agvClient.SendLog = true;
                }
                actionMap = new Dictionary<string, Asa.ClientAction>();
                //foreach (string key in NodeList)
                //{
                //    actionMap.Add(key, Asa.ClientAction.None);
                //}
                agvClient.SendSleep = 5;
                agvClient.Connect();
                foreach (string str in NodeList)
                {
                    SetStatus(str);
                }

            }
            catch (Exception ex)
            {
                LogUtil.error("初始化agvClient " + ServerIp + " 出错:"+ ex.ToString());
            }
        }

        private static void AgvClient_EnterShelf(string id, string rfid)
        {
           // RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_EnterShelf [" + id + "] [" + rfid+ "]  ");
            StoreManager.Store.AGVProcess(id, ClientAction.Arrive);
            foreach (AC_BOX_Bean box in StoreManager.Store.BoxMap.Values)
            {
                if (box.Config.AgvNodeName.Equals(id))
                {
                    LogUtil.info("收到 AgvClient_EnterShelf [" + id + "] [" + rfid+ "]  ,设置 [" + box.Name + "] WaitShelfEnter = true");
                    box.WaitShelfEnter = true;
                    break;
                }
            }
        }
        public static void SetCancelState(bool isCancel)
        {
            CurrCancelState = isCancel;
            agvClient.CancelState = isCancel;
        }
        public  static Dictionary<string, DateTime> closeDoorTimeMap = new Dictionary<string, DateTime>(); 
        private static void AgvClient_CloseDoor(string id, string rfid)
        {
         //   RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_CloseDoor [" + id + "] [" + rfid+ "]  ");

            if (closeDoorTimeMap.ContainsKey(id))
            {
                closeDoorTimeMap.Remove(id);
            }
            closeDoorTimeMap.Add(id, DateTime.Now);
        }
        
        public static void SetStatus(string id, string mark = "", string shelfId = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low, bool isMust = false)
        {
            //  ClientAction currA = GetAction(id);
            if (!isMust)
            {
                if (actionMap.ContainsKey(id))
                {
                    ClientAction currA = actionMap[id]; //相同状态就设置一次
                    if (currA.Equals(action))
                    {
                        return;
                    }
                }
            }
            if (action.Equals(ClientAction.None))
            {
                mark = "0";
            }
            agvClient.SetStatus(id,mark, shelfId, action, level);
            UpdateAction(id, action);
        }

        private static void AgvClient_Ready(string id, string rfid)
        {
            UpdateAction(id, ClientAction.Ready);
           // RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + rfid+ "]  ");
            StoreManager.Store.AGVProcess(id, ClientAction.Ready);
        }
         

        private static void AgvClient_Arrive(string id, string rfid)
        {
            UpdateAction(id, ClientAction.Arrive);
           // RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_Arrive [" + id + "] [" + rfid+ "]   ");

            StoreManager.Store.AGVProcess(id, ClientAction.Arrive);
        }


        internal static bool ISConnected()
        {
            if (agvClient == null)
            {
                return false;
            }
            return agvClient.IsConn;
        }
 

        public static bool SetToNone(string id, string shelfId = "")
        {
            ClientAction currA = GetAction(id);
            if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter))
            {
                SetStatus(id, shelfId, shelfId, ClientAction.None);
                return true;
            }
            return false;
        }
        public static bool NeedEnter(string id, string mark = "0", string shelfId = "")
        {
            ClientAction currA = GetAction(id);
            if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter))
            { 
                SetStatus(id, mark, shelfId, ClientAction.NeedEnter);
                return true;
            }
            return false;
        }
        public static bool NeedLeave(string id, string mark, string shelfId )
        {
            //包装料会发往分盘区, 紧急料区, 包装线区
           // urgentReel 这个为true是紧急料   出到紧急料区
           // cutReel 为true是分盘料,AGV会拉到到分盘区
           //料串会发到分盘区和紧急料区
           //两个都为false 包装料默认拉到包装线体, 料串默认拉到紧急料区
            ClientAction currA = GetAction(id);
            if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter) || currA.Equals(ClientAction.FinishEnter)||currA.Equals(ClientAction.FinishLeave))
            {
                SetStatus(id, mark, shelfId, ClientAction.NeedLeave);
                return true;
            }
            return false;
        } 
        private static void AgvClient_Log(string s)
        {
            try
            {
                bool isLog = ConfigAppSettings.GetIntValue(Setting_Init.Agv_Log_Open).Equals(1);
                if (isLog)
                {
                    LogUtil. debug(" AGV " + ServerIp + " Log : " + s);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("AgvClient_Log 出错:" + ex.ToString());
            }
        }

        public static Asa.ClientAction GetAction(string NodeName)
        {
            if (actionMap.ContainsKey(NodeName))
            {
                return actionMap[NodeName];
            }
            return Asa.ClientAction.None;
        }
        public static void UpdateAction(string name, Asa.ClientAction action)
        {
            if (actionMap.ContainsKey(name))
            {
                actionMap[name] = action;
            }
            else
            {
                actionMap.Add(name, action);
            }
        }
        public static void Dispose()
        {
            try
            {
                if (agvClient != null)
                {
                    agvClient.Close();
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("释放 agvClient " + ServerIp + " 出错:"+ ex.ToString());
            }
        }
    }
    //public class AGVAction
    //{
    //    public static string None = "None";
    //    public static string Arrive = "Arrive";
    //    public static string CanEnter = "CanEnter";
    //    public static string GetRFID = "GetRFID";
    //    public static string Ready = "Ready";
    //    public static string FinishOut = "FinishOut";
    //}
}