125 lines
4.0 KiB
C#
125 lines
4.0 KiB
C#
using HslCommunication.Core;
|
|
using HslCommunication.Core.Device;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Reflection.Emit;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Seyounth.Auto.Plc.Helper
|
|
{
|
|
public static class AnalysisHelper
|
|
{
|
|
#region 解析类型帮助类
|
|
|
|
/// <summary>
|
|
/// 根据类型获取字节长度
|
|
/// </summary>
|
|
/// <param name="structName"></param>
|
|
/// <returns></returns>
|
|
public static ushort TructToByteCount(string structName)
|
|
{
|
|
switch (structName.ToUpper())
|
|
{
|
|
case "SYSTEM.BOOL":
|
|
case "SYSTEM.BOOLEAN":
|
|
case "SYSTEM.BIT":
|
|
return 1;
|
|
|
|
case "SYSTEM.BYTE":
|
|
return 1;
|
|
|
|
case "SYSTEM.UINT16":
|
|
case "SYSTEM.INT16":
|
|
case "SYSTEM.SHORT":
|
|
case "SYSTEM.USHORT":
|
|
return 2;
|
|
|
|
case "SYSTEM.UINT32":
|
|
case "SYSTEM.INT":
|
|
case "SYSTEM.INT32":
|
|
case "SYSTEM.FLOAT":
|
|
case "SYSTEM.SINGLE":
|
|
return 4;
|
|
|
|
case "SYSTEM.LONG":
|
|
case "SYSTEM.DOUBLE":
|
|
return 6;
|
|
|
|
case "SYSTEM.STRING":
|
|
return 20;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 根据类型获取字节长度
|
|
/// </summary>
|
|
/// <param name="structName"></param>
|
|
/// <returns></returns>
|
|
public static ushort TructToRegCount(string structName)
|
|
{
|
|
switch (structName.ToUpper())
|
|
{
|
|
case "SYSTEM.BOOL":
|
|
case "SYSTEM.BOOLEAN":
|
|
case "SYSTEM.BIT":
|
|
return 1;
|
|
|
|
case "SYSTEM.BYTE":
|
|
return 1;
|
|
|
|
case "SYSTEM.UINT16":
|
|
case "SYSTEM.INT16":
|
|
case "SYSTEM.SHORT":
|
|
case "SYSTEM.USHORT":
|
|
return 1;
|
|
|
|
case "SYSTEM.UINT32":
|
|
case "SYSTEM.INT":
|
|
case "SYSTEM.INT32":
|
|
case "SYSTEM.FLOAT":
|
|
case "SYSTEM.SINGLE":
|
|
return 2;
|
|
|
|
case "SYSTEM.LONG":
|
|
case "SYSTEM.DOUBLE":
|
|
return 3;
|
|
|
|
case "SYSTEM.STRING":
|
|
return 10;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
public static T ConvertBytes<T>(byte[] bytes, DeviceCommunication device, int startIndex)
|
|
{
|
|
if (bytes == null) throw new ArgumentNullException();
|
|
|
|
return Type.GetTypeCode(typeof(T)) switch
|
|
{
|
|
TypeCode.Boolean => (T)(object)device.ByteTransform.TransBool(bytes, startIndex),
|
|
TypeCode.Byte => (T)(object)device.ByteTransform.TransByte(bytes, startIndex),
|
|
TypeCode.Int16 => (T)(object)device.ByteTransform.TransInt16(bytes, startIndex),
|
|
TypeCode.UInt16 => (T)(object)device.ByteTransform.TransUInt16(bytes, startIndex),
|
|
TypeCode.Int32 => (T)(object)device.ByteTransform.TransInt32(bytes, startIndex),
|
|
TypeCode.UInt32 => (T)(object)device.ByteTransform.TransUInt32(bytes, startIndex),
|
|
TypeCode.Int64 => (T)(object)device.ByteTransform.TransUInt64(bytes, startIndex),
|
|
TypeCode.UInt64 => (T)(object)device.ByteTransform.TransUInt64(bytes, startIndex),
|
|
TypeCode.Single => (T)(object)device.ByteTransform.TransSingle(bytes, startIndex),
|
|
TypeCode.Double => (T)(object)device.ByteTransform.TransDouble(bytes, startIndex),
|
|
// 添加其他需要的类型...
|
|
_ => throw new NotSupportedException($"Type {typeof(T)} is not supported")
|
|
};
|
|
}
|
|
|
|
#endregion 解析类型帮助类
|
|
}
|
|
} |