You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

387 lines
12 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
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
}
}