From 88cd361a5a583f7298194d412a28cf4e6a5c45d4 Mon Sep 17 00:00:00 2001 From: parallelbgls Date: Tue, 23 May 2017 10:07:37 +0800 Subject: [PATCH] Bug Fix. --- Modbus.Net/src/Base.Common/BaseMachine.cs | 42 +++++++++----- Modbus.Net/src/Base.Common/TaskManager.cs | 68 +++-------------------- 2 files changed, 36 insertions(+), 74 deletions(-) diff --git a/Modbus.Net/src/Base.Common/BaseMachine.cs b/Modbus.Net/src/Base.Common/BaseMachine.cs index ee97b51..e247760 100644 --- a/Modbus.Net/src/Base.Common/BaseMachine.cs +++ b/Modbus.Net/src/Base.Common/BaseMachine.cs @@ -304,24 +304,36 @@ namespace Modbus.Net } } - //如果没有数据返回空 - if (datas.Length == 0) - ans.Add(key, new ReturnUnit - { - PlcValue = null, - UnitExtend = address.UnitExtend - }); - else - ans.Add(key, - new ReturnUnit + try + { + //如果没有数据返回空 + if (datas.Length == 0) + ans.Add(key, new ReturnUnit { - PlcValue = - Convert.ToDouble( - ValueHelper.GetInstance(BaseUtility.Endian) - .GetValue(datas, ref localMainPos, ref localSubPos, - address.DataType)) * address.Zoom, + PlcValue = null, 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; + } } } //如果不保持连接,断开连接 diff --git a/Modbus.Net/src/Base.Common/TaskManager.cs b/Modbus.Net/src/Base.Common/TaskManager.cs index c7dbe25..0e876b1 100644 --- a/Modbus.Net/src/Base.Common/TaskManager.cs +++ b/Modbus.Net/src/Base.Common/TaskManager.cs @@ -408,9 +408,10 @@ namespace Modbus.Net /// 构造函数 /// /// 返回值的处理函数 + /// 返回值的键类型 /// 循环间隔(毫秒) /// 设备离线时的循环间隔(毫秒) - public TaskItemGetData(Action returnFunc, int getCycle, int sleepCycle) + public TaskItemGetData(Action returnFunc, MachineGetDataType getDataType, int getCycle, int sleepCycle) { Name = "GetDatas"; Invoke = async (machine, tasks, parameters) => @@ -421,7 +422,7 @@ namespace Modbus.Net await tasks.StartNew( async () => await machine.InvokeMachineMethod>>("GetDatasAsync", - MachineGetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap(); + getDataType).WithCancellation(cts.Token)).Unwrap(); return new DataReturnDef { MachineId = machine.GetMachineIdString(), @@ -444,8 +445,9 @@ namespace Modbus.Net /// 构造函数 /// /// 写入的值 + /// 写入值的键类型 /// 返回值的处理函数 - public TaskItemSetData(Dictionary values, Action returnFunc = null) + public TaskItemSetData(Dictionary values, MachineSetDataType setDataType, Action returnFunc = null) { Name = "SetDatas"; Invoke = Invoke = async (machine, tasks, parameters) => @@ -456,7 +458,7 @@ namespace Modbus.Net await tasks.StartNew( async () => await machine.InvokeMachineMethod>("SetDatasAsync", parameters[0], - MachineSetDataType.CommunicationTag).WithCancellation(cts.Token)).Unwrap(); + setDataType).WithCancellation(cts.Token)).Unwrap(); return ans; }; Params = new object[] {values}; @@ -641,10 +643,8 @@ namespace Modbus.Net /// /// 同时可以运行的任务数 /// 读取数据后是否保持连接 - /// 获取与设置数据的方式 - public TaskManager(int maxRunningTask, bool keepConnect, - MachineDataType dataType = MachineDataType.CommunicationTag) - : base(maxRunningTask, keepConnect, dataType) + public TaskManager(int maxRunningTask, bool keepConnect) + : base(maxRunningTask, keepConnect) { } @@ -723,15 +723,12 @@ namespace Modbus.Net /// /// 同时可以运行的任务数 /// 读取数据后是否保持连接 - /// 获取与设置数据的方式 - public TaskManager(int maxRunningTask, bool keepConnect, - MachineDataType dataType = MachineDataType.CommunicationTag) + public TaskManager(int maxRunningTask, bool keepConnect) { _scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask); _machines = new HashSet>(new TaskMachineEqualityComparer()); KeepConnect = keepConnect; - MachineDataType = dataType; _cts = new CancellationTokenSource(); _tasks = new TaskFactory(_cts.Token, TaskCreationOptions.None, TaskContinuationOptions.None, _scheduler); } @@ -755,53 +752,6 @@ namespace Modbus.Net } } - /// - /// 设备读写设备的关键字 - /// - 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; - } - } - } - } - - /// - /// 设备读数据的关键字 - /// - public MachineGetDataType GetDataType { get; set; } - - /// - /// 设备写数据的关键字 - /// - public MachineSetDataType SetDataType { get; set; } - /// /// 最大可执行任务数 ///