2015-08-04 update 1
This commit is contained in:
@@ -12,6 +12,14 @@ namespace ModBus.Net
|
|||||||
|
|
||||||
public string MachineName { get; set; }
|
public string MachineName { get; set; }
|
||||||
|
|
||||||
|
public bool IsConnected
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return BaseUtility.IsConnected;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public string ConnectionToken
|
public string ConnectionToken
|
||||||
{
|
{
|
||||||
get { return BaseUtility.ConnectionToken; }
|
get { return BaseUtility.ConnectionToken; }
|
||||||
@@ -52,6 +60,7 @@ namespace ModBus.Net
|
|||||||
{
|
{
|
||||||
BaseUtility.Connect();
|
BaseUtility.Connect();
|
||||||
}
|
}
|
||||||
|
if (!BaseUtility.IsConnected) return null;
|
||||||
foreach (var communicateAddress in CommunicateAddresses)
|
foreach (var communicateAddress in CommunicateAddresses)
|
||||||
{
|
{
|
||||||
var datas = BaseUtility.GetDatas<byte>(2, 0, AddressFormater.FormatAddress(communicateAddress.Area,communicateAddress.Address), communicateAddress.GetCount);
|
var datas = BaseUtility.GetDatas<byte>(2, 0, AddressFormater.FormatAddress(communicateAddress.Area,communicateAddress.Address), communicateAddress.GetCount);
|
||||||
|
|||||||
@@ -16,7 +16,12 @@ namespace ModBus.Net
|
|||||||
|
|
||||||
public bool IsConnected
|
public bool IsConnected
|
||||||
{
|
{
|
||||||
get { return _baseConnector.IsConnected; }
|
get
|
||||||
|
{
|
||||||
|
if (_baseConnector == null)
|
||||||
|
return false;
|
||||||
|
return _baseConnector.IsConnected;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Connect()
|
public bool Connect()
|
||||||
|
|||||||
@@ -166,11 +166,13 @@ namespace ModBus.Net
|
|||||||
public class TaskManager
|
public class TaskManager
|
||||||
{
|
{
|
||||||
private HashSet<BaseMachine> _machines;
|
private HashSet<BaseMachine> _machines;
|
||||||
|
private HashSet<BaseMachine> _unlinkedMachines;
|
||||||
private TaskFactory<Dictionary<string,ReturnUnit>> _tasks;
|
private TaskFactory<Dictionary<string,ReturnUnit>> _tasks;
|
||||||
private TaskScheduler _scheduler;
|
private TaskScheduler _scheduler;
|
||||||
private CancellationTokenSource _cts;
|
private CancellationTokenSource _cts;
|
||||||
|
|
||||||
private Timer _timer;
|
private Timer _timer;
|
||||||
|
private Timer _timer2;
|
||||||
|
|
||||||
private bool _keepConnect;
|
private bool _keepConnect;
|
||||||
|
|
||||||
@@ -212,8 +214,11 @@ namespace ModBus.Net
|
|||||||
if (_timer != null)
|
if (_timer != null)
|
||||||
{
|
{
|
||||||
_timer.Change(Timeout.Infinite, Timeout.Infinite);
|
_timer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||||
|
_timer2.Change(Timeout.Infinite, Timeout.Infinite);
|
||||||
_timer.Dispose();
|
_timer.Dispose();
|
||||||
|
_timer2.Dispose();
|
||||||
_timer = null;
|
_timer = null;
|
||||||
|
_timer2 = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (value < 0) return;
|
else if (value < 0) return;
|
||||||
@@ -222,14 +227,18 @@ namespace ModBus.Net
|
|||||||
if (_timer != null)
|
if (_timer != null)
|
||||||
{
|
{
|
||||||
_timer.Change(Timeout.Infinite, Timeout.Infinite);
|
_timer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||||
|
_timer2.Change(Timeout.Infinite, Timeout.Infinite);
|
||||||
_timer.Dispose();
|
_timer.Dispose();
|
||||||
|
_timer2.Dispose();
|
||||||
_timer = null;
|
_timer = null;
|
||||||
|
_timer2 = null;
|
||||||
}
|
}
|
||||||
if (value > 0)
|
if (value > 0)
|
||||||
{
|
{
|
||||||
_getCycle = value;
|
_getCycle = value;
|
||||||
}
|
}
|
||||||
_timer = new Timer(MaintainTasks, null, 0, _getCycle * 1000);
|
_timer = new Timer(MaintainTasks, null, 0, _getCycle * 1000);
|
||||||
|
_timer2 = new Timer(MaintainTasks2, null, _getCycle * 6000, _getCycle * 6000);
|
||||||
//MaintainTasks(null);
|
//MaintainTasks(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -249,6 +258,7 @@ namespace ModBus.Net
|
|||||||
{
|
{
|
||||||
_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
|
_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
|
||||||
_machines = new HashSet<BaseMachine>(new BaseMachineEqualityComparer());
|
_machines = new HashSet<BaseMachine>(new BaseMachineEqualityComparer());
|
||||||
|
_unlinkedMachines = new HashSet<BaseMachine>(new BaseMachineEqualityComparer());
|
||||||
_getCycle = getCycle;
|
_getCycle = getCycle;
|
||||||
KeepConnect = keepConnect;
|
KeepConnect = keepConnect;
|
||||||
}
|
}
|
||||||
@@ -289,6 +299,42 @@ namespace ModBus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void MoveMachineToUnlinked(int id)
|
||||||
|
{
|
||||||
|
IEnumerable<BaseMachine> machines;
|
||||||
|
lock(_machines)
|
||||||
|
{
|
||||||
|
machines = _machines.Where(c => c.Id == id).ToList();
|
||||||
|
if (machines.Count() <= 0) return;
|
||||||
|
_machines.RemoveWhere(p => p.Id == id);
|
||||||
|
}
|
||||||
|
lock(_unlinkedMachines)
|
||||||
|
{
|
||||||
|
foreach(var machine in machines)
|
||||||
|
{
|
||||||
|
_unlinkedMachines.Add(machine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MoveMachineToLinked(int id)
|
||||||
|
{
|
||||||
|
IEnumerable<BaseMachine> machines;
|
||||||
|
lock (_unlinkedMachines)
|
||||||
|
{
|
||||||
|
machines = _unlinkedMachines.Where(c => c.Id == id).ToList();
|
||||||
|
if (machines.Count() <= 0) return;
|
||||||
|
_unlinkedMachines.RemoveWhere(p => p.Id == id);
|
||||||
|
}
|
||||||
|
lock (_machines)
|
||||||
|
{
|
||||||
|
foreach (var machine in machines)
|
||||||
|
{
|
||||||
|
_machines.Add(machine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void RemoveMachine(BaseMachine machine)
|
public void RemoveMachine(BaseMachine machine)
|
||||||
{
|
{
|
||||||
lock (_machines)
|
lock (_machines)
|
||||||
@@ -297,26 +343,37 @@ namespace ModBus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void MaintainTasks(object sender)
|
private void MaintainTasks(object sender)
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
AsyncHelper.RunSync(MaintainTasksAsync);
|
AsyncHelper.RunSync(MaintainTasksAsync);
|
||||||
}
|
}
|
||||||
catch (Exception)
|
|
||||||
|
private void MaintainTasks2(object sender)
|
||||||
{
|
{
|
||||||
TaskStop();
|
AsyncHelper.RunSync(MaintainTasks2Async);
|
||||||
TaskStart();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task MaintainTasksAsync()
|
private async Task MaintainTasksAsync()
|
||||||
{
|
{
|
||||||
HashSet<BaseMachine> saveMachines = new HashSet<BaseMachine>();
|
HashSet<BaseMachine> saveMachines = new HashSet<BaseMachine>();
|
||||||
|
IEnumerable<BaseMachine> saveMachinesEnum = new List<BaseMachine>();
|
||||||
lock (_machines)
|
lock (_machines)
|
||||||
{
|
{
|
||||||
saveMachines.UnionWith(_machines);
|
saveMachines.UnionWith(_machines);
|
||||||
|
saveMachinesEnum = saveMachines.ToList();
|
||||||
|
}
|
||||||
|
foreach (var machine in saveMachinesEnum)
|
||||||
|
{
|
||||||
|
await RunTask(machine);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task MaintainTasks2Async()
|
||||||
|
{
|
||||||
|
HashSet<BaseMachine> saveMachines = new HashSet<BaseMachine>();
|
||||||
|
lock (_unlinkedMachines)
|
||||||
|
{
|
||||||
|
saveMachines.UnionWith(_unlinkedMachines);
|
||||||
}
|
}
|
||||||
foreach (var machine in saveMachines)
|
foreach (var machine in saveMachines)
|
||||||
{
|
{
|
||||||
@@ -333,6 +390,8 @@ namespace ModBus.Net
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void TaskStop()
|
public void TaskStop()
|
||||||
|
{
|
||||||
|
lock (_machines)
|
||||||
{
|
{
|
||||||
GetCycle = Timeout.Infinite;
|
GetCycle = Timeout.Infinite;
|
||||||
if (_cts != null)
|
if (_cts != null)
|
||||||
@@ -340,14 +399,13 @@ namespace ModBus.Net
|
|||||||
_cts.Cancel();
|
_cts.Cancel();
|
||||||
}
|
}
|
||||||
if (_machines != null)
|
if (_machines != null)
|
||||||
{
|
|
||||||
lock (_machines)
|
|
||||||
{
|
{
|
||||||
foreach (var machine in _machines)
|
foreach (var machine in _machines)
|
||||||
{
|
{
|
||||||
machine.Disconnect();
|
machine.Disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_tasks = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,16 +415,28 @@ namespace ModBus.Net
|
|||||||
{
|
{
|
||||||
//var ans = machine.GetDatas();
|
//var ans = machine.GetDatas();
|
||||||
CancellationTokenSource cts = new CancellationTokenSource();
|
CancellationTokenSource cts = new CancellationTokenSource();
|
||||||
cts.CancelAfter(TimeSpan.FromSeconds(_getCycle * 2));
|
cts.CancelAfter(TimeSpan.FromSeconds(_getCycle));
|
||||||
var ans = await _tasks.StartNew(machine.GetDatas, cts.Token);
|
var ans = await _tasks.StartNew(machine.GetDatas, cts.Token);
|
||||||
|
//var ans = await Task.Factory.StartNew(machine.GetDatas, cts.Token);
|
||||||
|
if (!machine.IsConnected)
|
||||||
|
{
|
||||||
|
MoveMachineToUnlinked(machine.Id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MoveMachineToLinked(machine.Id);
|
||||||
|
}
|
||||||
if (ReturnValues != null)
|
if (ReturnValues != null)
|
||||||
{
|
{
|
||||||
ReturnValues(new KeyValuePair<int, Dictionary<string,ReturnUnit>>(machine.Id, ans));
|
ReturnValues(new KeyValuePair<int, Dictionary<string,ReturnUnit>>(machine.Id, ans));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
if (!machine.IsConnected)
|
||||||
|
{
|
||||||
|
MoveMachineToUnlinked(machine.Id);
|
||||||
|
}
|
||||||
if (ReturnValues != null)
|
if (ReturnValues != null)
|
||||||
{
|
{
|
||||||
ReturnValues(new KeyValuePair<int, Dictionary<string,ReturnUnit>>(machine.Id, null));
|
ReturnValues(new KeyValuePair<int, Dictionary<string,ReturnUnit>>(machine.Id, null));
|
||||||
|
|||||||
Reference in New Issue
Block a user