CommonVar.cs 12.9 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using Common;

namespace DeviceLibrary
{
    /// <summary>
    /// 公共参数
    /// </summary>
    public static class CommonVar
    {
        /// <summary>
        /// 任务类型
        /// </summary>
        public static List<JobType> jobTypeInfo;
        /// <summary>
        /// 小车信息
        /// </summary>
        public static List<Agv_Info> agvInfo;

        public static AgvServer server;
        public static Dictionary<string, string> agvMission;
        public static Dictionary<string, string> showNameMissionName;
        public static Control control;
        private static List<string> msg = new List<string>();
        public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
        public static Charge Charge;
        public static Standby Standby;

        #region 任务日志
        static log4net.ILog runLog = log4net.LogManager.GetLogger("RunLog");
        static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();

        public static void RunLogInfo(RunInfo info)
        {
            if (runInfoMap == null)
                return;
            if (runInfoMap.Keys.Contains(info.AGVNum))
            {
                if (!runInfoMap[info.AGVNum].Equals(info))
                {
                    runLog.Info(info.ToString());
                }
            }
            else
            {
                runInfoMap.Add(info.AGVNum, info);
                runLog.Info(info.ToString());
            }
        }

        public static void ErrorLogRecord(ErrorInfo errorInfo)
        {
            runLog.Info(errorInfo.ToString());
        }
        #endregion

        public static string ReadIni(string section, string key)
        {
            return IniFileHelper.ReadValue(section, key, CONFIG_PATH + SettingString.FileName_tempData);
        }

        public static void WriteIni(string section, string key, string value)
        {
            IniFileHelper.WriteValue(section, key, value, CONFIG_PATH + SettingString.FileName_tempData);
        }



        /// <summary>
        /// 移动到节点位置
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        public static bool MoveToNode(Agv_Info agv, string nodeName)
        {
            string log;
            //清除目的地
            agv.Place = "";
            //执行下一个任务
            int i = NodeManager.FindNode(nodeName);
            bool rtn = agv.AssignTask(SettingString.Move + nodeName);
            if (rtn)
            {
                agv.Place = nodeName;
                if (i > -1)
                    log = string.Format("{0} {1} To Node {2} {3}", agv.Name, SettingString.Move, nodeName, NodeManager.GetState(i).ToString());
                else
                    log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Move, nodeName);
                LogUtil.info(log);
                MiR_API.State_Ready(agv);
            }
            else
            {
                log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Move, nodeName);
                LogUtil.info(log);
            }

