2017-02-26 update 1 Msb Version Continue Fix and open Modbus Endian change.

This commit is contained in:
parallelbgls
2017-02-26 21:01:18 +08:00
parent 962f7a80d8
commit 18e4f6ce80
22 changed files with 116 additions and 131 deletions

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>Modbus.Net.Modbus</id> <id>Modbus.Net.Modbus</id>
<version>1.2.2</version> <version>1.2.3</version>
<title>Modbus.Net.Modbus</title> <title>Modbus.Net.Modbus</title>
<authors>Chris L.(Luo Sheng)</authors> <authors>Chris L.(Luo Sheng)</authors>
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners> <owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
@@ -13,7 +13,7 @@
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright> <copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
<tags>hardware communicate protocal modbus Delian</tags> <tags>hardware communicate protocal modbus Delian</tags>
<dependencies> <dependencies>
<dependency id="Modbus.Net" version="1.2.2" /> <dependency id="Modbus.Net" version="1.2.3" />
</dependencies> </dependencies>
</metadata> </metadata>
<files> <files>

View File

@@ -5,13 +5,13 @@
/// </summary> /// </summary>
public class ModbusAsciiProtocal : ModbusProtocal public class ModbusAsciiProtocal : ModbusProtocal
{ {
public ModbusAsciiProtocal(byte slaveAddress, byte masterAddress) public ModbusAsciiProtocal(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.COM, slaveAddress, masterAddress) : this(ConfigurationManager.COM, slaveAddress, masterAddress, endian)
{ {
} }
public ModbusAsciiProtocal(string com, byte slaveAddress, byte masterAddress) public ModbusAsciiProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusAsciiProtocalLinker(com); ProtocalLinker = new ModbusAsciiProtocalLinker(com);
} }

View File

@@ -47,7 +47,7 @@ namespace Modbus.Net.Modbus
/// </summary> /// </summary>
public abstract class ModbusProtocal : BaseProtocal public abstract class ModbusProtocal : BaseProtocal
{ {
protected ModbusProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) protected ModbusProtocal(byte slaveAddress, byte masterAddress, Endian endian) : base(slaveAddress, masterAddress, endian)
{ {
} }
@@ -116,9 +116,9 @@ namespace Modbus.Net.Modbus
public override IOutputStruct Unformat(byte[] messageBytes, ref int pos) public override IOutputStruct Unformat(byte[] messageBytes, ref int pos)
{ {
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos); var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
var dataCount = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos); var dataCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
var dataValue = new byte[dataCount]; var dataValue = new byte[dataCount];
Array.Copy(messageBytes, 3, dataValue, 0, dataCount); Array.Copy(messageBytes, 3, dataValue, 0, dataCount);
return new ReadDataModbusOutputStruct(slaveAddress, functionCode, dataCount, dataValue); return new ReadDataModbusOutputStruct(slaveAddress, functionCode, dataCount, dataValue);
@@ -132,13 +132,13 @@ namespace Modbus.Net.Modbus
public class WriteDataModbusInputStruct : IInputStruct public class WriteDataModbusInputStruct : IInputStruct
{ {
public WriteDataModbusInputStruct(byte slaveAddress, string startAddress, object[] writeValue, public WriteDataModbusInputStruct(byte slaveAddress, string startAddress, object[] writeValue,
AddressTranslator addressTranslator) AddressTranslator addressTranslator, Endian endian)
{ {
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
var translateAddress = addressTranslator.AddressTranslate(startAddress, false); var translateAddress = addressTranslator.AddressTranslate(startAddress, false);
FunctionCode = (byte) translateAddress.Area; FunctionCode = (byte) translateAddress.Area;
StartAddress = (ushort) translateAddress.Address; StartAddress = (ushort) translateAddress.Address;
var writeByteValue = BigEndianValueHelper.Instance.ObjectArrayToByteArray(writeValue); var writeByteValue = ValueHelper.GetInstance(endian).ObjectArrayToByteArray(writeValue);
WriteCount = WriteCount =
(ushort) (writeByteValue.Length/addressTranslator.GetAreaByteLength(translateAddress.AreaString)); (ushort) (writeByteValue.Length/addressTranslator.GetAreaByteLength(translateAddress.AreaString));
WriteByteCount = (byte) writeByteValue.Length; WriteByteCount = (byte) writeByteValue.Length;
@@ -194,10 +194,10 @@ namespace Modbus.Net.Modbus
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag) public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{ {
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var startAddress = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var writeCount = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress, return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress,
writeCount); writeCount);
} }
@@ -261,16 +261,16 @@ namespace Modbus.Net.Modbus
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag) public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{ {
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var writeByteCount = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var writeByteCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var year = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var year = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var day = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var day = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var month = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var month = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var hour = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var hour = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var second = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var second = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var minute = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var minute = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var millisecond = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var millisecond = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
return new GetSystemTimeModbusOutputStruct(slaveAddress, functionCode, writeByteCount, year, day, return new GetSystemTimeModbusOutputStruct(slaveAddress, functionCode, writeByteCount, year, day,
month, hour, second, minute, millisecond); month, hour, second, minute, millisecond);
} }
@@ -359,10 +359,10 @@ namespace Modbus.Net.Modbus
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag) public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
{ {
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag); var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
var startAddress = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
var writeCount = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag); var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
return new SetSystemTimeModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount); return new SetSystemTimeModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount);
} }
} }

