diff --git a/.gitignore b/.gitignore index 1bc915c..05ec4f6 100644 --- a/.gitignore +++ b/.gitignore @@ -154,3 +154,4 @@ $RECYCLE.BIN/ # Mac desktop service store files .DS_Store +/Modbus.Net/packages diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.nuspec b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.nuspec index c0c2c80..6718ee4 100644 --- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.nuspec +++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.nuspec @@ -2,7 +2,7 @@ Modbus.Net.Modbus - 1.1.0 + 1.1.1 Modbus.Net.Modbus Chris L.(Luo Sheng) Hangzhou Delian Information and Science Technology Co.,Ltd. diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocal.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocal.cs index 82dcfea..6f947b0 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocal.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocal.cs @@ -13,5 +13,10 @@ { ProtocalLinker = new ModbusTcpProtocalLinker(ip); } + + public ModbusTcpProtocal(string ip, int port) + { + ProtocalLinker = new ModbusTcpProtocalLinker(ip, port); + } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocalLinker.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocalLinker.cs index aee6f52..e6a67f3 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocalLinker.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusTcpProtocalLinker.cs @@ -22,5 +22,10 @@ { } + + public ModbusTcpProtocalLinker(string ip, int port) : base(ip, port) + { + + } } } diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs index c8245be..bba0f34 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusUtility.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; namespace Modbus.Net.Modbus { @@ -21,6 +22,34 @@ namespace Modbus.Net.Modbus { private ModbusType _modbusType; + protected string ConnectionStringIp + { + get + { + if (ConnectionString == null) return null; + return ConnectionString.Contains(":") ? ConnectionString.Split(':')[0] : ConnectionString; + } + } + + protected int? ConnectionStringPort + { + get + { + if (ConnectionString == null) return null; + if (!ConnectionString.Contains(":")) return null; + var connectionStringSplit = ConnectionString.Split(':'); + try + { + return connectionStringSplit.Length < 2 ? (int?)null : int.Parse(connectionStringSplit[1]); + } + catch + { + return null; + } + + } + } + public ModbusType ModbusType { get @@ -39,7 +68,7 @@ namespace Modbus.Net.Modbus } case ModbusType.Tcp: { - Wrapper = ConnectionString == null ? new ModbusTcpProtocal() : new ModbusTcpProtocal(ConnectionString); + Wrapper = ConnectionString == null ? new ModbusTcpProtocal() : (ConnectionStringPort == null ? new ModbusTcpProtocal(ConnectionString) : new ModbusTcpProtocal(ConnectionStringIp,ConnectionStringPort.Value)); break; } } diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.nuspec b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.nuspec index c1dff2e..1ae2d80 100644 --- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.nuspec +++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.nuspec @@ -2,7 +2,7 @@ Modbus.Net.Siemens - 1.1.0 + 1.1.1 Modbus.Net.Siemens Chris L.(Luo Sheng) Hangzhou Delian Information and Science Technology Co.,Ltd. diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs index 7841e4d..3e2bd70 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocal.cs @@ -12,13 +12,20 @@ namespace Modbus.Net.Siemens private readonly byte _tdpuSize; private readonly string _ip; + private readonly int _port; private int _connectTryCount; public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu) : this(tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ConfigurationManager.IP) { } - public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu, string ip) + public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, + ushort maxPdu, string ip) : this (tdpuSize, tsapSrc, tsapDst, maxCalling, maxCalled, maxPdu, ip, 0) + { + + } + + public SiemensTcpProtocal(byte tdpuSize, ushort tsapSrc, ushort tsapDst, ushort maxCalling, ushort maxCalled, ushort maxPdu, string ip, int port) { _taspSrc = tsapSrc; _tsapDst = tsapDst; @@ -27,6 +34,7 @@ namespace Modbus.Net.Siemens _maxPdu = maxPdu; _tdpuSize = tdpuSize; _ip = ip; + _port = port; _connectTryCount = 0; } @@ -69,7 +77,7 @@ namespace Modbus.Net.Siemens public override async Task ConnectAsync() { _connectTryCount++; - ProtocalLinker = new SiemensTcpProtocalLinker(_ip); + ProtocalLinker = _port == 0 ? new SiemensTcpProtocalLinker(_ip) : new SiemensTcpProtocalLinker(_ip, _port); if (!await ProtocalLinker.ConnectAsync()) return false; _connectTryCount = 0; var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst); diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocalLinker.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocalLinker.cs index 452f1f6..36ca1b3 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocalLinker.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensTcpProtocalLinker.cs @@ -33,5 +33,11 @@ namespace Modbus.Net.Siemens { } + + public SiemensTcpProtocalLinker(string ip, int port) + : base(ip, port) + { + + } } } \ No newline at end of file diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs index 9077889..73d6360 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensUtility.cs @@ -29,7 +29,34 @@ namespace Modbus.Net.Siemens private readonly ushort _maxCalling; private readonly ushort _maxCalled; private readonly ushort _maxPdu; - + + protected string ConnectionStringIp + { + get + { + if (ConnectionString == null) return null; + return ConnectionString.Contains(":") ? ConnectionString.Split(':')[0] : ConnectionString; + } + } + + protected int? ConnectionStringPort + { + get + { + if (ConnectionString == null) return null; + if (!ConnectionString.Contains(":")) return null; + var connectionStringSplit = ConnectionString.Split(':'); + try + { + return connectionStringSplit.Length < 2 ? (int?)null : int.Parse(connectionStringSplit[1]); + } + catch + { + return null; + } + } + } + private SiemensType _siemensType; public SiemensType ConnectionType @@ -53,7 +80,7 @@ namespace Modbus.Net.Siemens // } case SiemensType.Tcp: { - Wrapper = ConnectionString == null ? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) : new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionString); + Wrapper = ConnectionString == null ? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu) : (ConnectionStringPort == null ? new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionString) : new SiemensTcpProtocal(_tdpuSize, _taspSrc, _tsapDst, _maxCalling, _maxCalled, _maxPdu, ConnectionStringIp, ConnectionStringPort.Value)); break; } } diff --git a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs index 045bde1..119cd12 100644 --- a/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs +++ b/Modbus.Net/NA200H.UI.WPF/MainWindow.xaml.cs @@ -50,13 +50,15 @@ namespace NA200H.UI.WPF //}); //machine.AddressFormater = new AddressFormaterNA200H(); //machine.AddressTranslator = new AddressTranslatorNA200H(); - machine = new SiemensMachine(SiemensType.Tcp, "192.168.3.11", SiemensMachineModel.S7_300, new List() + //machine.AddressCombiner = new AddressCombinerContinus(); + machine = new SiemensMachine(SiemensType.Tcp, "192.168.3.11:102", SiemensMachineModel.S7_300, new List() { new AddressUnit() {Id = 1, Area = "V", Address = 0, CommunicationTag = "Add1", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = 2, Area = "V", Address = 2, CommunicationTag = "Add2", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = 3, Area = "V", Address = 4, CommunicationTag = "Add3", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = 4, Area = "V", Address = 6, CommunicationTag = "Ans", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0} }); + machine.AddressCombiner = new AddressCombinerContinus(); var result = machine.GetDatas(); var resultFormat = BaseMachine.MapGetValuesToSetValues(result); SetValue(new ushort[4] {(ushort)resultFormat["Add1"], (ushort)resultFormat["Add2"], (ushort)resultFormat["Add3"], (ushort)resultFormat["Ans"]});