            return rtn;

        }
        /// <summary>
        /// 移动到节点位置
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <returns></returns>
        public static bool DockToNode(Agv_Info agv, string nodeName)
        {
            string log;
            //清除目的地
            agv.Place = "";
            //执行下一个任务
            bool rtn = agv.AssignTask(SettingString.Dock + nodeName);
            if (rtn)
            {
                agv.Place = nodeName;
                log = string.Format("{0} {1} To Node {2}", agv.Name, SettingString.Dock, nodeName);
                LogUtil.info(log);
                MiR_API.State_Ready(agv);
            }
            else
            {
                log = string.Format("{0} {1} To Node {2} 失败", agv.Name, SettingString.Dock, nodeName);
                LogUtil.info(log);
            }

            return rtn;

        }

        public static bool DoorMission(Agv_Info agv, string doorName)
        {
            agv.Place = doorName;
            return agv.AssignTask(SettingString.Move + doorName);
        }

        /// <summary>
        /// 检查当前移动任务是否结束
        /// </summary>
        /// <param name="taskName">任务名称</param>
        /// <param name="taskGUID">任务GUID</param>
        /// <returns></returns>
        public static bool CheckTaskMoveFinished(Agv_Info agv, string nodeName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Move + nodeName + " " + curTaskState);
            return agvMission[SettingString.Move + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }
        /// <summary>
        /// 检查当前停靠任务是否结束
        /// </summary>
        /// <param name="taskName">任务名称</param>
        /// <param name="taskGUID">任务GUID</param>
        /// <returns></returns>
        public static bool CheckTaskDockFinished(Agv_Info agv, string nodeName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Dock + nodeName + " " + curTaskState);
            return agvMission[SettingString.Dock + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }
        /// <summary>
        /// 检查充电任务是否分配完成
        /// </summary>
        /// <param name="taskName"></param>
        /// <returns></returns>
        public static bool CheckTaskFinished(Agv_Info agv, string taskName)
        {
            return taskName.Contains(SettingString.AutoCharge) && agv.CurTaskState.Equals(SettingString.Executing);
        }

        public static bool CheckEnterOrLeaveFinished(Agv_Info agv, string actionName, string curTaskState)
        {
            LogUtil.debug(agv.Name + " 检查进出料是否结束: " + actionName + " " + curTaskState);
            return agvMission[actionName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
        }


        /// <summary>
        /// 判断电量是否够执行任务,默认20
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        public static bool CheckCanExecuteMission(Agv_Info agv, int threshold = 20)
        {
            if (agv.Battery <= threshold)
            {
                LogUtil.debug(agv.Name + " 电量小于20%,不执行任务,等待充电");
                return false;
            }

            return true;
        }

        /// <summary>
        /// 判断小车是否空闲(充电/待机位)
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        public static bool CheckAGVStatusNone(Agv_Info agv)
        {
            if ((agv.CurJob == null || agv.CurJob is ChargeJob || agv.CurJob is StandyJob) && !agv.IsExistShelf)
                return true;
            else
                return false;
        }

        /// <summary>
        /// 获取Job任务状态
        /// </summary>
        /// <param name="CurTaskID"></param>
        /// <returns></returns>
        public static string GetTakJobState(Agv_Info agv)
        {
            if (!agv.CurTaskID.Equals(-1) && MiR_API.Get_Task_State(agv, out string st))
                return st;
            return SettingString.Wait;
        }

    }
    public class RunInfo
    {
        /// <summary>
        /// AGV编号
        /// </summary>
        public string AGVNum { get; set; } = "";
        /// <summary>
        /// 任务名称
        /// </summary>
        public string TaskName { get; set; } = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; set; } = "";
        /// <summary>
        /// 任务步骤
        /// </summary>
        public string TaskStep { get; set; } = "";
        /// <summary>
        /// 任务内容
        /// </summary>
        public string MissionInfo { get; set; } = "";
        /// <summary>
        /// 开始时间
        /// </summary>
        public string DateTime { get; set; } = "";
        /// <summary>
        /// 结束时间
        /// </summary>
        public string EndDateTime { get; set; } = "";
        /// <summary>
        /// 任务运行时长
        /// </summary>
        public string TaskRunTime { get; set; } = "";
        /// <summary>
        /// 类型
        /// </summary>
        public string Type { get; set; } = "Task";

        public RunInfo(string AGVNum, string taskName, string targetPlace, string taskStep, string missionInfo, DateTime startTime)
        {
            //开始时间 2006-01-02 15:04:05
            DateTime = startTime.ToString("yyyy-MM-dd HH:mm:ss");
            EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            this.AGVNum = AGVNum;
            MissionInfo = missionInfo;
            TaskName = taskName;
            TaskRunTime = (System.DateTime.Now - startTime).TotalMinutes.ToString("f2");
            TargetPlace = targetPlace;
            TaskStep = taskStep;
        }
        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);
        }
    }

    public class ErrorInfo
    {

        /// <summary>
        /// AGV编号
        /// </summary>
        public string AGVNum
        {
            get { return agvname; }
            set
            {
                agvname = value.PadLeft(4, '0');
            }
        }
        private string agvname = "";
        /// <summary>
        /// 开始时间
        /// </summary>
        public string DateTime { get; set; } = "";
        /// <summary>
        /// 结束时间
        /// </summary>
        public string EndDateTime { get; set; } = "";
        /// <summary>
        /// 异常信息
        /// </summary>
        public string ErrorMsg { get; set; } = "";
        public string ErrorLastTime { get; set; } = "";
        /// <summary>
        /// 任务名称
        /// </summary>
        public string TaskName { get; set; } = "";
        /// <summary>
        /// AGV的当前任务
        /// </summary>
        public string AGVMissionName { get; set; } = "";

        public string MissionInfo { get; set; } = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; set; } = "";
        /// <summary>
        /// 类型
        /// </summary>
        public string Type { get; set; } = "Error";
        public ErrorInfo(Agv_Info agv)
        {
            DateTime = agv.errStartTime.ToString("yyyy-MM-dd HH:mm:ss");
            AGVNum = agv.Name;
            EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            ErrorMsg = agv.ErrorMsg;
            ErrorLastTime = (System.DateTime.Now - agv.errStartTime).TotalMinutes.ToString("f2");
            if (agv.CurJob != null)
            {
                TaskName = agv.CurJob.JobName;
                MissionInfo = agv.CurJob.runInfo;
            }
            AGVMissionName = agv.CurTaskName;
            TargetPlace = agv.Place;
        }
        public override string ToString()
        {
            return JsonHelper.SerializeObject(this);
        }
    }

    public static class Window_API
    {
        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        [DllImport("user32.dll ", SetLastError = true)]
        public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
        public const int SW_RESTORE = 9;

    }

    /// <summary>
    /// 客户端
    /// </summary>
    public class Client
    {
        /// <summary>
        /// 循环
        /// </summary>
        public bool Loop;
        /// <summary>
        /// IP地址
        /// </summary>
        public string IP;
        /// <summary>
        /// 是否连接
        /// </summary>
        public bool IsConn;
        /// <summary>
        /// 节点名称集合
        /// </summary>
        public List<string> nodeName;
        /// <summary>
        /// 套接字
        /// </summary>
        public Socket Socket;
        /// <summary>
        /// 接收数据线程
        /// </summary>
        public Thread ListenNet;
    }
}