This commit is contained in:
parallelbgls
2017-05-18 18:51:01 +08:00
parent 269e8399dd
commit 8143df7610
3 changed files with 40 additions and 22 deletions

View File

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

View File

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

View File

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