EfortData.cs 11.8 KB
using System;
using System.Text;

namespace HslCommunication.Robot.EFORT
{
    /// <summary>
    /// 埃夫特机器人的数据结构
    /// </summary>
    public class EfortData
    {
        #region Constructor

        /// <summary>
        /// 实例化一个默认的对象
        /// </summary>
        public EfortData()
        {
            IoDOut = new byte[32];
            IoDIn = new byte[32];
            IoIOut = new int[32];
            IoIIn = new int[32];
            DbAxisPos = new float[7];
            DbCartPos = new float[6];
            DbAxisSpeed = new float[7];
            DbAxisAcc = new float[7];
            DbAxisAccAcc = new float[7];
            DbAxisTorque = new float[7];
            DbAxisDirCnt = new int[7];
            DbAxisTime = new int[7];
        }


        #endregion



        /// <summary>
        /// 报文开始的字符串
        /// </summary>
        public string PacketStart { get; set; }

        /// <summary>
        /// 数据命令
        /// </summary>
        public ushort PacketOrders { get; set; }


        /// <summary>
        /// 数据心跳
        /// </summary>
        public ushort PacketHeartbeat { get; set; }

        /// <summary>
        /// 报警状态,1:有报警,0:无报警
        /// </summary>
        public byte ErrorStatus { get; set; }

        /// <summary>
        /// 急停状态,1:无急停,0:有急停
        /// </summary>
        public byte HstopStatus { get; set; }

        /// <summary>
        /// 权限状态,1:有权限,0:无权限
        /// </summary>
        public byte AuthorityStatus { get; set; }

        /// <summary>
        /// 伺服状态,1:有使能,0:未使能
        /// </summary>
        public byte ServoStatus { get; set; }

        /// <summary>
        /// 轴运动状态,1:有运动,0:未运动
        /// </summary>
        public byte AxisMoveStatus { get; set; }

        /// <summary>
        /// 程序运行状态,1:有运行,0:未运行
        /// </summary>
        public byte ProgMoveStatus { get; set; }

        /// <summary>
        /// 程序加载状态,1:有加载,0:无加载
        /// </summary>
        public byte ProgLoadStatus { get; set; }

        /// <summary>
        /// 程序暂停状态,1:有暂停,0:无暂停
        /// </summary>
        public byte ProgHoldStatus { get; set; }

        /// <summary>
        /// 模式状态,1:手动,2:自动,3:远程
        /// </summary>
        public ushort ModeStatus { get; set; }

        /// <summary>
        /// 读读状态,百分比(单位)
        /// </summary>
        public ushort SpeedStatus { get; set; }

        /// <summary>
        /// IoDOut状态
        /// </summary>
        public byte[] IoDOut { get; set; }


        /// <summary>
        /// IoDIn状态
        /// </summary>
        public byte[] IoDIn { get; set; }


        /// <summary>
        /// IoIOut状态
        /// </summary>
        public int[] IoIOut { get; set; }

        /// <summary>
        /// IoIIn状态
        /// </summary>
        public int[] IoIIn { get; set; }

        /// <summary>
        /// 加载工程名
        /// </summary>
        public string ProjectName { get; set; }

        /// <summary>
        /// 加载程序名
        /// </summary>
        public string ProgramName { get; set; }


        /// <summary>
        /// 错误信息
        /// </summary>
        public string ErrorText { get; set; }

        /// <summary>
        /// 一到七轴的角度
        /// </summary>
        public float[] DbAxisPos { get; set; }

        /// <summary>
        /// X,Y,Z,A,B,C方向,也叫笛卡尔坐标系
        /// </summary>
        public float[] DbCartPos { get; set; }

        /// <summary>
        /// 一到七轴的速度
        /// </summary>
        public float[] DbAxisSpeed { get; set; }

        /// <summary>
        /// 一到七轴的加速度
        /// </summary>
        public float[] DbAxisAcc { get; set; }

        /// <summary>
        /// 一到七轴的加加速度
        /// </summary>
        public float[] DbAxisAccAcc { get; set; }

        /// <summary>
        /// 一到七轴的力矩
        /// </summary>
        public float[] DbAxisTorque { get; set; }

        /// <summary>
        /// 轴反向计数
        /// </summary>
        public int[] DbAxisDirCnt { get; set; }

        /// <summary>
        /// 轴工作总时长
        /// </summary>
        public int[] DbAxisTime { get; set; }

        /// <summary>
        /// 设备开机总时长
        /// </summary>
        public int DbDeviceTime { get; set; }

        /// <summary>
        /// 报文结束标记
        /// </summary>
        public string PacketEnd { get; set; }

        #region Static Method

