From 9323e7eb1f71e5f47e3ab6cf8233b7673a308480 Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Fri, 27 Oct 2017 16:18:22 +0800 Subject: [PATCH] 2017-10-27 update 1 BaseController and IController First Commit (Not complete, temporary disable all serial port codes.) --- .../Modbus.Net.Core/Modbus.Net.Core.csproj | 6 +- .../Modbus.Net.Modbus.Core.csproj | 6 +- .../Modbus.Net.Modbus.csproj | 6 +- .../Modbus.Net.OPC/FBox/FBoxOpcDaManchine.cs | 8 +- .../Modbus.Net.OPC/Modbus.Net.OPC.csproj | 2 +- Modbus.Net/Modbus.Net.OPC/OpcConnector.cs | 24 +-- Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs | 16 +- Modbus.Net/Modbus.Net.OPC/OpcDaProtocal.cs | 9 - Modbus.Net/Modbus.Net.OPC/OpcMachine.cs | 8 +- Modbus.Net/Modbus.Net.OPC/OpcUaMachine.cs | 16 +- Modbus.Net/Modbus.Net.OPC/OpcUaProtocal.cs | 9 - .../Modbus.Net.Siemens.Core.csproj | 4 +- .../Modbus.Net.Siemens.csproj | 4 +- Modbus.Net/Modbus.Net/Modbus.Net.csproj | 6 +- Modbus.Net/src/Base.Common/BaseConnector.cs | 48 ++++- Modbus.Net/src/Base.Common/BaseController.cs | 175 ++++++++++++++++++ Modbus.Net/src/Base.Common/BaseMachine.cs | 36 ++-- Modbus.Net/src/Base.Common/BaseProtocal.cs | 6 - Modbus.Net/src/Base.Common/BaseUtility.cs | 15 -- Modbus.Net/src/Base.Common/IConnector.cs | 13 -- Modbus.Net/src/Base.Common/IController.cs | 17 ++ Modbus.Net/src/Base.Common/IProtocal.cs | 6 - Modbus.Net/src/Base.Common/IProtocalLinker.cs | 6 - Modbus.Net/src/Base.Common/ProtocalLinker.cs | 9 - Modbus.Net/src/Base.Common/TcpConnector.cs | 109 +++++++---- Modbus.Net/src/Modbus.Common/ModbusMachine.cs | 16 +- .../src/Modbus.Common/ModbusProtocal.cs | 9 - .../Modbus.Common/ModbusTcpProtocalLinker.cs | 3 +- Modbus.Net/src/Modbus.Common/ModbusUtility.cs | 6 +- .../src/Siemens.Common/SiemensMachine.cs | 16 +- .../src/Siemens.Common/SiemensTcpProtocal.cs | 9 - .../SiemensTcpProtocalLinker.cs | 1 + .../src/Siemens.Common/SiemensUtility.cs | 2 + README.md | 35 ++-- Samples/AnyType/Controllers/HomeController.cs | 2 +- .../TaskManager/Controllers/HomeController.cs | 2 +- .../TripleAdd/Controllers/HomeController.cs | 2 +- Tests/Modbus.Net.Tests/BaseTest.cs | 8 +- Tests/Modbus.Net.Tests/MachineMethodTest.cs | 6 +- .../ModbusMultiStationTest.cs | 4 +- Tests/Modbus.Net.Tests/ModbusTest.cs | 26 +-- Tests/Modbus.Net.Tests/OpcTest.cs | 2 +- Tests/Modbus.Net.Tests/SiemensTest.cs | 2 +- Tests/Modbus.Net.Tests/TaskManagerTest.cs | 5 +- 44 files changed, 437 insertions(+), 283 deletions(-) create mode 100644 Modbus.Net/src/Base.Common/BaseController.cs create mode 100644 Modbus.Net/src/Base.Common/IController.cs diff --git a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj index 0bf4df1..60c2db4 100644 --- a/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj +++ b/Modbus.Net/Modbus.Net.Core/Modbus.Net.Core.csproj @@ -5,7 +5,7 @@ Modbus.Net.Core Modbus.Net Modbus.Net.Core - 1.4.0 + 1.4.1 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. @@ -51,9 +51,13 @@ + + + diff --git a/Modbus.Net/Modbus.Net.Modbus.Core/Modbus.Net.Modbus.Core.csproj b/Modbus.Net/Modbus.Net.Modbus.Core/Modbus.Net.Modbus.Core.csproj index aac1f49..da30280 100644 --- a/Modbus.Net/Modbus.Net.Modbus.Core/Modbus.Net.Modbus.Core.csproj +++ b/Modbus.Net/Modbus.Net.Modbus.Core/Modbus.Net.Modbus.Core.csproj @@ -4,7 +4,7 @@ Modbus.Net.Modbus.Core Modbus.Net.Modbus Modbus.Net.Modbus.Core - 1.4.0 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net.Modbus @@ -28,17 +28,21 @@ + + diff --git a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj index cf070d7..0a04c10 100644 --- a/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj +++ b/Modbus.Net/Modbus.Net.Modbus/Modbus.Net.Modbus.csproj @@ -5,7 +5,7 @@ Modbus.Net.Modbus Modbus.Net.Modbus Modbus.Net.Modbus - 1.4.0 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net.Modbus @@ -33,17 +33,21 @@ + + diff --git a/Modbus.Net/Modbus.Net.OPC/FBox/FBoxOpcDaManchine.cs b/Modbus.Net/Modbus.Net.OPC/FBox/FBoxOpcDaManchine.cs index 04053a2..f0741d1 100644 --- a/Modbus.Net/Modbus.Net.OPC/FBox/FBoxOpcDaManchine.cs +++ b/Modbus.Net/Modbus.Net.OPC/FBox/FBoxOpcDaManchine.cs @@ -15,9 +15,9 @@ namespace Modbus.Net.OPC.FBox /// 设备名称 /// 获取地址 /// 是否保持连接 - public FBoxOpcDaMachine(string localSequence, string linkerName, + public FBoxOpcDaMachine(string id, string localSequence, string linkerName, IEnumerable getAddresses, bool keepConnect) - : base( + : base(id, ConfigurationManager.AppSettings["FBoxOpcDaHost"] ?? "opcda://localhost/FBoxOpcServer", getAddresses, keepConnect, true) { @@ -39,9 +39,9 @@ namespace Modbus.Net.OPC.FBox /// 页名称 /// 设备名称 /// 获取地址 - public FBoxOpcDaMachine(string localSequence, string linkerName, + public FBoxOpcDaMachine(string id, string localSequence, string linkerName, IEnumerable getAddresses) - : this(localSequence, linkerName, getAddresses, false) + : this(id, localSequence, linkerName, getAddresses, false) { } diff --git a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj index 3e1a9cd..98f64ca 100644 --- a/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj +++ b/Modbus.Net/Modbus.Net.OPC/Modbus.Net.OPC.csproj @@ -5,7 +5,7 @@ Modbus.Net.OPC Modbus.Net.OPC Modbus.Net.OPC - 1.4.0 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net OPC Implementation diff --git a/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs b/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs index f8f81e3..93c61be 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcConnector.cs @@ -12,7 +12,7 @@ namespace Modbus.Net.OPC /// /// Opc连接器 /// - public abstract class OpcConnector : BaseConnector + public abstract class OpcConnector : IConnector { /// /// 是否正在连接 @@ -43,18 +43,18 @@ namespace Modbus.Net.OPC /// /// 连接标识 /// - public override string ConnectionToken { get; } + public virtual string ConnectionToken { get; } /// /// 是否正在连接 /// - public override bool IsConnected => _connect; + public virtual bool IsConnected => _connect; /// /// 断开连接 /// /// - public override bool Disconnect() + public virtual bool Disconnect() { try { @@ -77,17 +77,7 @@ namespace Modbus.Net.OPC /// /// 需要发送的数据 /// 是否发送成功 - public override OpcParamOut SendMsg(OpcParamIn message) - { - return AsyncHelper.RunSync(() => SendMsgAsync(message)); - } - - /// - /// 带返回发送数据 - /// - /// 需要发送的数据 - /// 是否发送成功 - public override async Task SendMsgAsync(OpcParamIn message) + public virtual async Task SendMsgAsync(OpcParamIn message) { try { @@ -186,7 +176,7 @@ namespace Modbus.Net.OPC /// 连接PLC /// /// 是否连接成功 - public override bool Connect() + protected bool Connect() { try { @@ -207,7 +197,7 @@ namespace Modbus.Net.OPC /// 连接PLC,异步 /// /// 是否连接成功 - public override Task ConnectAsync() + public virtual Task ConnectAsync() { return Task.FromResult(Connect()); } diff --git a/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs b/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs index ed39377..805ec17 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs @@ -18,8 +18,8 @@ namespace Modbus.Net.OPC /// 需要读写的数据 /// 是否保持连接 /// 是否开启正则匹配 - public OpcDaMachine(string connectionString, IEnumerable> getAddresses, bool keepConnect, bool isRegexOn = false) - : base(getAddresses, keepConnect) + public OpcDaMachine(TKey id, string connectionString, IEnumerable> getAddresses, bool keepConnect, bool isRegexOn = false) + : base(id, getAddresses, keepConnect) { BaseUtility = new OpcDaUtility(connectionString, isRegexOn); ((OpcUtility) BaseUtility).GetSeperator += @@ -31,8 +31,8 @@ namespace Modbus.Net.OPC /// /// 连接地址 /// 需要读写的数据 - public OpcDaMachine(string connectionString, IEnumerable> getAddresses) - : this(connectionString, getAddresses, false) + public OpcDaMachine(TKey id, string connectionString, IEnumerable> getAddresses) + : this(id, connectionString, getAddresses, false) { } } @@ -49,8 +49,8 @@ namespace Modbus.Net.OPC /// 需要读写的数据 /// 是否保持连接 /// 是否开启正则匹配 - public OpcDaMachine(string connectionString, IEnumerable getAddresses, bool keepConnect, bool isRegexOn = false) - : base(getAddresses, keepConnect) + public OpcDaMachine(string id, string connectionString, IEnumerable getAddresses, bool keepConnect, bool isRegexOn = false) + : base(id, getAddresses, keepConnect) { BaseUtility = new OpcDaUtility(connectionString, isRegexOn); ((OpcUtility) BaseUtility).GetSeperator += @@ -62,8 +62,8 @@ namespace Modbus.Net.OPC /// /// 连接地址 /// 需要读写的数据 - public OpcDaMachine(string connectionString, IEnumerable getAddresses) - : this(connectionString, getAddresses, false) + public OpcDaMachine(string id, string connectionString, IEnumerable getAddresses) + : this(id, connectionString, getAddresses, false) { } } diff --git a/Modbus.Net/Modbus.Net.OPC/OpcDaProtocal.cs b/Modbus.Net/Modbus.Net.OPC/OpcDaProtocal.cs index 47beba8..798847a 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcDaProtocal.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcDaProtocal.cs @@ -22,15 +22,6 @@ namespace Modbus.Net.OPC _isRegexOn = isRegexOn; } - /// - /// 连接设备 - /// - /// 是否连接成功 - public override bool Connect() - { - return AsyncHelper.RunSync(ConnectAsync); - } - /// /// 连接设备 /// diff --git a/Modbus.Net/Modbus.Net.OPC/OpcMachine.cs b/Modbus.Net/Modbus.Net.OPC/OpcMachine.cs index 0b6f537..8709a86 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcMachine.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcMachine.cs @@ -14,8 +14,8 @@ namespace Modbus.Net.OPC /// /// 需要读写的地址 /// 是否保持连接 - protected OpcMachine(IEnumerable> getAddresses, bool keepConnect) - : base(getAddresses, keepConnect) + protected OpcMachine(TKey id, IEnumerable> getAddresses, bool keepConnect) + : base(id, getAddresses, keepConnect) { AddressCombiner = new AddressCombinerSingle(); AddressCombinerSet = new AddressCombinerSingle(); @@ -32,8 +32,8 @@ namespace Modbus.Net.OPC /// /// 需要读写的地址 /// 是否保持连接 - protected OpcMachine(IEnumerable getAddresses, bool keepConnect) - : base(getAddresses, keepConnect) + protected OpcMachine(string id, IEnumerable getAddresses, bool keepConnect) + : base(id, getAddresses, keepConnect) { AddressCombiner = new AddressCombinerSingle(); AddressCombinerSet = new AddressCombinerSingle(); diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUaMachine.cs b/Modbus.Net/Modbus.Net.OPC/OpcUaMachine.cs index 584a4eb..d4657b9 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcUaMachine.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcUaMachine.cs @@ -18,8 +18,8 @@ namespace Modbus.Net.OPC /// 需要读写的数据 /// 是否保持连接 /// 是否开启正则匹配 - public OpcUaMachine(string connectionString, IEnumerable> getAddresses, bool keepConnect, bool isRegexOn = false) - : base(getAddresses, keepConnect) + public OpcUaMachine(TKey id, string connectionString, IEnumerable> getAddresses, bool keepConnect, bool isRegexOn = false) + : base(id, getAddresses, keepConnect) { BaseUtility = new OpcUaUtility(connectionString, isRegexOn); ((OpcUtility) BaseUtility).GetSeperator += @@ -31,8 +31,8 @@ namespace Modbus.Net.OPC /// /// 连接地址 /// 需要读写的数据 - public OpcUaMachine(string connectionString, IEnumerable> getAddresses) - : this(connectionString, getAddresses, false) + public OpcUaMachine(TKey id, string connectionString, IEnumerable> getAddresses) + : this(id, connectionString, getAddresses, false) { } } @@ -49,8 +49,8 @@ namespace Modbus.Net.OPC /// 需要读写的数据 /// 是否保持连接 /// 是否开启正则匹配 - public OpcUaMachine(string connectionString, IEnumerable getAddresses, bool keepConnect, bool isRegexOn = false) - : base(getAddresses, keepConnect) + public OpcUaMachine(string id, string connectionString, IEnumerable getAddresses, bool keepConnect, bool isRegexOn = false) + : base(id, getAddresses, keepConnect) { BaseUtility = new OpcUaUtility(connectionString, isRegexOn); ((OpcUtility) BaseUtility).GetSeperator += @@ -62,8 +62,8 @@ namespace Modbus.Net.OPC /// /// 连接地址 /// 需要读写的数据 - public OpcUaMachine(string connectionString, IEnumerable getAddresses) - : this(connectionString, getAddresses, false) + public OpcUaMachine(string id, string connectionString, IEnumerable getAddresses) + : this(id, connectionString, getAddresses, false) { } } diff --git a/Modbus.Net/Modbus.Net.OPC/OpcUaProtocal.cs b/Modbus.Net/Modbus.Net.OPC/OpcUaProtocal.cs index 32d07fc..c80d15f 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcUaProtocal.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcUaProtocal.cs @@ -22,15 +22,6 @@ namespace Modbus.Net.OPC _isRegexOn = isRegexOn; } - /// - /// 连接设备 - /// - /// 是否连接成功 - public override bool Connect() - { - return AsyncHelper.RunSync(ConnectAsync); - } - /// /// 连接设备 /// diff --git a/Modbus.Net/Modbus.Net.Siemens.Core/Modbus.Net.Siemens.Core.csproj b/Modbus.Net/Modbus.Net.Siemens.Core/Modbus.Net.Siemens.Core.csproj index eabe269..33bbba5 100644 --- a/Modbus.Net/Modbus.Net.Siemens.Core/Modbus.Net.Siemens.Core.csproj +++ b/Modbus.Net/Modbus.Net.Siemens.Core/Modbus.Net.Siemens.Core.csproj @@ -5,7 +5,7 @@ Modbus.Net.Siemens.Core Modbus.Net.Siemens Modbus.Net.Siemens.Core - 1.4.0 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net Siemens Profinet Implementation @@ -29,8 +29,10 @@ + diff --git a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj index 3b7b102..b906244 100644 --- a/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj +++ b/Modbus.Net/Modbus.Net.Siemens/Modbus.Net.Siemens.csproj @@ -5,7 +5,7 @@ Modbus.Net.Siemens Modbus.Net.Siemens Modbus.Net.Siemens - 1.4.0 + 1.4.1 Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. Modbus.Net Siemens Profinet Implementation @@ -29,8 +29,10 @@ + diff --git a/Modbus.Net/Modbus.Net/Modbus.Net.csproj b/Modbus.Net/Modbus.Net/Modbus.Net.csproj index 525d7f5..8a14256 100644 --- a/Modbus.Net/Modbus.Net/Modbus.Net.csproj +++ b/Modbus.Net/Modbus.Net/Modbus.Net.csproj @@ -5,7 +5,7 @@ Modbus.Net Modbus.Net Modbus.Net - 1.4.0 + 1.4.1 Modbus.Net Chris L.(Luo Sheng) Hangzhou Delian IoT Science Technology Co.,Ltd. @@ -51,9 +51,13 @@ + + + diff --git a/Modbus.Net/src/Base.Common/BaseConnector.cs b/Modbus.Net/src/Base.Common/BaseConnector.cs index 50c7303..b6ce5d8 100644 --- a/Modbus.Net/src/Base.Common/BaseConnector.cs +++ b/Modbus.Net/src/Base.Common/BaseConnector.cs @@ -14,6 +14,17 @@ namespace Modbus.Net /// public abstract class BaseConnector : IConnector { + //protected delegate MessageReturnCallbackArgs MessageReturnDelegate(object sender, MessageReturnArgs args); + + //protected event MessageReturnDelegate MessageReturn; + + public void AddController(IController controller) + { + Controller = controller; + } + + protected IController Controller { get; set; } + /// /// 标识Connector的连接关键字 /// @@ -24,12 +35,6 @@ namespace Modbus.Net /// public abstract bool IsConnected { get; } - /// - /// 连接PLC - /// - /// 是否连接成功 - public abstract bool Connect(); - /// /// 连接PLC,异步 /// @@ -47,13 +52,36 @@ namespace Modbus.Net /// /// 需要发送的数据 /// 是否发送成功 - public abstract TParamOut SendMsg(TParamIn message); + public abstract Task SendMsgAsync(TParamIn message); /// - /// 带返回发送数据 + /// 发送数据,不确认 /// /// 需要发送的数据 - /// 是否发送成功 - public abstract Task SendMsgAsync(TParamIn message); + protected abstract Task SendMsgWithoutConfirm(TParamIn message); + + /// + /// 接收消息单独线程开启 + /// + protected abstract void ReceiveMsgThreadStart(); + + /// + /// 接收消息单独线程停止 + /// + protected abstract void ReceiveMsgThreadStop(); } + + /*public class MessageReturnArgs + { + public byte[] ReturnMessage { get; set; } + + public string MessageKey { get; set; } + } + + public class MessageReturnCallbackArgs + { + public bool ShouldLockSender { get; set; } = false; + + public bool ShouldReleaseSender { get; set; } = false; + }*/ } \ No newline at end of file diff --git a/Modbus.Net/src/Base.Common/BaseController.cs b/Modbus.Net/src/Base.Common/BaseController.cs new file mode 100644 index 0000000..bd44786 --- /dev/null +++ b/Modbus.Net/src/Base.Common/BaseController.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Serilog; +using Serilog.Events; + +namespace Modbus.Net +{ + public abstract class BaseController : IController + { + protected List WaitingMessages { get; set; } + + protected Task SendingThread { get; set; } + protected bool _taskCancel = false; + + protected BaseController() + { + WaitingMessages = new List(); + } + + public MessageWaitingDef AddMessage(byte[] sendMessage) + { + var def = new MessageWaitingDef + { + Key = GetKeyFromMessage(sendMessage), + SendMessage = sendMessage, + SendMutex = new AutoResetEvent(false), + ReceiveMutex = new AutoResetEvent(false) + }; + AddMessageToList(def); + return def; + } + + protected abstract void SendingMessageControlInner(); + + public void SendStop() + { + _taskCancel = true; + } + + public void SendStart() + { + if (SendingThread == null) + { + SendingThread = Task.Run(()=>SendingMessageControlInner()); + } + } + + public void Clear() + { + lock (WaitingMessages) + { + WaitingMessages.Clear(); + } + } + + protected virtual void AddMessageToList(MessageWaitingDef def) + { + lock (WaitingMessages) + { + WaitingMessages.Add(def); + } + } + + protected abstract string GetKeyFromMessage(byte[] message); + + public bool ConfirmMessage(byte[] receiveMessage) + { + var def = GetMessageFromWaitingList(receiveMessage); + if (def != null) + { + def.ReceiveMessage = receiveMessage; + lock (WaitingMessages) + { + WaitingMessages.Remove(def); + } + def.ReceiveMutex.Set(); + return true; + } + return false; + } + + protected abstract MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage); + + public void ForceRemoveWaitingMessage(MessageWaitingDef def) + { + lock (WaitingMessages) + { + WaitingMessages.Remove(def); + } + } + } + + public class MessageWaitingDef + { + public string Key { get; set; } + + public byte[] SendMessage { get; set; } + + public byte[] ReceiveMessage { get; set; } + + public EventWaitHandle SendMutex { get; set; } + + public EventWaitHandle ReceiveMutex { get; set; } + } + + public class FIFOController : BaseController + { + private MessageWaitingDef _currentSendingPos; + + public int AcquireTime { get; } + + public FIFOController(int acquireTime) + { + AcquireTime = acquireTime; + } + + protected override void SendingMessageControlInner() + { + try + { + while (!_taskCancel) + { + if (AcquireTime > 0) + { + Thread.Sleep(AcquireTime); + } + lock (WaitingMessages) + { + if (_currentSendingPos == null) + { + if (WaitingMessages.Count > 0) + { + _currentSendingPos = WaitingMessages.First(); + } + } + if (_currentSendingPos != null) + { + _currentSendingPos.SendMutex.Set(); + if (WaitingMessages.Count <= 1) + { + _currentSendingPos = null; + } + else + { + _currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1]; + } + } + } + } + } + catch (ObjectDisposedException) + { + //ignore + } + catch(Exception e) + { + Log.Error(e, "Controller thorws exception"); + } + + } + + protected override string GetKeyFromMessage(byte[] message) + { + return null; + } + + protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage) + { + return WaitingMessages.FirstOrDefault(); + } + } +} \ No newline at end of file diff --git a/Modbus.Net/src/Base.Common/BaseMachine.cs b/Modbus.Net/src/Base.Common/BaseMachine.cs index 84c52aa..f8d52cc 100644 --- a/Modbus.Net/src/Base.Common/BaseMachine.cs +++ b/Modbus.Net/src/Base.Common/BaseMachine.cs @@ -93,7 +93,7 @@ namespace Modbus.Net /// 构造器 /// /// 需要与设备通讯的地址 - protected BaseMachine(IEnumerable getAddresses) : base(getAddresses) + protected BaseMachine(string id, IEnumerable getAddresses) : base(id, getAddresses) { } @@ -102,8 +102,8 @@ namespace Modbus.Net /// /// 需要与设备通讯的地址 /// 是否保持连接 - protected BaseMachine(IEnumerable getAddresses, bool keepConnect) - : base(getAddresses, keepConnect) + protected BaseMachine(string id, IEnumerable getAddresses, bool keepConnect) + : base(id, getAddresses, keepConnect) { } @@ -114,8 +114,8 @@ namespace Modbus.Net /// 是否保持连接 /// 从站地址 /// 主站地址 - protected BaseMachine(IEnumerable getAddresses, bool keepConnect, byte slaveAddress, - byte masterAddress) : base(getAddresses, keepConnect, slaveAddress, masterAddress) + protected BaseMachine(string id, IEnumerable getAddresses, bool keepConnect, byte slaveAddress, + byte masterAddress) : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { } } @@ -135,8 +135,8 @@ namespace Modbus.Net /// 构造器 /// /// 需要与设备通讯的地址 - protected BaseMachine(IEnumerable> getAddresses) - : this(getAddresses, false) + protected BaseMachine(TKey id, IEnumerable> getAddresses) + : this(id, getAddresses, false) { } @@ -145,8 +145,9 @@ namespace Modbus.Net /// /// 需要与设备通讯的地址 /// 是否保持连接 - protected BaseMachine(IEnumerable> getAddresses, bool keepConnect) + protected BaseMachine(TKey id, IEnumerable> getAddresses, bool keepConnect) { + Id = id; GetAddresses = getAddresses; KeepConnect = keepConnect; } @@ -158,8 +159,8 @@ namespace Modbus.Net /// 是否保持连接 /// 从站地址 /// 主站地址 - protected BaseMachine(IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, - byte masterAddress) : this(getAddresses, keepConnect) + protected BaseMachine(TKey id, IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, + byte masterAddress) : this(id, getAddresses, keepConnect) { SlaveAddress = slaveAddress; MasterAddress = masterAddress; @@ -604,15 +605,6 @@ namespace Modbus.Net return null; } - /// - /// 连接设备 - /// - /// 是否连接成功 - public bool Connect() - { - return BaseUtility.Connect(); - } - /// /// 连接设备 /// @@ -874,12 +866,6 @@ namespace Modbus.Net /// 设备的方法集合 TMachineMethod GetMachineMethods() where TMachineMethod : class, IMachineMethod; - /// - /// 连接设备 - /// - /// 是否连接成功 - bool Connect(); - /// /// 连接设备 /// diff --git a/Modbus.Net/src/Base.Common/BaseProtocal.cs b/Modbus.Net/src/Base.Common/BaseProtocal.cs index 1d58f15..e890cec 100644 --- a/Modbus.Net/src/Base.Common/BaseProtocal.cs +++ b/Modbus.Net/src/Base.Common/BaseProtocal.cs @@ -136,12 +136,6 @@ namespace Modbus.Net /// 协议连接开始 /// /// - public abstract bool Connect(); - - /// - /// 协议连接开始(异步) - /// - /// public abstract Task ConnectAsync(); /// diff --git a/Modbus.Net/src/Base.Common/BaseUtility.cs b/Modbus.Net/src/Base.Common/BaseUtility.cs index 5908772..bf3cd78 100644 --- a/Modbus.Net/src/Base.Common/BaseUtility.cs +++ b/Modbus.Net/src/Base.Common/BaseUtility.cs @@ -250,15 +250,6 @@ namespace Modbus.Net /// public AddressTranslator AddressTranslator { get; set; } - /// - /// 连接设备 - /// - /// 设备是否连接成功 - public bool Connect() - { - return Wrapper.Connect(); - } - /// /// 连接设备 /// @@ -323,12 +314,6 @@ namespace Modbus.Net /// AddressTranslator AddressTranslator { get; set; } - /// - /// 连接设备 - /// - /// 设备是否连接成功 - bool Connect(); - /// /// 连接设备 /// diff --git a/Modbus.Net/src/Base.Common/IConnector.cs b/Modbus.Net/src/Base.Common/IConnector.cs index 74693d5..121ec4b 100644 --- a/Modbus.Net/src/Base.Common/IConnector.cs +++ b/Modbus.Net/src/Base.Common/IConnector.cs @@ -17,12 +17,6 @@ namespace Modbus.Net /// bool IsConnected { get; } - /// - /// PLC - /// - /// Ƿӳɹ - bool Connect(); - /// /// PLC첽 /// @@ -35,13 +29,6 @@ namespace Modbus.Net /// ǷϿɹ bool Disconnect(); - /// - /// ط - /// - /// Ҫ͵ - /// Ƿͳɹ - TParamOut SendMsg(TParamIn message); - /// /// ط /// diff --git a/Modbus.Net/src/Base.Common/IController.cs b/Modbus.Net/src/Base.Common/IController.cs new file mode 100644 index 0000000..2ab2e38 --- /dev/null +++ b/Modbus.Net/src/Base.Common/IController.cs @@ -0,0 +1,17 @@ +namespace Modbus.Net +{ + public interface IController + { + MessageWaitingDef AddMessage(byte[] sendMessage); + + void SendStop(); + + void SendStart(); + + void Clear(); + + bool ConfirmMessage(byte[] receiveMessage); + + void ForceRemoveWaitingMessage(MessageWaitingDef def); + } +} diff --git a/Modbus.Net/src/Base.Common/IProtocal.cs b/Modbus.Net/src/Base.Common/IProtocal.cs index 37dedb8..266c10e 100644 --- a/Modbus.Net/src/Base.Common/IProtocal.cs +++ b/Modbus.Net/src/Base.Common/IProtocal.cs @@ -30,12 +30,6 @@ namespace Modbus.Net /// 协议连接开始 /// /// - bool Connect(); - - /// - /// 协议连接开始(异步) - /// - /// Task ConnectAsync(); /// diff --git a/Modbus.Net/src/Base.Common/IProtocalLinker.cs b/Modbus.Net/src/Base.Common/IProtocalLinker.cs index 2dde9e8..000ff06 100644 --- a/Modbus.Net/src/Base.Common/IProtocalLinker.cs +++ b/Modbus.Net/src/Base.Common/IProtocalLinker.cs @@ -19,12 +19,6 @@ namespace Modbus.Net /// bool IsConnected { get; } - /// - /// 连接设备 - /// - /// 设备是否连接成功 - bool Connect(); - /// /// 连接设备 /// diff --git a/Modbus.Net/src/Base.Common/ProtocalLinker.cs b/Modbus.Net/src/Base.Common/ProtocalLinker.cs index 8381e18..1a892b7 100644 --- a/Modbus.Net/src/Base.Common/ProtocalLinker.cs +++ b/Modbus.Net/src/Base.Common/ProtocalLinker.cs @@ -78,15 +78,6 @@ namespace Modbus.Net /// protected IConnector BaseConnector; - /// - /// 连接设备 - /// - /// 设备是否连接成功 - public bool Connect() - { - return BaseConnector.Connect(); - } - /// /// 连接设备 /// diff --git a/Modbus.Net/src/Base.Common/TcpConnector.cs b/Modbus.Net/src/Base.Common/TcpConnector.cs index ec321b6..d12d3e8 100644 --- a/Modbus.Net/src/Base.Common/TcpConnector.cs +++ b/Modbus.Net/src/Base.Common/TcpConnector.cs @@ -52,6 +52,9 @@ namespace Modbus.Net private bool m_disposed; + private Task _receiveThread; + private bool _taskCancel = false; + /// /// 构造器 /// @@ -138,15 +141,6 @@ namespace Modbus.Net Dispose(false); } - /// - /// 连接 - /// - /// 是否连接成功 - public override bool Connect() - { - return AsyncHelper.RunSync(ConnectAsync); - } - /// /// 连接 /// @@ -175,7 +169,9 @@ namespace Modbus.Net } if (_socketClient.Connected) { - Log.Information("Tcp client {ConnectionToken} connected", ConnectionToken); + Controller.SendStart(); + ReceiveMsgThreadStart(); + Log.Information("Tcp client {ConnectionToken} connected", ConnectionToken); return true; } Log.Error("Tcp client {ConnectionToken} connect failed.", ConnectionToken); @@ -219,17 +215,28 @@ namespace Modbus.Net /// /// 发送的数据 /// 是否发送成功 - public override byte[] SendMsg(byte[] message) + public override async Task SendMsgAsync(byte[] message) { - return AsyncHelper.RunSync(() => SendMsgAsync(message)); + var task = SendMsgInner(message).WithCancellation(new CancellationTokenSource(10000).Token); + var ans = await task; + if (task.IsCanceled) + { + Controller.ForceRemoveWaitingMessage(ans); + return null; + } + return ans.ReceiveMessage; } - /// - /// 发送数据,需要返回 - /// - /// 发送的数据 - /// 是否发送成功 - public override async Task SendMsgAsync(byte[] message) + private async Task SendMsgInner(byte[] message) + { + var messageSendingdef = Controller.AddMessage(message); + messageSendingdef.SendMutex.WaitOne(); + await SendMsgWithoutConfirm(message); + messageSendingdef.ReceiveMutex.WaitOne(); + return messageSendingdef; + } + + protected override async Task SendMsgWithoutConfirm(byte[] message) { var datagram = message; @@ -245,45 +252,64 @@ namespace Modbus.Net Log.Verbose("Tcp client {ConnectionToken} send text len = {Length}", ConnectionToken, datagram.Length); Log.Verbose($"Tcp client {ConnectionToken} send: {String.Concat(datagram.Select(p => " " + p.ToString("X2")))}"); await stream.WriteAsync(datagram, 0, datagram.Length); - - var receiveBytes = await ReceiveAsync(stream); - Log.Verbose("Tcp client {ConnectionToken} receive text len = {Length}", ConnectionToken, - receiveBytes.Length); - Log.Verbose($"Tcp client {ConnectionToken} receive: {String.Concat(receiveBytes.Select(p => " " + p.ToString("X2")))}"); - - RefreshReceiveCount(); - - return receiveBytes; } catch (Exception err) { Log.Error(err, "Tcp client {ConnectionToken} send exception", ConnectionToken); CloseClientSocket(); - return null; } } + protected override void ReceiveMsgThreadStart() + { + _receiveThread = Task.Run(ReceiveMessage); + } + + protected override void ReceiveMsgThreadStop() + { + _taskCancel = true; + } + /// /// 接收返回消息 /// - /// Network Stream /// 返回的消息 - protected async Task ReceiveAsync(NetworkStream stream) + protected async Task ReceiveMessage() { try { - var len = await stream.ReadAsync(_receiveBuffer, 0, _receiveBuffer.Length); - stream.Flush(); - // 异步接收回答 - if (len > 0) - return CheckReplyDatagram(len); - return null; + while (!_taskCancel) + { + NetworkStream stream = _socketClient.GetStream(); + var len = await stream.ReadAsync(_receiveBuffer, 0, _receiveBuffer.Length); + stream.Flush(); + + // 异步接收回答 + if (len > 0) + { + byte[] receiveBytes = CheckReplyDatagram(len); + Log.Verbose("Tcp client {ConnectionToken} receive text len = {Length}", ConnectionToken, + receiveBytes.Length); + Log.Verbose( + $"Tcp client {ConnectionToken} receive: {String.Concat(receiveBytes.Select(p => " " + p.ToString("X2")))}"); + var isMessageConfirmed = Controller.ConfirmMessage(receiveBytes); + if (isMessageConfirmed == false) + { + //主动传输事件 + } + } + + RefreshReceiveCount(); + } + } + catch (ObjectDisposedException) + { + //ignore } catch (Exception err) { Log.Error(err, "Tcp client {ConnectionToken} receive exception", ConnectionToken); CloseClientSocket(); - return null; } } @@ -324,10 +350,11 @@ namespace Modbus.Net { try { - var stream = _socketClient.GetStream(); - stream.Dispose(); - _socketClient.Client.Shutdown(SocketShutdown.Both); - _socketClient.Client.Dispose(); + Controller.SendStop(); + Controller.Clear(); + ReceiveMsgThreadStop(); + _socketClient?.GetStream().Dispose(); + _socketClient?.Close(); } catch (Exception ex) { diff --git a/Modbus.Net/src/Modbus.Common/ModbusMachine.cs b/Modbus.Net/src/Modbus.Common/ModbusMachine.cs index 85b2d81..1fd6606 100644 --- a/Modbus.Net/src/Modbus.Common/ModbusMachine.cs +++ b/Modbus.Net/src/Modbus.Common/ModbusMachine.cs @@ -19,10 +19,10 @@ namespace Modbus.Net.Modbus /// 从站号 /// 主站号 /// 端格式 - public ModbusMachine(ModbusType connectionType, string connectionString, + public ModbusMachine(TKey id, ModbusType connectionType, string connectionString, IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb) - : base(getAddresses, keepConnect, slaveAddress, masterAddress) + : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian); AddressFormater = new AddressFormaterModbus(); @@ -39,10 +39,10 @@ namespace Modbus.Net.Modbus /// 从站号 /// 主站号 /// 端格式 - public ModbusMachine(ModbusType connectionType, string connectionString, + public ModbusMachine(TKey id, ModbusType connectionType, string connectionString, IEnumerable> getAddresses, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb) - : this(connectionType, connectionString, getAddresses, false, slaveAddress, masterAddress, endian) + : this(id, connectionType, connectionString, getAddresses, false, slaveAddress, masterAddress, endian) { } } @@ -62,10 +62,10 @@ namespace Modbus.Net.Modbus /// 从站号 /// 主站号 /// 端格式 - public ModbusMachine(ModbusType connectionType, string connectionString, + public ModbusMachine(string id, ModbusType connectionType, string connectionString, IEnumerable getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb) - : base(getAddresses, keepConnect, slaveAddress, masterAddress) + : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { BaseUtility = new ModbusUtility(connectionType, connectionString, slaveAddress, masterAddress, endian); AddressFormater = new AddressFormaterModbus(); @@ -82,10 +82,10 @@ namespace Modbus.Net.Modbus /// 从站号 /// 主站号 /// 端格式 - public ModbusMachine(ModbusType connectionType, string connectionString, + public ModbusMachine(string id, ModbusType connectionType, string connectionString, IEnumerable getAddresses, byte slaveAddress, byte masterAddress, Endian endian = Endian.BigEndianLsb) - : this(connectionType, connectionString, getAddresses, false, slaveAddress, masterAddress, endian) + : this(id, connectionType, connectionString, getAddresses, false, slaveAddress, masterAddress, endian) { } } diff --git a/Modbus.Net/src/Modbus.Common/ModbusProtocal.cs b/Modbus.Net/src/Modbus.Common/ModbusProtocal.cs index c6c3d52..a247903 100644 --- a/Modbus.Net/src/Modbus.Common/ModbusProtocal.cs +++ b/Modbus.Net/src/Modbus.Common/ModbusProtocal.cs @@ -104,15 +104,6 @@ namespace Modbus.Net.Modbus { } - /// - /// 连接 - /// - /// 是否连接成功 - public override bool Connect() - { - return ProtocalLinker.Connect(); - } - /// /// 连接 /// diff --git a/Modbus.Net/src/Modbus.Common/ModbusTcpProtocalLinker.cs b/Modbus.Net/src/Modbus.Common/ModbusTcpProtocalLinker.cs index 18b4744..31939d6 100644 --- a/Modbus.Net/src/Modbus.Common/ModbusTcpProtocalLinker.cs +++ b/Modbus.Net/src/Modbus.Common/ModbusTcpProtocalLinker.cs @@ -12,7 +12,7 @@ namespace Modbus.Net.Modbus /// /// IP地址 public ModbusTcpProtocalLinker(string ip) - : base(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502")) + : this(ip, int.Parse(ConfigurationManager.AppSettings["ModbusPort"] ?? "502")) { } @@ -23,6 +23,7 @@ namespace Modbus.Net.Modbus /// 端口 public ModbusTcpProtocalLinker(string ip, int port) : base(ip, port) { + ((BaseConnector)BaseConnector).AddController(new FIFOController(500)); } /// diff --git a/Modbus.Net/src/Modbus.Common/ModbusUtility.cs b/Modbus.Net/src/Modbus.Common/ModbusUtility.cs index aaeb282..5434ce2 100644 --- a/Modbus.Net/src/Modbus.Common/ModbusUtility.cs +++ b/Modbus.Net/src/Modbus.Common/ModbusUtility.cs @@ -142,13 +142,13 @@ namespace Modbus.Net.Modbus switch (_modbusType) { //Rtu协议 - case ModbusType.Rtu: + /*case ModbusType.Rtu: { Wrapper = ConnectionString == null ? new ModbusRtuProtocal(SlaveAddress, MasterAddress, Endian) : new ModbusRtuProtocal(ConnectionString, SlaveAddress, MasterAddress, Endian); break; - } + }*/ //Tcp协议 case ModbusType.Tcp: { @@ -161,6 +161,7 @@ namespace Modbus.Net.Modbus break; } //Ascii协议 + /* case ModbusType.Ascii: { Wrapper = ConnectionString == null @@ -190,6 +191,7 @@ namespace Modbus.Net.Modbus MasterAddress, Endian)); break; } + */ } } } diff --git a/Modbus.Net/src/Siemens.Common/SiemensMachine.cs b/Modbus.Net/src/Siemens.Common/SiemensMachine.cs index 3a5fb32..92c3697 100644 --- a/Modbus.Net/src/Siemens.Common/SiemensMachine.cs +++ b/Modbus.Net/src/Siemens.Common/SiemensMachine.cs @@ -19,9 +19,9 @@ namespace Modbus.Net.Siemens /// 是否保持连接 /// 从站号 /// 主站号 - public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, + public SiemensMachine(TKey id, SiemensType connectionType, string connectionString, SiemensMachineModel model, IEnumerable> getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress) - : base(getAddresses, keepConnect, slaveAddress, masterAddress) + : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); AddressFormater = new AddressFormaterSiemens(); @@ -38,9 +38,9 @@ namespace Modbus.Net.Siemens /// 读写的地址 /// 从站号 /// 主站号 - public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, + public SiemensMachine(TKey id, SiemensType connectionType, string connectionString, SiemensMachineModel model, IEnumerable> getAddresses, byte slaveAddress, byte masterAddress) - : this(connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) + : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) { } } @@ -60,9 +60,9 @@ namespace Modbus.Net.Siemens /// 是否保持连接 /// 从站号 /// 主站号 - public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, + public SiemensMachine(string id, SiemensType connectionType, string connectionString, SiemensMachineModel model, IEnumerable getAddresses, bool keepConnect, byte slaveAddress, byte masterAddress) - : base(getAddresses, keepConnect, slaveAddress, masterAddress) + : base(id, getAddresses, keepConnect, slaveAddress, masterAddress) { BaseUtility = new SiemensUtility(connectionType, connectionString, model, slaveAddress, masterAddress); AddressFormater = new AddressFormaterSiemens(); @@ -79,9 +79,9 @@ namespace Modbus.Net.Siemens /// 读写的地址 /// 从站号 /// 主站号 - public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, + public SiemensMachine(string id, SiemensType connectionType, string connectionString, SiemensMachineModel model, IEnumerable getAddresses, byte slaveAddress, byte masterAddress) - : this(connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) + : this(id, connectionType, connectionString, model, getAddresses, false, slaveAddress, masterAddress) { } } diff --git a/Modbus.Net/src/Siemens.Common/SiemensTcpProtocal.cs b/Modbus.Net/src/Siemens.Common/SiemensTcpProtocal.cs index 1ced049..5eac699 100644 --- a/Modbus.Net/src/Siemens.Common/SiemensTcpProtocal.cs +++ b/Modbus.Net/src/Siemens.Common/SiemensTcpProtocal.cs @@ -136,15 +136,6 @@ namespace Modbus.Net.Siemens return await base.SendReceiveAsync(unit, content); } - /// - /// 连接设备 - /// - /// 设备是否连接成功 - public override bool Connect() - { - return AsyncHelper.RunSync(ConnectAsync); - } - /// /// 连接设备 /// diff --git a/Modbus.Net/src/Siemens.Common/SiemensTcpProtocalLinker.cs b/Modbus.Net/src/Siemens.Common/SiemensTcpProtocalLinker.cs index bab66c8..87b7c6b 100644 --- a/Modbus.Net/src/Siemens.Common/SiemensTcpProtocalLinker.cs +++ b/Modbus.Net/src/Siemens.Common/SiemensTcpProtocalLinker.cs @@ -25,6 +25,7 @@ namespace Modbus.Net.Siemens public SiemensTcpProtocalLinker(string ip, int port) : base(ip, port) { + ((BaseConnector)BaseConnector).AddController(new FIFOController(500)); } /// diff --git a/Modbus.Net/src/Siemens.Common/SiemensUtility.cs b/Modbus.Net/src/Siemens.Common/SiemensUtility.cs index aeeb360..729c0a7 100644 --- a/Modbus.Net/src/Siemens.Common/SiemensUtility.cs +++ b/Modbus.Net/src/Siemens.Common/SiemensUtility.cs @@ -184,6 +184,7 @@ namespace Modbus.Net.Siemens switch (_siemensType) { //PPI + /* case SiemensType.Ppi: { Wrapper = ConnectionString == null @@ -196,6 +197,7 @@ namespace Modbus.Net.Siemens { throw new NotImplementedException(); } + */ //Ethenet case SiemensType.Tcp: { diff --git a/README.md b/README.md index 39606fe..921535c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Overview ------------------- Modbus.Net is an open hardware communication platform written by C# 7.0. -You can only focusing on the protocal itself, and the platform can automaticaly create a full asynchronized or synchronized communication library. +You can only focusing on the Protocol itself, and the platform can automaticaly create a full asynchronized or synchronized communication library. Why called Modbus.Net ------------------- @@ -18,7 +18,7 @@ The real Modbus Implementation has been moved to Modbus.Net.Modbus. If you want There are also "Modbus.Net.Siemens" that can communicate to Siemens S7-200, S7-200 Smart, S7-300, S7-400, S7-1200, S7-1500 using PPI or TCP/IP. -"Modbus.Net.OPC" Implements OPC DA and OPC UA protocal. +"Modbus.Net.OPC" Implements OPC DA and OPC UA Protocol. Platform Supported ------------------- @@ -61,7 +61,7 @@ RoadMap ### Version 1.3.1 * InputStruct -> IInputStruct, OutputStruct -> IOutputStruct (Complete) -* Generic Method For ProtocalUnit (Complete) +* Generic Method For ProtocolUnit (Complete) ### Version 1.3.2 * Add Interface IMachineMethod and IUtilityMethod. Utiltiy and Machine can extend function using interface (Complete) @@ -86,7 +86,7 @@ RoadMap ### Version 1.3.8 * Change Resx to appsettings.json, now you can set default params there (Complete - CORE ONLY) -* Change ISpecialProtocalUnit to SpecialProtocalUnitAttribute (Complete) +* Change ISpecialProtocolUnit to SpecialProtocolUnitAttribute (Complete) ### Version 1.3.9 * Modbus Single Write for Coil and Reg (05 and 06) (Complete) @@ -100,32 +100,33 @@ RoadMap * Update to .Net Standard 2.0 (Complete) ### Version 1.4.0 -* New Protocal Pipeline System (Complete) +* New Protocol Pipeline System (Complete) ### Version 1.4.1 -* BaseController (In Road) -* New ComConnector (In Road) -* New TcpConnector (In Road) -* New UdpConnector (In Road) -* Serial Port Connection with Multiple Master Station (In Road) +* BaseController and IController (Programming) +* New ComConnector (Programming) +* New TcpConnector (Programming) +* New UdpConnector (Programming) +* Serial Port Connection with Multiple Master Station (Delay) ### Version 1.4.2 -* PPI Remake (In Road) -* Siemens MPI Support (In Road) -* Siemens MultiStation PPI Support (In Road) +* PPI Remake (Delay) +* Siemens MPI Support (Delay) +* Siemens MultiStation PPI Support (Delay) ### Version 1.5.X * Unite TransServer.Net into Modbus.Net (In Road) * Passive Connector and Controller (In Road) * Architechture rebuild (In Road) - -### Version 1.6.X -* English comment (In Road) * ValueHelper remake to interface, users can add their own value translate function (In Road) * New Zoom (In Road) +### Version 1.6.X +* English comment (In Road) + ### Version 2.0.0 * Rename to Transport.Net (In Road) -* Puzzle System (In Road) +* Puzzle Builder (In Road) * Machine Builder (In Road) +* Protocol Builer (In Road) diff --git a/Samples/AnyType/Controllers/HomeController.cs b/Samples/AnyType/Controllers/HomeController.cs index 3216039..1ddd154 100644 --- a/Samples/AnyType/Controllers/HomeController.cs +++ b/Samples/AnyType/Controllers/HomeController.cs @@ -57,7 +57,7 @@ namespace AnyType.Controllers //初始化任务管理器 task = new TaskManager(10, true); //向任务管理器中添加设备 - task.AddMachine(new ModbusMachine(ModbusType.Tcp, "192.168.3.10", addressUnits, + task.AddMachine(new ModbusMachine("1", ModbusType.Tcp, "192.168.3.10", addressUnits, true, 2, 0)); //启动任务 task.InvokeTimerAll(new TaskItemGetData(returnValues => diff --git a/Samples/TaskManager/Controllers/HomeController.cs b/Samples/TaskManager/Controllers/HomeController.cs index a481007..f76491e 100644 --- a/Samples/TaskManager/Controllers/HomeController.cs +++ b/Samples/TaskManager/Controllers/HomeController.cs @@ -49,7 +49,7 @@ namespace TaskManager.Controllers //初始化任务管理器 task = new Modbus.Net.TaskManager(10, true); //向任务管理器中添加设备 - task.AddMachine(new ModbusMachine(ModbusType.Tcp, "192.168.3.10", addressUnits, + task.AddMachine(new ModbusMachine("1", ModbusType.Tcp, "192.168.3.10", addressUnits, true, 2, 0)); //启动任务 task.InvokeTimerAll(new TaskItemGetData(returnValues => diff --git a/Samples/TripleAdd/Controllers/HomeController.cs b/Samples/TripleAdd/Controllers/HomeController.cs index 3f7d401..5d89cf0 100644 --- a/Samples/TripleAdd/Controllers/HomeController.cs +++ b/Samples/TripleAdd/Controllers/HomeController.cs @@ -51,7 +51,7 @@ namespace TripleAdd.Controllers { if (machine == null) { - machine = new ModbusMachine(ModbusType.Tcp, "192.168.3.10", new List() + machine = new ModbusMachine("1", ModbusType.Tcp, "192.168.3.10", new List() { new AddressUnit() {Id = "1", Area = "4X", Address = 1, CommunicationTag = "Add1", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, new AddressUnit() {Id = "2", Area = "4X", Address = 2, CommunicationTag = "Add2", DataType = typeof(ushort), Zoom = 1, DecimalPos = 0}, diff --git a/Tests/Modbus.Net.Tests/BaseTest.cs b/Tests/Modbus.Net.Tests/BaseTest.cs index 8809a9e..9f2b5b5 100644 --- a/Tests/Modbus.Net.Tests/BaseTest.cs +++ b/Tests/Modbus.Net.Tests/BaseTest.cs @@ -129,20 +129,18 @@ namespace Modbus.Net.Tests }, }; - _baseMachine = new ModbusMachine(ModbusType.Tcp, "192.168.1.1", _addressUnits, true, 2, 0) + _baseMachine = new ModbusMachine(1, ModbusType.Tcp, "192.168.1.1", _addressUnits, true, 2, 0) { - Id = 1, ProjectName = "Project 1", MachineName = "Test 1" }; - _baseMachine2 = new SiemensMachine(SiemensType.Tcp, "192.168.3.10", SiemensMachineModel.S7_1200, _addressUnits, true, 2, 0) + _baseMachine2 = new SiemensMachine(2, SiemensType.Tcp, "192.168.3.10", SiemensMachineModel.S7_1200, _addressUnits, true, 2, 0) { - Id = 2, ProjectName = "Project 1", MachineName = "Test 2" }; - _baseMachine2.Connect(); + _baseMachine2.ConnectAsync().Wait(); _taskManager = new TaskManager(10, true); diff --git a/Tests/Modbus.Net.Tests/MachineMethodTest.cs b/Tests/Modbus.Net.Tests/MachineMethodTest.cs index 8d99598..926d64f 100644 --- a/Tests/Modbus.Net.Tests/MachineMethodTest.cs +++ b/Tests/Modbus.Net.Tests/MachineMethodTest.cs @@ -14,7 +14,7 @@ namespace Modbus.Net.Tests [TestMethod] public void GetUtility() { - BaseMachine baseMachine = new ModbusMachine(ModbusType.Tcp, "192.168.3.12", null, true, 2, 0); + BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0); var utility = baseMachine.GetUtility(); var methods = utility.GetType().GetRuntimeMethods(); Assert.AreEqual(methods.FirstOrDefault(method => method.Name == "GetTimeAsync") != null, true); @@ -25,7 +25,7 @@ namespace Modbus.Net.Tests [TestMethod] public async Task InvokeUtility() { - BaseMachine baseMachine = new ModbusMachine(ModbusType.Tcp, "192.168.3.12", null, true, 2, 0); + BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, "192.168.3.12", null, true, 2, 0); var success = await baseMachine.BaseUtility.GetUtilityMethods().SetTimeAsync(DateTime.Now); Assert.AreEqual(success, true); var time = await baseMachine.BaseUtility.GetUtilityMethods().GetTimeAsync(); @@ -36,7 +36,7 @@ namespace Modbus.Net.Tests [TestMethod] public async Task InvokeMachine() { - BaseMachine baseMachine = new ModbusMachine(ModbusType.Tcp, "192.168.3.10", new List> + BaseMachine baseMachine = new ModbusMachine(1, ModbusType.Tcp, "192.168.3.10", new List> { new AddressUnit { diff --git a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs index 37bfa33..e0378ce 100644 --- a/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusMultiStationTest.cs @@ -17,8 +17,8 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _modbusRtuMachine1 = new ModbusMachine(ModbusType.Rtu, "COM1", null, true, 1, 0); - _modbusRtuMachine2 = new ModbusMachine(ModbusType.Rtu, "COM1", null, true, 2, 0); + _modbusRtuMachine1 = new ModbusMachine("1", ModbusType.Rtu, "COM1", null, true, 1, 0); + _modbusRtuMachine2 = new ModbusMachine("2", ModbusType.Rtu, "COM1", null, true, 2, 0); } [TestMethod] diff --git a/Tests/Modbus.Net.Tests/ModbusTest.cs b/Tests/Modbus.Net.Tests/ModbusTest.cs index 0306d9b..2c2353c 100644 --- a/Tests/Modbus.Net.Tests/ModbusTest.cs +++ b/Tests/Modbus.Net.Tests/ModbusTest.cs @@ -18,11 +18,11 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _modbusTcpMachine = new ModbusMachine(ModbusType.Tcp, "192.168.3.10", null, true, 2, 0); + _modbusTcpMachine = new ModbusMachine("1", ModbusType.Tcp, "192.168.3.10", null, true, 2, 0); - _modbusRtuMachine = new ModbusMachine(ModbusType.Rtu, "COM3", null, true, 2, 0); + //_modbusRtuMachine = new ModbusMachine("2", ModbusType.Rtu, "COM3", null, true, 2, 0); - _modbusAsciiMachine = new ModbusMachine(ModbusType.Ascii, "COM5", null, true, 2, 0); + //_modbusAsciiMachine = new ModbusMachine("3", ModbusType.Ascii, "COM5", null, true, 2, 0); } [TestMethod] @@ -51,17 +51,17 @@ namespace Modbus.Net.Tests }; _modbusTcpMachine.GetAddresses = addresses; - _modbusAsciiMachine.GetAddresses = addresses; - _modbusRtuMachine.GetAddresses = addresses; + //_modbusAsciiMachine.GetAddresses = addresses; + //_modbusRtuMachine.GetAddresses = addresses; await _modbusTcpMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusAsciiMachine.SetDatasAsync(MachineSetDataType.Address, dic1); - await _modbusRtuMachine.SetDatasAsync(MachineSetDataType.Address, dic1); + //await _modbusAsciiMachine.SetDatasAsync(MachineSetDataType.Address, dic1); + //await _modbusRtuMachine.SetDatasAsync(MachineSetDataType.Address, dic1); var ans = await _modbusTcpMachine.GetDatasAsync(MachineGetDataType.Address); - var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); - var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); + //var ans2 = await _modbusRtuMachine.GetDatasAsync(MachineGetDataType.Address); + //var ans3 = await _modbusAsciiMachine.GetDatasAsync(MachineGetDataType.Address); Assert.AreEqual(ans["0X 1.0"].PlcValue, dic1["0X 1.0"]); - Assert.AreEqual(ans2["0X 1.0"].PlcValue, dic1["0X 1.0"]); - Assert.AreEqual(ans3["0X 1.0"].PlcValue, dic1["0X 1.0"]); + //Assert.AreEqual(ans2["0X 1.0"].PlcValue, dic1["0X 1.0"]); + //Assert.AreEqual(ans3["0X 1.0"].PlcValue, dic1["0X 1.0"]); } [TestMethod] @@ -316,8 +316,8 @@ namespace Modbus.Net.Tests [TestCleanup] public void MachineClean() { - _modbusAsciiMachine.Disconnect(); - _modbusRtuMachine.Disconnect(); + //_modbusAsciiMachine.Disconnect(); + //_modbusRtuMachine.Disconnect(); _modbusTcpMachine.Disconnect(); } } diff --git a/Tests/Modbus.Net.Tests/OpcTest.cs b/Tests/Modbus.Net.Tests/OpcTest.cs index 95608d1..53619bb 100644 --- a/Tests/Modbus.Net.Tests/OpcTest.cs +++ b/Tests/Modbus.Net.Tests/OpcTest.cs @@ -15,7 +15,7 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _opcMachine = new FBoxOpcDaMachine("1","德联科技测试", null, true); + _opcMachine = new FBoxOpcDaMachine("1", "1", "德联科技测试", null, true); } [TestMethod] diff --git a/Tests/Modbus.Net.Tests/SiemensTest.cs b/Tests/Modbus.Net.Tests/SiemensTest.cs index b733dd0..6ecff1e 100644 --- a/Tests/Modbus.Net.Tests/SiemensTest.cs +++ b/Tests/Modbus.Net.Tests/SiemensTest.cs @@ -15,7 +15,7 @@ namespace Modbus.Net.Tests [TestInitialize] public void Init() { - _siemensTcpMachine = new SiemensMachine(SiemensType.Tcp, "192.168.3.10", SiemensMachineModel.S7_1200, null, true, 2, 0); + _siemensTcpMachine = new SiemensMachine("1", SiemensType.Tcp, "192.168.3.10", SiemensMachineModel.S7_1200, null, true, 2, 0); } [TestMethod] diff --git a/Tests/Modbus.Net.Tests/TaskManagerTest.cs b/Tests/Modbus.Net.Tests/TaskManagerTest.cs index 9c889be..e16bc71 100644 --- a/Tests/Modbus.Net.Tests/TaskManagerTest.cs +++ b/Tests/Modbus.Net.Tests/TaskManagerTest.cs @@ -80,10 +80,7 @@ namespace Modbus.Net.Tests } }; - BaseMachine machine = new ModbusMachine(ModbusType.Tcp, "192.168.3.10", addresses, true, 2, 0) - { - Id = "1" - }; + BaseMachine machine = new ModbusMachine("1", ModbusType.Tcp, "192.168.3.10", addresses, true, 2, 0); _taskManager.AddMachine(machine);