|
|
@@ -1,10 +1,12 @@
|
|
|
using Microsoft.AspNetCore.Http;
|
|
|
using Microsoft.AspNetCore.Mvc;
|
|
|
using OpcDaComRcw.Dx;
|
|
|
+using S7.Net.Types;
|
|
|
using System.Collections.Concurrent;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Data.Entity.Core.Metadata.Edm;
|
|
|
using System.Reflection.Emit;
|
|
|
+using System.Text;
|
|
|
using System.Xml.Linq;
|
|
|
using YSAI.Core.data;
|
|
|
using YSAI.Core.@enum;
|
|
|
@@ -65,12 +67,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
/// 休眠时间(毫秒)
|
|
|
/// </summary>
|
|
|
int SleepTime { get; set; } = 100;
|
|
|
- /// <summary>
|
|
|
- /// 执行方法的委托,读取方法,每个通信设备都应该存在
|
|
|
- /// Address:请求参数
|
|
|
- /// Task<OperateResult>:操作结果
|
|
|
- /// </summary>
|
|
|
- Func<Address, OperateResult>? Function { get; set; }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 数据变化抛出 false则为实时数据
|
|
|
/// 只抛出变化项
|
|
|
@@ -133,8 +130,6 @@ namespace YSAI.Manage.Core.@base
|
|
|
/// </summary>
|
|
|
private OperateResult operateResult { get; set; }
|
|
|
|
|
|
-
|
|
|
-
|
|
|
#region 私有函数
|
|
|
/// <summary>
|
|
|
/// 初始化管理
|
|
|
@@ -208,22 +203,6 @@ namespace YSAI.Manage.Core.@base
|
|
|
operateResult = modbusClientOperate.On();
|
|
|
if (operateResult.State)
|
|
|
{
|
|
|
- Func<Address, OperateResult>? Function = null;
|
|
|
- switch (manage.MRType)
|
|
|
- {
|
|
|
- case ModbusReadType.Coils:
|
|
|
- Function = modbusClientOperate.ReadCoils;
|
|
|
- break;
|
|
|
- case ModbusReadType.Inputs:
|
|
|
- Function = modbusClientOperate.ReadInputs;
|
|
|
- break;
|
|
|
- case ModbusReadType.HoldingRegisters:
|
|
|
- Function = modbusClientOperate.ReadHoldingRegisters;
|
|
|
- break;
|
|
|
- case ModbusReadType.InputRegisters:
|
|
|
- Function = modbusClientOperate.ReadInputRegisters;
|
|
|
- break;
|
|
|
- }
|
|
|
//创建一个自定义订阅
|
|
|
SubscribeOperate subscribeOperate = SubscribeOperate.Instance(new SubscribeData.Basics()
|
|
|
{
|
|
|
@@ -232,7 +211,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
DataChangeOut = DataChangeOut,
|
|
|
SameDataOut = SameDataOut,
|
|
|
SleepTime = SleepTime,
|
|
|
- Function = Function
|
|
|
+ Function = modbusClientOperate.Read
|
|
|
});
|
|
|
|
|
|
//事件注册(永远保持一个事件注册)
|
|
|
@@ -457,7 +436,45 @@ namespace YSAI.Manage.Core.@base
|
|
|
return FaliMessage;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 写入管理
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="V">数据类型</typeparam>
|
|
|
+ /// <param name="data">数据</param>
|
|
|
+ /// <param name="Name">数采类型</param>
|
|
|
+ /// <param name="SN">实例SN</param>
|
|
|
+ /// <returns></returns>
|
|
|
+ private OperateResult WriteHandler<V>(ConcurrentDictionary<string, V> data, DaqType? Name,string SN)
|
|
|
+ {
|
|
|
+ switch (Name)
|
|
|
+ {
|
|
|
+ case DaqType.OpcUa:
|
|
|
+ operateResult = OpcUaDaqObjArray[SN].Write(data);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("Write", false, $"[ {Name.ToString()} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDa:
|
|
|
+ operateResult = OpcDaDaqObjArray[SN].Write(data);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("Write", false, $"[ {Name.ToString()} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.S7:
|
|
|
+ operateResult = S7DaqObjArray[SN].Write(data);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("Write", false, $"[ {Name.ToString()} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return Break("Write",true);
|
|
|
+ }
|
|
|
+
|
|
|
#endregion
|
|
|
+
|
|
|
#region 事件管理
|
|
|
/// <summary>
|
|
|
/// OPCUA客户端的全局事件
|
|
|
@@ -514,7 +531,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
List<string> strings = InHandler();
|
|
|
if (strings.Count > 0)
|
|
|
{
|
|
|
- return Break("Init", false, "存在一个或多个初始化错误", RData: strings.ToJson(), RType: ResultType.Json);
|
|
|
+ return Break("Init", false, "存在一个或多个初始化错误", RData: strings, RType: ResultType.Json);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
@@ -548,23 +565,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
{
|
|
|
case DaqType.DB:
|
|
|
//判断是否有此实例
|
|
|
- if (DBDaqObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- //判断是否有此自定义订阅
|
|
|
- if (SubscribeObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- operateResult = SubscribeObjArray[SN].On();
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
@@ -572,23 +573,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
case DaqType.Modbus:
|
|
|
|
|
|
//判断是否有此实例
|
|
|
- if (DBDaqObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- //判断是否有此自定义订阅
|
|
|
- if (SubscribeObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- operateResult = SubscribeObjArray[SN].On();
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
@@ -596,81 +581,69 @@ namespace YSAI.Manage.Core.@base
|
|
|
break;
|
|
|
case DaqType.OpcUa:
|
|
|
//判断是否有此实例
|
|
|
- if (OpcUaDaqObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- //OPCUA 自带订阅功能
|
|
|
- ConcurrentDictionary<string, List<AddressDetails>> sub = new ConcurrentDictionary<string, List<AddressDetails>>();
|
|
|
- sub.TryAdd(addressManage.SN, addressManage.AddressArray);
|
|
|
- operateResult = OpcUaDaqObjArray[SN].AddSubscribe(sub);
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", operateResult.State, operateResult.Message);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!OpcUaDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
break;
|
|
|
case DaqType.OpcDa:
|
|
|
//判断是否有此实例
|
|
|
- if (OpcDaDaqObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- operateResult = OpcDaDaqObjArray[SN].UpdateGroupSubscribedState(SN, true);
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ if (!OpcDaDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
break;
|
|
|
case DaqType.OpcDaHttp:
|
|
|
//判断是否有此实例
|
|
|
- if (DBDaqObjArray.ContainsKey(SN))
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
- //判断是否有此自定义订阅
|
|
|
- if (SubscribeObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- operateResult = SubscribeObjArray[SN].On();
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
- }
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
- else
|
|
|
+ break;
|
|
|
+ case DaqType.S7:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
break;
|
|
|
+ }
|
|
|
+
|
|
|
+ switch (Name)
|
|
|
+ {
|
|
|
+ case DaqType.OpcUa:
|
|
|
+ //OPCUA 自带订阅功能
|
|
|
+ ConcurrentDictionary<string, List<AddressDetails>> sub = new ConcurrentDictionary<string, List<AddressDetails>>();
|
|
|
+ sub.TryAdd(addressManage.SN, addressManage.AddressArray);
|
|
|
+ operateResult = OpcUaDaqObjArray[SN].AddSubscribe(sub);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("On", operateResult.State, operateResult.Message);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDa:
|
|
|
+ operateResult = OpcDaDaqObjArray[SN].UpdateGroupSubscribedState(SN, true);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.DB:
|
|
|
+ case DaqType.Modbus:
|
|
|
+ case DaqType.OpcDaHttp:
|
|
|
case DaqType.S7:
|
|
|
- //判断是否有此实例
|
|
|
- if (DBDaqObjArray.ContainsKey(SN))
|
|
|
+ //判断是否有此自定义订阅
|
|
|
+ if (SubscribeObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
- //判断是否有此自定义订阅
|
|
|
- if (SubscribeObjArray.ContainsKey(SN))
|
|
|
- {
|
|
|
- operateResult = SubscribeObjArray[SN].On();
|
|
|
- if (!operateResult.State)
|
|
|
- {
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
+ operateResult = SubscribeObjArray[SN].On();
|
|
|
+ if (!operateResult.State)
|
|
|
{
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -696,60 +669,85 @@ namespace YSAI.Manage.Core.@base
|
|
|
switch (Name)
|
|
|
{
|
|
|
case DaqType.DB:
|
|
|
-
|
|
|
- operateResult = SubscribeObjArray[SN].Off();
|
|
|
- if (!operateResult.State)
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
- return Break("Off", false, operateResult.Message);
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
case DaqType.Modbus:
|
|
|
-
|
|
|
- operateResult = SubscribeObjArray[SN].Off();
|
|
|
- if (!operateResult.State)
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!ModbusDaqObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
- return Break("Off", false, operateResult.Message);
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
case DaqType.OpcUa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcUaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcDaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDaHttp:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcDaHttpDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.S7:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!S7DaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
|
|
|
+ switch (Name)
|
|
|
+ {
|
|
|
+ case DaqType.OpcUa:
|
|
|
operateResult = OpcUaDaqObjArray[SN].RemoveSubscribe(basics.AManages.FirstOrDefault(c => c.DType.Equals(Name) && c.SN.Equals(SN)).AddressArray);
|
|
|
if (!operateResult.State)
|
|
|
{
|
|
|
return Break("Off", false, operateResult.Message);
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
case DaqType.OpcDa:
|
|
|
-
|
|
|
operateResult = OpcDaDaqObjArray[SN].UpdateGroupSubscribedState(SN, false);
|
|
|
if (!operateResult.State)
|
|
|
{
|
|
|
return Break("Off", false, operateResult.Message);
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
+ case DaqType.DB:
|
|
|
+ case DaqType.Modbus:
|
|
|
case DaqType.OpcDaHttp:
|
|
|
-
|
|
|
- operateResult = SubscribeObjArray[SN].Off();
|
|
|
- if (!operateResult.State)
|
|
|
+ case DaqType.S7:
|
|
|
+ //判断是否有此自定义订阅
|
|
|
+ if (SubscribeObjArray.ContainsKey(SN))
|
|
|
{
|
|
|
- return Break("Off", false, operateResult.Message);
|
|
|
+ operateResult = SubscribeObjArray[SN].Off();
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("Off", false, $"[ {Name.ToString} ] [ {SN} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
- break;
|
|
|
- case DaqType.S7:
|
|
|
-
|
|
|
- operateResult = SubscribeObjArray[SN].Off();
|
|
|
- if (!operateResult.State)
|
|
|
+ else
|
|
|
{
|
|
|
- return Break("Off", false, operateResult.Message);
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 订阅不存在");
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
return Break("Off", true);
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
@@ -779,6 +777,54 @@ namespace YSAI.Manage.Core.@base
|
|
|
return Break("Read", false, $"[ {Name.ToString()} ] 未查询到({AddressName})地址配置数据");
|
|
|
}
|
|
|
|
|
|
+ switch (Name)
|
|
|
+ {
|
|
|
+ case DaqType.DB:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.Modbus:
|
|
|
+
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case DaqType.OpcUa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcUaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcDaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.OpcDaHttp:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case DaqType.S7:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
switch (Name)
|
|
|
{
|
|
|
case DaqType.DB:
|
|
|
@@ -789,36 +835,10 @@ namespace YSAI.Manage.Core.@base
|
|
|
}
|
|
|
break;
|
|
|
case DaqType.Modbus:
|
|
|
- switch (addressManage.MRType)
|
|
|
+ operateResult = ModbusDaqObjArray[SN].Read(addressManage);
|
|
|
+ if (operateResult.State)
|
|
|
{
|
|
|
- case ModbusReadType.Coils:
|
|
|
- operateResult = ModbusDaqObjArray[SN].ReadCoils(addressManage);
|
|
|
- if (operateResult.State)
|
|
|
- {
|
|
|
- return Break("Read", true, RData: operateResult.RData, RType: operateResult.RType);
|
|
|
- }
|
|
|
- break;
|
|
|
- case ModbusReadType.Inputs:
|
|
|
- operateResult = ModbusDaqObjArray[SN].ReadInputs(addressManage);
|
|
|
- if (operateResult.State)
|
|
|
- {
|
|
|
- return Break("Read", true, RData: operateResult.RData, RType: operateResult.RType);
|
|
|
- }
|
|
|
- break;
|
|
|
- case ModbusReadType.HoldingRegisters:
|
|
|
- operateResult = ModbusDaqObjArray[SN].ReadHoldingRegisters(addressManage);
|
|
|
- if (operateResult.State)
|
|
|
- {
|
|
|
- return Break("Read", true, RData: operateResult.RData, RType: operateResult.RType);
|
|
|
- }
|
|
|
- break;
|
|
|
- case ModbusReadType.InputRegisters:
|
|
|
- operateResult = ModbusDaqObjArray[SN].ReadInputRegisters(addressManage);
|
|
|
- if (operateResult.State)
|
|
|
- {
|
|
|
- return Break("Read", true, RData: operateResult.RData, RType: operateResult.RType);
|
|
|
- }
|
|
|
- break;
|
|
|
+ return Break("Read", true, RData: operateResult.RData, RType: operateResult.RType);
|
|
|
}
|
|
|
break;
|
|
|
case DaqType.OpcUa:
|
|
|
@@ -850,6 +870,7 @@ namespace YSAI.Manage.Core.@base
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
return Break("Read", false, $"[ {Name.ToString()} ] [ {AddressName} ] {operateResult.Message}");
|
|
|
}
|
|
|
catch (Exception ex)
|
|
|
@@ -882,19 +903,112 @@ namespace YSAI.Manage.Core.@base
|
|
|
switch (Name)
|
|
|
{
|
|
|
case DaqType.DB:
|
|
|
- return Break("Write",false,$"[ {Name.ToString()} ] 目前不支持写入功能");
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+ break;
|
|
|
case DaqType.Modbus:
|
|
|
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
+
|
|
|
break;
|
|
|
case DaqType.OpcUa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcUaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
break;
|
|
|
case DaqType.OpcDa:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!OpcDaDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
break;
|
|
|
case DaqType.OpcDaHttp:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
break;
|
|
|
case DaqType.S7:
|
|
|
+ //判断是否有此实例
|
|
|
+ if (!DBDaqObjArray.ContainsKey(SN))
|
|
|
+ {
|
|
|
+ return Break("On", false, $"[ {Name.ToString} ] [ {SN} ] 实例不存在");
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
+ switch (Name)
|
|
|
+ {
|
|
|
+ case DaqType.OpcDaHttp:
|
|
|
+ case DaqType.DB:
|
|
|
+ return Break("Write",false,$"[ {Name.ToString()} ] 目前不支持写入功能");
|
|
|
+ case DaqType.Modbus:
|
|
|
+ ConcurrentDictionary<ushort, object> pairs = new ConcurrentDictionary<ushort, object>();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ switch (DType)
|
|
|
+ {
|
|
|
+ case DataType.String:
|
|
|
+ pairs.TryAdd(int.Parse(AddressName).ToUshort(),Value);
|
|
|
+ break;
|
|
|
+ case DataType.Bool:
|
|
|
+ pairs.TryAdd(int.Parse(AddressName).ToUshort(), bool.Parse(Value));
|
|
|
+ break;
|
|
|
+ case DataType.Double:
|
|
|
+ pairs.TryAdd(int.Parse(AddressName).ToUshort(), double.Parse(Value));
|
|
|
+ break;
|
|
|
+ case DataType.Int:
|
|
|
+ pairs.TryAdd(int.Parse(AddressName).ToUshort(), int.Parse(Value));
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return Break("Write", false, "值类型错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ return Break("Write", false, $"数据类型转换异常:{ex.Message}");
|
|
|
+ }
|
|
|
+ operateResult = ModbusDaqObjArray[SN].Write(pairs);
|
|
|
+ if (!operateResult.State)
|
|
|
+ {
|
|
|
+ return Break("Write", false, $"[ {Name.ToString()} ] {operateResult.Message}");
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ switch (DType)
|
|
|
+ {
|
|
|
+ case DataType.String:
|
|
|
+ ConcurrentDictionary<string, string> str = new ConcurrentDictionary<string, string>();
|
|
|
+ str.TryAdd(AddressName, Value);
|
|
|
+ return WriteHandler(str, Name, SN);
|
|
|
+ case DataType.Bool:
|
|
|
+ ConcurrentDictionary<string, bool> bo = new ConcurrentDictionary<string, bool>();
|
|
|
+ bo.TryAdd(AddressName, bool.Parse(Value));
|
|
|
+ return WriteHandler(bo, Name, SN);
|
|
|
+ case DataType.Double:
|
|
|
+ ConcurrentDictionary<string, double> dou = new ConcurrentDictionary<string, double>();
|
|
|
+ dou.TryAdd(AddressName, double.Parse(Value));
|
|
|
+ return WriteHandler(dou, Name, SN);
|
|
|
+ case DataType.Int:
|
|
|
+ ConcurrentDictionary<string, int> ints = new ConcurrentDictionary<string, int>();
|
|
|
+ ints.TryAdd(AddressName, int.Parse(Value));
|
|
|
+ return WriteHandler(ints, Name, SN);
|
|
|
+ default:
|
|
|
+ return Break("Write", false, "值类型错误");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return Break("Write", true);
|
|
|
}
|
|
|
catch (Exception ex)
|