2017-02-26 update 1 Msb Version Continue Fix and open Modbus Endian change.
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Modbus.Net.Modbus</id>
|
||||
<version>1.2.2</version>
|
||||
<version>1.2.3</version>
|
||||
<title>Modbus.Net.Modbus</title>
|
||||
<authors>Chris L.(Luo Sheng)</authors>
|
||||
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
|
||||
@@ -13,7 +13,7 @@
|
||||
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
|
||||
<tags>hardware communicate protocal modbus Delian</tags>
|
||||
<dependencies>
|
||||
<dependency id="Modbus.Net" version="1.2.2" />
|
||||
<dependency id="Modbus.Net" version="1.2.3" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
/// </summary>
|
||||
public class ModbusAsciiProtocal : ModbusProtocal
|
||||
{
|
||||
public ModbusAsciiProtocal(byte slaveAddress, byte masterAddress)
|
||||
: this(ConfigurationManager.COM, slaveAddress, masterAddress)
|
||||
public ModbusAsciiProtocal(byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: this(ConfigurationManager.COM, slaveAddress, masterAddress, endian)
|
||||
{
|
||||
}
|
||||
|
||||
public ModbusAsciiProtocal(string com, byte slaveAddress, byte masterAddress)
|
||||
: base(slaveAddress, masterAddress)
|
||||
public ModbusAsciiProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: base(slaveAddress, masterAddress, endian)
|
||||
{
|
||||
ProtocalLinker = new ModbusAsciiProtocalLinker(com);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
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)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
var dataCount = BigEndianValueHelper.Instance.GetByte(messageBytes, ref pos);
|
||||
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
|
||||
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
|
||||
var dataCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref pos);
|
||||
var dataValue = new byte[dataCount];
|
||||
Array.Copy(messageBytes, 3, dataValue, 0, dataCount);
|
||||
return new ReadDataModbusOutputStruct(slaveAddress, functionCode, dataCount, dataValue);
|
||||
@@ -132,13 +132,13 @@ namespace Modbus.Net.Modbus
|
||||
public class WriteDataModbusInputStruct : IInputStruct
|
||||
{
|
||||
public WriteDataModbusInputStruct(byte slaveAddress, string startAddress, object[] writeValue,
|
||||
AddressTranslator addressTranslator)
|
||||
AddressTranslator addressTranslator, Endian endian)
|
||||
{
|
||||
SlaveAddress = slaveAddress;
|
||||
var translateAddress = addressTranslator.AddressTranslate(startAddress, false);
|
||||
FunctionCode = (byte) translateAddress.Area;
|
||||
StartAddress = (ushort) translateAddress.Address;
|
||||
var writeByteValue = BigEndianValueHelper.Instance.ObjectArrayToByteArray(writeValue);
|
||||
var writeByteValue = ValueHelper.GetInstance(endian).ObjectArrayToByteArray(writeValue);
|
||||
WriteCount =
|
||||
(ushort) (writeByteValue.Length/addressTranslator.GetAreaByteLength(translateAddress.AreaString));
|
||||
WriteByteCount = (byte) writeByteValue.Length;
|
||||
@@ -194,10 +194,10 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var startAddress = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var writeCount = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
return new WriteDataModbusOutputStruct(slaveAddress, functionCode, startAddress,
|
||||
writeCount);
|
||||
}
|
||||
@@ -261,16 +261,16 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var writeByteCount = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var year = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var day = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var month = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var hour = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var second = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var minute = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var millisecond = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var writeByteCount = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var year = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
var day = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var month = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var hour = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
var second = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var minute = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var millisecond = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
return new GetSystemTimeModbusOutputStruct(slaveAddress, functionCode, writeByteCount, year, day,
|
||||
month, hour, second, minute, millisecond);
|
||||
}
|
||||
@@ -359,10 +359,10 @@ namespace Modbus.Net.Modbus
|
||||
|
||||
public override IOutputStruct Unformat(byte[] messageBytes, ref int flag)
|
||||
{
|
||||
var slaveAddress = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var functionCode = BigEndianValueHelper.Instance.GetByte(messageBytes, ref flag);
|
||||
var startAddress = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var writeCount = BigEndianValueHelper.Instance.GetUShort(messageBytes, ref flag);
|
||||
var slaveAddress = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var functionCode = ValueHelper.GetInstance(Endian).GetByte(messageBytes, ref flag);
|
||||
var startAddress = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
var writeCount = ValueHelper.GetInstance(Endian).GetUShort(messageBytes, ref flag);
|
||||
return new SetSystemTimeModbusOutputStruct(slaveAddress, functionCode, startAddress, writeCount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,13 +5,13 @@
|
||||
/// </summary>
|
||||
public class ModbusRtuProtocal : ModbusProtocal
|
||||
{
|
||||
public ModbusRtuProtocal(byte slaveAddress, byte masterAddress)
|
||||
: this(ConfigurationManager.COM, slaveAddress, masterAddress)
|
||||
public ModbusRtuProtocal(byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: this(ConfigurationManager.COM, slaveAddress, masterAddress, endian)
|
||||
{
|
||||
}
|
||||
|
||||
public ModbusRtuProtocal(string com, byte slaveAddress, byte masterAddress)
|
||||
: base(slaveAddress, masterAddress)
|
||||
public ModbusRtuProtocal(string com, byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: base(slaveAddress, masterAddress, endian)
|
||||
{
|
||||
ProtocalLinker = new ModbusRtuProtocalLinker(com);
|
||||
}
|
||||
|
||||
@@ -5,18 +5,18 @@
|
||||
/// </summary>
|
||||
public class ModbusTcpProtocal : ModbusProtocal
|
||||
{
|
||||
public ModbusTcpProtocal(byte slaveAddress, byte masterAddress)
|
||||
: this(ConfigurationManager.IP, slaveAddress, masterAddress)
|
||||
public ModbusTcpProtocal(byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: 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);
|
||||
}
|
||||
|
||||
public ModbusTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress)
|
||||
: base(slaveAddress, masterAddress)
|
||||
public ModbusTcpProtocal(string ip, int port, byte slaveAddress, byte masterAddress, Endian endian)
|
||||
: base(slaveAddress, masterAddress, endian)
|
||||
{
|
||||
ProtocalLinker = new ModbusTcpProtocalLinker(ip, port);
|
||||
}
|
||||
|
||||
@@ -33,24 +33,25 @@ namespace Modbus.Net.Modbus
|
||||
/// </summary>
|
||||
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)
|
||||
{
|
||||
Endian = endian;
|
||||
ConnectionString = null;
|
||||
ModbusType = (ModbusType) connectionType;
|
||||
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)
|
||||
{
|
||||
Endian = endian;
|
||||
ConnectionString = connectionString;
|
||||
ModbusType = connectionType;
|
||||
AddressTranslator = new AddressTranslatorModbus();
|
||||
}
|
||||
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadDataModbusProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteDataModbusProtocal)].IsLittleEndian;
|
||||
public override Endian Endian { get; }
|
||||
|
||||
protected string ConnectionStringIp
|
||||
{
|
||||
@@ -91,27 +92,27 @@ namespace Modbus.Net.Modbus
|
||||
case ModbusType.Rtu:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
? new ModbusRtuProtocal(SlaveAddress, MasterAddress)
|
||||
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
||||
? new ModbusRtuProtocal(SlaveAddress, MasterAddress, Endian)
|
||||
: new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
|
||||
break;
|
||||
}
|
||||
//Tcp协议
|
||||
case ModbusType.Tcp:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
? new ModbusTcpProtocal(SlaveAddress, MasterAddress)
|
||||
? new ModbusTcpProtocal(SlaveAddress, MasterAddress, Endian)
|
||||
: (ConnectionStringPort == null
|
||||
? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress)
|
||||
? new ModbusTcpProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian)
|
||||
: new ModbusTcpProtocal(ConnectionStringIp, ConnectionStringPort.Value, SlaveAddress,
|
||||
MasterAddress));
|
||||
MasterAddress, Endian));
|
||||
break;
|
||||
}
|
||||
//Ascii协议
|
||||
case ModbusType.Ascii:
|
||||
{
|
||||
Wrapper = ConnectionString == null
|
||||
? new ModbusAsciiProtocal(SlaveAddress, MasterAddress)
|
||||
: new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress);
|
||||
? new ModbusAsciiProtocal(SlaveAddress, MasterAddress, Endian)
|
||||
: new ModbusAsciiProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -157,7 +158,7 @@ namespace Modbus.Net.Modbus
|
||||
try
|
||||
{
|
||||
var inputStruct = new WriteDataModbusInputStruct(SlaveAddress, startAddress, setContents,
|
||||
AddressTranslator);
|
||||
AddressTranslator, Endian);
|
||||
var outputStruct = await
|
||||
Wrapper.SendReceiveAsync(Wrapper[typeof (WriteDataModbusProtocal)], inputStruct) as
|
||||
WriteDataModbusOutputStruct;
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”: :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2")]
|
||||
[assembly: AssemblyVersion("1.2.3")]
|
||||
[assembly: AssemblyFileVersion("1.2.3")]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Modbus.Net.OPC</id>
|
||||
<version>1.2.2</version>
|
||||
<version>1.2.3</version>
|
||||
<title>Modbus.Net.OPC</title>
|
||||
<authors>Chris L.(Luo Sheng)</authors>
|
||||
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
|
||||
@@ -13,7 +13,7 @@
|
||||
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
|
||||
<tags>hardware communicate protocal OPC DA Delian</tags>
|
||||
<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" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
|
||||
@@ -15,8 +15,7 @@ namespace Modbus.Net.OPC
|
||||
Wrapper = new OpcDaProtocal(ConnectionString);
|
||||
}
|
||||
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestOpcProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestOpcProtocal)].IsLittleEndian;
|
||||
public override Endian Endian => Endian.BigEndianLsb;
|
||||
|
||||
public override void SetConnectionType(int connectionType)
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@ namespace Modbus.Net.OPC
|
||||
/// </summary>
|
||||
public abstract class OpcProtocal : BaseProtocal
|
||||
{
|
||||
protected OpcProtocal() : base(0, 0)
|
||||
protected OpcProtocal() : base(0, 0, Endian.BigEndianLsb)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”: :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2")]
|
||||
[assembly: AssemblyVersion("1.2.3")]
|
||||
[assembly: AssemblyFileVersion("1.2.3")]
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Modbus.Net.Siemens</id>
|
||||
<version>1.2.2</version>
|
||||
<version>1.2.3</version>
|
||||
<title>Modbus.Net.Siemens</title>
|
||||
<authors>Chris L.(Luo Sheng)</authors>
|
||||
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
|
||||
@@ -13,7 +13,7 @@
|
||||
<copyright>Copyright 2017 Hangzhou Delian IoT Science Technology Co.,Ltd.</copyright>
|
||||
<tags>hardware communicate protocal Siemens profinet Delian</tags>
|
||||
<dependencies>
|
||||
<dependency id="Modbus.Net" version="1.2.2" />
|
||||
<dependency id="Modbus.Net" version="1.2.3" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
||||
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
||||
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
|
||||
// 方法是按如下所示使用“*”: :
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2")]
|
||||
[assembly: AssemblyVersion("1.2.3")]
|
||||
[assembly: AssemblyFileVersion("1.2.3")]
|
||||
|
||||
@@ -104,7 +104,7 @@ namespace Modbus.Net.Siemens
|
||||
|
||||
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)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,8 +91,7 @@ namespace Modbus.Net.Siemens
|
||||
AddressTranslator = new AddressTranslatorSiemens();
|
||||
}
|
||||
|
||||
public override Endian GetLittleEndian => Wrapper[typeof (ReadRequestSiemensProtocal)].IsLittleEndian;
|
||||
public override Endian SetLittleEndian => Wrapper[typeof (WriteRequestSiemensProtocal)].IsLittleEndian;
|
||||
public override Endian Endian => Endian.BigEndianLsb;
|
||||
|
||||
protected string ConnectionStringIp
|
||||
{
|
||||
|
||||
@@ -257,17 +257,10 @@ namespace Modbus.Net
|
||||
{
|
||||
PlcValue =
|
||||
Convert.ToDouble(
|
||||
BaseUtility.GetLittleEndian == Endian.LittleEndianLsb
|
||||
? ValueHelper.Instance.GetValue(datas, ref localMainPos, ref localSubPos,
|
||||
ValueHelper.GetInstance(BaseUtility.Endian)
|
||||
.GetValue(datas, ref localMainPos, ref localSubPos,
|
||||
address.DataType)
|
||||
.ToString()
|
||||
: 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,
|
||||
.ToString())*address.Zoom,
|
||||
UnitExtend = address.UnitExtend
|
||||
});
|
||||
}
|
||||
@@ -378,11 +371,7 @@ namespace Modbus.Net
|
||||
BigEndianValueHelper.Instance.ByteLength[
|
||||
communicateAddress.DataType.FullName]));
|
||||
|
||||
var valueHelper = BaseUtility.SetLittleEndian == Endian.LittleEndianLsb
|
||||
? ValueHelper.Instance
|
||||
: BaseUtility.SetLittleEndian == Endian.BigEndianLsb
|
||||
? BigEndianValueHelper.Instance
|
||||
: BigEndianMsbValueHelper.Instance;
|
||||
var valueHelper = ValueHelper.GetInstance(BaseUtility.Endian);
|
||||
//如果设备本身能获取到数据但是没有数据
|
||||
var datas = datasReturn;
|
||||
|
||||
|
||||
@@ -13,13 +13,16 @@ namespace Modbus.Net
|
||||
/// <summary>
|
||||
/// 构造器
|
||||
/// </summary>
|
||||
protected BaseProtocal(byte slaveAddress, byte masterAddress)
|
||||
protected BaseProtocal(byte slaveAddress, byte masterAddress, Endian endian)
|
||||
{
|
||||
Endian = endian;
|
||||
Protocals = new Dictionary<string, ProtocalUnit>();
|
||||
SlaveAddress = slaveAddress;
|
||||
MasterAddress = masterAddress;
|
||||
}
|
||||
|
||||
protected Endian Endian { get; set; }
|
||||
|
||||
public byte SlaveAddress { get; set; }
|
||||
public byte MasterAddress { get; set; }
|
||||
|
||||
@@ -46,6 +49,7 @@ namespace Modbus.Net
|
||||
var protocalUnit =
|
||||
Assembly.Load(type.Assembly.FullName).CreateInstance(protocalName) as ProtocalUnit;
|
||||
if (protocalUnit == null) throw new InvalidCastException("没有相应的协议内容");
|
||||
protocalUnit.Endian = Endian;
|
||||
Register(protocalUnit);
|
||||
return Protocals[protocalName];
|
||||
}
|
||||
|
||||
@@ -40,14 +40,9 @@ namespace Modbus.Net
|
||||
public byte MasterAddress { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取协议是否遵循小端格式
|
||||
/// 协议是否遵循小端格式
|
||||
/// </summary>
|
||||
public abstract Endian GetLittleEndian { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 设置协议是否遵循小端格式
|
||||
/// </summary>
|
||||
public abstract Endian SetLittleEndian { get; }
|
||||
public abstract Endian Endian { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 设备是否已经连接
|
||||
@@ -117,22 +112,8 @@ namespace Modbus.Net
|
||||
var getReturnValue = await GetDatasAsync(startAddress,
|
||||
(int) Math.Ceiling(bCount*getTypeAndCount.Value));
|
||||
var getBytes = getReturnValue;
|
||||
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;
|
||||
return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, getTypeAndCount);
|
||||
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -167,7 +148,7 @@ namespace Modbus.Net
|
||||
{
|
||||
var getBytes = await GetDatasAsync(startAddress,
|
||||
new KeyValuePair<Type, int>(typeof (T), getByteCount));
|
||||
return BigEndianValueHelper.Instance.ObjectArrayToDestinationArray<T>(getBytes);
|
||||
return ValueHelper.GetInstance(Endian).ObjectArrayToDestinationArray<T>(getBytes);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
@@ -188,7 +169,7 @@ namespace Modbus.Net
|
||||
AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getTypeAndCountList));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// <summary>GetEndian
|
||||
/// 获取数据
|
||||
/// </summary>
|
||||
/// <param name="startAddress">开始地址</param>
|
||||
@@ -207,22 +188,7 @@ namespace Modbus.Net
|
||||
select (int) Math.Ceiling(bCount*getTypeAndCount.Value)).Sum();
|
||||
var getReturnValue = await GetDatasAsync(startAddress, bAllCount);
|
||||
var getBytes = getReturnValue;
|
||||
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;
|
||||
return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, translateTypeAndCount);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>Modbus.Net</id>
|
||||
<version>1.2.2.1</version>
|
||||
<version>1.2.3</version>
|
||||
<title>Modbus.Net</title>
|
||||
<authors>Chris L.(Luo Sheng)</authors>
|
||||
<owners>Hangzhou Delian IoT Science Technology Co.,Ltd.</owners>
|
||||
|
||||
@@ -35,5 +35,5 @@ using System.Runtime.InteropServices;
|
||||
// 方法是按如下所示使用“*”:
|
||||
// [assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
[assembly: AssemblyVersion("1.2.2")]
|
||||
[assembly: AssemblyFileVersion("1.2.2")]
|
||||
[assembly: AssemblyVersion("1.2.3")]
|
||||
[assembly: AssemblyFileVersion("1.2.3")]
|
||||
@@ -10,7 +10,7 @@ namespace Modbus.Net
|
||||
/// <summary>
|
||||
/// 是否为小端格式
|
||||
/// </summary>
|
||||
public Endian IsLittleEndian { get; protected set; } = Endian.BigEndianLsb;
|
||||
public Endian Endian { get; set; } = Endian.BigEndianLsb;
|
||||
|
||||
/// <summary>
|
||||
/// 从输入结构格式化
|
||||
@@ -26,7 +26,7 @@ namespace Modbus.Net
|
||||
/// <returns>格式化后的字节流</returns>
|
||||
public virtual byte[] Format(params object[] message)
|
||||
{
|
||||
return TranslateContent(IsLittleEndian, message);
|
||||
return TranslateContent(Endian, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -34,6 +34,8 @@ namespace Modbus.Net
|
||||
/// </summary>
|
||||
public static bool LittleEndian => true;
|
||||
|
||||
public static bool LittleEndianBit => true;
|
||||
|
||||
/// <summary>
|
||||
/// 将一个byte数字转换为一个byte元素的数组。
|
||||
/// </summary>
|
||||
@@ -508,7 +510,7 @@ namespace Modbus.Net
|
||||
boolToByteTemp = 0;
|
||||
}
|
||||
lastIsBool = true;
|
||||
if (LittleEndian)
|
||||
if (!LittleEndianBit)
|
||||
{
|
||||
boolToByteTemp = (byte) (boolToByteTemp*2 + ((bool) content ? 1 : 0));
|
||||
}
|
||||
@@ -874,6 +876,29 @@ namespace Modbus.Net
|
||||
/// </summary>
|
||||
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
|
||||
}
|
||||
|
||||
@@ -1023,6 +1048,8 @@ namespace Modbus.Net
|
||||
|
||||
protected new bool LittleEndian => false;
|
||||
|
||||
protected new bool LittleEndianBit => false;
|
||||
|
||||
public new static BigEndianValueHelper Instance
|
||||
=> _bigEndianInstance ?? (_bigEndianInstance = new BigEndianMsbValueHelper());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user