2015-08-04 update 1

This commit is contained in:
parallelbgls@outlook.com
2015-08-04 09:47:46 +08:00
parent e5184d5d02
commit 7f9dd58580
3 changed files with 107 additions and 23 deletions

View File

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

View File

@@ -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()

View File

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