2025-06-16 17:24:23 +08:00

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