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);