Agv_Info.cs 11.1 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AGVControl
{
    public class Agv_Info
    {
        /// <summary>
        /// 小车名称
        /// </summary>
        public string Name { private set; get; }
        /// <summary>
        /// 小车在FLEET中的ID号
        /// </summary>
        public string ID { private set; get; }
        /// <summary>
        /// IP地址
        /// </summary>
        public string IP { private set; get; }
        /// <summary>
        /// IO模块GUID
        /// </summary>
        public string IOID { private set; get; }
        /// <summary>
        /// 授权码
        /// </summary>
        public string Authorization { private set; get; }

        /// <summary>
        /// 当前架子的RFID
        /// </summary>
        public string RFID { set; get; }
        /// <summary>
        /// 是否在线
        /// </summary>
        public bool IsCon { set; get; }
        /// <summary>
        /// 是否可用
        /// </summary>
        private bool _IsUse = true;
        public bool IsUse
        {
            set
            {
                if (!value.Equals(_IsUse))
                {
                    _IsUse = value;
                    Common.WriteIni(Name, SettingString.IsUse, _IsUse.ToString());
                }
            }
            get { return _IsUse; }
        }
        /// <summary>
        /// 地点
        /// </summary>
        public string Place { set; get; }
        /// <summary>
        /// 地点
        /// </summary>
        public string PlaceAliceName { set; get; } = "";

        /// <summary>
        /// 地点的状态
        /// </summary>
        public ePlaceState PlaceState { private set; get; }

        /// <summary>
        /// 小车的状态ID,(从小车获取)
        /// </summary>
        public eAGVState StateID { private set; get; }

        /// <summary>
        /// 负载
        /// </summary>
        public bool IsExistShelf { set; get; } = false;

        /// <summary>
        /// 电量百分比,(从小车获取)
        /// </summary>
        public int Battery { private set; get; }
        /// <summary>
        /// 当前任务文本,(从小车获取)
        /// </summary>
        public string MissionText { set; get; }


        /// <summary>
        /// 关门,用于执行一次
        /// </summary>
        //public bool CloseDoor { set; get; }
        /// <summary>
        /// 任务发送
        /// </summary>
        public string TaskSend { set; get; } = "";
        /// <summary>
        /// 闲置等待时间,用于充电
        /// </summary>
        public int WaitTime { set; get; }
        /// <summary>
        /// 临时待机位,用于执行一次
        /// </summary>
        //public bool StandbyTemp { set; get; }
        public DateTime DockingStartTime { get; set; } = DateTime.Now;
        public class clsPosition
        {
            public double orientation { get; set; }
            public double x { get; set; }
            public double y { get; set; }
        }
        /// <summary>
        /// 当前位置
        /// </summary>
        public clsPosition Position;

        /// <summary>
        /// 任务内容
        /// </summary>
        public string Msg
        {
            get;
            set;
        } = "";
        /// <summary>
        /// 当前任务
        /// </summary>
        public Job CurJob { get; set; }

        /// <summary>
        /// 当前任务的ID号
        /// </summary>
        public int CurTaskID { get; set; } = -1;

        public string CurTaskState { get; set; } = "";
        /// <summary>
        /// 当前任务名称
        /// </summary>
        public string CurTaskName { get; set; }

        /// <summary>
        /// 当前任务的GUID
        /// </summary>
        public string CurTaskGUID { get; set; }
        /// <summary>
        /// 当前料架的工单信息
        /// </summary>
        public string BoxDestInfo { get; set; } = "";

        public string RunInfo()
        {
            Job tmpJob = null;
            if (CurJob != null)
            {
                if (CurJob is ChargeJob)
                    tmpJob = (ChargeJob)CurJob;
                else if (CurJob is EmptyAGVBackJob)
                    tmpJob = (EmptyAGVBackJob)CurJob;
                else if (CurJob is EmptyShelfBackJob)
                    tmpJob = (EmptyShelfBackJob)CurJob;
                else if (CurJob is EnterLeaveShelfJob)
                    tmpJob = (EnterLeaveShelfJob)CurJob;
                else if (CurJob is GoEmptyShelfLineJob)
                    tmpJob = (GoEmptyShelfLineJob)CurJob;
                else if (CurJob is GoFullShelfStationJob)
                    tmpJob = (GoFullShelfStationJob)CurJob;
                else if (CurJob is SendFullShelfToLineJob)
                    tmpJob = (SendFullShelfToLineJob)CurJob;
                if (RFID.StartsWith("C"))
                {
                    return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurTaskName:{4}{0}RunInfo:{5}{0}BoxDestInfo:{6}{0}GetRack:{7}{0}MissionText:{8}", "\r\n", Name, RFID, CurJob.ToString(), CurTaskName, Msg, BoxDestInfo, BLL.AGVManager.GetRackBy(RFID), MissionText);
                }
                else if (!RFID.Equals(""))
                {
                    return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurTaskName:{4}{0}RunInfo:{5}{0}BoxDestInfo:{6}{0}MissionText:{7}", "\r\n", Name, RFID, CurJob.ToString(), CurTaskName, Msg, BoxDestInfo, MissionText);

                }
                else
                    return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurTaskName:{4}{0}RunInfo:{5}{0}MissionText:{6}", "\r\n", Name, RFID, CurJob.ToString(), CurTaskName, Msg, MissionText);

            }
            else
                return string.Format("Name:{1}{0}RFID:{2}{0}CurTaskName:{3}{0}MissionText:{4}", "\r\n", Name, RFID, CurTaskName, MissionText);
        }
        public Agv_Info(string id, string name, string ip, string authorization, string ioID, bool isUse, string rfid)
        {
            ID = id;
            Name = name;
            IP = ip;
            Authorization = authorization;
            IOID = ioID;
            RFID = rfid;
            IsCon = false;
            _IsUse = isUse;
            Place = "";
            TaskSend = "";
            Msg = "";
            Position = new Agv_Info.clsPosition();
        }

        DateTime IoStartTime = DateTime.MaxValue;
        int IoLastTime = 5000;
        public bool SetState(eAGVState stateID, string stateText, int battery, string missionText, clsPosition position)
        {
            bool isChange = false;
            bool preShelfState = IsExistShelf;
            Common.mir.Get_IO_Status(this, out bool[] input, out bool[] output);
            if (input != null && input.Length == 4)
            {
                bool reachIoValue = input[3].Equals(true);//input[2] &&
                if (reachIoValue)
                {
                    //满足给定的IO值,计算持续时间
                    if (IoStartTime == DateTime.MaxValue)
                    {
                        IoStartTime = DateTime.Now;
                    }


                    if (IoLastTime > 0)
                    {
                        //持续时间
                        TimeSpan lastTimeSpan = DateTime.Now - IoStartTime;
                        IsExistShelf = (lastTimeSpan.TotalMilliseconds >= IoLastTime);
                    }
                    else
                    {
                        IsExistShelf = true;
                    }
                }
                else
                {
                    //重新计时
                    IoStartTime = DateTime.MinValue;
                    IsExistShelf = input[3];
                }
            }
            if (!StateID.Equals(stateID) || !CurTaskState.Equals(stateText) || !Battery.Equals(battery)
                 || !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState))
                isChange = true;
            StateID = stateID;
            CurTaskState = stateText;
            Battery = battery;
            MissionText = missionText;
            Position = position;
            return isChange;
        }

        public void GetPlace(int value)
        {
            // Common.log.Debug(Name + " PLC20=" + value);
            if (value == 0)
            {
                Place = "";
                PlaceState = ePlaceState.None;
            }
            else if (value > 0 && value < 1000)
            {
                //Place = "";
                //PlaceState = PlaceState.None;
                //TaskSend = "";
            }
            else if (value >= 1000)
            {
                int a = value / 1000;
                int b = (value - a * 1000) / 10;
                int c = value - a * 1000 - b * 10;
                if (c.Equals(1) || c.Equals(3) || c.Equals(5))//Move,Enter,Leave
                    TaskSend = "";
                Place = (char)(64 + a) + b.ToString();
                if (Common.nodeInfo != null && Common.nodeInfo.Count != 0)
                {
                    ClientNode node = Common.nodeInfo.Find(s => s.Name == Place);
                    if (node != null)
                        PlaceAliceName = node.AliceName;
                    else
                        PlaceAliceName = Place;
                }
                PlaceState = (ePlaceState)c;
            }
        }

        public string[] ToRow()
        {
            //AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
            List<string> s = new List<string>();
            s.Add(Name);
            s.Add(IP);
            // if (IsCon)
            //{
            s.Add(StateID.ToString());
            s.Add(CurTaskState);
            s.Add(RFID);
            //s.Add(Msg);
            // s.Add(MissionText);
            s.Add(PlaceAliceName);
            //s.Add(Place);
            s.Add(PlaceState.ToString());
            //if (Common.nodeInfo != null && Common.nodeInfo.Count != 0)
            //{
            //    ClientNode node = Common.nodeInfo.Find(q => q.Name == NextPlace);
            //    if (node != null)
            //        NextPlaceAliceName = node.AliceName;
            //    else
            //        NextPlaceAliceName = NextPlace;
            //}
            //s.Add(NextPlaceAliceName);
            //}
            //else
            //{
            //    s.AddRange(new List<string> { "", "", "", "", "", "", "" });
            //}
            s.Add(IsExistShelf ? "满载" : "空载");
            s.Add(IsCon ? "在线" : "离线");
            s.Add(Battery + "%");
            s.Add(IsUse ? "是" : "否");
            // s.Add("清空");

            return s.ToArray();
        }

    }

    /// <summary>
    /// MIR 状态,与状态ID对应
    /// </summary>
    public enum eAGVState
    {
        None = 0,
        Starting,
        ShuttingDown,
        Ready,
        Pause,
        Executing,
        Aborted,
        Completed,
        Docked,
        Docking,
        EmergencyStop,
        ManualControl,
        Error,
        UNKNOWN
    }
}