using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace HslCommunication.Robot.EFORT { /// /// 埃夫特机器人的数据结构 /// public class EfortData { #region Constructor /// /// 实例化一个默认的对象 /// 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 /// /// 报文开始的字符串 /// public string PacketStart { get; set; } /// /// 数据命令 /// public ushort PacketOrders { get; set; } /// /// 数据心跳 /// public ushort PacketHeartbeat { get; set; } /// /// 报警状态,1:有报警,0:无报警 /// public byte ErrorStatus { get; set; } /// /// 急停状态,1:无急停,0:有急停 /// public byte HstopStatus { get; set; } /// /// 权限状态,1:有权限,0:无权限 /// public byte AuthorityStatus { get; set; } /// /// 伺服状态,1:有使能,0:未使能 /// public byte ServoStatus { get; set; } /// /// 轴运动状态,1:有运动,0:未运动 /// public byte AxisMoveStatus { get; set; } /// /// 程序运行状态,1:有运行,0:未运行 /// public byte ProgMoveStatus { get; set; } /// /// 程序加载状态,1:有加载,0:无加载 /// public byte ProgLoadStatus { get; set; } /// /// 程序暂停状态,1:有暂停,0:无暂停 /// public byte ProgHoldStatus { get; set; } /// /// 模式状态,1:手动,2:自动,3:远程 /// public ushort ModeStatus { get; set; } /// /// 读读状态,百分比(单位) /// public ushort SpeedStatus { get; set; } /// /// IoDOut状态 /// public byte[] IoDOut { get; set; } /// /// IoDIn状态 /// public byte[] IoDIn { get; set; } /// /// IoIOut状态 /// public int[] IoIOut { get; set; } /// /// IoIIn状态 /// public int[] IoIIn { get; set; } /// /// 加载工程名 /// public string ProjectName { get; set; } /// /// 加载程序名 /// public string ProgramName { get; set; } /// /// 错误信息 /// public string ErrorText { get; set; } /// /// 一到七轴的角度 /// public float[] DbAxisPos { get; set; } /// /// X,Y,Z,A,B,C方向,也叫笛卡尔坐标系 /// public float[] DbCartPos { get; set; } /// /// 一到七轴的速度 /// public float[] DbAxisSpeed { get; set; } /// /// 一到七轴的加速度 /// public float[] DbAxisAcc { get; set; } /// /// 一到七轴的加加速度 /// public float[] DbAxisAccAcc { get; set; } /// /// 一到七轴的力矩 /// public float[] DbAxisTorque { get; set; } /// /// 轴反向计数 /// public int[] DbAxisDirCnt { get; set; } /// /// 轴工作总时长 /// public int[] DbAxisTime { get; set; } /// /// 设备开机总时长 /// public int DbDeviceTime { get; set; } /// /// 报文结束标记 /// public string PacketEnd { get; set; } #region Static Method /// /// 从之前的版本数据构造一个埃夫特机器人的数据类型 /// /// 真实的数据内容 /// 转换的结果内容 public static OperateResult PraseFromPrevious(byte[] data ) { if (data.Length < 784) return new OperateResult( 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 ); } /// /// 从新版本数据构造一个埃夫特机器人的数据类型 /// /// 真实的数据内容 /// 转换的结果内容 public static OperateResult PraseFrom( byte[] data ) { if (data.Length < 788) return new OperateResult( 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 } }