Agv_Info.cs 8.4 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>
        public bool IsUse { set; get; }
        /// <summary>
        /// 地点
        /// </summary>
        public string Place { set; get; }
        /// <summary>
        /// 地点
        /// </summary>
        public string PlaceAliceName { set; get; } = "";

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

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

        /// <summary>
        /// 负载
        /// </summary>
        public bool IsExistShelf { set; get; } = false;
        /// <summary>
        /// 小车的状态,(从小车获取)
        /// </summary>
        public string StateText { private set; get; }
        /// <summary>
        /// 电量百分比,(从小车获取)
        /// </summary>
        public int Battery { private set; get; }
        /// <summary>
        /// 当前任务文本,(从小车获取)
        /// </summary>
        public string MissionText { set; get; }
        /// <summary>
        /// 下一个地点
        /// </summary>
        public string NextPlace { set; get; }
        /// <summary>
        /// 下一个地点
        /// </summary>
        public string NextPlaceAliceName { 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 struct DockingStru
        {
            public DateTime startTime;
            public bool IsDocking;
        }
        /// <summary>
        /// 停靠信息
        /// </summary>
        public DockingStru DockingInfo;

        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; }
        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 = "";
            NextPlace = "";
            Msg = "";
            DockingInfo.IsDocking = false;
            DockingInfo.startTime = DateTime.Now;
            Position = new Agv_Info.clsPosition();
        }

        DateTime IoStartTime = DateTime.MaxValue;
        int IoLastTime = 5000;
        public bool SetState(int stateID, string stateText, int battery, string missionText, clsPosition position)
        {
            bool isChange = false;
            bool preShelfState = IsExistShelf;
            //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) || !StateText.Equals(stateText)
                 || !MissionText.Equals(missionText) || !IsExistShelf.Equals(preShelfState)) //!Battery.Equals(battery)
                isChange = true;
            StateID = stateID;
            StateText = 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 = PlaceState.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 = (PlaceState)c;
            }
        }

        public string[] ToRow()
        {
            //AGV名称,IP,AGV状态,任务状态,地点,后续任务,在线,电量,调用,清除缓存
            List<string> s = new List<string>();
            s.Add(Name);
            s.Add(IP);
            if (IsCon)
            {
                s.Add(StateText);
                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();
        }

    }
}