View File

@@ -5,13 +5,13 @@
/// </summary> /// </summary>
public class ModbusRtuProtocal : ModbusProtocal public class ModbusRtuProtocal : ModbusProtocal
{ {
public ModbusRtuProtocal(byte slaveAddress, byte masterAddress) public ModbusRtuProtocal(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.COM, slaveAddress, masterAddress) : this(ConfigurationManager.COM, slaveAddress, masterAddress, endian)
{ {
} }
public ModbusRtuProtocal(string com, byte slaveAddress, byte masterAddress) public ModbusRtuProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusRtuProtocalLinker(com); ProtocalLinker = new ModbusRtuProtocalLinker(com);
} }

View File

@@ -5,18 +5,18 @@
/// </summary> /// </summary>
public class ModbusTcpProtocal : ModbusProtocal public class ModbusTcpProtocal : ModbusProtocal
{ {
public ModbusTcpProtocal(byte slaveAddress, byte masterAddress) public ModbusTcpProtocal(byte slaveAddress, byte masterAddress, Endian endian)
: this(ConfigurationManager.IP, slaveAddress, masterAddress) : this(ConfigurationManager.IP, slaveAddress, masterAddress, endian)
{ {
} }
public ModbusTcpProtocal(string ip, byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) public ModbusTcpProtocal(string ip, byte slaveAddress, byte masterAddress, Endian endian) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip); ProtocalLinker = new ModbusTcpProtocalLinker(ip);
} }
public ModbusTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress) public ModbusTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress, endian)
{ {
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port); ProtocalLinker = new ModbusTcpProtocalLinker(ip, port);
} }

View File

@@ -33,24 +33,25 @@ namespace Modbus.Net.Modbus
/// </summary> /// </summary>
private ModbusType _modbusType; private ModbusType _modbusType;
public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress) public ModbusUtility(int connectionType, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
Endian = endian;
ConnectionString = null; ConnectionString = null;
ModbusType = (ModbusType) connectionType; ModbusType = (ModbusType) connectionType;
AddressTranslator = new AddressTranslatorModbus(); AddressTranslator = new AddressTranslatorModbus();
} }
public ModbusUtility(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress) public ModbusUtility(ModbusType connectionType, string connectionString, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb)
: base(slaveAddress, masterAddress) : base(slaveAddress, masterAddress)
{ {
Endian = endian;
ConnectionString = connectionString; ConnectionString = connectionString;
ModbusType = connectionType; ModbusType = connectionType;
AddressTranslator = new AddressTranslatorModbus(); AddressTranslator = new AddressTranslatorModbus();
} }
public override Endian GetLittleEndian => Wrapper[typeof (ReadDataModbusProtocal)].IsLittleEndian; public override Endian Endian { get; }
public override Endian SetLittleEndian => Wrapper[typeof (WriteDataModbusProtocal)].IsLittleEndian;
protected string ConnectionStringIp protected string ConnectionStringIp
{ {
@@ -91,27 +92,27 @@ namespace Modbus.Net.Modbus
case ModbusType.Rtu: case ModbusType.Rtu:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusRtuProtocal(SlaveAddress, MasterAddress) ? new ModbusRtuProtocal(SlaveAddress, MasterAddress, Endian)
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress); : new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
break; break;
} }
//Tcp协议 //Tcp协议
case ModbusType.Tcp: case ModbusType.Tcp:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusTcpProtocal(SlaveAddress, MasterAddress) ? new ModbusTcpProtocal(SlaveAddress, MasterAddress, Endian)
: (ConnectionStringPort == null : (ConnectionStringPort == null
? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress) ? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian)
: new ModbusTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress, : new ModbusTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
MasterAddress)); MasterAddress, Endian));
break; break;
} }
//Ascii协议 //Ascii协议
case ModbusType.Ascii: case ModbusType.Ascii:
{ {
Wrapper = ConnectionString == null Wrapper = ConnectionString == null
? new ModbusAsciiProtocal(SlaveAddress, MasterAddress) ? new ModbusAsciiProtocal(SlaveAddress, MasterAddress, Endian)
: new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress); : new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
break; break;
} }
} }
@@ -157,7 +158,7 @@ namespace Modbus.Net.Modbus
try try
{ {
var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents, var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents,
AddressTranslator); AddressTranslator, Endian);
var outputStruct = await var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct) as Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct) as
WriteDataModbusOutputStruct; WriteDataModbusOutputStruct;

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: : // 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.2")] [assembly: AssemblyVersion("1.2.3")]
[assembly: AssemblyFileVersion("1.2.2")] [assembly: AssemblyFileVersion("1.2.3")]

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>Modbus.Net.OPC</id> <id>Modbus.Net.OPC</id>
<version>1.2.2</version> <version>1.2.3</version>
<title>Modbus.Net.OPC</title> <title>Modbus.Net.OPC</title>
<authors>Chris L.(Luo Sheng)</authors> <authors>Chris L.(Luo Sheng)</authors>
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners> <owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
@@ -13,7 +13,7 @@
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright> <copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
<tags>hardware communicate protocal OPC DA Delian</tags> <tags>hardware communicate protocal OPC DA Delian</tags>
<dependencies> <dependencies>
<dependency id="Modbus.Net" version="1.2.2" /> <dependency id="Modbus.Net" version="1.2.3" />
<dependency id="H.Opc" version="0.7.0" /> <dependency id="H.Opc" version="0.7.0" />
</dependencies> </dependencies>
</metadata> </metadata>

