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.

649 lines
22 KiB
C#

using HslCommunication.BasicFramework;
using HslCommunication.Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HslCommunication.Profinet.Keyence
{
/// <summary>
/// 基恩士Nano串口Bytes数据转换规则
/// </summary>
///以数据格式“位”读取R100~R103时, []表示空格,发送指令如下:
///ACSII码 R D S [] R 1 0 0 [] 4 /r
///16进制码0x52,0x44,0x53,0x20,0x52,0x31,0x30,0x30,0x20,0x34,0x0d
///响应如下
///ACSII码 1 [] 0 [] 1 [] 0 /r /n
///16进制码0x31,0x20,0x30,0x20,0x31,0x20,0x30,0x0d,0x0a
public class KeyenceNanoByteTransform : IByteTransform
{
#region Constructor
/// <summary>
/// 实例化一个默认的对象
/// </summary>
public KeyenceNanoByteTransform()
{
}
/// <summary>
/// 数据格式
/// </summary>
public DataFormat DataFormat { get; set; }
#endregion
#region Get Value From Bytes
/// <summary>
/// Nano响应的Bytes转换为string数组
/// </summary>
/// <param name="buffer">缓存数据 </param>
/// <returns>字符串数组 </returns>
private string[] BytesToStringArray(byte[] buffer)
{
string strBuffer = Encoding.Default.GetString(buffer);
return strBuffer.Split(' ');
}
/// <summary>
/// 从缓存中提取出bool结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">位的索引</param>
/// <returns>bool对象</returns>
public virtual bool TransBool(byte[] buffer, int index)
{
return BytesToStringArray(buffer)[index] == "1" ? true : false;
}
/// <summary>
/// 从缓存中提取出bool数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">位的索引</param>
/// <param name="length">bool长度</param>
/// <returns>bool数组</returns>
public bool[] TransBool(byte[] buffer, int index, int length)
{
bool[] result = new bool[length];
for (int i = 0; i < length; i++)
{
result[i] = BytesToStringArray(buffer)[index + i] == "1" ? true : false;
}
return result;
}
/// <summary>
/// 从缓存中提取byte结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>byte对象</returns>
public virtual byte TransByte(byte[] buffer, int index)
{
return Convert.ToByte(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取byte数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>byte数组对象</returns>
public virtual byte[] TransByte(byte[] buffer, int index, int length)
{
byte[] result = new byte[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToByte(BytesToStringArray(buffer)[index + i]);
}
return result;
}
/// <summary>
/// 从缓存中提取short结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>short对象</returns>
public virtual short TransInt16(byte[] buffer, int index)
{
return Convert.ToInt16(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取short数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>short数组对象</returns>
public virtual short[] TransInt16(byte[] buffer, int index, int length)
{
short[] result = new short[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToInt16(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取ushort结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>ushort对象</returns>
public virtual ushort TransUInt16(byte[] buffer, int index)
{
return Convert.ToUInt16(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取ushort数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>ushort数组对象</returns>
public virtual ushort[] TransUInt16(byte[] buffer, int index, int length)
{
ushort[] result = new ushort[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToUInt16(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取int结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>int对象</returns>
public virtual int TransInt32(byte[] buffer, int index)
{
return Convert.ToInt32(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取int数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>int数组对象</returns>
public virtual int[] TransInt32(byte[] buffer, int index, int length)
{
int[] result = new int[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToInt32(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取uint结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>uint对象</returns>
public virtual uint TransUInt32(byte[] buffer, int index)
{
return Convert.ToUInt32(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取uint数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>uint数组对象</returns>
public virtual uint[] TransUInt32(byte[] buffer, int index, int length)
{
uint[] result = new uint[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToUInt32(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取long结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>long对象</returns>
public virtual long TransInt64(byte[] buffer, int index)
{
return Convert.ToInt64(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取long数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>long数组对象</returns>
public virtual long[] TransInt64(byte[] buffer, int index, int length)
{
long[] result = new long[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToInt64(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取ulong结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <returns>ulong对象</returns>
public virtual ulong TransUInt64(byte[] buffer, int index)
{
return Convert.ToUInt64(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取ulong数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>ulong数组对象</returns>
public virtual ulong[] TransUInt64(byte[] buffer, int index, int length)
{
ulong[] result = new ulong[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToUInt64(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取float结果
/// </summary>
/// <param name="buffer">缓存对象</param>
/// <param name="index">索引位置</param>
/// <returns>float对象</returns>
public virtual float TransSingle(byte[] buffer, int index)
{
return Convert.ToSingle(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取float数组结果
/// </summary>
/// <param name="buffer">缓存数据</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>float数组对象</returns>
public virtual float[] TransSingle(byte[] buffer, int index, int length)
{
float[] result = new float[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToSingle(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取double结果
/// </summary>
/// <param name="buffer">缓存对象</param>
/// <param name="index">索引位置</param>
/// <returns>double对象</returns>
public virtual double TransDouble(byte[] buffer, int index)
{
return Convert.ToDouble(BytesToStringArray(buffer)[index]);
}
/// <summary>
/// 从缓存中提取double数组结果
/// </summary>
/// <param name="buffer">缓存对象</param>
/// <param name="index">索引位置</param>
/// <param name="length">读取的数组长度</param>
/// <returns>double数组对象</returns>
public virtual double[] TransDouble(byte[] buffer, int index, int length)
{
double[] result = new double[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToDouble(BytesToStringArray(buffer)[i + index]);
}
return result;
}
/// <summary>
/// 从缓存中提取string结果使用指定的编码
/// </summary>
/// <param name="buffer">缓存对象</param>
/// <param name="index">索引位置</param>
/// <param name="length">byte数组长度</param>
/// <param name="encoding">字符串的编码</param>
/// <returns>string对象</returns>
public virtual string TransString(byte[] buffer, int index, int length, Encoding encoding)
{
byte[] tmp = TransByte(buffer, index, length);
return encoding.GetString(tmp);
}
#endregion
#region Get Bytes From Value
/// <summary>
/// bool变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(bool value)
{
return TransByte(new bool[] { value });
}
/// <summary>
/// bool数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(bool[] values)
{
StringBuilder stringBuilder = new StringBuilder();
string strLength = values.Length.ToString();
for (int i = 0; i < values.Length; i++)
{
stringBuilder.Append(" ");
stringBuilder.Append(values[i] ? "1" : "0");
}
return Encoding.ASCII.GetBytes(stringBuilder.ToString());
}
/// <summary>
/// byte变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(byte value)
{
return new byte[] { value };
}
/// <summary>
/// short变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(short value)
{
return TransByte(new short[] { value });
}
/// <summary>
/// short数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(short[] values)
{
return Trans<short>.ToBytes(values, ".S");
}
/// <summary>
/// ushort变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(ushort value)
{
return TransByte(new ushort[] { value });
}
/// <summary>
/// ushort数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(ushort[] values)
{
return Trans<ushort>.ToBytes(values, ".U");
}
/// <summary>
/// int变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(int value)
{
return TransByte(new int[] { value });
}
/// <summary>
/// int数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(int[] values)
{
return Trans<int>.ToBytes(values, ".L");
}
/// <summary>
/// uint变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(uint value)
{
return TransByte(new uint[] { value });
}
/// <summary>
/// uint数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(uint[] values)
{
return Trans<uint>.ToBytes(values, ".D");
}
/// <summary>
/// long变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(long value)
{
return TransByte(new long[] { value });
}
/// <summary>
/// long数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(long[] values)
{
return Trans<long>.ToBytes(values, ".L");
}
/// <summary>
/// ulong变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(ulong value)
{
return TransByte(new ulong[] { value });
}
/// <summary>
/// ulong数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(ulong[] values)
{
return Trans<ulong>.ToBytes(values, ".L");
}
/// <summary>
/// float变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(float value)
{
return TransByte(new float[] { value });
}
/// <summary>
/// float数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(float[] values)
{
return Trans<float>.ToBytes(values, ".F");
}
/// <summary>
/// double变量转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(double value)
{
return TransByte(new double[] { value });
}
/// <summary>
/// double数组变量转化缓存数据
/// </summary>
/// <param name="values">等待转化的数组</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(double[] values)
{
return Trans<double>.ToBytes(values,".DF");
}
/// <summary>
/// 使用指定的编码字符串转化缓存数据
/// </summary>
/// <param name="value">等待转化的数据</param>
/// <param name="encoding">字符串的编码方式</param>
/// <returns>buffer数据</returns>
public virtual byte[] TransByte(string value, Encoding encoding)
{
if (value == null) return null;
return encoding.GetBytes(value);
}
/// <summary>
/// 字节转换类
/// </summary>
/// <typeparam name="T"></typeparam>
private class Trans<T> where T : struct
{
/// <summary>
/// 泛型对象转换为字节数组
/// </summary>
/// <param name="values"></param>
/// <param name="dataFormat"></param>
/// <returns></returns>
public static byte[] ToBytes(T[] values,string dataFormat)
{
if (values == null) return null;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append(dataFormat);
stringBuilder.Append(" ");
stringBuilder.Append(values.Length.ToString());
for (int i = 0; i < values.Length; i++)
{
stringBuilder.Append(" ");
if (typeof(T)==typeof(int) )
{
var value = Convert.ToInt32(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T)== typeof(uint))
{
var value = Convert.ToUInt32(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(short))
{
var value = Convert.ToInt16(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(ushort))
{
var value = Convert.ToUInt16(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(long))
{
var value = Convert.ToInt64(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(ulong))
{
var value = Convert.ToUInt64(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(float))
{
var value = Convert.ToSingle(values[i]);
stringBuilder.Append(value.ToString());
}
else if (typeof(T) == typeof(double))
{
var value = Convert.ToDouble(values[i]);
stringBuilder.Append(value.ToString());
}
else
{
return null;
}
}
return Encoding.ASCII.GetBytes(stringBuilder.ToString());
}
}
#endregion
}
}