2017-02-25 update 2 Endian Fix
This commit is contained in:
@@ -49,8 +49,8 @@ namespace Modbus.Net.Modbus
|
||||
AddressTranslator = new AddressTranslatorModbus();
|
||||
}
|
||||
|
||||
public override bool GetLittleEndian => Wrapper[typeof (ReadDataModbusProtocal)].IsLittleEndian;
|
||||
public override bool SetLittleEndian => Wrapper[typeof (WriteDataModbusProtocal)].IsLittleEndian;
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadDataModbusProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteDataModbusProtocal)].IsLittleEndian;
|
||||
|
||||
protected string ConnectionStringIp
|
||||
{
|
||||
|
||||
@@ -15,8 +15,8 @@ namespace Modbus.Net.OPC
|
||||
Wrapper = new OpcDaProtocal(ConnectionString);
|
||||
}
|
||||
|
||||
public override bool GetLittleEndian => Wrapper[typeof (ReadRequestOpcProtocal)].IsLittleEndian;
|
||||
public override bool SetLittleEndian => Wrapper[typeof (WriteRequestOpcProtocal)].IsLittleEndian;
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestOpcProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestOpcProtocal)].IsLittleEndian;
|
||||
|
||||
public override void SetConnectionType(int connectionType)
|
||||
{
|
||||
|
||||
@@ -20,12 +20,12 @@ namespace Modbus.Net.Siemens
|
||||
_com = com;
|
||||
}
|
||||
|
||||
public override byte[] SendReceive(bool isLittleEndian, params object[] content)
|
||||
public override byte[] SendReceive(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
return AsyncHelper.RunSync(() => SendReceiveAsync(isLittleEndian, content));
|
||||
}
|
||||
|
||||
public override async Task<byte[]> SendReceiveAsync(bool isLittleEndian, params object[] content)
|
||||
public override async Task<byte[]> SendReceiveAsync(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
|
||||
{
|
||||
|
||||
@@ -41,12 +41,12 @@ namespace Modbus.Net.Siemens
|
||||
_connectTryCount = 0;
|
||||
}
|
||||
|
||||
public override byte[] SendReceive(bool isLittleEndian, params object[] content)
|
||||
public override byte[] SendReceive(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
return AsyncHelper.RunSync(() => SendReceiveAsync(isLittleEndian, content));
|
||||
}
|
||||
|
||||
public override async Task<byte[]> SendReceiveAsync(bool isLittleEndian, params object[] content)
|
||||
public override async Task<byte[]> SendReceiveAsync(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
|
||||
{
|
||||
|
||||
@@ -91,8 +91,8 @@ namespace Modbus.Net.Siemens
|
||||
AddressTranslator = new AddressTranslatorSiemens();
|
||||
}
|
||||
|
||||
public override bool GetLittleEndian => Wrapper[typeof (ReadRequestSiemensProtocal)].IsLittleEndian;
|
||||
public override bool SetLittleEndian => Wrapper[typeof (WriteRequestSiemensProtocal)].IsLittleEndian;
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestSiemensProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestSiemensProtocal)].IsLittleEndian;
|
||||
|
||||
protected string ConnectionStringIp
|
||||
{
|
||||
|
||||
@@ -257,11 +257,15 @@ namespace Modbus.Net
|
||||
{
|
||||
PlcValue =
|
||||
Convert.ToDouble(
|
||||
BaseUtility.GetLittleEndian
|
||||
BaseUtility.GetLittleEndian == Endian.LittleEndianLsb
|
||||
? ValueHelper.Instance.GetValue(datas, ref localMainPos, ref localSubPos,
|
||||
address.DataType)
|
||||
.ToString()
|
||||
: BigEndianValueHelper.Instance.GetValue(datas, ref localMainPos,
|
||||
: BaseUtility.GetLittleEndian == Endian.BigEndianLsb
|
||||
? BigEndianValueHelper.Instance.GetValue(datas, ref localMainPos,
|
||||
ref localSubPos,
|
||||
address.DataType)
|
||||
: BigEndianMsbValueHelper.Instance.GetValue(datas, ref localMainPos,
|
||||
ref localSubPos,
|
||||
address.DataType))*address.Zoom,
|
||||
UnitExtend = address.UnitExtend
|
||||
@@ -374,9 +378,11 @@ namespace Modbus.Net
|
||||
BigEndianValueHelper.Instance.ByteLength[
|
||||
communicateAddress.DataType.FullName]));
|
||||
|
||||
var valueHelper = BaseUtility.SetLittleEndian
|
||||
var valueHelper = BaseUtility.SetLittleEndian == Endian.LittleEndianLsb
|
||||
? ValueHelper.Instance
|
||||
: BigEndianValueHelper.Instance;
|
||||
: BaseUtility.SetLittleEndian == Endian.BigEndianLsb
|
||||
? BigEndianValueHelper.Instance
|
||||
: BigEndianMsbValueHelper.Instance;
|
||||
//如果设备本身能获取到数据但是没有数据
|
||||
var datas = datasReturn;
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace Modbus.Net
|
||||
/// <param name="isLittleEndian">是否是小端格式</param>
|
||||
/// <param name="content">写入的内容,使用对象数组描述</param>
|
||||
/// <returns>从设备获取的字节流</returns>
|
||||
public virtual byte[] SendReceive(bool isLittleEndian, params object[] content)
|
||||
public virtual byte[] SendReceive(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
return AsyncHelper.RunSync(() => SendReceiveAsync(isLittleEndian, content));
|
||||
}
|
||||
@@ -83,7 +83,7 @@ namespace Modbus.Net
|
||||
/// <param name="isLittleEndian">是否是小端格式</param>
|
||||
/// <param name="content">写入的内容,使用对象数组描述</param>
|
||||
/// <returns>从设备获取的字节流</returns>
|
||||
public virtual async Task<byte[]> SendReceiveAsync(bool isLittleEndian, params object[] content)
|
||||
public virtual async Task<byte[]> SendReceiveAsync(Endian isLittleEndian, params object[] content)
|
||||
{
|
||||
if (ProtocalLinker == null || !ProtocalLinker.IsConnected)
|
||||
{
|
||||
|
||||
@@ -3,8 +3,17 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public enum Endian
|
||||
{
|
||||
LittleEndianLsb,
|
||||
BigEndianLsb,
|
||||
BigEndianMsb
|
||||
}
|
||||
|
||||
namespace Modbus.Net
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 基础Api入口
|
||||
/// </summary>
|
||||
@@ -33,12 +42,12 @@ namespace Modbus.Net
|
||||
/// <summary>
|
||||
/// 获取协议是否遵循小端格式
|
||||
/// </summary>
|
||||
public abstract bool GetLittleEndian { get; }
|
||||
public abstract Endian GetLittleEndian { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 设置协议是否遵循小端格式
|
||||
/// </summary>
|
||||
public abstract bool SetLittleEndian { get; }
|
||||
public abstract Endian SetLittleEndian { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备是否已经连接
|
||||
@@ -108,9 +117,22 @@ namespace Modbus.Net
|
||||
var getReturnValue = await GetDatasAsync(startAddress,
|
||||
(int) Math.Ceiling(bCount*getTypeAndCount.Value));
|
||||
var getBytes = getReturnValue;
|
||||
return GetLittleEndian
|
||||
? ValueHelper.Instance.ByteArrayToObjectArray(getBytes, getTypeAndCount)
|
||||
: BigEndianValueHelper.Instance.ByteArrayToObjectArray(getBytes, getTypeAndCount);
|
||||
switch (GetLittleEndian)
|
||||
{
|
||||
case Endian.LittleEndianLsb:
|
||||
{
|
||||
return ValueHelper.Instance.ByteArrayToObjectArray(getBytes, getTypeAndCount);
|
||||
}
|
||||
case Endian.BigEndianLsb:
|
||||
{
|
||||
return BigEndianValueHelper.Instance.ByteArrayToObjectArray(getBytes, getTypeAndCount);
|
||||
}
|
||||
case Endian.BigEndianMsb:
|
||||
{
|
||||
return BigEndianMsbValueHelper.Instance.ByteArrayToObjectArray(getBytes, getTypeAndCount);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -185,9 +207,22 @@ namespace Modbus.Net
|
||||
select (int) Math.Ceiling(bCount*getTypeAndCount.Value)).Sum();
|
||||
var getReturnValue = await GetDatasAsync(startAddress, bAllCount);
|
||||
var getBytes = getReturnValue;
|
||||
return GetLittleEndian
|
||||
? ValueHelper.Instance.ByteArrayToObjectArray(getBytes, translateTypeAndCount)
|
||||
: BigEndianValueHelper.Instance.ByteArrayToObjectArray(getBytes, translateTypeAndCount);
|
||||
switch (GetLittleEndian)
|
||||
{
|
||||
case Endian.LittleEndianLsb:
|
||||
{
|
||||
return ValueHelper.Instance.ByteArrayToObjectArray(getBytes, translateTypeAndCount);
|
||||
}
|
||||
case Endian.BigEndianLsb:
|
||||
{
|
||||
return BigEndianValueHelper.Instance.ByteArrayToObjectArray(getBytes, translateTypeAndCount);
|
||||
}
|
||||
case Endian.BigEndianMsb:
|
||||
{
|
||||
return BigEndianMsbValueHelper.Instance.ByteArrayToObjectArray(getBytes, translateTypeAndCount);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
@@ -10,11 +10,11 @@ namespace Modbus.Net
|
||||
/// <summary>
|
||||
/// 是否为小端格式
|
||||
/// </summary>
|
||||
public bool IsLittleEndian { get; protected set; } = false;
|
||||
public Endian IsLittleEndian { get; protected set; } = Endian.BigEndianLsb;
|
||||
|
||||
/// <summary>
|
||||
/// 从输入结构格式化
|
||||
/// </summary>
|
||||
/// </summary>s
|
||||
/// <param name="message">结构化的输入数据</param>
|
||||
/// <returns>格式化后的字节流</returns>
|
||||
public abstract byte[] Format(IInputStruct message);
|
||||
@@ -43,11 +43,24 @@ namespace Modbus.Net
|
||||
/// <param name="isLittleEndian">是否是小端格式</param>
|
||||
/// <param name="contents">对象数组</param>
|
||||
/// <returns>字节数组</returns>
|
||||
public static byte[] TranslateContent(bool isLittleEndian, params object[] contents)
|
||||
public static byte[] TranslateContent(Endian isLittleEndian, params object[] contents)
|
||||
{
|
||||
return isLittleEndian
|
||||
? ValueHelper.Instance.ObjectArrayToByteArray(contents)
|
||||
: BigEndianValueHelper.Instance.ObjectArrayToByteArray(contents);
|
||||
switch (isLittleEndian)
|
||||
{
|
||||
case Endian.LittleEndianLsb:
|
||||
{
|
||||
return ValueHelper.Instance.ObjectArrayToByteArray(contents);
|
||||
}
|
||||
case Endian.BigEndianLsb:
|
||||
{
|
||||
return BigEndianValueHelper.Instance.ObjectArrayToByteArray(contents);
|
||||
}
|
||||
case Endian.BigEndianMsb:
|
||||
{
|
||||
return BigEndianMsbValueHelper.Instance.ObjectArrayToByteArray(contents);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -822,7 +822,7 @@ namespace Modbus.Net
|
||||
/// <param name="subPos">设置位置</param>
|
||||
/// <param name="setBit">设置bit大小,true为1,false为0</param>
|
||||
/// <returns></returns>
|
||||
public byte SetBit(byte number, int subPos, bool setBit)
|
||||
protected byte SetBit(byte number, int subPos, bool setBit)
|
||||
{
|
||||
var creation = 0;
|
||||
if (setBit)
|
||||
@@ -1013,6 +1013,19 @@ namespace Modbus.Net
|
||||
|
||||
public class BigEndianMsbValueHelper : BigEndianValueHelper
|
||||
{
|
||||
private static BigEndianValueHelper _bigEndianInstance;
|
||||
|
||||
protected BigEndianMsbValueHelper()
|
||||
{
|
||||
}
|
||||
|
||||
protected override ValueHelper _Instance => _bigEndianInstance;
|
||||
|
||||
protected new bool LittleEndian => false;
|
||||
|
||||
public new static BigEndianValueHelper Instance
|
||||
=> _bigEndianInstance ?? (_bigEndianInstance = new BigEndianMsbValueHelper());
|
||||
|
||||
public override bool GetBit(byte[] number, ref int pos, ref int subPos)
|
||||
{
|
||||
if (subPos < 0 && subPos > 7) throw new IndexOutOfRangeException();
|
||||
|
||||
Reference in New Issue
Block a user