View File

@@ -15,8 +15,7 @@ namespace Modbus.Net.OPC
Wrapper = new OpcDaProtocal(ConnectionString); Wrapper = new OpcDaProtocal(ConnectionString);
} }
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestOpcProtocal)].IsLittleEndian; public override Endian Endian => Endian.BigEndianLsb;
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestOpcProtocal)].IsLittleEndian;
public override void SetConnectionType(int connectionType) public override void SetConnectionType(int connectionType)
{ {

View File

@@ -7,7 +7,7 @@ namespace Modbus.Net.OPC
/// </summary> /// </summary>
public abstract class OpcProtocal : BaseProtocal public abstract class OpcProtocal : BaseProtocal
{ {
protected OpcProtocal() : base(0, 0) protected OpcProtocal() : base(0, 0, Endian.BigEndianLsb)
{ {
} }
} }

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: : // 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.2")] [assembly: AssemblyVersion("1.2.3")]
[assembly: AssemblyFileVersion("1.2.2")] [assembly: AssemblyFileVersion("1.2.3")]

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>Modbus.Net.Siemens</id> <id>Modbus.Net.Siemens</id>
<version>1.2.2</version> <version>1.2.3</version>
<title>Modbus.Net.Siemens</title> <title>Modbus.Net.Siemens</title>
<authors>Chris L.(Luo Sheng)</authors> <authors>Chris L.(Luo Sheng)</authors>
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners> <owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
@@ -13,7 +13,7 @@
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright> <copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
<tags>hardware communicate protocal Siemens profinet Delian</tags> <tags>hardware communicate protocal Siemens profinet Delian</tags>
<dependencies> <dependencies>
<dependency id="Modbus.Net" version="1.2.2" /> <dependency id="Modbus.Net" version="1.2.3" />
</dependencies> </dependencies>
</metadata> </metadata>
<files> <files>

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: : // 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.2")] [assembly: AssemblyVersion("1.2.3")]
[assembly: AssemblyFileVersion("1.2.2")] [assembly: AssemblyFileVersion("1.2.3")]

View File

@@ -104,7 +104,7 @@ namespace Modbus.Net.Siemens
public abstract class SiemensProtocal : BaseProtocal public abstract class SiemensProtocal : BaseProtocal
{ {
protected SiemensProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress) protected SiemensProtocal(byte slaveAddress, byte masterAddress) : base(slaveAddress, masterAddress, Endian.BigEndianLsb)
{ {
} }
} }

View File

@@ -91,8 +91,7 @@ namespace Modbus.Net.Siemens
AddressTranslator = new AddressTranslatorSiemens(); AddressTranslator = new AddressTranslatorSiemens();
} }
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestSiemensProtocal)].IsLittleEndian; public override Endian Endian => Endian.BigEndianLsb;
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestSiemensProtocal)].IsLittleEndian;
protected string ConnectionStringIp protected string ConnectionStringIp
{ {

View File

@@ -257,17 +257,10 @@ namespace Modbus.Net
{ {
PlcValue = PlcValue =
Convert.ToDouble( Convert.ToDouble(
BaseUtility.GetLittleEndian == Endian.LittleEndianLsb ValueHelper.GetInstance(BaseUtility.Endian)
? ValueHelper.Instance.GetValue(datas, ref localMainPos, ref localSubPos, .GetValue(datas, ref localMainPos, ref localSubPos,
address.DataType) address.DataType)
.ToString() .ToString())*address.Zoom,
: 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 UnitExtend = address.UnitExtend
}); });
} }
@@ -378,11 +371,7 @@ namespace Modbus.Net
BigEndianValueHelper.Instance.ByteLength[ BigEndianValueHelper.Instance.ByteLength[
communicateAddress.DataType.FullName])); communicateAddress.DataType.FullName]));
var valueHelper = BaseUtility.SetLittleEndian == Endian.LittleEndianLsb var valueHelper = ValueHelper.GetInstance(BaseUtility.Endian);
? ValueHelper.Instance
: BaseUtility.SetLittleEndian == Endian.BigEndianLsb
? BigEndianValueHelper.Instance
: BigEndianMsbValueHelper.Instance;
//如果设备本身能获取到数据但是没有数据 //如果设备本身能获取到数据但是没有数据
var datas = datasReturn; var datas = datasReturn;

