This commit is contained in:
parallelbgls
2017-05-23 10:07:37 +08:00
parent 3965ced0c2
commit 2706986381
2 changed files with 36 additions and 74 deletions

View File

@@ -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;
}
} }
} }
//如果不保持连接,断开连接 //如果不保持连接,断开连接

View File

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