Bug Fix
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user