View File

@@ -13,13 +13,16 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 构造器 /// 构造器
/// </summary> /// </summary>
protected BaseProtocal(byte slaveAddress, byte masterAddress) protected BaseProtocal(byte slaveAddress, byte masterAddress, Endian endian)
{ {
Endian = endian;
Protocals = new Dictionary<string, ProtocalUnit>(); Protocals = new Dictionary<string, ProtocalUnit>();
SlaveAddress = slaveAddress; SlaveAddress = slaveAddress;
MasterAddress = masterAddress; MasterAddress = masterAddress;
} }
protected Endian Endian { get; set; }
public byte SlaveAddress { get; set; } public byte SlaveAddress { get; set; }
public byte MasterAddress { get; set; } public byte MasterAddress { get; set; }
@@ -44,8 +47,9 @@ namespace Modbus.Net
} }
//自动寻找存在的协议并将其加载 //自动寻找存在的协议并将其加载
var protocalUnit = var protocalUnit =
Assembly.Load(type.Assembly.FullName).CreateInstance(protocalName) as ProtocalUnit; Assembly.Load(type.Assembly.FullName).CreateInstance(protocalName) as ProtocalUnit;
if (protocalUnit == null) throw new InvalidCastException("没有相应的协议内容"); if (protocalUnit == null) throw new InvalidCastException("没有相应的协议内容");
protocalUnit.Endian = Endian;
Register(protocalUnit); Register(protocalUnit);
return Protocals[protocalName]; return Protocals[protocalName];
} }

View File

