AgvClient.cs 8.4 KB

using Asa;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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 Asa.AgvClient agvClient;
        public 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
            {
              //  LogUtil.info("开始  Init agvclient");
                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;
                }
                actionMap = new Dictionary<string, Asa.ClientAction>();
              
                LogUtil.info(" 开始 agvClient.Connect");
                agvClient.Connect();
                foreach (string str in NodeList)
                {
                    SetStatus(str);
                } 
            }
            catch (Exception ex)
            {
                LogUtil.error("初始化agvClient " + ServerIp + " 出错:", ex);
            }
        }

        public static void SetCancelState(bool isCancel)
        {

            CurrCancelState = isCancel;
            if (agvClient != null)
            {
                agvClient.CancelState = isCancel;
            }
        }
        public static void SetStatus(string id, string shelfId = "", ClientAction action = ClientAction.None, ClientLevel level = ClientLevel.Low,bool isMust=false)
        { 

            if (!isMust)
            {
                if (actionMap.ContainsKey(id))
                {
                    ClientAction currA = actionMap[id]; //相同状态就设置一次
                    if (currA.Equals(action))
                    {
                        return;
                    }
                }
            }
            string mark = "";
            if (shelfId != "")
            {
                int index = shelfId.IndexOf(',');
                if (index > 0)
                {
                    //紧急出料模块,料串离开时,mark=紧急料或者分配料,rfid=料串号
                    mark = shelfId.Substring(index + 1, shelfId.Length - index - 1);
                    shelfId = shelfId.Substring(0, index);
                }
            }
            agvClient.SetStatus(id,mark, shelfId, action, level);
            UpdateAction(id, action);
            LogUtil.info("AgvClient SetStatus id:"+id+ ",mark:"+ mark + ",shelfId:"+ shelfId+ ",action:"+ action.ToString() + ",level:"+ level.ToString());

        }

        private static void AgvClient_Ready(string id, string rfid)
        {
            try
            {

                //UpdateAction(id, ClientAction.Ready);
                LogUtil.info("收到 AgvClient_Ready [" + id + "] [" + rfid + "] "+ GetAction(id).ToString());

                if (GetAction(id) == ClientAction.NeedEnter || id=="D1")
                {
                    SetStatus(id, "", ClientAction.MayEnter);
                }
                else if (GetAction(id) == ClientAction.NeedLeave || id=="D2")
                {
                    SetStatus(id, "", ClientAction.MayLeave);
                }
                
                if (RobotManager.robot.inputEquip.Config.LeftAgvName.Equals(id))
                {
                    RobotManager.robot.inputEquip.LeftBatchMove.AgvReady(id, rfid, GetAction(id));
                }
                else if (RobotManager.robot.inputEquip.Config.RightAgvName.Equals(id))
                {
                    RobotManager.robot.inputEquip.RightBatchMove.AgvReady(id, rfid, GetAction(id));
                }
                else if (RobotManager.robot.outputEquip.Config.AgvInName.Equals(id) || RobotManager.robot.outputEquip.Config.AgvOutName.Equals(id))
                {
                    RobotManager.robot.outputEquip.AgvReady(id, rfid);
                    if (!rfid.StartsWith("B"))
                    {
                        //SetStatus(id, "", ClientAction.MayLeave);
                    }
                    else
                    {
                        //SetStatus(id, "", ClientAction.MayEnter);
                    }
                }

                else
                {
                    LogUtil.error("收到 AgvClient_Arrive [" + id + "] [" + rfid + "] 未找到对应的设备 ,暂不处理");
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("AgvClient_Ready [" + id + "] [" + rfid + "]  处理出错:" + ex.ToString());
            }
        }
        private static void AgvClient_CloseDoor(string id, string rfid)
        {
            LogUtil.info("收到 AgvClient_CloseDoor [" + id + "] [" + rfid + "] 暂无需处理 ");
        }
        private static void AgvClient_Arrive(string id, string rfid)
        {
         //   UpdateAction(id, ClientAction.Arrive); 
            LogUtil.info("收到 AgvClient_Arrive [" + id + "] [" + rfid + "]暂无需处理   "); 
        }
 
        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, 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;
        } 

        private static bool isLog = ConfigAppSettings.GetIntValue(Setting_Init.Agv_Log_Open).Equals(1);
        private static void AgvClient_Log(string s)
        {
            try
            {
                if (isLog)
                {
                    LogUtil.info(" 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);
            }
        }
    } 
}