Browse Source

fix modbusRTU

pull/17/head
Gavin 8 years ago
parent
commit
eab3bf5285
  1. 32
      SCADA/Program/ModbusDriver/ModbusDriver.sln
  2. 82
      SCADA/Program/ModbusDriver/ModbusRTUDriver.cs
  3. BIN
      SCADA/dll/ModbusDriver.dll

32
SCADA/Program/ModbusDriver/ModbusDriver.sln

@ -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

82
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;
}
}

BIN
SCADA/dll/ModbusDriver.dll

Binary file not shown.
Loading…
Cancel
Save