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 } }