Bug Fix.
This commit is contained in:
@@ -304,24 +304,36 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//如果没有数据返回空
|
try
|
||||||
if (datas.Length == 0)
|
{
|
||||||
ans.Add(key, new ReturnUnit
|
//如果没有数据返回空
|
||||||
{
|
if (datas.Length == 0)
|
||||||
PlcValue = null,
|
ans.Add(key, new ReturnUnit
|
||||||
UnitExtend = address.UnitExtend
|
|
||||||
});
|
|
||||||
else
|
|
||||||
ans.Add(key,
|
|
||||||
new ReturnUnit
|
|
||||||
{
|
{
|
||||||
PlcValue =
|
PlcValue = null,
|
||||||
Convert.ToDouble(
|
|
||||||
ValueHelper.GetInstance(BaseUtility.Endian)
|
|
||||||
.GetValue(datas, ref localMainPos, ref localSubPos,
|
|
||||||
address.DataType)) * address.Zoom,
|
|
||||||
UnitExtend = address.UnitExtend
|
UnitExtend = address.UnitExtend
|
||||||
});
|
});
|
||||||
|
else
|
||||||
|
ans.Add(key,
|
||||||
|
new ReturnUnit
|
||||||
|
{
|
||||||
|
PlcValue =
|
||||||
|
Convert.ToDouble(
|
||||||
|
ValueHelper.GetInstance(BaseUtility.Endian)
|
||||||
|
.GetValue(datas, ref localMainPos, ref localSubPos,
|
||||||
|
address.DataType)) * address.Zoom,
|
||||||
|
UnitExtend = address.UnitExtend
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
ErrorCount++;
|
||||||
|
Log.Error(e, $"BaseMachine -> GetDatas, Id:{Id} Connection:{ConnectionToken} key {key} existing. ErrorCount {ErrorCount}.");
|
||||||
|
|
||||||
|
if (ErrorCount >= _maxErrorCount)
|
||||||
|
Disconnect();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//如果不保持连接,断开连接
|
//如果不保持连接,断开连接
|
||||||
|
|||||||
@@ -408,9 +408,10 @@ namespace Modbus.Net
|
|||||||
/// 构造函数
|
/// 构造函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="returnFunc">返回值的处理函数</param>
|
/// <param name="returnFunc">返回值的处理函数</param>
|
||||||
|
/// <param name="getDataType">返回值的键类型</param>
|
||||||
/// <param name="getCycle">循环间隔(毫秒)</param>
|
/// <param name="getCycle">循环间隔(毫秒)</param>
|
||||||
/// <param name="sleepCycle">设备离线时的循环间隔(毫秒)</param>
|
/// <param name="sleepCycle">设备离线时的循环间隔(毫秒)</param>
|
||||||
public TaskItemGetData(Action<DataReturnDef> returnFunc, int getCycle, int sleepCycle)
|
public TaskItemGetData(Action<DataReturnDef> returnFunc, MachineGetDataType getDataType, int getCycle, int sleepCycle)
|
||||||
{
|
{
|
||||||
Name = "GetDatas";
|
Name = "GetDatas";
|
||||||
Invoke = async (machine, tasks, parameters) =>
|
Invoke = async (machine, tasks, parameters) =>
|
||||||
@@ -421,7 +422,7 @@ namespace Modbus.Net
|
|||||||
await tasks.StartNew(
|
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)).Unwrap();
|
getDataType).WithCancellation(cts.Token)).Unwrap();
|
||||||
return new DataReturnDef
|
return new DataReturnDef
|
||||||
{
|
{
|
||||||
MachineId = machine.GetMachineIdString(),
|
MachineId = machine.GetMachineIdString(),
|
||||||
@@ -444,8 +445,9 @@ namespace Modbus.Net
|
|||||||
/// 构造函数
|
/// 构造函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="values">写入的值</param>
|
/// <param name="values">写入的值</param>
|
||||||
|
/// <param name="setDataType">写入值的键类型</param>
|
||||||
/// <param name="returnFunc">返回值的处理函数</param>
|
/// <param name="returnFunc">返回值的处理函数</param>
|
||||||
public TaskItemSetData(Dictionary<string, double> values, Action<bool> returnFunc = null)
|
public TaskItemSetData(Dictionary<string, double> values, MachineSetDataType setDataType, Action<bool> returnFunc = null)
|
||||||
{
|
{
|
||||||
Name = "SetDatas";
|
Name = "SetDatas";
|
||||||
Invoke = Invoke = async (machine, tasks, parameters) =>
|
Invoke = Invoke = async (machine, tasks, parameters) =>
|
||||||
@@ -456,7 +458,7 @@ namespace Modbus.Net
|
|||||||
await tasks.StartNew(
|
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)).Unwrap();
|
setDataType).WithCancellation(cts.Token)).Unwrap();
|
||||||
return ans;
|
return ans;
|
||||||
};
|
};
|
||||||
Params = new object[] {values};
|
Params = new object[] {values};
|
||||||
@@ -641,10 +643,8 @@ namespace Modbus.Net
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="maxRunningTask">同时可以运行的任务数</param>
|
/// <param name="maxRunningTask">同时可以运行的任务数</param>
|
||||||
/// <param name="keepConnect">读取数据后是否保持连接</param>
|
/// <param name="keepConnect">读取数据后是否保持连接</param>
|
||||||
/// <param name="dataType">获取与设置数据的方式</param>
|
public TaskManager(int maxRunningTask, bool keepConnect)
|
||||||
public TaskManager(int maxRunningTask, bool keepConnect,
|
: base(maxRunningTask, keepConnect)
|
||||||
MachineDataType dataType = MachineDataType.CommunicationTag)
|
|
||||||
: base(maxRunningTask, keepConnect, dataType)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -723,15 +723,12 @@ namespace Modbus.Net
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="maxRunningTask">同时可以运行的任务数</param>
|
/// <param name="maxRunningTask">同时可以运行的任务数</param>
|
||||||
/// <param name="keepConnect">读取数据后是否保持连接</param>
|
/// <param name="keepConnect">读取数据后是否保持连接</param>
|
||||||
/// <param name="dataType">获取与设置数据的方式</param>
|
public TaskManager(int maxRunningTask, bool keepConnect)
|
||||||
public TaskManager(int maxRunningTask, bool keepConnect,
|
|
||||||
MachineDataType dataType = MachineDataType.CommunicationTag)
|
|
||||||
{
|
{
|
||||||
_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
|
_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
|
||||||
_machines =
|
_machines =
|
||||||
new HashSet<TaskMachine<TMachineKey>>(new TaskMachineEqualityComparer<TMachineKey>());
|
new HashSet<TaskMachine<TMachineKey>>(new TaskMachineEqualityComparer<TMachineKey>());
|
||||||
KeepConnect = keepConnect;
|
KeepConnect = keepConnect;
|
||||||
MachineDataType = dataType;
|
|
||||||
_cts = new CancellationTokenSource();
|
_cts = new CancellationTokenSource();
|
||||||
_tasks = new TaskFactory(_cts.Token, TaskCreationOptions.None, TaskContinuationOptions.None, _scheduler);
|
_tasks = new TaskFactory(_cts.Token, TaskCreationOptions.None, TaskContinuationOptions.None, _scheduler);
|
||||||
}
|
}
|
||||||
@@ -755,53 +752,6 @@ namespace Modbus.Net
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设备读写设备的关键字
|
|
||||||
/// </summary>
|
|
||||||
public MachineDataType MachineDataType
|
|
||||||
{
|
|
||||||
set
|
|
||||||
{
|
|
||||||
switch (value)
|
|
||||||
{
|
|
||||||
case MachineDataType.Address:
|
|
||||||
{
|
|
||||||
GetDataType = MachineGetDataType.Address;
|
|
||||||
SetDataType = MachineSetDataType.Address;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MachineDataType.CommunicationTag:
|
|
||||||
{
|
|
||||||
GetDataType = MachineGetDataType.CommunicationTag;
|
|
||||||
SetDataType = MachineSetDataType.CommunicationTag;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MachineDataType.Name:
|
|
||||||
{
|
|
||||||
GetDataType = MachineGetDataType.Name;
|
|
||||||
SetDataType = MachineSetDataType.Name;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MachineDataType.Id:
|
|
||||||
{
|
|
||||||
GetDataType = MachineGetDataType.Id;
|
|
||||||
SetDataType = MachineSetDataType.Id;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设备读数据的关键字
|
|
||||||
/// </summary>
|
|
||||||
public MachineGetDataType GetDataType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设备写数据的关键字
|
|
||||||
/// </summary>
|
|
||||||
public MachineSetDataType SetDataType { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 最大可执行任务数
|
/// 最大可执行任务数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user