Agv_Info.cs 9.2 KB
using System;
using System.Collections.Generic;
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; }
        /// <summary>
        /// 是否可用
        /// </summary>
        private bool _IsUse = true;
        public bool IsUse
        {
            set
            {
                if (!value.Equals(_IsUse))
                {
                    _IsUse = value;
                }
            }
            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 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>
        /// 使用Fleet发任务
        /// </summary>
        public bool UseFleet { get; set; } = true;
        /// <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()
        {
            string curJobTaskName = "";
            string curJobTaskState = "";
            int curJobTaskID = -1;
            if (CurJob != null)
            {
                curJobTaskName = CurJob.CurTaskName;
                curJobTaskState = CurJob.CurTaskState;
                curJobTaskID = CurJob.CurTaskID;

                if (RFID.StartsWith("C"))
                {
                    return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态:{4}]{0}当前步骤:{5}{0}执行信息:{6}",
                        "\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
                }
                else if (RFID.StartsWith("D"))
                {
                    return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
                        "\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);

                }
                else
                    return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
                        "\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
            }
            else
                return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}执行信息:{5}",
                 "\r\n", Name, RFID, curJobTaskName, curJobTaskState, MissionText);
        }
        /// <summary>
        /// 任务重发
        /// </summary>
        public void Resend()
        {
            if (CurJob != null)
            {
                CurJob.ResendTask(this);

            }
        }
        /// <summary>
        /// 停在同一处超时
        /// </summary>
        public bool StandTimeOut { get; set; } = false;
        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 Agv_Info.clsPosition();
        }

        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, clsPosition 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);//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;
            CheckStandTimeOut(position);
            return isChange;
        }

        /// <summary>
        /// 检查小车是否在原地停留超时
        /// </summary>
        /// <returns></returns>
        private void CheckStandTimeOut(clsPosition position)
        {
            if (IsUse && CurJob != null && !(CurJob is ChargeJob) &&
                (!CurTaskName.Contains(SettingString.Standby)))//!CurTaskName.Contains(SettingString.AutoCharge) ||
            {
                if (Math.Abs(position.x - Position.x) < 1 && Math.Abs(position.y - Position.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;
        }
    }

}