This commit is contained in:
罗圣
2016-08-25 14:56:52 +08:00
parent f5cc2ee601
commit c4e2116192
5 changed files with 46 additions and 10 deletions

View File

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

View File

@@ -13,6 +13,7 @@ namespace Modbus.Net.OPC
{
BaseUtility = new OpcDaUtility(connectionString);
AddressCombiner = new AddressCombinerSingle();
AddressCombinerSet = new AddressCombinerSingle();
}
public OpcDaMachine(string connectionString, IEnumerable<AddressUnit> getAddresses)

View File

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

View File

@@ -71,10 +71,15 @@ namespace Modbus.Net
public AddressFormater AddressFormater { get; set; }
/// <summary>
/// 地址解码
/// 获取地址组合
/// </summary>
public AddressCombiner AddressCombiner { get; set; }
/// <summary>
/// 写入地址组合器
/// </summary>
public AddressCombiner AddressCombinerSet { get; set; }
/// <summary>
/// 地址转换器
/// </summary>
@@ -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;
}
}

View File

@@ -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
/// <param name="maxRunningTask">同时可以运行的任务数</param>
/// <param name="getCycle">读取数据的时间间隔(秒)</param>
/// <param name="keepConnect">读取数据后是否保持连接</param>
public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineGetDataType getDataType = MachineGetDataType.CommunicationTag)
/// <param name="dataType">获取与设置数据的方式</param>
public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineDataType dataType = MachineDataType.CommunicationTag)
{
//_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
_machines = new HashSet<BaseMachine>(new BaseMachineEqualityComparer());
_unlinkedMachines = new HashSet<BaseMachine>(new BaseMachineEqualityComparer());
_getCycle = getCycle;
KeepConnect = keepConnect;
GetDataType = getDataType;
MachineDataType = dataType;
}
/// <summary>
@@ -494,10 +523,9 @@ namespace Modbus.Net
/// 设置数据
/// </summary>
/// <param name="connectionToken">设备的连接标识</param>
/// <param name="setDataType">设置类型</param>
/// <param name="values">需要设置的数据</param>
/// <returns>是否设置成功</returns>
public async Task<bool> SetDatasAsync(string connectionToken, MachineSetDataType setDataType,
public async Task<bool> SetDatasAsync(string connectionToken,
Dictionary<string, double> 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);
}
/// <summary>