@@ -40,14 +40,9 @@ namespace Modbus.Net
public byte MasterAddress { get; set; } public byte MasterAddress { get; set; }
/// <summary> /// <summary>
/// 获取协议是否遵循小端格式 /// 协议是否遵循小端格式
/// </summary> /// </summary>
public abstract Endian GetLittleEndian { get; } public abstract Endian Endian { get; }
/// <summary>
/// 设置协议是否遵循小端格式
/// </summary>
public abstract Endian SetLittleEndian { get; }
/// <summary> /// <summary>
/// 设备是否已经连接 /// 设备是否已经连接
@@ -117,22 +112,8 @@ namespace Modbus.Net
var getReturnValue = await GetDatasAsync(startAddress, var getReturnValue = await GetDatasAsync(startAddress,
(int) Math.Ceiling(bCount*getTypeAndCount.Value)); (int) Math.Ceiling(bCount*getTypeAndCount.Value));
var getBytes = getReturnValue; var getBytes = getReturnValue;
switch (GetLittleEndian) return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, getTypeAndCount);
{
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) catch (Exception)
{ {
@@ -167,7 +148,7 @@ namespace Modbus.Net
{ {
var getBytes = await GetDatasAsync(startAddress, var getBytes = await GetDatasAsync(startAddress,
new KeyValuePair<Type, int>(typeof (T), getByteCount)); new KeyValuePair<Type, int>(typeof (T), getByteCount));
return BigEndianValueHelper.Instance.ObjectArrayToDestinationArray<T>(getBytes); return ValueHelper.GetInstance(Endian).ObjectArrayToDestinationArray<T>(getBytes);
} }
catch (Exception) catch (Exception)
{ {
@@ -188,7 +169,7 @@ namespace Modbus.Net
AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getTypeAndCountList)); AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getTypeAndCountList));
} }
/// <summary> /// <summary>GetEndian
/// 获取数据 /// 获取数据
/// </summary> /// </summary>
/// <param name="startAddress">开始地址</param> /// <param name="startAddress">开始地址</param>
@@ -207,22 +188,7 @@ namespace Modbus.Net
select (int) Math.Ceiling(bCount*getTypeAndCount.Value)).Sum(); select (int) Math.Ceiling(bCount*getTypeAndCount.Value)).Sum();
var getReturnValue = await GetDatasAsync(startAddress, bAllCount); var getReturnValue = await GetDatasAsync(startAddress, bAllCount);
var getBytes = getReturnValue; var getBytes = getReturnValue;
switch (GetLittleEndian) return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, translateTypeAndCount);
{
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) catch (Exception)
{ {

View File

@@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>Modbus.Net</id> <id>Modbus.Net</id>
<version>1.2.2.1</version> <version>1.2.3</version>
<title>Modbus.Net</title> <title>Modbus.Net</title>
<authors>Chris L.(Luo Sheng)</authors> <authors>Chris L.(Luo Sheng)</authors>
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners> <owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>

View File

@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
// 方法是按如下所示使用“*”: // 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.2")] [assembly: AssemblyVersion("1.2.3")]
[assembly: AssemblyFileVersion("1.2.2")] [assembly: AssemblyFileVersion("1.2.3")]

View File

@@ -10,7 +10,7 @@ namespace Modbus.Net
/// <summary> /// <summary>
/// 是否为小端格式 /// 是否为小端格式
/// </summary> /// </summary>
public Endian IsLittleEndian { get; protected set; } = Endian.BigEndianLsb; public Endian Endian { get; set; } = Endian.BigEndianLsb;
/// <summary> /// <summary>
/// 从输入结构格式化 /// 从输入结构格式化
@@ -26,7 +26,7 @@ namespace Modbus.Net
/// <returns>格式化后的字节流</returns> /// <returns>格式化后的字节流</returns>
public virtual byte[] Format(params object[] message) public virtual byte[] Format(params object[] message)
{ {
return TranslateContent(IsLittleEndian, message); return TranslateContent(Endian, message);
} }
/// <summary> /// <summary>

View File

@@ -34,6 +34,8 @@ namespace Modbus.Net
/// </summary> /// </summary>
public static bool LittleEndian => true; public static bool LittleEndian => true;
public static bool LittleEndianBit => true;
/// <summary> /// <summary>
/// 将一个byte数字转换为一个byte元素的数组。 /// 将一个byte数字转换为一个byte元素的数组。
/// </summary> /// </summary>
@@ -508,7 +510,7 @@ namespace Modbus.Net
boolToByteTemp = 0; boolToByteTemp = 0;
} }
lastIsBool = true; lastIsBool = true;
if (LittleEndian) if (!LittleEndianBit)
{ {
boolToByteTemp = (byte) (boolToByteTemp*2 + ((bool) content ? 1 : 0)); boolToByteTemp = (byte) (boolToByteTemp*2 + ((bool) content ? 1 : 0));
} }
@@ -874,6 +876,29 @@ namespace Modbus.Net
/// </summary> /// </summary>
public static ValueHelper Instance => _instance ?? (_instance = new ValueHelper()); public static ValueHelper Instance => _instance ?? (_instance = new ValueHelper());
public static ValueHelper GetInstance(Endian endian)
{
switch (endian)
{
case Endian.LittleEndianLsb:
{
return ValueHelper.Instance;
}
case Endian.BigEndianLsb:
{
return BigEndianValueHelper.Instance;
}
case Endian.BigEndianMsb:
{
return BigEndianMsbValueHelper.Instance;
}
default:
{
return ValueHelper.Instance;
}
}
}
#endregion #endregion
} }
@@ -1023,6 +1048,8 @@ namespace Modbus.Net
protected new bool LittleEndian => false; protected new bool LittleEndian => false;
protected new bool LittleEndianBit => false;
public new static BigEndianValueHelper Instance public new static BigEndianValueHelper Instance
=> _bigEndianInstance ?? (_bigEndianInstance = new BigEndianMsbValueHelper()); => _bigEndianInstance ?? (_bigEndianInstance = new BigEndianMsbValueHelper());