From eab3bf5285e6c40e35b46ccc0cec53ebb45b79b0 Mon Sep 17 00:00:00 2001 From: Gavin Date: Thu, 7 Dec 2017 18:43:00 +0800 Subject: [PATCH] fix modbusRTU --- SCADA/Program/ModbusDriver/ModbusDriver.sln | 32 ------- SCADA/Program/ModbusDriver/ModbusRTUDriver.cs | 82 +++++++++--------- SCADA/dll/ModbusDriver.dll | Bin 29184 -> 29184 bytes 3 files changed, 43 insertions(+), 71 deletions(-) delete mode 100644 SCADA/Program/ModbusDriver/ModbusDriver.sln diff --git a/SCADA/Program/ModbusDriver/ModbusDriver.sln b/SCADA/Program/ModbusDriver/ModbusDriver.sln deleted file mode 100644 index d079660..0000000 --- a/SCADA/Program/ModbusDriver/ModbusDriver.sln +++ /dev/null @@ -1,32 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModbusDriver", "ModbusDriver.csproj", "{AEA44301-6A29-4AF7-91E8-E6D755B618F1}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|Itanium = Debug|Itanium - Debug|x64 = Debug|x64 - Release|Any CPU = Release|Any CPU - Release|Itanium = Release|Itanium - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|Itanium.ActiveCfg = Debug|Itanium - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|Itanium.Build.0 = Debug|Itanium - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|x64.ActiveCfg = Debug|x64 - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Debug|x64.Build.0 = Debug|x64 - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|Any CPU.Build.0 = Release|Any CPU - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|Itanium.ActiveCfg = Release|Itanium - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|Itanium.Build.0 = Release|Itanium - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|x64.ActiveCfg = Release|x64 - {AEA44301-6A29-4AF7-91E8-E6D755B618F1}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs b/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs index 00b3488..dc6a133 100644 --- a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs +++ b/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs @@ -319,53 +319,57 @@ namespace ModbusDriver #endregion #region :IReaderWriter + object _async = new object(); public byte[] ReadBytes(DeviceAddress address, ushort size) { int area = address.Area; - try + + //no need to multiply by 16 + //byte[] header = area == Modbus.fctReadCoil ? CreateReadHeader(address.Start * 16, (ushort)(16 * size), (byte)area) : + // CreateReadHeader(address.Start, size, (byte)area); + byte[] header = CreateReadHeader(address.Start, size, (byte)area); + lock (_async) { - //no need to multiply by 16 - //byte[] header = area == Modbus.fctReadCoil ? CreateReadHeader(address.Start * 16, (ushort)(16 * size), (byte)area) : - // CreateReadHeader(address.Start, size, (byte)area); - byte[] header = CreateReadHeader(address.Start, size, (byte)area); - _serialPort.Write(header, 0, header.Length); - - /* different function_code have different realy frameBytes - * function_code 1/2: one register variable use one bit - * function_code 3/4: one register variable use two bytes - */ - int modbus_rtu_replay_frameBytes_size = 0; - int modbus_rtu_replay_data_size = 0; - switch (area) + try { - case 1: - case 2: - modbus_rtu_replay_frameBytes_size = size / 8 + 1 + 5; - break; - case 3: - case 4: - modbus_rtu_replay_frameBytes_size = size * 2 + 5; - break; + _serialPort.Write(header, 0, header.Length); + /* different function_code have different realy frameBytes + * function_code 1/2: one register variable use one bit + * function_code 3/4: one register variable use two bytes + */ + int modbus_rtu_replay_frameBytes_size = 0; + int modbus_rtu_replay_data_size = 0; + switch (area) + { + case 1: + case 2: + modbus_rtu_replay_frameBytes_size = size / 8 + 1 + 5; + break; + case 3: + case 4: + modbus_rtu_replay_frameBytes_size = size * 2 + 5; + break; + } + modbus_rtu_replay_data_size = modbus_rtu_replay_frameBytes_size - 5; + + byte[] frameBytes = new byte[modbus_rtu_replay_frameBytes_size]; + byte[] data = new byte[modbus_rtu_replay_data_size]; + int numBytesRead = 0; + while (numBytesRead != modbus_rtu_replay_frameBytes_size) + numBytesRead += _serialPort.Read(frameBytes, numBytesRead, modbus_rtu_replay_frameBytes_size - numBytesRead); + if (frameBytes[0] == _slaveId && Utility.CheckSumCRC(frameBytes)) + { + Array.Copy(frameBytes, 3, data, 0, modbus_rtu_replay_data_size); + return data; + } + return null; } - modbus_rtu_replay_data_size = modbus_rtu_replay_frameBytes_size - 5; - - byte[] frameBytes = new byte[modbus_rtu_replay_frameBytes_size]; - byte[] data = new byte[modbus_rtu_replay_data_size]; - int numBytesRead = 0; - while (numBytesRead != modbus_rtu_replay_frameBytes_size) - numBytesRead += _serialPort.Read(frameBytes, numBytesRead, modbus_rtu_replay_frameBytes_size - numBytesRead); - if (frameBytes[0] == _slaveId && Utility.CheckSumCRC(frameBytes)) + catch (Exception e) { - Array.Copy(frameBytes, 3, data, 0, modbus_rtu_replay_data_size); - return data; + if (OnClose != null) + OnClose(this, new ShutdownRequestEventArgs(e.Message)); + return null; } - return null; - } - catch (Exception e) - { - if (OnClose != null) - OnClose(this, new ShutdownRequestEventArgs(e.Message)); - return null; } } diff --git a/SCADA/dll/ModbusDriver.dll b/SCADA/dll/ModbusDriver.dll index 18131be84f918c10eb4d15afc4b517fc73d47fe6..bd926e11cede6daac8006996b1154c8edc3a3367 100644 GIT binary patch delta 7890 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 AcK`qY delta 7901 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