        /// <summary>
        /// 从之前的版本数据构造一个埃夫特机器人的数据类型
        /// </summary>
        /// <param name="data">真实的数据内容</param>
        /// <returns>转换的结果内容</returns>
        public static OperateResult<EfortData> PraseFromPrevious(byte[] data)
        {
            if (data.Length < 784) return new OperateResult<EfortData>(string.Format(StringResources.Language.DataLengthIsNotEnough, 784, data.Length));

            // 开始解析数据
            EfortData efortData = new EfortData();
            efortData.PacketStart = Encoding.ASCII.GetString(data, 0, 15).Trim();
            efortData.PacketOrders = BitConverter.ToUInt16(data, 17);
            efortData.PacketHeartbeat = BitConverter.ToUInt16(data, 19);
            efortData.ErrorStatus = data[21];
            efortData.HstopStatus = data[22];
            efortData.AuthorityStatus = data[23];
            efortData.ServoStatus = data[24];
            efortData.AxisMoveStatus = data[25];
            efortData.ProgMoveStatus = data[26];
            efortData.ProgLoadStatus = data[27];
            efortData.ProgHoldStatus = data[28];
            efortData.ModeStatus = BitConverter.ToUInt16(data, 29);
            efortData.SpeedStatus = BitConverter.ToUInt16(data, 31);

            for (int i = 0; i < 32; i++)
            {
                efortData.IoDOut[i] = data[33 + i];
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoDIn[i] = data[65 + i];
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoIOut[i] = BitConverter.ToInt32(data, 97 + 4 * i);
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoIIn[i] = BitConverter.ToInt32(data, 225 + 4 * i);
            }

            efortData.ProjectName = Encoding.ASCII.GetString(data, 353, 32).Trim('\u0000');
            efortData.ProgramName = Encoding.ASCII.GetString(data, 385, 32).Trim('\u0000');
            efortData.ErrorText = Encoding.ASCII.GetString(data, 417, 128).Trim('\u0000');

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisPos[i] = BitConverter.ToSingle(data, 545 + 4 * i);
            }

            for (int i = 0; i < 6; i++)
            {
                efortData.DbCartPos[i] = BitConverter.ToSingle(data, 573 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisSpeed[i] = BitConverter.ToSingle(data, 597 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisAcc[i] = BitConverter.ToSingle(data, 625 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisAccAcc[i] = BitConverter.ToSingle(data, 653 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisTorque[i] = BitConverter.ToSingle(data, 681 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisDirCnt[i] = BitConverter.ToInt32(data, 709 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisTime[i] = BitConverter.ToInt32(data, 737 + 4 * i);
            }


            efortData.DbDeviceTime = BitConverter.ToInt32(data, 765);
            efortData.PacketEnd = Encoding.ASCII.GetString(data, 769, 15).Trim();


            return OperateResult.CreateSuccessResult(efortData);
        }


        /// <summary>
        /// 从新版本数据构造一个埃夫特机器人的数据类型
        /// </summary>
        /// <param name="data">真实的数据内容</param>
        /// <returns>转换的结果内容</returns>
        public static OperateResult<EfortData> PraseFrom(byte[] data)
        {
            if (data.Length < 788) return new OperateResult<EfortData>(string.Format(StringResources.Language.DataLengthIsNotEnough, 788, data.Length));

            // 开始解析数据
            EfortData efortData = new EfortData();
            efortData.PacketStart = Encoding.ASCII.GetString(data, 0, 16).Trim();
            efortData.PacketOrders = BitConverter.ToUInt16(data, 18);
            efortData.PacketHeartbeat = BitConverter.ToUInt16(data, 20);
            efortData.ErrorStatus = data[22];
            efortData.HstopStatus = data[23];
            efortData.AuthorityStatus = data[24];
            efortData.ServoStatus = data[25];
            efortData.AxisMoveStatus = data[26];
            efortData.ProgMoveStatus = data[27];
            efortData.ProgLoadStatus = data[28];
            efortData.ProgHoldStatus = data[29];
            efortData.ModeStatus = BitConverter.ToUInt16(data, 30);
            efortData.SpeedStatus = BitConverter.ToUInt16(data, 32);

            for (int i = 0; i < 32; i++)
            {
                efortData.IoDOut[i] = data[34 + i];
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoDIn[i] = data[66 + i];
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoIOut[i] = BitConverter.ToInt32(data, 100 + 4 * i);
            }
            for (int i = 0; i < 32; i++)
            {
                efortData.IoIIn[i] = BitConverter.ToInt32(data, 228 + 4 * i);
            }

            efortData.ProjectName = Encoding.ASCII.GetString(data, 356, 32).Trim('\u0000');
            efortData.ProgramName = Encoding.ASCII.GetString(data, 388, 32).Trim('\u0000');
            efortData.ErrorText = Encoding.ASCII.GetString(data, 420, 128).Trim('\u0000');

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisPos[i] = BitConverter.ToSingle(data, 548 + 4 * i);
            }

            for (int i = 0; i < 6; i++)
            {
                efortData.DbCartPos[i] = BitConverter.ToSingle(data, 576 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisSpeed[i] = BitConverter.ToSingle(data, 600 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisAcc[i] = BitConverter.ToSingle(data, 628 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisAccAcc[i] = BitConverter.ToSingle(data, 656 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisTorque[i] = BitConverter.ToSingle(data, 684 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisDirCnt[i] = BitConverter.ToInt32(data, 712 + 4 * i);
            }

            for (int i = 0; i < 7; i++)
            {
                efortData.DbAxisTime[i] = BitConverter.ToInt32(data, 740 + 4 * i);
            }


            efortData.DbDeviceTime = BitConverter.ToInt32(data, 768);
            efortData.PacketEnd = Encoding.ASCII.GetString(data, 772, 16).Trim();


            return OperateResult.CreateSuccessResult(efortData);
        }

        #endregion
    }
}