2017-12-25 update 1 Serial Port Multistation fix
This commit is contained in:
@@ -0,0 +1,18 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFrameworks>net45; netcoreapp2.0</TargetFrameworks>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Modbus.Net.Modbus\Modbus.Net.Modbus.csproj" />
|
||||||
|
<ProjectReference Include="..\Modbus.Net.Siemens\Modbus.Net.Siemens.csproj" />
|
||||||
|
<ProjectReference Include="..\Modbus.Net\Modbus.Net.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
147
Modbus.Net/Modbus.Net.PersistedTests/Program.cs
Normal file
147
Modbus.Net/Modbus.Net.PersistedTests/Program.cs
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using Modbus.Net.Modbus;
|
||||||
|
using Serilog;
|
||||||
|
|
||||||
|
namespace Modbus.Net.PersistedTests
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
Log.Logger = new LoggerConfiguration().MinimumLevel.Verbose().WriteTo.Console().CreateLogger();
|
||||||
|
|
||||||
|
IMachineProperty<int> machine = new ModbusMachine<int, string>(1, ModbusType.Rtu, "COM1",
|
||||||
|
new List<AddressUnit>()
|
||||||
|
{
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "1",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 1,
|
||||||
|
Name = "test 1",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "2",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 2,
|
||||||
|
Name = "test 2",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "3",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 3,
|
||||||
|
Name = "test 3",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
}, true, 2, 1);
|
||||||
|
IMachineProperty<int> machine2 = new ModbusMachine<int, string>(2, ModbusType.Rtu, "COM1",
|
||||||
|
new List<AddressUnit>()
|
||||||
|
{
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "1",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 11,
|
||||||
|
Name = "test 1",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "2",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 12,
|
||||||
|
Name = "test 2",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "3",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 13,
|
||||||
|
Name = "test 3",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
}, true, 3, 1);
|
||||||
|
IMachineProperty<int> machine3 = new ModbusMachine<int, string>(3, ModbusType.Rtu, "COM1",
|
||||||
|
new List<AddressUnit>()
|
||||||
|
{
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "1",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 21,
|
||||||
|
Name = "test 1",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "2",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 22,
|
||||||
|
Name = "test 2",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
new AddressUnit()
|
||||||
|
{
|
||||||
|
Id = "3",
|
||||||
|
Area = "4X",
|
||||||
|
Address = 23,
|
||||||
|
Name = "test 3",
|
||||||
|
DataType = typeof(ushort)
|
||||||
|
},
|
||||||
|
}, true, 4, 1);
|
||||||
|
|
||||||
|
TaskManager<int> manager = new TaskManager<int>(20, true);
|
||||||
|
manager.AddMachines<string>(new List<IMachineProperty<int>>{machine, machine2, machine3});
|
||||||
|
Random r = new Random();
|
||||||
|
manager.InvokeTimerAll(new TaskItemSetData(()=>new Dictionary<string, double>
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"4X 1.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 2.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 3.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 11.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 12.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 13.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 21.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 22.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"4X 23.0", r.Next()%65536
|
||||||
|
},
|
||||||
|
}, MachineSetDataType.Address, 10000, 10000));
|
||||||
|
Thread.Sleep(5000);
|
||||||
|
manager.InvokeTimerAll(new TaskItemGetData(data =>
|
||||||
|
{
|
||||||
|
foreach (var dataInner in data.ReturnValues)
|
||||||
|
{
|
||||||
|
Console.WriteLine(dataInner.Key + " " + dataInner.Value.PlcValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
}, MachineGetDataType.Address, 10000, 10000));
|
||||||
|
|
||||||
|
Console.Read();
|
||||||
|
Console.Read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrossLamp", "..\Samples\Cro
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnyType", "..\Samples\AnyType\AnyType.csproj", "{25FABD48-D82E-4E08-91A4-46F7057EC954}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AnyType", "..\Samples\AnyType\AnyType.csproj", "{25FABD48-D82E-4E08-91A4-46F7057EC954}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modbus.Net.PersistedTests", "Modbus.Net.PersistedTests\Modbus.Net.PersistedTests.csproj", "{5BFCA3D4-D809-485E-B69C-6F80A6A917D4}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -72,6 +74,10 @@ Global
|
|||||||
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Release|Any CPU.Build.0 = Release|Any CPU
|
{25FABD48-D82E-4E08-91A4-46F7057EC954}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{5BFCA3D4-D809-485E-B69C-6F80A6A917D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5BFCA3D4-D809-485E-B69C-6F80A6A917D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5BFCA3D4-D809-485E-B69C-6F80A6A917D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5BFCA3D4-D809-485E-B69C-6F80A6A917D4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -82,6 +88,7 @@ Global
|
|||||||
{2D939825-8459-438A-AC82-4C67A73E373E} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
{2D939825-8459-438A-AC82-4C67A73E373E} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
||||||
{41F40C27-AB1A-4153-BBAD-BFC7BD57B380} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
{41F40C27-AB1A-4153-BBAD-BFC7BD57B380} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
||||||
{25FABD48-D82E-4E08-91A4-46F7057EC954} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
{25FABD48-D82E-4E08-91A4-46F7057EC954} = {145DA93A-6768-4D98-8512-AB22339933F7}
|
||||||
|
{5BFCA3D4-D809-485E-B69C-6F80A6A917D4} = {D8DD32FC-CF39-4A1A-8FBF-9E82C5278C34}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {AF00D64E-3C70-474A-8A81-E9E48017C4B5}
|
SolutionGuid = {AF00D64E-3C70-474A-8A81-E9E48017C4B5}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace Modbus.Net
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 传输控制器
|
/// 传输控制器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected IController Controller { get; set; }
|
protected virtual IController Controller { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 标识Connector的连接关键字
|
/// 标识Connector的连接关键字
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace Modbus.Net
|
|||||||
WaitingMessages = new List<MessageWaitingDef>();
|
WaitingMessages = new List<MessageWaitingDef>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="IController.AddMessage(byte[])" />
|
/// <inheritdoc />
|
||||||
public MessageWaitingDef AddMessage(byte[] sendMessage)
|
public MessageWaitingDef AddMessage(byte[] sendMessage)
|
||||||
{
|
{
|
||||||
var def = new MessageWaitingDef
|
var def = new MessageWaitingDef
|
||||||
@@ -40,19 +40,22 @@ namespace Modbus.Net
|
|||||||
SendMutex = new AutoResetEvent(false),
|
SendMutex = new AutoResetEvent(false),
|
||||||
ReceiveMutex = new AutoResetEvent(false)
|
ReceiveMutex = new AutoResetEvent(false)
|
||||||
};
|
};
|
||||||
AddMessageToList(def);
|
if (AddMessageToList(def))
|
||||||
|
{
|
||||||
return def;
|
return def;
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 发送消息的实际内部方法
|
/// 发送消息的实际内部方法
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected abstract void SendingMessageControlInner();
|
protected abstract void SendingMessageControlInner();
|
||||||
|
|
||||||
/// <inheritdoc cref="IController.SendStop" />
|
/// <inheritdoc />
|
||||||
public abstract void SendStop();
|
public abstract void SendStop();
|
||||||
|
|
||||||
/// <inheritdoc cref="IController.SendStart" />
|
/// <inheritdoc />
|
||||||
public void SendStart()
|
public void SendStart()
|
||||||
{
|
{
|
||||||
if (SendingThread == null)
|
if (SendingThread == null)
|
||||||
@@ -61,7 +64,7 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="IController.Clear" />
|
/// <inheritdoc />
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
lock (WaitingMessages)
|
lock (WaitingMessages)
|
||||||
@@ -74,11 +77,16 @@ namespace Modbus.Net
|
|||||||
/// 将信息添加到队列
|
/// 将信息添加到队列
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="def">需要添加的信息信息</param>
|
/// <param name="def">需要添加的信息信息</param>
|
||||||
protected virtual void AddMessageToList(MessageWaitingDef def)
|
protected virtual bool AddMessageToList(MessageWaitingDef def)
|
||||||
{
|
{
|
||||||
lock (WaitingMessages)
|
lock (WaitingMessages)
|
||||||
|
{
|
||||||
|
if (WaitingMessages.FirstOrDefault(p => p.Key == def.Key) == null)
|
||||||
{
|
{
|
||||||
WaitingMessages.Add(def);
|
WaitingMessages.Add(def);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +97,7 @@ namespace Modbus.Net
|
|||||||
/// <returns>信息的检索关键字</returns>
|
/// <returns>信息的检索关键字</returns>
|
||||||
protected abstract string GetKeyFromMessage(byte[] message);
|
protected abstract string GetKeyFromMessage(byte[] message);
|
||||||
|
|
||||||
/// <inheritdoc cref="IController.ConfirmMessage(byte[])" />
|
/// <inheritdoc />
|
||||||
public bool ConfirmMessage(byte[] receiveMessage)
|
public bool ConfirmMessage(byte[] receiveMessage)
|
||||||
{
|
{
|
||||||
var def = GetMessageFromWaitingList(receiveMessage);
|
var def = GetMessageFromWaitingList(receiveMessage);
|
||||||
|
|||||||
@@ -108,6 +108,28 @@ namespace Modbus.Net
|
|||||||
private static Dictionary<string, SerialPortLock> Connectors { get; } = new Dictionary<string, SerialPortLock>()
|
private static Dictionary<string, SerialPortLock> Connectors { get; } = new Dictionary<string, SerialPortLock>()
|
||||||
;
|
;
|
||||||
|
|
||||||
|
private static Dictionary<string, IController> Controllers { get; } = new Dictionary<string, IController>()
|
||||||
|
;
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
protected override IController Controller {
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (Controllers.ContainsKey(_com))
|
||||||
|
{
|
||||||
|
return Controllers[_com];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!Controllers.ContainsKey(_com))
|
||||||
|
{
|
||||||
|
Controllers.Add(_com, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 连接中的连接器
|
/// 连接中的连接器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -272,9 +294,7 @@ namespace Modbus.Net
|
|||||||
|
|
||||||
#region 发送接收数据
|
#region 发送接收数据
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// 是否正在连接
|
|
||||||
/// </summary>
|
|
||||||
public override bool IsConnected
|
public override bool IsConnected
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@@ -292,6 +312,8 @@ namespace Modbus.Net
|
|||||||
protected bool Connect()
|
protected bool Connect()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
lock (Connectors)
|
||||||
{
|
{
|
||||||
if (!Connectors.ContainsKey(_com))
|
if (!Connectors.ContainsKey(_com))
|
||||||
{
|
{
|
||||||
@@ -317,7 +339,7 @@ namespace Modbus.Net
|
|||||||
ReceiveMsgThreadStart();
|
ReceiveMsgThreadStart();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Controller.SendStart();
|
Controller.SendStart();
|
||||||
|
|
||||||
Log.Information("Com client {ConnectionToken} connect success", ConnectionToken);
|
Log.Information("Com client {ConnectionToken} connect success", ConnectionToken);
|
||||||
@@ -331,19 +353,13 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// 连接串口
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>是否连接成功</returns>
|
|
||||||
public override Task<bool> ConnectAsync()
|
public override Task<bool> ConnectAsync()
|
||||||
{
|
{
|
||||||
return Task.FromResult(Connect());
|
return Task.FromResult(Connect());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// 断开串口
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>是否断开成功</returns>
|
|
||||||
public override bool Disconnect()
|
public override bool Disconnect()
|
||||||
{
|
{
|
||||||
if (Linkers.ContainsKey(_slave) && Connectors.ContainsKey(_com))
|
if (Linkers.ContainsKey(_slave) && Connectors.ContainsKey(_com))
|
||||||
@@ -415,15 +431,11 @@ namespace Modbus.Net
|
|||||||
return AsyncHelper.RunSync(() => SendMsgAsync(message));
|
return AsyncHelper.RunSync(() => SendMsgAsync(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// 发送数据,需要返回
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">发送的数据</param>
|
|
||||||
/// <returns>是否发送成功</returns>
|
|
||||||
public override async Task<byte[]> SendMsgAsync(byte[] message)
|
public override async Task<byte[]> SendMsgAsync(byte[] message)
|
||||||
{
|
{
|
||||||
CheckOpen();
|
CheckOpen();
|
||||||
var task = SendMsgInner(message).WithCancellation(new CancellationTokenSource(10000).Token);
|
var task = SendMsgInner(message).WithCancellation(new CancellationTokenSource(100000).Token);
|
||||||
var ans = await task;
|
var ans = await task;
|
||||||
if (task.IsCanceled)
|
if (task.IsCanceled)
|
||||||
{
|
{
|
||||||
@@ -434,6 +446,8 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task<MessageWaitingDef> SendMsgInner(byte[] message)
|
private async Task<MessageWaitingDef> SendMsgInner(byte[] message)
|
||||||
|
{
|
||||||
|
using (await SerialPort.Lock.LockAsync())
|
||||||
{
|
{
|
||||||
var messageSendingdef = Controller.AddMessage(message);
|
var messageSendingdef = Controller.AddMessage(message);
|
||||||
messageSendingdef.SendMutex.WaitOne();
|
messageSendingdef.SendMutex.WaitOne();
|
||||||
@@ -441,14 +455,10 @@ namespace Modbus.Net
|
|||||||
messageSendingdef.ReceiveMutex.WaitOne();
|
messageSendingdef.ReceiveMutex.WaitOne();
|
||||||
return messageSendingdef;
|
return messageSendingdef;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <inheritdoc />
|
||||||
/// 发送数据,不确认
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message">需要发送的数据</param>
|
|
||||||
protected override async Task SendMsgWithoutConfirm(byte[] message)
|
protected override async Task SendMsgWithoutConfirm(byte[] message)
|
||||||
{
|
|
||||||
using (await SerialPort.Lock.LockAsync())
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -456,7 +466,7 @@ namespace Modbus.Net
|
|||||||
message.Length);
|
message.Length);
|
||||||
Log.Verbose(
|
Log.Verbose(
|
||||||
$"Com client {ConnectionToken} send msg: {String.Concat(message.Select(p => " " + p.ToString("X2")))}");
|
$"Com client {ConnectionToken} send msg: {String.Concat(message.Select(p => " " + p.ToString("X2")))}");
|
||||||
await Task.Run(()=>SerialPort.Write(message, 0, message.Length));
|
await Task.Run(() => SerialPort.Write(message, 0, message.Length));
|
||||||
}
|
}
|
||||||
catch (Exception err)
|
catch (Exception err)
|
||||||
{
|
{
|
||||||
@@ -464,7 +474,6 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
RefreshSendCount();
|
RefreshSendCount();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void ReceiveMsgThreadStart()
|
protected override void ReceiveMsgThreadStart()
|
||||||
@@ -497,8 +506,9 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
//主动传输事件
|
//主动传输事件
|
||||||
}
|
}
|
||||||
}
|
|
||||||
RefreshReceiveCount();
|
RefreshReceiveCount();
|
||||||
|
}
|
||||||
|
|
||||||
Thread.Sleep(500);
|
Thread.Sleep(500);
|
||||||
}
|
}
|
||||||
@@ -515,9 +525,8 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
CheckOpen();
|
CheckOpen();
|
||||||
|
|
||||||
byte[] data;
|
|
||||||
Thread.Sleep(100);
|
Thread.Sleep(100);
|
||||||
var i = ReadComm(out data, 10, 5000, 1000);
|
var i = ReadComm(out var data, 10, 5000, 1000);
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
var returndata = new byte[i];
|
var returndata = new byte[i];
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace Modbus.Net
|
|||||||
AcquireTime = acquireTime;
|
AcquireTime = acquireTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.SendingMessageControlInner"/>
|
/// <inheritdoc />
|
||||||
protected override void SendingMessageControlInner()
|
protected override void SendingMessageControlInner()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -54,14 +54,9 @@ namespace Modbus.Net
|
|||||||
if (_currentSendingPos != null)
|
if (_currentSendingPos != null)
|
||||||
{
|
{
|
||||||
_currentSendingPos.SendMutex.Set();
|
_currentSendingPos.SendMutex.Set();
|
||||||
if (WaitingMessages.Count <= 1)
|
_currentSendingPos = WaitingMessages.Count <= 1
|
||||||
{
|
? null
|
||||||
_currentSendingPos = null;
|
: WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,19 +72,19 @@ namespace Modbus.Net
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.SendStop"/>
|
/// <inheritdoc />
|
||||||
public override void SendStop()
|
public override void SendStop()
|
||||||
{
|
{
|
||||||
_taskCancel = true;
|
_taskCancel = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.GetKeyFromMessage(byte[])"/>
|
/// <inheritdoc />
|
||||||
protected override string GetKeyFromMessage(byte[] message)
|
protected override string GetKeyFromMessage(byte[] message)
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.GetMessageFromWaitingList(byte[])"/>
|
/// <inheritdoc />
|
||||||
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
|
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
|
||||||
{
|
{
|
||||||
return WaitingMessages.FirstOrDefault();
|
return WaitingMessages.FirstOrDefault();
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ namespace Modbus.Net
|
|||||||
AcquireTime = acquireTime;
|
AcquireTime = acquireTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.SendingMessageControlInner" />
|
/// <inheritdoc />
|
||||||
protected override void SendingMessageControlInner()
|
protected override void SendingMessageControlInner()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -61,14 +61,9 @@ namespace Modbus.Net
|
|||||||
if (_currentSendingPos != null)
|
if (_currentSendingPos != null)
|
||||||
{
|
{
|
||||||
_currentSendingPos.SendMutex.Set();
|
_currentSendingPos.SendMutex.Set();
|
||||||
if (WaitingMessages.Count <= 1)
|
_currentSendingPos = WaitingMessages.Count <= 1
|
||||||
{
|
? null
|
||||||
_currentSendingPos = null;
|
: WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_currentSendingPos = WaitingMessages[WaitingMessages.IndexOf(_currentSendingPos) + 1];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -84,13 +79,13 @@ namespace Modbus.Net
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.SendStop" />
|
/// <inheritdoc />
|
||||||
public override void SendStop()
|
public override void SendStop()
|
||||||
{
|
{
|
||||||
_taskCancel = false;
|
_taskCancel = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.GetKeyFromMessage(byte[])" />
|
/// <inheritdoc />
|
||||||
protected override string GetKeyFromMessage(byte[] message)
|
protected override string GetKeyFromMessage(byte[] message)
|
||||||
{
|
{
|
||||||
string ans = "";
|
string ans = "";
|
||||||
@@ -106,7 +101,7 @@ namespace Modbus.Net
|
|||||||
return ans;
|
return ans;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc cref="BaseController.GetMessageFromWaitingList(byte[])" />
|
/// <inheritdoc />
|
||||||
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
|
protected override MessageWaitingDef GetMessageFromWaitingList(byte[] receiveMessage)
|
||||||
{
|
{
|
||||||
var returnKey = GetKeyFromMessage(receiveMessage);
|
var returnKey = GetKeyFromMessage(receiveMessage);
|
||||||
|
|||||||
@@ -691,7 +691,7 @@ namespace Modbus.Net
|
|||||||
/// <param name="machines">多台设备</param>
|
/// <param name="machines">多台设备</param>
|
||||||
public void AddMachines(IEnumerable<BaseMachine> machines)
|
public void AddMachines(IEnumerable<BaseMachine> machines)
|
||||||
{
|
{
|
||||||
base.AddMachines(machines);
|
base.AddMachines<string>(machines);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -699,9 +699,9 @@ namespace Modbus.Net
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="id">设备Id</param>
|
/// <param name="id">设备Id</param>
|
||||||
/// <returns>获取的设备</returns>
|
/// <returns>获取的设备</returns>
|
||||||
public BaseMachine GetMachineById(string id)
|
public new BaseMachine GetMachineById(string id)
|
||||||
{
|
{
|
||||||
return base.GetMachineById<string>(id) as BaseMachine;
|
return base.GetMachineById(id) as BaseMachine;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -709,9 +709,9 @@ namespace Modbus.Net
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="connectionToken">通讯标志</param>
|
/// <param name="connectionToken">通讯标志</param>
|
||||||
/// <returns>获取的设备</returns>
|
/// <returns>获取的设备</returns>
|
||||||
public BaseMachine GetMachineByConnectionToken(string connectionToken)
|
public new BaseMachine GetMachineByConnectionToken(string connectionToken)
|
||||||
{
|
{
|
||||||
return base.GetMachineByConnectionToken<string>(connectionToken) as BaseMachine;
|
return base.GetMachineByConnectionToken(connectionToken) as BaseMachine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -808,8 +808,7 @@ namespace Modbus.Net
|
|||||||
/// 添加一台设备
|
/// 添加一台设备
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="machine">设备</param>
|
/// <param name="machine">设备</param>
|
||||||
public void AddMachine<TUnitKey>(BaseMachine<TMachineKey, TUnitKey> machine)
|
public void AddMachine(IMachineProperty<TMachineKey> machine)
|
||||||
where TUnitKey : IEquatable<TUnitKey>
|
|
||||||
{
|
{
|
||||||
machine.KeepConnect = KeepConnect;
|
machine.KeepConnect = KeepConnect;
|
||||||
lock (_machines)
|
lock (_machines)
|
||||||
@@ -822,7 +821,7 @@ namespace Modbus.Net
|
|||||||
/// 添加多台设备
|
/// 添加多台设备
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="machines">设备的列表</param>
|
/// <param name="machines">设备的列表</param>
|
||||||
public void AddMachines<TUnitKey>(IEnumerable<BaseMachine<TMachineKey, TUnitKey>> machines)
|
public void AddMachines<TUnitKey>(IEnumerable<IMachineProperty<TMachineKey>> machines)
|
||||||
where TUnitKey : IEquatable<TUnitKey>
|
where TUnitKey : IEquatable<TUnitKey>
|
||||||
{
|
{
|
||||||
foreach (var machine in machines)
|
foreach (var machine in machines)
|
||||||
@@ -832,11 +831,9 @@ namespace Modbus.Net
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 通过Id获取设备
|
/// 通过Id获取设备
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TUnitKey">设备地址Id的类型</typeparam>
|
|
||||||
/// <param name="id">设备的Id</param>
|
/// <param name="id">设备的Id</param>
|
||||||
/// <returns>获取设备</returns>
|
/// <returns>获取设备</returns>
|
||||||
public BaseMachine<TMachineKey, TUnitKey> GetMachineById<TUnitKey>(TMachineKey id)
|
public IMachineProperty<TMachineKey> GetMachineById(TMachineKey id)
|
||||||
where TUnitKey : IEquatable<TUnitKey>
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -845,7 +842,7 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
machine = _machines.SingleOrDefault(p => p.Machine.Id.Equals(id));
|
machine = _machines.SingleOrDefault(p => p.Machine.Id.Equals(id));
|
||||||
}
|
}
|
||||||
return machine?.Machine as BaseMachine<TMachineKey, TUnitKey>;
|
return machine?.Machine;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
@@ -857,11 +854,9 @@ namespace Modbus.Net
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 通过通讯标志获取设备
|
/// 通过通讯标志获取设备
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TUnitKey">设备地址Id的类型</typeparam>
|
|
||||||
/// <param name="connectionToken">通讯标志</param>
|
/// <param name="connectionToken">通讯标志</param>
|
||||||
/// <returns>获取的数据</returns>
|
/// <returns>获取的数据</returns>
|
||||||
public BaseMachine<TMachineKey, TUnitKey> GetMachineByConnectionToken<TUnitKey>(string connectionToken)
|
public IMachineProperty<TMachineKey> GetMachineByConnectionToken(string connectionToken)
|
||||||
where TUnitKey : IEquatable<TUnitKey>
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -870,7 +865,7 @@ namespace Modbus.Net
|
|||||||
{
|
{
|
||||||
machine = _machines.SingleOrDefault(p => p.Machine.ConnectionToken == connectionToken && p.Machine.IsConnected);
|
machine = _machines.SingleOrDefault(p => p.Machine.ConnectionToken == connectionToken && p.Machine.IsConnected);
|
||||||
}
|
}
|
||||||
return machine?.Machine as BaseMachine<TMachineKey, TUnitKey>;
|
return machine?.Machine;
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user