From c4e2116192dd243b05bbb0d3ddd20c36f6a2a5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E5=9C=A3?= Date: Thu, 25 Aug 2016 14:56:52 +0800 Subject: [PATCH] fix --- Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs | 1 + Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs | 1 + .../Modbus.Net.Siemens/SiemensMachine.cs | 1 + Modbus.Net/Modbus.Net/BaseMachine.cs | 13 ++++-- Modbus.Net/Modbus.Net/TaskManager.cs | 40 ++++++++++++++++--- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs b/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs index f2f54c9..c2fa8aa 100644 --- a/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs +++ b/Modbus.Net/Modbus.Net.Modbus/ModbusMachine.cs @@ -10,6 +10,7 @@ namespace Modbus.Net.Modbus BaseUtility = new ModbusUtility(connectionType, connectionString); AddressFormater = new AddressFormaterModbus(); AddressCombiner = new AddressCombinerContinus(); + AddressCombinerSet = new AddressCombinerContinus(); } public ModbusMachine(ModbusType connectionType, string connectionString, diff --git a/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs b/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs index 8f844a2..e6d8b6e 100644 --- a/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs +++ b/Modbus.Net/Modbus.Net.OPC/OpcDaMachine.cs @@ -13,6 +13,7 @@ namespace Modbus.Net.OPC { BaseUtility = new OpcDaUtility(connectionString); AddressCombiner = new AddressCombinerSingle(); + AddressCombinerSet = new AddressCombinerSingle(); } public OpcDaMachine(string connectionString, IEnumerable getAddresses) diff --git a/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs b/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs index 7cba42e..042cd9a 100644 --- a/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs +++ b/Modbus.Net/Modbus.Net.Siemens/SiemensMachine.cs @@ -10,6 +10,7 @@ namespace Modbus.Net.Siemens BaseUtility = new SiemensUtility(connectionType, connectionString, model); AddressFormater = new AddressFormaterSiemens(); AddressCombiner = new AddressCombinerContinus(); + AddressCombinerSet = new AddressCombinerContinus(); } public SiemensMachine(SiemensType connectionType, string connectionString, SiemensMachineModel model, diff --git a/Modbus.Net/Modbus.Net/BaseMachine.cs b/Modbus.Net/Modbus.Net/BaseMachine.cs index 930433e..cb15a79 100644 --- a/Modbus.Net/Modbus.Net/BaseMachine.cs +++ b/Modbus.Net/Modbus.Net/BaseMachine.cs @@ -71,10 +71,15 @@ namespace Modbus.Net public AddressFormater AddressFormater { get; set; } /// - /// 地址解码器 + /// 获取地址组合器 /// public AddressCombiner AddressCombiner { get; set; } + /// + /// 写入地址组合器 + /// + public AddressCombiner AddressCombinerSet { get; set; } + /// /// 地址转换器 /// @@ -329,7 +334,7 @@ namespace Modbus.Net addresses.Add(address); } //将地址编码成与实际设备通讯的地址,注意这个地址必须是连续的 - var communcationUnits = new AddressCombinerContinus().Combine(addresses); + var communcationUnits = AddressCombinerSet.Combine(addresses); //遍历每条通讯的连续地址 foreach (var communicateAddress in communcationUnits) { @@ -366,13 +371,13 @@ namespace Modbus.Net //获取要写入的值 var value = values.SingleOrDefault(p => p.Key == address); //将要写入的值加入队列 - datasList.Add(Convert.ChangeType(value.Value, dataType)); + datasList.Add(Convert.ChangeType(value.Value / addressUnit.Zoom, dataType)); break; } case MachineSetDataType.CommunicationTag: { var value = values.SingleOrDefault(p => p.Key == addressUnit.CommunicationTag); - datasList.Add(Convert.ChangeType(value.Value, dataType)); + datasList.Add(Convert.ChangeType(value.Value / addressUnit.Zoom, dataType)); break; } } diff --git a/Modbus.Net/Modbus.Net/TaskManager.cs b/Modbus.Net/Modbus.Net/TaskManager.cs index 53ac2a1..a31f167 100644 --- a/Modbus.Net/Modbus.Net/TaskManager.cs +++ b/Modbus.Net/Modbus.Net/TaskManager.cs @@ -4,9 +4,14 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; - namespace Modbus.Net { + public enum MachineDataType + { + Address, + CommunicationTag, + } + public class TaskReturnDef { public string MachineId { get; set; } @@ -279,7 +284,30 @@ 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; + } + } + } + } + public MachineGetDataType GetDataType { get; set; } + public MachineSetDataType SetDataType { get; set; } /*public int MaxRunningTasks { @@ -297,14 +325,15 @@ namespace Modbus.Net /// 同时可以运行的任务数 /// 读取数据的时间间隔(秒) /// 读取数据后是否保持连接 - public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineGetDataType getDataType = MachineGetDataType.CommunicationTag) + /// 获取与设置数据的方式 + public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineDataType dataType = MachineDataType.CommunicationTag) { //_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask); _machines = new HashSet(new BaseMachineEqualityComparer()); _unlinkedMachines = new HashSet(new BaseMachineEqualityComparer()); _getCycle = getCycle; KeepConnect = keepConnect; - GetDataType = getDataType; + MachineDataType = dataType; } /// @@ -494,10 +523,9 @@ namespace Modbus.Net /// 设置数据 /// /// 设备的连接标识 - /// 设置类型 /// 需要设置的数据 /// 是否设置成功 - public async Task SetDatasAsync(string connectionToken, MachineSetDataType setDataType, + public async Task SetDatasAsync(string connectionToken, Dictionary values) { BaseMachine machine = null; @@ -506,7 +534,7 @@ namespace Modbus.Net machine = _machines.FirstOrDefault(p => p.ConnectionToken == connectionToken); } if (machine == null) return false; - return await machine.SetDatasAsync(setDataType, values); + return await machine.SetDatasAsync(SetDataType, values); } ///