diff --git a/Modbus.Net/Modbus.Net/BaseMachine.cs b/Modbus.Net/Modbus.Net/BaseMachine.cs
index 27bd85d..930433e 100644
--- a/Modbus.Net/Modbus.Net/BaseMachine.cs
+++ b/Modbus.Net/Modbus.Net/BaseMachine.cs
@@ -5,6 +5,21 @@ using System.Threading.Tasks;
namespace Modbus.Net
{
+ ///
+ /// 获取设备值的方式
+ ///
+ public enum MachineGetDataType
+ {
+ ///
+ /// 地址
+ ///
+ Address,
+ ///
+ /// 通讯标识
+ ///
+ CommunicationTag
+ }
+
///
/// 向设备设置值的方式
///
@@ -28,7 +43,7 @@ namespace Modbus.Net
///
/// 设备的Id
///
- public int Id { get; set; }
+ public string Id { get; set; }
///
/// 设备所在工程的名称
@@ -113,16 +128,18 @@ namespace Modbus.Net
/// 读取数据
///
/// 从设备读取的数据
- public Dictionary GetDatas()
+ public Dictionary GetDatas(MachineGetDataType getDataType)
{
- return AsyncHelper.RunSync(GetDatasAsync);
+ return AsyncHelper.RunSync(()=>GetDatasAsync(getDataType));
}
+
+
///
/// 读取数据
///
/// 从设备读取的数据
- public async Task> GetDatasAsync()
+ public async Task> GetDatasAsync(MachineGetDataType getDataType)
{
try
{
@@ -146,14 +163,26 @@ namespace Modbus.Net
Math.Ceiling(communicateAddress.GetCount*
BigEndianValueHelper.Instance.ByteLength[
communicateAddress.DataType.FullName]));
- var datas = datasReturn.ReturnValue;
- //如果没有数据,终止
- if (datas == null || datas.Length == 0 || datas.Length !=
- (int)
- Math.Ceiling(communicateAddress.GetCount *
- BigEndianValueHelper.Instance.ByteLength[
- communicateAddress.DataType.FullName])) return null;
+ byte[] datas;
+
+ //如果设备本身能获取到数据但是没有数据
+ if (datasReturn == null)
+ {
+ datas = null;
+ }
+ else
+ {
+ datas = datasReturn.ReturnValue;
+
+ //如果没有数据,终止
+ if (datas == null || datas.Length == 0 || datas.Length !=
+ (int)
+ Math.Ceiling(communicateAddress.GetCount *
+ BigEndianValueHelper.Instance.ByteLength[
+ communicateAddress.DataType.FullName])) return null;
+ }
+
int pos = 0;
//解码数据
while (pos < communicateAddress.GetCount)
@@ -164,17 +193,52 @@ namespace Modbus.Net
p => p.Area == communicateAddress.Area && p.Address == pos + communicateAddress.Address);
if (address != null)
{
- //将获取的数据和对应的通讯标识对应
- ans.Add(address.CommunicationTag,
- new ReturnUnit
+ string key;
+ switch (getDataType)
+ {
+ case MachineGetDataType.CommunicationTag:
+ {
+ key = address.CommunicationTag;
+ break;
+ }
+ case MachineGetDataType.Address:
+ {
+ key = AddressFormater.FormatAddress(address.Area, address.Address);
+ break;
+ }
+ default:
+ {
+ key = address.CommunicationTag;
+ break;
+ }
+ }
+
+ if (datas == null)
+ {
+ ans.Add(key, new ReturnUnit
{
- PlcValue =
- Double.Parse(
- datasReturn.IsLittleEndian ? ValueHelper.Instance.GetValue(datas, ref pos, address.DataType)
- .ToString() : BigEndianValueHelper.Instance.GetValue(datas, ref pos, address.DataType)
- .ToString()) *address.Zoom,
+ PlcValue = null,
UnitExtend = address.UnitExtend
});
+ pos += (int)ValueHelper.Instance.ByteLength[address.DataType.ToString()];
+ }
+ else
+ {
+ //将获取的数据和对应的通讯标识对应
+ ans.Add(key,
+ new ReturnUnit
+ {
+ PlcValue =
+ Double.Parse(
+ datasReturn.IsLittleEndian
+ ? ValueHelper.Instance.GetValue(datas, ref pos, address.DataType)
+ .ToString()
+ : BigEndianValueHelper.Instance.GetValue(datas, ref pos,
+ address.DataType)
+ .ToString())*address.Zoom,
+ UnitExtend = address.UnitExtend
+ });
+ }
}
else
{
@@ -361,8 +425,8 @@ namespace Modbus.Net
public static Dictionary MapGetValuesToSetValues(Dictionary getValues)
{
if (getValues == null) return null;
- return (from getValue in getValues
- select new KeyValuePair(getValue.Key, getValue.Value.PlcValue)).ToDictionary(p=>p.Key,p=>p.Value);
+ return (from getValue in getValues where getValue.Value.PlcValue != null
+ select new KeyValuePair(getValue.Key, getValue.Value.PlcValue.Value)).ToDictionary(p=>p.Key,p=>p.Value);
}
}
@@ -418,7 +482,7 @@ namespace Modbus.Net
///
/// 返回的数据
///
- public double PlcValue { get; set; }
+ public double? PlcValue { get; set; }
///
/// 数据的扩展
///
@@ -430,7 +494,7 @@ namespace Modbus.Net
///
/// 数据单元Id
///
- public int Id { get; set; }
+ public string Id { get; set; }
///
/// 数据所属的区域
///
@@ -494,7 +558,7 @@ namespace Modbus.Net
///
/// Id
///
- int Id { get; set; }
+ string Id { get; set; }
///
/// 工程名
///
diff --git a/Modbus.Net/Modbus.Net/TaskManager.cs b/Modbus.Net/Modbus.Net/TaskManager.cs
index 2ff3103..53ac2a1 100644
--- a/Modbus.Net/Modbus.Net/TaskManager.cs
+++ b/Modbus.Net/Modbus.Net/TaskManager.cs
@@ -9,7 +9,7 @@ namespace Modbus.Net
{
public class TaskReturnDef
{
- public int MachineId { get; set; }
+ public string MachineId { get; set; }
public Dictionary ReturnValues { get; set; }
}
@@ -279,6 +279,8 @@ namespace Modbus.Net
}
}
+ public MachineGetDataType GetDataType { get; set; }
+
/*public int MaxRunningTasks
{
get { return _scheduler.MaximumConcurrencyLevel; }
@@ -295,13 +297,14 @@ namespace Modbus.Net
/// 同时可以运行的任务数
/// 读取数据的时间间隔(秒)
/// 读取数据后是否保持连接
- public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect)
+ public TaskManager(/*int maxRunningTask,*/ int getCycle, bool keepConnect, MachineGetDataType getDataType = MachineGetDataType.CommunicationTag)
{
//_scheduler = new LimitedConcurrencyLevelTaskScheduler(maxRunningTask);
_machines = new HashSet(new BaseMachineEqualityComparer());
_unlinkedMachines = new HashSet(new BaseMachineEqualityComparer());
_getCycle = getCycle;
KeepConnect = keepConnect;
+ GetDataType = getDataType;
}
///
@@ -352,7 +355,7 @@ namespace Modbus.Net
/// 根据设备的id移除设备
///
/// 设备的id
- public void RemoveMachineWithId(int id)
+ public void RemoveMachineWithId(string id)
{
lock (_machines)
{
@@ -368,7 +371,7 @@ namespace Modbus.Net
/// 将设备指定为未连接
///
/// 设备的id
- public void MoveMachineToUnlinked(int id)
+ public void MoveMachineToUnlinked(string id)
{
IEnumerable machines;
lock(_machines)
@@ -390,7 +393,7 @@ namespace Modbus.Net
/// 将设备指定为已连接
///
/// 设备的id
- public void MoveMachineToLinked(int id)
+ public void MoveMachineToLinked(string id)
{
IEnumerable machines;
lock (_unlinkedMachines)
@@ -556,7 +559,7 @@ namespace Modbus.Net
//超时后取消任务
cts.CancelAfter(TimeSpan.FromSeconds(_getCycle));
//读取数据
- var ans = await machine.GetDatasAsync().WithCancellation(cts.Token);
+ var ans = await machine.GetDatasAsync(GetDataType).WithCancellation(cts.Token);
if (!machine.IsConnected)
{
MoveMachineToUnlinked(machine.Id);