协议解析float和double支持有符号和无符号,默认无符号

master
smartwyy 5 months ago
parent ed6873ecaa
commit 35b5c02945

@ -15,10 +15,11 @@ public static class BitUtls
/// <param name="scale">精度</param>
/// <param name="round">保留几位小数</param>
/// <param name="offset">位偏移</param>
/// <param name="unSign">对float和double 默认无符号</param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
public static object Bytes2Value(byte[] bytes, Type propertyType, int start, int length,
double scale, int round, double offset)
double scale, int round, double offset, bool unSign = true)
{
if (propertyType == BOOLEAN) return Convert.ChangeType(Byte2Bit(bytes, start, length) == 1, propertyType);
@ -44,11 +45,11 @@ public static class BitUtls
if (propertyType == FLOAT)
return
Convert.ChangeType(Math.Round(Byte2Float(bytes, start, length, scale) - offset, round), propertyType);
Convert.ChangeType(Math.Round(Byte2Float(bytes, start, length, scale, unSign) - offset, round), propertyType);
if (propertyType == DOUBLE)
return
Convert.ChangeType(Math.Round(Byte2Double(bytes, start, length, scale) - offset, round),
Convert.ChangeType(Math.Round(Byte2Double(bytes, start, length, scale, unSign) - offset, round),
propertyType);
if (propertyType == STRING)
@ -220,23 +221,23 @@ public static class BitUtls
return list.ToArray();
}
public static float Byte2Float(byte[] bytes, int startBit, int length, double factor)
public static float Byte2Float(byte[] bytes, int startBit, int length, double factor, bool unSign)
{
if (length < 17)
{
int d = Byte2Int16(bytes, startBit, length);
int d =unSign ? Byte2UInt16(bytes, startBit, length) : Byte2Int16(bytes, startBit, length);
return (float)(d * factor);
}
else
{
var d = Byte2Int32(bytes, startBit, length);
Int64 d = unSign ? Byte2UInt32(bytes, startBit, length) : Byte2Int32(bytes, startBit, length) ;
return (float)(d * factor);
}
}
public static double Byte2Double(byte[] bytes, int startBit, int length, double factor)
public static double Byte2Double(byte[] bytes, int startBit, int length, double factor, bool unSign)
{
var d = Byte2UInt32(bytes, startBit, length);
Int64 d = unSign ? Byte2UInt32(bytes, startBit, length) : Byte2Int32(bytes, startBit, length);
return (float)(d * factor);
}

@ -91,7 +91,7 @@ public static class ModbusDecoder
}
case ModbusProperty<float> floatProperty:
{
SetPropertyValue(startRegisterNo, floatProperty, decodeUseBytes);
SetPropertyValue(startRegisterNo, floatProperty, decodeUseBytes, true);
// SetPropertyValue(floatProperty.RegisterNo, floatProperty, decodeUseBytes);
break;
}
@ -112,7 +112,7 @@ public static class ModbusDecoder
return t;
}
private static void SetPropertyValue<T>(int startRegisterNo, ModbusProperty<T> field, byte[] bytes)
private static void SetPropertyValue<T>(int startRegisterNo, ModbusProperty<T> field, byte[] bytes, bool unSign = true)
{
var registerNo = field.RegisterNo;
var start = field.Start;
@ -134,7 +134,7 @@ public static class ModbusDecoder
_ => length
};
var value = BitUtls.Bytes2Value(bytes, valueType, start, length, scale, round, offset);
var value = BitUtls.Bytes2Value(bytes, valueType, start, length, scale, round, offset, unSign);
field.Value = (T)value;
}
}
Loading…
Cancel
Save