This commit is contained in:
parallelbgls
2017-05-18 18:51:01 +08:00
parent 7dd7d0501c
commit df94010952
3 changed files with 40 additions and 22 deletions

View File

@@ -413,13 +413,13 @@ namespace Modbus.Net
//地址为空报错 //地址为空报错
if (address == null) if (address == null)
{ {
Console.WriteLine($"Machine {ConnectionToken} Address {value.Key} doesn't exist."); Log.Error($"Machine {ConnectionToken} Address {value.Key} doesn't exist.");
continue; continue;
} }
//不能写报错 //不能写报错
if (!address.CanWrite) if (!address.CanWrite)
{ {
Console.WriteLine($"Machine {ConnectionToken} Address {value.Key} cannot write."); Log.Error($"Machine {ConnectionToken} Address {value.Key} cannot write.");
continue; continue;
} }
addresses.Add(address); addresses.Add(address);

View File

@@ -80,6 +80,8 @@ namespace Modbus.Net
get get
{ {
var protocalName = type.FullName; var protocalName = type.FullName;
lock (Protocals)
{
if (Protocals.ContainsKey(protocalName)) if (Protocals.ContainsKey(protocalName))
return Protocals[protocalName]; return Protocals[protocalName];
//自动寻找存在的协议并将其加载 //自动寻找存在的协议并将其加载
@@ -89,6 +91,7 @@ namespace Modbus.Net
throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented"); throw new InvalidCastException($"No ProtocalUnit {nameof(TProtocalUnit)} implemented");
protocalUnit.Endian = Endian; protocalUnit.Endian = Endian;
Register(protocalUnit); Register(protocalUnit);
}
return Protocals[protocalName]; return Protocals[protocalName];
} }
} }

View File

@@ -418,10 +418,10 @@ namespace Modbus.Net
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(100000)); cts.CancelAfter(TimeSpan.FromSeconds(100000));
var ans = var ans =
await tasks.Run( await tasks.StartNew(
async () => await machine.InvokeMachineMethod<IMachineMethodData, async () => await machine.InvokeMachineMethod<IMachineMethodData,
Task<Dictionary<string, ReturnUnit>>>("GetDatasAsync", Task<Dictionary<string, ReturnUnit>>>("GetDatasAsync",
MachineGetDataType.CommunicationTag).WithCancellation(cts.Token)); MachineGetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap();
return new DataReturnDef return new DataReturnDef
{ {
MachineId = machine.GetMachineIdString(), MachineId = machine.GetMachineIdString(),
@@ -453,10 +453,10 @@ namespace Modbus.Net
var cts = new CancellationTokenSource(); var cts = new CancellationTokenSource();
cts.CancelAfter(TimeSpan.FromSeconds(100000)); cts.CancelAfter(TimeSpan.FromSeconds(100000));
var ans = var ans =
await tasks.Run( await tasks.StartNew(
async () => await machine.InvokeMachineMethod<IMachineMethodData, async () => await machine.InvokeMachineMethod<IMachineMethodData,
Task<bool>>("SetDatasAsync", parameters[0], Task<bool>>("SetDatasAsync", parameters[0],
MachineSetDataType.CommunicationTag).WithCancellation(cts.Token)); MachineSetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap();
return ans; return ans;
}; };
Params = new object[] {values}; Params = new object[] {values};
@@ -468,7 +468,7 @@ namespace Modbus.Net
/// 任务 /// 任务
/// </summary> /// </summary>
/// <typeparam name="TInterType">任务返回值的类型</typeparam> /// <typeparam name="TInterType">任务返回值的类型</typeparam>
public class TaskItem<TInterType> : ITaskItem, IEquatable<TaskItem<TInterType>> public class TaskItem<TInterType> : ITaskItem, IEquatable<TaskItem<TInterType>>, ICloneable
{ {
/// <summary> /// <summary>
/// 定时器 /// 定时器
@@ -574,7 +574,7 @@ namespace Modbus.Net
/// </summary> /// </summary>
private void DeactivateTimer() private void DeactivateTimer()
{ {
Timer.Dispose(); Timer?.Dispose();
Timer = null; Timer = null;
} }
@@ -595,7 +595,7 @@ namespace Modbus.Net
/// </summary> /// </summary>
private void DeactivateTimerDisconnected() private void DeactivateTimerDisconnected()
{ {
TimerDisconnected.Dispose(); TimerDisconnected?.Dispose();
TimerDisconnected = null; TimerDisconnected = null;
} }
@@ -620,6 +620,15 @@ namespace Modbus.Net
ActivateTimerDisconnected(); ActivateTimerDisconnected();
return true; return true;
} }
/// <summary>
/// 拷贝实例
/// </summary>
/// <returns>拷贝的实例</returns>
public object Clone()
{
return MemberwiseClone();
}
} }
/// <summary> /// <summary>
@@ -943,7 +952,10 @@ namespace Modbus.Net
lock (_machines) lock (_machines)
{ {
foreach (var machine in _machines) foreach (var machine in _machines)
ans &= machine.InvokeTimer(item); {
Thread.Sleep(10);
ans &= machine.InvokeTimer(item.Clone() as TaskItem<TInterType>);
}
} }
return ans; return ans;
} }
@@ -958,8 +970,11 @@ namespace Modbus.Net
lock (_machines) lock (_machines)
{ {
foreach (var machine in _machines) foreach (var machine in _machines)
{
Thread.Sleep(10);
ans &= machine.StopAllTimers(); ans &= machine.StopAllTimers();
} }
}
return ans; return ans;
} }
@@ -1052,7 +1067,7 @@ namespace Modbus.Net
lock (_machines) lock (_machines)
{ {
foreach (var machine in _machines) foreach (var machine in _machines)
tasks.Add(machine.InvokeOnce(item)); tasks.Add(_tasks.StartNew(async () => await machine.InvokeOnce(item.Clone() as TaskItem<TInterType>)).Unwrap());
} }
var ans = await Task.WhenAll(tasks); var ans = await Task.WhenAll(tasks);
return ans.All(p => p); return ans.All(p => p);
@@ -1069,7 +1084,7 @@ namespace Modbus.Net
{ {
var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId)); var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId));
if (machine != null) if (machine != null)
return await machine.InvokeOnce(item); return await machine.InvokeOnce(item.Clone() as TaskItem<TInterType>);
return false; return false;
} }
@@ -1084,7 +1099,7 @@ namespace Modbus.Net
{ {
var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId)); var machine = _machines.FirstOrDefault(p => p.Machine.Id.Equals(machineId));
if (machine != null) if (machine != null)
return machine.InvokeTimer(item); return machine.InvokeTimer(item.Clone() as TaskItem<TInterType>);
return false; return false;
} }