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 18131be..bd926e1 100644 Binary files a/SCADA/dll/ModbusDriver.dll and b/SCADA/dll/ModbusDriver.dll differ