diff --git a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj
index 564990a..489b6c8 100644
--- a/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj
+++ b/Modbus.Net/Modbus.Net.Modbus.NA200H/Modbus.Net.Modbus.NA200H.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Modbus.NA200H
Modbus.Net.Modbus.NA200H
Modbus.Net.Modbus.NA200H
- 1.4.0-beta03
+ 1.4.0-beta04
Chris L.(Luo Sheng)
Hangzhou Delian Science Technology Co.,Ltd.
Modbus.Net.Modbus
diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
index c5c830d..e81085e 100644
--- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
+++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Modbus
Modbus.Net.Modbus
Modbus.Net.Modbus
- 1.4.0-beta03
+ 1.4.0-beta04
Chris L.(Luo Sheng)
Hangzhou Delian Science Technology Co.,Ltd.
Modbus.Net.Modbus
diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs
index ab68099..1af5205 100644
--- a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs
+++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs
@@ -61,7 +61,7 @@ namespace Modbus.Net.Modbus
/// 起始地址
/// 需要设置的数据
/// 设置是否成功
- Task SetSingleDataAsync(string startAddress, object setContent);
+ Task> SetSingleDataAsync(string startAddress, object setContent);
}
///
@@ -251,7 +251,7 @@ namespace Modbus.Net.Modbus
/// 读时间
///
/// 设备的时间
- public async Task GetTimeAsync()
+ public async Task> GetTimeAsync()
{
try
{
@@ -259,12 +259,24 @@ namespace Modbus.Net.Modbus
var outputStruct =
await Wrapper.SendReceiveAsync(
Wrapper[typeof(GetSystemTimeModbusProtocol)], inputStruct);
- return outputStruct?.Time ?? DateTime.MinValue;
+ return new ReturnStruct
+ {
+ Datas = outputStruct?.Time ?? DateTime.MinValue,
+ IsSuccess = true,
+ ErrorCode = 0,
+ ErrorMsg = ""
+ };
}
- catch (Exception e)
+ catch (ModbusProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> GetTime: {ConnectionString} error");
- return DateTime.MinValue;
+ logger.LogError(e, $"ModbusUtility -> GetTime: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = DateTime.MinValue,
+ IsSuccess = false,
+ ErrorCode = e.ErrorMessageNumber,
+ ErrorMsg = e.Message
+ };
}
}
@@ -273,7 +285,7 @@ namespace Modbus.Net.Modbus
///
/// 需要写入的时间
/// 写入是否成功
- public async Task SetTimeAsync(DateTime setTime)
+ public async Task> SetTimeAsync(DateTime setTime)
{
try
{
@@ -281,12 +293,24 @@ namespace Modbus.Net.Modbus
var outputStruct =
await Wrapper.SendReceiveAsync(
Wrapper[typeof(SetSystemTimeModbusProtocol)], inputStruct);
- return outputStruct?.WriteCount > 0;
+ return new ReturnStruct()
+ {
+ Datas = outputStruct?.WriteCount > 0,
+ IsSuccess = outputStruct?.WriteCount > 0,
+ ErrorCode = outputStruct?.WriteCount > 0 ? 0 : -2,
+ ErrorMsg = outputStruct?.WriteCount > 0 ? "" : "Data length zero"
+ };
}
- catch (Exception e)
+ catch (ModbusProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> SetTime: {ConnectionString} error");
- return false;
+ logger.LogError(e, $"ModbusUtility -> SetTime: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = e.ErrorMessageNumber,
+ ErrorMsg = e.Message
+ };
}
}
@@ -305,7 +329,7 @@ namespace Modbus.Net.Modbus
/// 起始地址
/// 获取字节个数
/// 获取的结果
- public override async Task GetDatasAsync(string startAddress, int getByteCount)
+ public override async Task> GetDatasAsync(string startAddress, int getByteCount)
{
try
{
@@ -314,12 +338,24 @@ namespace Modbus.Net.Modbus
var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof(ReadDataModbusProtocol)],
inputStruct);
- return outputStruct?.DataValue;
+ return new ReturnStruct
+ {
+ Datas = outputStruct?.DataValue,
+ IsSuccess = true,
+ ErrorCode = 0,
+ ErrorMsg = ""
+ };
}
- catch (Exception e)
+ catch (ModbusProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> GetDatas: {ConnectionString} error");
- return null;
+ logger.LogError(e, $"ModbusUtility -> GetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = null,
+ IsSuccess = false,
+ ErrorCode = e.ErrorMessageNumber,
+ ErrorMsg = e.Message
+ };
}
}
@@ -329,7 +365,7 @@ namespace Modbus.Net.Modbus
/// 起始地址
/// 需要设置的数据
/// 设置是否成功
- public override async Task SetDatasAsync(string startAddress, object[] setContents)
+ public override async Task> SetDatasAsync(string startAddress, object[] setContents)
{
try
{
@@ -338,12 +374,24 @@ namespace Modbus.Net.Modbus
var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof(WriteDataModbusProtocol)],
inputStruct);
- return outputStruct?.WriteCount == setContents.Length;
+ return new ReturnStruct()
+ {
+ Datas = outputStruct?.WriteCount == setContents.Length,
+ IsSuccess = outputStruct?.WriteCount == setContents.Length,
+ ErrorCode = outputStruct?.WriteCount == setContents.Length ? 0 : -2,
+ ErrorMsg = outputStruct?.WriteCount == setContents.Length ? "" : "Data length mismatch"
+ };
}
- catch (Exception e)
+ catch (ModbusProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> SetDatas: {ConnectionString} error");
- return false;
+ logger.LogError(e, $"ModbusUtility -> SetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = e.ErrorMessageNumber,
+ ErrorMsg = e.Message
+ };
}
}
@@ -353,7 +401,7 @@ namespace Modbus.Net.Modbus
/// 起始地址
/// 需要设置的数据
/// 设置是否成功
- public async Task SetSingleDataAsync(string startAddress, object setContent)
+ public async Task> SetSingleDataAsync(string startAddress, object setContent)
{
try
{
@@ -362,12 +410,24 @@ namespace Modbus.Net.Modbus
var outputStruct = await
Wrapper.SendReceiveAsync(Wrapper[typeof(WriteSingleDataModbusProtocol)],
inputStruct);
- return outputStruct?.WriteValue.ToString() == setContent.ToString();
+ return new ReturnStruct()
+ {
+ Datas = outputStruct?.WriteValue.ToString() == setContent.ToString(),
+ IsSuccess = outputStruct?.WriteValue.ToString() == setContent.ToString(),
+ ErrorCode = outputStruct?.WriteValue.ToString() == setContent.ToString() ? 0 : -2,
+ ErrorMsg = outputStruct?.WriteValue.ToString() == setContent.ToString() ? "" : "Data length mismatch"
+ };
}
- catch (Exception e)
+ catch (ModbusProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> SetSingleDatas: {ConnectionString} error");
- return false;
+ logger.LogError(e, $"ModbusUtility -> SetSingleDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = e.ErrorMessageNumber,
+ ErrorMsg = e.Message
+ };
}
}
}
diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
index aa3bef4..b83affa 100644
--- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
+++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj
@@ -5,7 +5,7 @@
Modbus.Net.OPC
Modbus.Net.OPC
Modbus.Net.OPC
- 1.4.0-beta03
+ 1.4.0-beta04
Chris L.(Luo Sheng)
Hangzhou Delian Science Technology Co.,Ltd.
Modbus.Net.OPC
diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
index 2c7c301..48c4bf9 100644
--- a/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
+++ b/Modbus.Net/Modbus.Net.OPC/OpcUtility.cs
@@ -54,7 +54,7 @@ namespace Modbus.Net.OPC
/// 开始地址
/// 获取字节数个数
/// 接收到的byte数据
- public override async Task GetDatasAsync(string startAddress, int getByteCount)
+ public override async Task> GetDatasAsync(string startAddress, int getByteCount)
{
try
{
@@ -64,12 +64,24 @@ namespace Modbus.Net.OPC
await
Wrapper.SendReceiveAsync(Wrapper[typeof(ReadRequestOpcProtocol)],
readRequestOpcInputStruct);
- return readRequestOpcOutputStruct?.GetValue;
+ return new ReturnStruct
+ {
+ Datas = readRequestOpcOutputStruct?.GetValue,
+ IsSuccess = true,
+ ErrorCode = 0,
+ ErrorMsg = ""
+ };
}
catch (Exception e)
{
- logger.LogError(e, $"OpcUtility -> GetDatas: {ConnectionString} error");
- return null;
+ logger.LogError(e, $"OpcUtility -> GetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = null,
+ IsSuccess = true,
+ ErrorCode = -100,
+ ErrorMsg = e.Message
+ };
}
}
@@ -79,7 +91,7 @@ namespace Modbus.Net.OPC
/// 开始地址
/// 设置数据
/// 是否设置成功
- public override async Task SetDatasAsync(string startAddress, object[] setContents)
+ public override async Task> SetDatasAsync(string startAddress, object[] setContents)
{
try
{
@@ -90,12 +102,24 @@ namespace Modbus.Net.OPC
await
Wrapper.SendReceiveAsync(Wrapper[typeof(WriteRequestOpcProtocol)],
writeRequestOpcInputStruct);
- return writeRequestOpcOutputStruct?.WriteResult == true;
+ return new ReturnStruct
+ {
+ Datas = writeRequestOpcOutputStruct?.WriteResult == true,
+ IsSuccess = writeRequestOpcOutputStruct?.WriteResult == true,
+ ErrorCode = writeRequestOpcOutputStruct?.WriteResult == true ? 0 : 1,
+ ErrorMsg = writeRequestOpcOutputStruct?.WriteResult == true ? "" : "Write Failed"
+ };
}
catch (Exception e)
{
- logger.LogError(e, $"OpcUtility -> SetDatas: {ConnectionString} error");
- return false;
+ logger.LogError(e, $"OpcUtility -> SetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = -100,
+ ErrorMsg = e.Message
+ };
}
}
}
diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
index 9d6c9d8..7d8721f 100644
--- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
+++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj
@@ -5,7 +5,7 @@
Modbus.Net.Siemens
Modbus.Net.Siemens
Modbus.Net.Siemens
- 1.4.0-beta03
+ 1.4.0-beta04
Chris L.(Luo Sheng)
Hangzhou Delian Science Technology Co.,Ltd.
Modbus.Net Siemens Profinet Implementation
diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs
index e2d78cf..3d43c25 100644
--- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs
+++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocolLinker.cs
@@ -63,7 +63,7 @@ namespace Modbus.Net.Siemens
}
return true;
default:
- throw new FormatException();
+ throw new FormatException($"Error content code with code {content[5]} {content[8]}");
}
}
}
diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs
index a136f56..211cec2 100644
--- a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs
+++ b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs
@@ -16,7 +16,7 @@ namespace Modbus.Net.Siemens
///
/// MPI
///
- Mpi = 1,
+ //Mpi = 1,
///
/// 以太网
///
@@ -201,10 +201,10 @@ namespace Modbus.Net.Siemens
break;
}
//MPI
- case SiemensType.Mpi:
- {
- throw new NotImplementedException();
- }
+ //case SiemensType.Mpi:
+ //{
+ //throw new NotImplementedException();
+ //}
//Ethenet
case SiemensType.Tcp:
{
@@ -236,7 +236,7 @@ namespace Modbus.Net.Siemens
/// 开始地址
/// 读取字节个数
/// 从设备中读取的数据
- public override async Task GetDatasAsync(string startAddress, int getByteCount)
+ public override async Task> GetDatasAsync(string startAddress, int getByteCount)
{
try
{
@@ -252,12 +252,35 @@ namespace Modbus.Net.Siemens
Wrapper.SendReceiveAsync(
Wrapper[typeof(ReadRequestSiemensProtocol)],
readRequestSiemensInputStruct);
- return readRequestSiemensOutputStruct?.GetValue;
+ return new ReturnStruct
+ {
+ Datas = readRequestSiemensOutputStruct?.GetValue,
+ IsSuccess = true,
+ ErrorCode = 0,
+ ErrorMsg = ""
+ };
}
- catch (Exception e)
+ catch (SiemensProtocolErrorException e)
{
- logger.LogError(e, $"SiemensUtility -> GetDatas: {ConnectionString} error");
- return null;
+ logger.LogError(e, $"SiemensUtility -> GetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = null,
+ IsSuccess = false,
+ ErrorCode = e.ErrorCode,
+ ErrorMsg = e.Message
+ };
+ }
+ catch (FormatException e)
+ {
+ logger.LogError(e, $"SiemensUtility -> GetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = null,
+ IsSuccess = false,
+ ErrorCode = -1,
+ ErrorMsg = e.Message
+ };
}
}
@@ -267,7 +290,7 @@ namespace Modbus.Net.Siemens
/// 开始地址
/// 需要写入的数据
/// 写入是否成功
- public override async Task SetDatasAsync(string startAddress, object[] setContents)
+ public override async Task> SetDatasAsync(string startAddress, object[] setContents)
{
try
{
@@ -283,12 +306,34 @@ namespace Modbus.Net.Siemens
Wrapper.SendReceiveAsync(
Wrapper[typeof(WriteRequestSiemensProtocol)],
writeRequestSiemensInputStruct);
- return writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError;
+ return new ReturnStruct {
+ Datas = writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError,
+ IsSuccess = writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError,
+ ErrorCode = writeRequestSiemensOutputStruct?.AccessResult == SiemensAccessResult.NoError ? 0 : (int)writeRequestSiemensOutputStruct?.AccessResult,
+ ErrorMsg = writeRequestSiemensOutputStruct?.AccessResult.ToString()
+ };
}
- catch (Exception e)
+ catch (SiemensProtocolErrorException e)
{
- logger.LogError(e, $"ModbusUtility -> SetDatas: {ConnectionString} error");
- return false;
+ logger.LogError(e, $"ModbusUtility -> SetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = e.ErrorCode,
+ ErrorMsg = e.Message
+ };
+ }
+ catch (FormatException e)
+ {
+ logger.LogError(e, $"SiemensUtility -> GetDatas: {ConnectionString} error: {e.Message}");
+ return new ReturnStruct
+ {
+ Datas = false,
+ IsSuccess = false,
+ ErrorCode = -1,
+ ErrorMsg = e.Message
+ };
}
}
}
diff --git a/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs b/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs
index 0d464c6..8ba85a2 100644
--- a/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs
+++ b/Modbus.Net/Modbus.Net/Interface/IMachineMethod.cs
@@ -19,13 +19,13 @@ namespace Modbus.Net
/// ȡ
///
/// 豸ȡ
- Dictionary GetDatas(MachineDataType getDataType);
+ ReturnStruct> GetDatas(MachineDataType getDataType);
///
/// ȡ
///
/// 豸ȡ
- Task> GetDatasAsync(MachineDataType getDataType);
+ Task>> GetDatasAsync(MachineDataType getDataType);
///
/// д
@@ -33,7 +33,7 @@ namespace Modbus.Net
/// д
/// Ҫдֵ䣬дΪAddressʱΪҪдĵַдΪCommunicationTagʱΪҪдĵԪ
/// Ƿдɹ
- bool SetDatas(MachineDataType setDataType, Dictionary values);
+ ReturnStruct SetDatas(MachineDataType setDataType, Dictionary values);
///
/// д
@@ -41,6 +41,6 @@ namespace Modbus.Net
/// д
/// Ҫдֵ䣬дΪAddressʱΪҪдĵַдΪCommunicationTagʱΪҪдĵԪ
/// Ƿдɹ
- Task SetDatasAsync(MachineDataType setDataType, Dictionary values);
+ Task> SetDatasAsync(MachineDataType setDataType, Dictionary values);
}
}
\ No newline at end of file
diff --git a/Modbus.Net/Modbus.Net/Interface/IUtilityMethod.cs b/Modbus.Net/Modbus.Net/Interface/IUtilityMethod.cs
index ce526ee..384567f 100644
--- a/Modbus.Net/Modbus.Net/Interface/IUtilityMethod.cs
+++ b/Modbus.Net/Modbus.Net/Interface/IUtilityMethod.cs
@@ -22,7 +22,7 @@ namespace Modbus.Net
/// 开始地址
/// 获取字节数个数
/// 接收到的byte数据
- byte[] GetDatas(string startAddress, int getByteCount);
+ ReturnStruct GetDatas(string startAddress, int getByteCount);
///
/// 获取数据
@@ -30,7 +30,7 @@ namespace Modbus.Net
/// 开始地址
/// 获取字节数个数
/// 接收到的byte数据
- Task GetDatasAsync(string startAddress, int getByteCount);
+ Task> GetDatasAsync(string startAddress, int getByteCount);
///
/// 获取数据
@@ -38,7 +38,7 @@ namespace Modbus.Net
/// 开始地址
/// 获取类型和个数
/// 接收到的对应的类型和数据
- object[] GetDatas(string startAddress, KeyValuePair getTypeAndCount);
+ ReturnStruct