diff --git a/SCADA/Program/.vs/DataExchange/v15/.suo b/SCADA/Program/.vs/DataExchange/v15/.suo index 8e7b465..7c2a6c4 100644 Binary files a/SCADA/Program/.vs/DataExchange/v15/.suo and b/SCADA/Program/.vs/DataExchange/v15/.suo differ diff --git a/SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide b/SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide index 2bad3ab..d774922 100644 Binary files a/SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide and b/SCADA/Program/.vs/DataExchange/v15/sqlite3/storage.ide differ diff --git a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs b/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs index 59658c2..836583c 100644 --- a/SCADA/Program/ModbusDriver/ModbusRTUDriver.cs +++ b/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 256字节,地址域1字节,功能码1字节,数据为252字节 , 差错检验2字节, + PDU=功能码+数据 + 所以PDU应为: 253字节 + */ + get { return 0xFD; } //0xFD 十进制为253 + + } public DeviceAddress GetDeviceAddress(string address)//PLC地址一般为5位 如40001,也有可能为40001.1 首位代表地址类型 diff --git a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs b/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs index 9f9a234..08fc88e 100644 --- a/SCADA/Program/ModbusDriver/ModbusTCPDriver.cs +++ b/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 + 更新原因: 在 modbus——TCP中协议规定如下: + ADU=MBAP+功能码+数据 其中 ADU 256字节,MBAP 7字节,功能码1字节,数据为248字节 + 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)