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 GetDatas(string startAddress, KeyValuePair getTypeAndCount); /// /// 获取数据 @@ -46,7 +46,7 @@ namespace Modbus.Net /// 开始地址 /// 获取类型和个数 /// 接收到的对应的类型和数据 - Task GetDatasAsync(string startAddress, KeyValuePair getTypeAndCount); + Task> GetDatasAsync(string startAddress, KeyValuePair getTypeAndCount); /// /// 获取数据 @@ -55,7 +55,7 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的对应的类型和数据 - T[] GetDatas(string startAddress, int getByteCount); + ReturnStruct GetDatas(string startAddress, int getByteCount); /// /// 获取数据 @@ -64,7 +64,7 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的对应的类型和数据 - Task GetDatasAsync(string startAddress, int getByteCount); + Task> GetDatasAsync(string startAddress, int getByteCount); /// /// 获取数据 @@ -72,14 +72,14 @@ namespace Modbus.Net /// 开始地址 /// 获取类型和个数的队列 /// 获取数据的对象数组,请强制转换成相应类型 - object[] GetDatas(string startAddress, IEnumerable> getTypeAndCountList); + ReturnStruct GetDatas(string startAddress, IEnumerable> getTypeAndCountList); /// /// 获取数据 /// /// 开始地址 /// 获取类型和个数的队列 - Task GetDatasAsync(string startAddress, IEnumerable> getTypeAndCountList); + Task> GetDatasAsync(string startAddress, IEnumerable> getTypeAndCountList); /// /// 设置数据 @@ -87,7 +87,7 @@ namespace Modbus.Net /// 开始地址 /// 设置数据 /// 是否设置成功 - bool SetDatas(string startAddress, object[] setContents); + ReturnStruct SetDatas(string startAddress, object[] setContents); /// /// 设置数据 @@ -95,7 +95,7 @@ namespace Modbus.Net /// 开始地址 /// 设置数据 /// 是否设置成功 - Task SetDatasAsync(string startAddress, object[] setContents); + Task> SetDatasAsync(string startAddress, object[] setContents); } /// @@ -107,13 +107,13 @@ namespace Modbus.Net /// 获取PLC时间 /// /// PLC时间 - Task GetTimeAsync(); + Task> GetTimeAsync(); /// /// 设置PLC时间 /// /// 设置PLC时间 /// 设置是否成功 - Task SetTimeAsync(DateTime setTime); + Task> SetTimeAsync(DateTime setTime); } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs index 8f63bc8..5712fdf 100644 --- a/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs +++ b/Modbus.Net/Modbus.Net/Job/MachineJobScheduler.cs @@ -27,7 +27,7 @@ namespace Modbus.Net /// /// 返回的数据值 /// - public Dictionary ReturnValues { get; set; } + public ReturnStruct> ReturnValues { get; set; } } /// @@ -430,7 +430,7 @@ namespace Modbus.Net /// 失败回调方法,参数为设备ID /// /// - public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null) + public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null) { return await Deal(queryId, onSuccess, onFailure); } @@ -443,7 +443,7 @@ namespace Modbus.Net /// 失败回调方法,参数为设备ID /// /// - public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null) where TMachineKey : IEquatable + public async Task Deal(string queryId = null, Func onSuccess = null, Func onFailure = null) where TMachineKey : IEquatable { if (queryId == null) return new MachineSetJobScheduler(_scheduler, _trigger, _parentJobKey); JobKey jobKey = JobKey.Create("Modbus.Net.DataQuery.Job." + queryId, "Modbus.Net.DataQuery.Group." + _trigger.Key.Name); @@ -504,7 +504,7 @@ namespace Modbus.Net if (QueryMethod != null && values != null) { - context.JobDetail.JobDataMap.Put("SetValue", QueryMethodDispatch(new DataReturnDef() { MachineId = machine == null ? null : ((IMachineProperty)machine).GetMachineIdString(), ReturnValues = (Dictionary)values })); + context.JobDetail.JobDataMap.Put("SetValue", QueryMethodDispatch(new DataReturnDef() { MachineId = machine == null ? null : ((IMachineProperty)machine).GetMachineIdString(), ReturnValues = (ReturnStruct>)values })); await context.Scheduler.AddJob(context.JobDetail, true, false); } } @@ -527,7 +527,7 @@ namespace Modbus.Net context.JobDetail.JobDataMap.TryGetValue("Value", out values); context.JobDetail.JobDataMap.TryGetValue("SetValue", out valuesSet); if (valuesSet == null && values != null) - valuesSet = ((Dictionary)values).MapGetValuesToSetValues(); + valuesSet = ((ReturnStruct>)values).Datas.MapGetValuesToSetValues(); if (valuesSet == null) { @@ -556,14 +556,14 @@ namespace Modbus.Net context.JobDetail.JobDataMap.TryGetValue("Success", out success); context.JobDetail.JobDataMap.TryGetValue("OnSuccess", out onSuccess); context.JobDetail.JobDataMap.TryGetValue("OnFailure", out onFailure); - bool? successValue = (bool?)success; - if (successValue == true && onSuccess != null) + ReturnStruct successValue = (ReturnStruct)success; + if (successValue.IsSuccess == true && onSuccess != null) { await ((Func)onSuccess)(((IMachineProperty)machine).GetMachineIdString()); } - if (successValue == false && onFailure != null) + if (successValue.IsSuccess == false && onFailure != null) { - await ((Func)onFailure)(((IMachineProperty)machine).GetMachineIdString()); + await ((Func)onFailure)(((IMachineProperty)machine).GetMachineIdString(), successValue.ErrorCode, successValue.ErrorMsg); } context.JobDetail.JobDataMap.Remove("Success"); diff --git a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs index 31bbecf..acc8685 100644 --- a/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs +++ b/Modbus.Net/Modbus.Net/Machine/BaseMachine.cs @@ -193,7 +193,7 @@ namespace Modbus.Net /// 读取数据 /// /// 从设备读取的数据 - public Dictionary GetDatas(MachineDataType getDataType) + public ReturnStruct> GetDatas(MachineDataType getDataType) { return AsyncHelper.RunSync(() => GetDatasAsync(getDataType)); } @@ -203,7 +203,7 @@ namespace Modbus.Net /// 读取数据 /// /// 从设备读取的数据 - public async Task> GetDatasAsync(MachineDataType getDataType) + public async Task>> GetDatasAsync(MachineDataType getDataType) { try { @@ -212,7 +212,13 @@ namespace Modbus.Net if (!BaseUtility.IsConnected) await BaseUtility.ConnectAsync(); //如果无法连接,终止 - if (!BaseUtility.IsConnected) return null; + if (!BaseUtility.IsConnected) return + new ReturnStruct>() { + Datas = null, + IsSuccess = false, + ErrorCode = -1, + ErrorMsg = "Connection Error" + }; //遍历每一个实际向设备获取数据的连续地址 foreach (var communicateAddress in CommunicateAddresses) { @@ -229,12 +235,31 @@ namespace Modbus.Net //如果没有数据,终止 - if (datas == null || datas.Length != 0 && datas.Length < + if (datas.IsSuccess == false || datas.Datas == null) + { + return new ReturnStruct>() + { + Datas = null, + IsSuccess = false, + ErrorCode = datas.ErrorCode, + ErrorMsg = datas.ErrorMsg + }; + } + else if (datas.Datas.Length != 0 && datas.Datas.Length < (int) Math.Ceiling(communicateAddress.GetCount * BigEndianValueHelper.Instance.ByteLength[ communicateAddress.DataType.FullName])) - return null; + { + return new ReturnStruct>() + { + Datas = null, + IsSuccess = false, + ErrorCode = -2, + ErrorMsg = "Data length mismatch" + }; + } + foreach (var address in communicateAddress.OriginalAddresses) @@ -283,7 +308,7 @@ namespace Modbus.Net try { //如果没有数据返回空 - if (datas.Length == 0) + if (datas.Datas.Length == 0) ans.Add(key, new ReturnUnit { DeviceValue = null, @@ -296,7 +321,7 @@ namespace Modbus.Net DeviceValue = Convert.ToDouble( ValueHelper.GetInstance(BaseUtility.Endian) - .GetValue(datas, ref localMainPos, ref localSubPos, + .GetValue(datas.Datas, ref localMainPos, ref localSubPos, address.DataType)) * address.Zoom, AddressUnit = address.MapAddressUnitTUnitKeyToAddressUnit(), }); @@ -308,7 +333,13 @@ namespace Modbus.Net if (ErrorCount >= _maxErrorCount) Disconnect(); - return null; + return new ReturnStruct>() + { + Datas = null, + IsSuccess = false, + ErrorCode = -3, + ErrorMsg = "Data translation mismatch" + }; } } } @@ -318,7 +349,13 @@ namespace Modbus.Net //返回数据 if (ans.All(p => p.Value.DeviceValue == null)) ans = null; ErrorCount = 0; - return ans; + return new ReturnStruct> + { + Datas = ans, + IsSuccess = true, + ErrorCode = 0, + ErrorMsg = "" + }; } catch (Exception e) { @@ -327,7 +364,13 @@ namespace Modbus.Net if (ErrorCount >= _maxErrorCount) Disconnect(); - return null; + return new ReturnStruct>() + { + Datas = null, + IsSuccess = false, + ErrorCode = -100, + ErrorMsg = "Unknown Exception" + }; } } @@ -337,7 +380,7 @@ namespace Modbus.Net /// 写入类型 /// 需要写入的数据字典,当写入类型为Address时,键为需要写入的地址,当写入类型为CommunicationTag时,键为需要写入的单元的描述 /// 是否写入成功 - public bool SetDatas(MachineDataType setDataType, Dictionary values) + public ReturnStruct SetDatas(MachineDataType setDataType, Dictionary values) { return AsyncHelper.RunSync(() => SetDatasAsync(setDataType, values)); } @@ -348,7 +391,7 @@ namespace Modbus.Net /// 写入类型 /// 需要写入的数据字典,当写入类型为Address时,键为需要写入的地址,当写入类型为CommunicationTag时,键为需要写入的单元的描述 /// 是否写入成功 - public async Task SetDatasAsync(MachineDataType setDataType, Dictionary values) + public async Task> SetDatasAsync(MachineDataType setDataType, Dictionary values) { try { @@ -356,7 +399,13 @@ namespace Modbus.Net if (!BaseUtility.IsConnected) await BaseUtility.ConnectAsync(); //如果设备无法连接,终止 - if (!BaseUtility.IsConnected) return false; + if (!BaseUtility.IsConnected) return new ReturnStruct() + { + Datas = false, + IsSuccess = false, + ErrorCode = -1, + ErrorMsg = "Connection Error" + }; var addresses = new List>(); //遍历每个要设置的值 foreach (var value in values) @@ -434,12 +483,28 @@ namespace Modbus.Net var datas = datasReturn; //如果没有数据,终止 - if (datas == null || datas.Length < + if (datas.IsSuccess == false || datas.Datas == null) + { + return new ReturnStruct() + { + Datas = false, + IsSuccess = false, + ErrorCode = datas.ErrorCode, + ErrorMsg = datas.ErrorMsg + }; + } + else if(datas.Datas.Length < (int) Math.Ceiling(communicateAddress.GetCount * BigEndianValueHelper.Instance.ByteLength[ communicateAddress.DataType.FullName])) - return false; + return new ReturnStruct() + { + Datas = false, + IsSuccess = false, + ErrorCode = -2, + ErrorMsg = "Data length not match" + }; foreach (var addressUnit in communicateAddress.OriginalAddresses) { @@ -507,13 +572,19 @@ namespace Modbus.Net //将要写入的值加入队列 var data = Convert.ChangeType(value.Value / addressUnit.Zoom, dataType); - if (!valueHelper.SetValue(datas, mainByteCount, localByteCount, data)) - return false; + if (!valueHelper.SetValue(datas.Datas, mainByteCount, localByteCount, data)) + return new ReturnStruct() + { + Datas = false, + IsSuccess = false, + ErrorCode = -3, + ErrorMsg = "Data translation mismatch" + }; ; } //写入数据 await BaseUtility.GetUtilityMethods().SetDatasAsync(addressStart, - valueHelper.ByteArrayToObjectArray(datas, + valueHelper.ByteArrayToObjectArray(datas.Datas, new KeyValuePair(communicateAddress.DataType, communicateAddress.GetCount))); } //如果不保持连接,断开连接 @@ -527,9 +598,21 @@ namespace Modbus.Net if (ErrorCount >= _maxErrorCount) Disconnect(); - return false; + return new ReturnStruct() + { + Datas = false, + IsSuccess = false, + ErrorCode = -100, + ErrorMsg = "Unknown Exception" + }; } - return true; + return new ReturnStruct() + { + Datas = true, + IsSuccess = true, + ErrorCode = 0, + ErrorMsg = "" + }; } /// diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index 6b07b85..1e84a1d 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -5,7 +5,7 @@ Modbus.Net Modbus.Net Modbus.Net - 1.4.0-beta03 + 1.4.0-beta04 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian Science Technology Co.,Ltd. diff --git a/Modbus.Net/Modbus.Net/ReturnStruct/ReturnStruct.cs b/Modbus.Net/Modbus.Net/ReturnStruct/ReturnStruct.cs new file mode 100644 index 0000000..8bdd878 --- /dev/null +++ b/Modbus.Net/Modbus.Net/ReturnStruct/ReturnStruct.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Modbus.Net +{ + /// + /// 返回引用类型 + /// + /// + public struct ReturnStruct + { + /// + /// 数据 + /// + public TDataType Datas { get; set; } + /// + /// 操作是否成功 + /// + public bool IsSuccess { get; set; } + /// + /// 错误代码 + /// + public int ErrorCode { get; set; } + /// + /// 错误详细信息 + /// + public string ErrorMsg { get; set; } + } +} diff --git a/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs b/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs index f17b7bb..ab8d89e 100644 --- a/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs +++ b/Modbus.Net/Modbus.Net/Utility/BaseUtility.cs @@ -2,7 +2,9 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Security.Policy; using System.Threading.Tasks; +using System.Xml.Linq; /// /// 端格式 @@ -85,7 +87,7 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的byte数据 - public virtual byte[] GetDatas(string startAddress, int getByteCount) + public virtual ReturnStruct GetDatas(string startAddress, int getByteCount) { return AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getByteCount)); } @@ -96,7 +98,7 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的byte数据 - public abstract Task GetDatasAsync(string startAddress, int getByteCount); + public abstract Task> GetDatasAsync(string startAddress, int getByteCount); /// /// 获取数据 @@ -104,7 +106,7 @@ namespace Modbus.Net /// 开始地址 /// 获取类型和个数 /// 接收到的对应的类型和数据 - public virtual object[] GetDatas(string startAddress, + public virtual ReturnStruct GetDatas(string startAddress, KeyValuePair getTypeAndCount) { return AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getTypeAndCount)); @@ -116,7 +118,7 @@ namespace Modbus.Net /// 开始地址 /// 获取类型和个数 /// 接收到的对应的类型和数据 - public virtual async Task GetDatasAsync(string startAddress, + public virtual async Task> GetDatasAsync(string startAddress, KeyValuePair getTypeAndCount) { try @@ -126,12 +128,34 @@ namespace Modbus.Net var getReturnValue = await GetDatasAsync(startAddress, (int)Math.Ceiling(bCount * getTypeAndCount.Value)); var getBytes = getReturnValue; - return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, getTypeAndCount); + if (getBytes.IsSuccess == false || getBytes.Datas == null) + { + return new ReturnStruct + { + Datas = null, + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; + } + return new ReturnStruct + { + Datas = ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes.Datas, getTypeAndCount), + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; } catch (Exception e) { logger.LogError(e, $"ModbusUtility -> GetDatas: {ConnectionString} error"); - return null; + return new ReturnStruct + { + Datas = null, + IsSuccess = false, + ErrorCode = -100, + ErrorMsg = "Unknown Error" + }; } } @@ -142,7 +166,7 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的对应的类型和数据 - public virtual T[] GetDatas(string startAddress, + public virtual ReturnStruct GetDatas(string startAddress, int getByteCount) { return AsyncHelper.RunSync(() => GetDatasAsync(startAddress, getByteCount)); @@ -155,19 +179,41 @@ namespace Modbus.Net /// 开始地址 /// 获取字节数个数 /// 接收到的对应的类型和数据 - public virtual async Task GetDatasAsync(string startAddress, + public virtual async Task> GetDatasAsync(string startAddress, int getByteCount) { try { var getBytes = await GetDatasAsync(startAddress, new KeyValuePair(typeof(T), getByteCount)); - return ValueHelper.GetInstance(Endian).ObjectArrayToDestinationArray(getBytes); + if (getBytes.IsSuccess == false || getBytes.Datas == null) + { + return new ReturnStruct + { + Datas = null, + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; + } + return new ReturnStruct + { + Datas = ValueHelper.GetInstance(Endian).ObjectArrayToDestinationArray(getBytes.Datas), + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; } catch (Exception e) { logger.LogError(e, $"ModbusUtility -> GetDatas Generic: {ConnectionString} error"); - return null; + return new ReturnStruct + { + Datas = null, + IsSuccess = false, + ErrorCode = -100, + ErrorMsg = "Unknown Error" + }; } } @@ -177,7 +223,7 @@ namespace Modbus.Net /// 开始地址 /// 获取类型和个数的队列 /// 获取数据的对象数组,请强制转换成相应类型 - public virtual object[] GetDatas(string startAddress, + public virtual ReturnStruct GetDatas(string startAddress, IEnumerable> getTypeAndCountList) { return @@ -189,7 +235,7 @@ namespace Modbus.Net /// /// 开始地址 /// 获取类型和个数的队列 - public virtual async Task GetDatasAsync(string startAddress, + public virtual async Task> GetDatasAsync(string startAddress, IEnumerable> getTypeAndCountList) { try @@ -203,12 +249,34 @@ namespace Modbus.Net select (int)Math.Ceiling(bCount * getTypeAndCount.Value)).Sum(); var getReturnValue = await GetDatasAsync(startAddress, bAllCount); var getBytes = getReturnValue; - return ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes, translateTypeAndCount); + if (getBytes.IsSuccess == false || getBytes.Datas == null) + { + return new ReturnStruct + { + Datas = null, + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; + } + return new ReturnStruct + { + Datas = ValueHelper.GetInstance(Endian).ByteArrayToObjectArray(getBytes.Datas, translateTypeAndCount), + IsSuccess = getBytes.IsSuccess, + ErrorCode = getBytes.ErrorCode, + ErrorMsg = getBytes.ErrorMsg + }; } catch (Exception e) { logger.LogError(e, $"ModbusUtility -> GetDatas pair: {ConnectionString} error"); - return null; + return new ReturnStruct + { + Datas = null, + IsSuccess = false, + ErrorCode = -100, + ErrorMsg = "Unknown Error" + }; } } @@ -218,7 +286,7 @@ namespace Modbus.Net /// 开始地址 /// 设置数据 /// 是否设置成功 - public virtual bool SetDatas(string startAddress, object[] setContents) + public virtual ReturnStruct SetDatas(string startAddress, object[] setContents) { return AsyncHelper.RunSync(() => SetDatasAsync(startAddress, setContents)); } @@ -229,7 +297,7 @@ namespace Modbus.Net /// 开始地址 /// 设置数据 /// 是否设置成功 - public abstract Task SetDatasAsync(string startAddress, object[] setContents); + public abstract Task> SetDatasAsync(string startAddress, object[] setContents); /// /// 协议是否遵循小端格式 diff --git a/Samples/AnyType/Controllers/HomeController.cs b/Samples/AnyType/Controllers/HomeController.cs index 0902d54..c619e34 100644 --- a/Samples/AnyType/Controllers/HomeController.cs +++ b/Samples/AnyType/Controllers/HomeController.cs @@ -59,11 +59,11 @@ namespace AnyType.Controllers returnValues => { //唯一的参数包含返回值,是一个唯一标识符(machine的第二个参数),返回值(类型ReturnUnit)的键值对。 - if (returnValues.ReturnValues != null) + if (returnValues.ReturnValues.Datas != null) { lock (values) { - var unitValues = from val in returnValues.ReturnValues + var unitValues = from val in returnValues.ReturnValues.Datas select new Tuple( addressUnits.FirstOrDefault(p => p.CommunicationTag == val.Key)!, val.Value.DeviceValue); diff --git a/Samples/CrossLamp/Controllers/HomeController.cs b/Samples/CrossLamp/Controllers/HomeController.cs index b119f59..cd0a49e 100644 --- a/Samples/CrossLamp/Controllers/HomeController.cs +++ b/Samples/CrossLamp/Controllers/HomeController.cs @@ -34,7 +34,7 @@ namespace CrossLamp.Controllers await _utility.ConnectAsync(); } Lamp light = new Lamp(); - object[] lampsbyte = await _utility.GetDatasAsync("0X 1", new KeyValuePair(typeof(bool), 7)); + object[] lampsbyte = (await _utility.GetDatasAsync("0X 1", new KeyValuePair(typeof(bool), 7))).Datas; bool[] lamps = BigEndianValueHelper.Instance.ObjectArrayToDestinationArray(lampsbyte); if (lamps[0]) { diff --git a/Samples/MachineJob/Worker.cs b/Samples/MachineJob/Worker.cs index 6dce341..4937d82 100644 --- a/Samples/MachineJob/Worker.cs +++ b/Samples/MachineJob/Worker.cs @@ -64,7 +64,7 @@ namespace MachineJob.Service return Task.CompletedTask; } - public Task OnFailure(string machineId) + public Task OnFailure(string machineId, int errorCode, string errorMsg) { _logger.LogError("Machine {0} set failure", machineId); return Task.CompletedTask; @@ -72,7 +72,7 @@ namespace MachineJob.Service private Dictionary QueryConsole(DataReturnDef dataReturnDef) { - var values = dataReturnDef.ReturnValues; + var values = dataReturnDef.ReturnValues.Datas; foreach (var value in values) { _logger.LogInformation(dataReturnDef.MachineId + " " + value.Key + " " + value.Value.DeviceValue); diff --git a/Samples/TripleAdd/Controllers/HomeController.cs b/Samples/TripleAdd/Controllers/HomeController.cs index ae88b42..9131e0c 100644 --- a/Samples/TripleAdd/Controllers/HomeController.cs +++ b/Samples/TripleAdd/Controllers/HomeController.cs @@ -45,7 +45,7 @@ namespace TripleAdd.Controllers utility.AddressTranslator = new AddressTranslatorModbus(); await utility.ConnectAsync(); } - object[] getNum = await utility.GetDatasAsync("4X 1", new KeyValuePair(typeof(ushort), 4)); + object[] getNum = (await utility.GetDatasAsync("4X 1", new KeyValuePair(typeof(ushort), 4))).Datas; ushort[] getNumUshorts = BigEndianValueHelper.Instance.ObjectArrayToDestinationArray(getNum); return SetValue(getNumUshorts); } @@ -64,7 +64,7 @@ namespace TripleAdd.Controllers machine.AddressCombiner = new AddressCombinerContinus(machine.AddressTranslator, 100000); machine.AddressCombinerSet = new AddressCombinerContinus(machine.AddressTranslator, 100000); } - var resultFormat = (await machine.GetDatasAsync(MachineDataType.CommunicationTag)).MapGetValuesToSetValues(); + var resultFormat = (await machine.GetDatasAsync(MachineDataType.CommunicationTag)).Datas.MapGetValuesToSetValues(); return SetValue(new ushort[4] { (ushort)resultFormat["Add1"], (ushort)resultFormat["Add2"], (ushort)resultFormat["Add3"], (ushort)resultFormat["Ans"] }); } diff --git a/Tests/Modbus.Net.Tests/EndianTest.cs b/Tests/Modbus.Net.Tests/EndianTest.cs index 09d144f..90ed982 100644 --- a/Tests/Modbus.Net.Tests/EndianTest.cs +++ b/Tests/Modbus.Net.Tests/EndianTest.cs @@ -48,8 +48,8 @@ namespace Modbus.Net.Tests await _modbusTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusTcpMachine2.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["4X 1.0"].DeviceValue, dic1["4X 1"]); - Assert.AreEqual(ans2["4X 1.0"].DeviceValue, (ushort)dic1["4X 1"] % 256 * 256 + (ushort)dic1["4X 1"] / 256); + Assert.AreEqual(ans.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans2.Datas["4X 1.0"].DeviceValue, (ushort)dic1["4X 1"] % 256 * 256 + (ushort)dic1["4X 1"] / 256); } } } diff --git a/Tests/Modbus.Net.Tests/MachineMethodTest.cs b/Tests/Modbus.Net.Tests/MachineMethodTest.cs index 0f1b825..3f78a13 100644 --- a/Tests/Modbus.Net.Tests/MachineMethodTest.cs +++ b/Tests/Modbus.Net.Tests/MachineMethodTest.cs @@ -25,7 +25,7 @@ namespace Modbus.Net.Tests var success = await baseMachine.BaseUtility.GetUtilityMethods().SetTimeAsync(DateTime.Now); Assert.AreEqual(success, true); var time = await baseMachine.BaseUtility.GetUtilityMethods().GetTimeAsync(); - Assert.AreEqual((time.ToUniversalTime() - DateTime.Now.ToUniversalTime()).Seconds < 10, true); + Assert.AreEqual((time.Datas.ToUniversalTime() - DateTime.Now.ToUniversalTime()).Seconds < 10, true); baseMachine.Disconnect(); } @@ -54,7 +54,7 @@ namespace Modbus.Net.Tests }); Assert.AreEqual(success, true); var datas = await baseMachine.GetMachineMethods().GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(datas["0X 1.0"].DeviceValue, 1); + Assert.AreEqual(datas.Datas["0X 1.0"].DeviceValue, 1); success = await baseMachine.GetMachineMethods().SetDatasAsync( MachineDataType.Address, new Dictionary diff --git a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs index feb6970..1df4a80 100644 --- a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs @@ -135,18 +135,18 @@ namespace Modbus.Net.Tests _modbusRtuMachine1.Disconnect(); _modbusRtuMachine2.Disconnect(); - Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans2["A1"].DeviceValue, dic2["A1"]); - Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans2["A2"].DeviceValue, dic2["A2"]); - Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans2["A3"].DeviceValue, dic2["A3"]); - Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans2["A4"].DeviceValue, dic2["A4"]); - Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans2["A5"].DeviceValue, dic2["A5"]); - Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); - Assert.AreEqual(ans2["A6"].DeviceValue, dic2["A6"]); + Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2.Datas["A1"].DeviceValue, dic2["A1"]); + Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2.Datas["A2"].DeviceValue, dic2["A2"]); + Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2.Datas["A3"].DeviceValue, dic2["A3"]); + Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2.Datas["A4"].DeviceValue, dic2["A4"]); + Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2.Datas["A5"].DeviceValue, dic2["A5"]); + Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans2.Datas["A6"].DeviceValue, dic2["A6"]); } } } diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index dadfb31..799850d 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -56,9 +56,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["0X 1.0"].DeviceValue, dic1["0X 1.0"]); - Assert.AreEqual(ans2["0X 1.0"].DeviceValue, dic1["0X 1.0"]); - Assert.AreEqual(ans3["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans2.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); + Assert.AreEqual(ans3.Datas["0X 1.0"].DeviceValue, dic1["0X 1.0"]); } [TestMethod] @@ -83,9 +83,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["1X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans2["1X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans3["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans.Datas["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2.Datas["1X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3.Datas["1X 1.0"].DeviceValue, 0); } [TestMethod] @@ -110,9 +110,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["3X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans2["3X 1.0"].DeviceValue, 0); - Assert.AreEqual(ans3["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans.Datas["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans2.Datas["3X 1.0"].DeviceValue, 0); + Assert.AreEqual(ans3.Datas["3X 1.0"].DeviceValue, 0); } [TestMethod] @@ -149,9 +149,9 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.GetDatasAsync(MachineDataType.Address); var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.Address); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["4X 1.0"].DeviceValue, dic1["4X 1"]); - Assert.AreEqual(ans2["4X 1.0"].DeviceValue, dic1["4X 1"]); - Assert.AreEqual(ans3["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans2.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); + Assert.AreEqual(ans3.Datas["4X 1.0"].DeviceValue, dic1["4X 1"]); } [TestMethod] @@ -250,24 +250,24 @@ namespace Modbus.Net.Tests var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineDataType.CommunicationTag); var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineDataType.CommunicationTag); - Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); - Assert.AreEqual(ans2["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans2["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans2["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans2["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans2["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans2["A6"].DeviceValue, dic1["A6"]); - Assert.AreEqual(ans3["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans3["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans3["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans3["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans3["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans3["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans2.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans2.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans2.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans2.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans2.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans2.Datas["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans3.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans3.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans3.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans3.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans3.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans3.Datas["A6"].DeviceValue, dic1["A6"]); } [TestMethod] @@ -295,18 +295,18 @@ namespace Modbus.Net.Tests var ans = await _modbusTcpMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); var ans2 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); var ans3 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("4X 1", 1); - Assert.AreEqual(ans[0], dic1["4X 1"]); - Assert.AreEqual(ans2[0], dic1["4X 1"]); - Assert.AreEqual(ans3[0], dic1["4X 1"]); + Assert.AreEqual(ans.Datas[0], dic1["4X 1"]); + Assert.AreEqual(ans2.Datas[0], dic1["4X 1"]); + Assert.AreEqual(ans3.Datas[0], dic1["4X 1"]); await _modbusTcpMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1); await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1); await _modbusRtuMachine.BaseUtility.GetUtilityMethods().SetSingleDataAsync("0X 1", dic2["0X 1"] >= 1); var ans21 = await _modbusTcpMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); var ans22 = await _modbusRtuMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); var ans23 = await _modbusAsciiMachine.BaseUtility.GetUtilityMethods().GetDatasAsync("0X 1", 1); - Assert.AreEqual(ans21[0] ? 1 : 0, dic2["0X 1"]); - Assert.AreEqual(ans22[0] ? 1 : 0, dic2["0X 1"]); - Assert.AreEqual(ans23[0] ? 1 : 0, dic2["0X 1"]); + Assert.AreEqual(ans21.Datas[0] ? 1 : 0, dic2["0X 1"]); + Assert.AreEqual(ans22.Datas[0] ? 1 : 0, dic2["0X 1"]); + Assert.AreEqual(ans23.Datas[0] ? 1 : 0, dic2["0X 1"]); } diff --git a/Tests/Modbus.Net.Tests/SiemensTest.cs b/Tests/Modbus.Net.Tests/SiemensTest.cs index 2b9e878..6254b45 100644 --- a/Tests/Modbus.Net.Tests/SiemensTest.cs +++ b/Tests/Modbus.Net.Tests/SiemensTest.cs @@ -43,7 +43,7 @@ namespace Modbus.Net.Tests await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["Q 0.0"].DeviceValue, dic1["Q 0.0"]); + Assert.AreEqual(ans.Datas["Q 0.0"].DeviceValue, dic1["Q 0.0"]); } [TestMethod] @@ -64,7 +64,7 @@ namespace Modbus.Net.Tests _siemensTcpMachine!.GetAddresses = addresses; var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["I 0.0"].DeviceValue, 0); + Assert.AreEqual(ans.Datas["I 0.0"].DeviceValue, 0); } [TestMethod] @@ -96,7 +96,7 @@ namespace Modbus.Net.Tests await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["M 0.0"].DeviceValue, dic1["M 0"]); + Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0"]); } [TestMethod] @@ -129,7 +129,7 @@ namespace Modbus.Net.Tests await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["M 0.0"].DeviceValue, dic1["M 0.0"]); + Assert.AreEqual(ans.Datas["M 0.0"].DeviceValue, dic1["M 0.0"]); } [TestMethod] @@ -161,7 +161,7 @@ namespace Modbus.Net.Tests await _siemensTcpMachine.SetDatasAsync(MachineDataType.Address, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.Address); - Assert.AreEqual(ans["DB2 0.0"].DeviceValue, dic1["DB2 0.0"]); + Assert.AreEqual(ans.Datas["DB2 0.0"].DeviceValue, dic1["DB2 0.0"]); } [TestMethod] @@ -252,12 +252,12 @@ namespace Modbus.Net.Tests _siemensTcpMachine!.GetAddresses = addresses; await _siemensTcpMachine.SetDatasAsync(MachineDataType.CommunicationTag, dic1); var ans = await _siemensTcpMachine.GetDatasAsync(MachineDataType.CommunicationTag); - Assert.AreEqual(ans["A1"].DeviceValue, dic1["A1"]); - Assert.AreEqual(ans["A2"].DeviceValue, dic1["A2"]); - Assert.AreEqual(ans["A3"].DeviceValue, dic1["A3"]); - Assert.AreEqual(ans["A4"].DeviceValue, dic1["A4"]); - Assert.AreEqual(ans["A5"].DeviceValue, dic1["A5"]); - Assert.AreEqual(ans["A6"].DeviceValue, dic1["A6"]); + Assert.AreEqual(ans.Datas["A1"].DeviceValue, dic1["A1"]); + Assert.AreEqual(ans.Datas["A2"].DeviceValue, dic1["A2"]); + Assert.AreEqual(ans.Datas["A3"].DeviceValue, dic1["A3"]); + Assert.AreEqual(ans.Datas["A4"].DeviceValue, dic1["A4"]); + Assert.AreEqual(ans.Datas["A5"].DeviceValue, dic1["A5"]); + Assert.AreEqual(ans.Datas["A6"].DeviceValue, dic1["A6"]); } [TestCleanup]