AgvClient.cs 8.3 KB
using AsaPL;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class AgvClient
    {
        public static bool CurrCancelState = false;
        private static string ServerIp = ConfigAppSettings.GetValue(Setting_Init.AgvServerIp);
        private static AsaPL.AgvClient agvClient;
        private static bool isInit = false;
        public static Dictionary<string, AsaPL.ClientAction> actionMap = new Dictionary<string, AsaPL.ClientAction>();


        public static List<string> NodeList = new List<string>();
         
        public static void Init()
        {
            try
            {
                if (!isInit)
                {
                    isInit = true;
                    agvClient = new AsaPL.AgvClient(ServerIp);
                    agvClient.CancelState = false  ;
                 
                    agvClient.ReadyEnter += AgvClient_ReadyEnter;
                    agvClient.ReadyLeave += AgvClient_ReadyLeave;
                    agvClient.AGVFinishEnter += AgvClient_FinishEnter;
                    agvClient.AGVFinishLeave += AgvClient_FinishLeave;
                }
                actionMap = new Dictionary<string, AsaPL.ClientAction>(); 
                agvClient.Connect();
                LogUtil.info("初始化AGV服务");
                foreach (string str in NodeList)
                {
                    SetStatus(str);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("初始化AGV服务 " + ServerIp + " 出错:", ex);
            }
        }
        
        public static void SetCancelState(bool isCancel)
        {
            if (agvClient == null)
            {
                return;
            }
            CurrCancelState = isCancel;
            agvClient.CancelState = isCancel;
        }
        public static bool SetStatus(string id, string shelfId = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low, bool isMust = false)
        {
            if (agvClient == null)
            {
                return false ;
            }
            if (!isMust && level.Equals(ClientLevel.Low))
            {
                if (actionMap.ContainsKey(id))
                {
                    ClientAction currA = actionMap[id]; //相同状态就设置一次
                    if (currA.Equals(action))
                    {
                        return false;
                    }
                }
            }
            agvClient.SetStatus(id, shelfId, action, level);
            UpdateAction(id, action);
            return true;
        }
     
        /// <summary>
        /// 小车准备进入
        /// </summary>
        /// <param name="name">节点名称</param>
        private static void AgvClient_ReadyEnter(string name)
        {
            LogUtil.info("收到 AgvClient_ReadyEnter [" + name + "]");

            UpdateAction(name, ClientAction.ReadyEnter);
            //    RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_Ready [" + name + "]  ");
            WorkStation equip = getWorkStation(name);

            if (equip == null)
            {
                LogUtil.error("收到 AgvClient_Ready [" + name + "] 未找到对应的设备 ,暂不处理");
                return;
            }
            equip.AgvReadyEnter(name);
        }
        /// <summary>
        ///料架准备离开
        /// </summary>
        /// <param name="name">节点名称</param>
        private static void AgvClient_ReadyLeave(string name)
        {
            LogUtil.info("收到 AgvClient_ReadyLeave [" + name + "]");

            UpdateAction(name, ClientAction.ReadyLeave);
            //    RFIDData data = new RFIDData(content);
            LogUtil.info("收到 AgvClient_Ready [" + name + "]  ");
            WorkStation equip = getWorkStation(name);

            if (equip == null)
            {
                LogUtil.error("收到 AgvClient_Ready [" + name + "] 未找到对应的设备 ,暂不处理");
                return;
            }
            equip.AgvReadyLeave(name);
        }

        private static WorkStation getWorkStation(string nodeId)
        {
            foreach (WorkStation shelf in EquipManager.Equip.StationMap.Values)
            {
                if (shelf.AgvName.Equals(nodeId))
                {
                    return shelf;
                }
            }
            return null;

        }
        public static bool ISConnected()
        {
            if (agvClient == null)
            {
                return false;
            }
            return agvClient.IsConn;
        }
        /// <summary>
        /// 料架离开小车完成
        /// </summary>
        /// <param name="name"></param>
        private static void AgvClient_FinishLeave(string name)
        {
            LogUtil.info("收到 AgvClient_FinishLeave [" + name + "] ");
            UpdateAction(name, ClientAction.FinishLeave);
            Task.Factory.StartNew(delegate
            {
                Thread.Sleep(5000);
                if (GetAction(name).Equals(ClientAction.FinishLeave))
                {
                    SetStatus(name);
                    LogUtil.error("收到 AgvClient_FinishLeave [" + name + "] 5秒后,更新状态为None ");
                }
            });
        }
        /// <summary>
        /// 料架进入小车完成
        /// </summary>
        /// <param name="name"></param>
        private static void AgvClient_FinishEnter(string name)
        {
            LogUtil.info("收到 AgvClient_FinishEnter[" + name + "] ");
            UpdateAction(name, ClientAction.FinishEnter);
            Task.Factory.StartNew(delegate
            {
                Thread.Sleep(5000);
                if (GetAction(name).Equals(ClientAction.FinishEnter))
                {
                    SetStatus(name);
                    LogUtil.error("收到 AgvClient_FinishEnter [" + name + "] 5秒后,更新状态为None ");
                }
            });
        }
        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, ClientAction.None);
                return true;
            }
            return false;
        }
        public static bool NeedEnter(string id, string shelfId = "", ClientLevel level = ClientLevel.Low)
        {
            ClientAction currA = GetAction(id);
            if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter))
            {
                SetStatus(id, shelfId, ClientAction.NeedEnter, level);
                return true;
            }
            return false;
        }
        public static bool NeedLeave(string id, string shelfId = "", ClientLevel level = ClientLevel.Low)
        {
            ClientAction currA = GetAction(id);
            if (currA.Equals(ClientAction.None) || currA.Equals(ClientAction.NeedLeave) || currA.Equals(ClientAction.NeedEnter))
            {
                SetStatus(id, shelfId, ClientAction.NeedLeave, level);
                return true;
            }
            return false;
        }
        public static ClientAction GetAction(string NodeName)
        {
            if (actionMap.ContainsKey(NodeName))
            {
                return actionMap[NodeName];
            }
            return ClientAction.None;
        }
        public static void UpdateAction(string name, ClientAction action = ClientAction.None)
        {
            if (actionMap.ContainsKey(name))
            {
                actionMap[name] = action;
            }
            else
            {
                actionMap.Add(name, action);
            }
        }
        public static void Dispose()
        {
            try
            {
                if (agvClient != null)
                {
                    agvClient.Close();
                    LogUtil.info("关闭AGV服务");
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("关闭AGV服务 " + ServerIp + " 出错:", ex);
            }
        }
    }
}