Browse Source

ModBusRTUDriver和ModbusTCPDriver中的PDU 定义长度进行了修正

pull/9/head
yangjingzhao123 9 years ago
parent
commit
73af9a520d
  1. BIN
      SCADA/Program/.vs/DataExchange/v15/.suo
  2. BIN
      SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide
  3. 14
      SCADA/Program/ModbusDriver/ModbusRTUDriver.cs
  4. 160
      SCADA/Program/ModbusDriver/ModbusTCPDriver.cs

BIN
SCADA/Program/.vs/DataExchange/v15/.suo

Binary file not shown.

BIN
SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide

Binary file not shown.

14
SCADA/Program/ModbusDriver/ModbusRTUDriver.cs

@ -154,7 +154,19 @@ namespace ModbusDriver
#region :IPLCDriver
public int PDU
{
get { return 0x100; }
// get { return 0x100; } //0x100十进制值为256
/* yjz
20171125
RS232 / RS485 modbus协议规定如下
ADU=+++ ADU 25611252 2
PDU=+
PDU应为 253
*/
get { return 0xFD; } //0xFD 十进制为253
}
public DeviceAddress GetDeviceAddress(string address)//PLC地址一般为5位 如40001,也有可能为40001.1 首位代表地址类型

160
SCADA/Program/ModbusDriver/ModbusTCPDriver.cs

@ -10,8 +10,94 @@ using DataService;
namespace ModbusDriver
{
[Description("Modbus TCP协议")]
public sealed class ModbusTCPReader : IPLCDriver, IMultiReadWrite
public sealed class ModbusTCPReader : IPLCDriver, IMultiReadWrite //IPLCDriver : IDriver, IReaderWriter IDriver : IDisposable
{
#region
public int PDU
{
// get { return 252; }
//get { return 256; }
/* yjz
20171125
modbusTCP中协议规定如下
ADU=MBAP++ ADU 256MBAP 71248
PDU=+
PDU应为 249
*/
get { return 249; } //0xF9 十进制为249
}
public DeviceAddress GetDeviceAddress(string address)
{
DeviceAddress dv = DeviceAddress.Empty;
if (string.IsNullOrEmpty(address))
return dv;
dv.Area = _slaveId;
switch (address[0])
{
case '0':
{
dv.DBNumber = Modbus.fctReadCoil;
int st;
int.TryParse(address, out st);
//dv.Start = (st / 16) * 16;//???????????????????
dv.Bit = (byte)(st % 16);
st /= 16;
dv.Start = st;
}
break;
case '1':
{
dv.DBNumber = Modbus.fctReadDiscreteInputs;
int st;
int.TryParse(address.Substring(1), out st);
//dv.Start = (st / 16) * 16;//???????????????????
dv.Bit = (byte)(st % 16);
st /= 16;
dv.Start = st;
}
break;
case '4':
{
int index = address.IndexOf('.');
dv.DBNumber = Modbus.fctReadHoldingRegister;
if (index > 0)
{
dv.Start = int.Parse(address.Substring(1, index - 1));
dv.Bit = byte.Parse(address.Substring(index + 1));
}
else
dv.Start = int.Parse(address.Substring(1));
dv.Start--;
}
break;
case '3':
{
int index = address.IndexOf('.');
dv.DBNumber = Modbus.fctReadInputRegister;
if (index > 0)
{
dv.Start = int.Parse(address.Substring(1, index - 1));
dv.Bit = byte.Parse(address.Substring(index + 1));
}
else
dv.Start = int.Parse(address.Substring(1));
dv.Start--;
}
break;
}
return dv;
}
public string GetAddress(DeviceAddress address)
{
return string.Empty;
}
#endregion
private int _timeout;
private Socket tcpSynCl;
@ -239,78 +325,6 @@ namespace ModbusDriver
return WriteSyncData(data);
}
public int PDU
{
get { return 252; }
//get { return 256; }
}
public DeviceAddress GetDeviceAddress(string address)
{
DeviceAddress dv = DeviceAddress.Empty;
if (string.IsNullOrEmpty(address))
return dv;
dv.Area = _slaveId;
switch (address[0])
{
case '0':
{
dv.DBNumber = Modbus.fctReadCoil;
int st;
int.TryParse(address, out st);
//dv.Start = (st / 16) * 16;//???????????????????
dv.Bit = (byte)(st % 16);
st /= 16;
dv.Start = st;
}
break;
case '1':
{
dv.DBNumber = Modbus.fctReadDiscreteInputs;
int st;
int.TryParse(address.Substring(1), out st);
//dv.Start = (st / 16) * 16;//???????????????????
dv.Bit = (byte)(st % 16);
st /= 16;
dv.Start = st;
}
break;
case '4':
{
int index = address.IndexOf('.');
dv.DBNumber = Modbus.fctReadHoldingRegister;
if (index > 0)
{
dv.Start = int.Parse(address.Substring(1, index - 1));
dv.Bit = byte.Parse(address.Substring(index + 1));
}
else
dv.Start = int.Parse(address.Substring(1));
dv.Start--;
}
break;
case '3':
{
int index = address.IndexOf('.');
dv.DBNumber = Modbus.fctReadInputRegister;
if (index > 0)
{
dv.Start = int.Parse(address.Substring(1, index - 1));
dv.Bit = byte.Parse(address.Substring(index + 1));
}
else
dv.Start = int.Parse(address.Substring(1));
dv.Start--;
}
break;
}
return dv;
}
public string GetAddress(DeviceAddress address)
{
return string.Empty;
}
public IGroup AddGroup(string name, short id, int updateRate, float deadBand = 0f, bool active = false)

Loading…
Cancel
Save