Agv_Info.cs 9.3 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common;
namespace DeviceLibrary
{
    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>
        ///小车在Fleet中的id号
        /// </summary>
        public string RobotId { 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; }

        public bool IsInCharge { get; set; }
        /// <summary>
        /// 是否可用
        /// </summary>
        private bool _IsUse = true;
        public bool IsUse
        {
            set
            {
                if (!value.Equals(_IsUse))
                {
                    _IsUse = value;
                    AGVManager.WriteIni(Name,SettingString.IsUse,_IsUse.ToString());
                }
            }
            get { return _IsUse; }
        }
        /// <summary>
        /// 地点
        /// </summary>
        public string Place { set; get; } = SettingString.Standby;
        /// <summary>
        /// 地点
        /// </summary>
        public string PlaceAliceName { 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; }


        public class MirPosition
        {
            public float orientation { get; set; }
            public PointF Point;
            
        }
        /// <summary>
        /// 当前位置
        /// </summary>
        public MirPosition Position;

        /// <summary>
        /// 任务内容
        /// </summary>
        public string Msg
        {
            get;
            set;
        } = "";
        /// <summary>
        /// 当前任务
        /// </summary>
        public Job CurJob { get; set; }
        /// <summary>
        /// 使用Fleet发任务
        /// </summary>
        public bool UseFleet { get; set; } = false;
        /// <summary>
        /// 当前任务的ID号
        /// </summary>
        public int CurTaskID { get; set; } = -1;

        public string CurTaskState { get; set; } = "";
        /// <summary>
        /// 当前任务目的地名
        /// </summary>
        public string CurTarName { get; set; }

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

        /// <summary>
        /// 任务重发
        /// </summary>
        public void Resend()
        {
            if (CurJob != null)
            {
                CurJob.ResendTask(this);

            }
        }
        /// <summary>
        /// 停在同一处超时
        /// </summary>
        public bool StandTimeOut { get; set; } = false;
        public AGV_UI.Status StateKanban;
        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 = "";
            Msg = "";
            Position = new MirPosition();
            RunInfos = new List<string>() { "目的地", "RFID", "负载", "运行模式", "任务信息", "AGV运行信息" };
            StateKanban = new AGV_UI.Status(name, RunInfos);
        }

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


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

            if (!CurTaskState.Equals(stateText))
            {
                CurTaskState = stateText;
                StateKanban.SetCurState(stateText);

            }
            if (!Battery.Equals(battery))
            {
                Battery = battery;
                StateKanban.SetBattery(battery,IsInCharge);
            }
            //"目的地", "RFID", "负载", "运行模式","任务信息", "AGV运行信息" 
            if (AGVManager.nodeInfo != null && AGVManager.nodeInfo.Count != 0)
            {
                ClientNode node = AGVManager.nodeInfo.Find(ss => ss.Name == Place);
                if (node != null)
                    PlaceAliceName = node.AliceName;
                else
                    PlaceAliceName = Place;
            }
            StateKanban.ShowInfo("目的地", PlaceAliceName);
            StateKanban.ShowInfo("RFID", RFID);
            if (!IsExistShelf.Equals(preShelfState))
            {
                StateKanban.ShowInfo("负载", IsExistShelf ? "满载" : "空载");
            }
            StateKanban.ShowInfo("运行模式", IsUse ? "自动" : "手动");
            StateKanban.ShowInfo("任务信息", this.CurJob.RunInfo);

            if (!MissionText.Equals(missionText))
            {
                MissionText = missionText;
                StateKanban.ShowInfo("AGV运行信息", missionText);
            }
            CheckStandTimeOut(position);
            return isChange;
        }

        /// <summary>
        /// 检查小车是否在原地停留超时
        /// </summary>
        /// <returns></returns>
        private void CheckStandTimeOut(MirPosition position)
        {
            if (IsUse && CurJob != null && !(CurJob is ChargeJob) &&
                (!CurTarName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
            {
                if (Math.Abs(position.Point.X - Position.Point.X) < 1 && Math.Abs(position.Point.Y- Position.Point.Y) < 1)
                {
                    //满足条件,计算持续时间
                    if (StandStartTime == DateTime.MaxValue)
                    {
                        StandStartTime = DateTime.Now;
                    }
                    TimeSpan lastTimeSpan = DateTime.Now - StandStartTime;
                    StandTimeOut = (lastTimeSpan.TotalMinutes >= StandLastTimeMinute);
                }
                else
                {
                    //重新计时
                    StandStartTime = DateTime.Now;
                    StandTimeOut = false;

                }
            }
            else if (CurJob != null && (CurJob is ChargeJob))
            {
                StandTimeOut = false;
                StandStartTime = DateTime.Now;
            }
            else
            {
                StandTimeOut = false;
                StandStartTime = DateTime.Now;
            }
            Position = position;
        }
    }

}