diff --git a/Sln.Imm.Daemon.Business/DeviceCollectionBusiness.cs b/Sln.Imm.Daemon.Business/DeviceCollectionBusiness.cs index 4463602..bf80dd0 100644 --- a/Sln.Imm.Daemon.Business/DeviceCollectionBusiness.cs +++ b/Sln.Imm.Daemon.Business/DeviceCollectionBusiness.cs @@ -40,11 +40,11 @@ public class DeviceCollectionBusiness private readonly BaseDeviceInfoCacheService _cacheService; - private readonly List _opcs; + private readonly Dictionary _opcs; private readonly IBaseService _paramValService; - public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService, List opcs, IBaseService paramValService) + public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService, Dictionary opcs, IBaseService paramValService) { _serilog = serilogHelper; _cacheService = cacheService; @@ -54,69 +54,109 @@ public class DeviceCollectionBusiness //this.Handle(); } - public async Task Handle2() + public async Task Handle() { - bool isFalg = true; + bool isFlag = true; - var deviceInfos = await _cacheService.GetValueAsync("BaseDeviceInfoCache"); - - _opcs. - } - - public async Task Handle(IOpcService opcUa) - { - bool isFalg = true; - - var deviceInfos = await _cacheService.GetValueAsync("BaseDeviceInfoCache"); int i = 0; + do { i++; - foreach (var item in deviceInfos) + + foreach (var (item, opcua) in _opcs) { - //bool result = await _opcUaService.ConnectAsync(item.networkAddress); - - //if (!result) - //{ - // throw new ArgumentNullException($"设备未连接"); - - //} - //Task.Run(async () => - //{ - - // //_opcUaService.DisconnectAsync(); - //}); - try { - _serilog.Info($"开始采集{item.deviceName},设备数据,第{i}次"); - var opcItemValues = await this.ReadParam(item, opcUa); + _serilog.Info($"开始采集{item.deviceName}"); + var opcItemValues = await this.ReadParam(item, opcua); - //this.SaveParam(item, opcItemValues, out List paramValues); + this.SaveParam(item, opcItemValues, out List paramValues); _serilog.Info($"{item.deviceName}数据采集完成:{JsonConvert.SerializeObject(opcItemValues)}"); + if(i == 10) + { + + isFlag = false; + + opcua.DisconnectAsync().Wait(); + + _serilog.Info($"读取完成断开连接"); + } + } catch (Exception e) { _serilog.Info($"{item.deviceName}数据读取异常:{e.Message}"); + + isFlag = false; + + opcua.DisconnectAsync().Wait(); } } - if (i == 1000) - { - isFalg = false; + - await opcUa.DisconnectAsync(); + Thread.Sleep(2000); - _serilog.Info($"读取完成断开连接"); - } - - - await Task.Delay(1000 * 1); - } while (isFalg); + } while (isFlag); } + //public async Task Handle(IOpcService opcUa) + //{ + // bool isFalg = true; + + // var deviceInfos = await _cacheService.GetValueAsync("BaseDeviceInfoCache"); + // int i = 0; + // do + // { + // i++; + // foreach (var item in deviceInfos) + // { + // //bool result = await _opcUaService.ConnectAsync(item.networkAddress); + + // //if (!result) + // //{ + // // throw new ArgumentNullException($"设备未连接"); + + // //} + // //Task.Run(async () => + // //{ + + // // //_opcUaService.DisconnectAsync(); + // //}); + + // try + // { + // _serilog.Info($"开始采集{item.deviceName},设备数据,第{i}次"); + // var opcItemValues = await this.ReadParam(item, opcUa); + + // //this.SaveParam(item, opcItemValues, out List paramValues); + + // _serilog.Info($"{item.deviceName}数据采集完成:{JsonConvert.SerializeObject(opcItemValues)}"); + + // } + // catch (Exception e) + // { + // _serilog.Info($"{item.deviceName}数据读取异常:{e.Message}"); + // } + // } + + // if (i == 1000) + // { + // isFalg = false; + + // await opcUa.DisconnectAsync(); + + // _serilog.Info($"读取完成断开连接"); + // } + + + // await Task.Delay(1000 * 1); + // } while (isFalg); + //} + /// /// 读取设备参数 /// @@ -132,20 +172,8 @@ public class DeviceCollectionBusiness List deviceParams = device.deviceParams.Select(x => x.paramAddr).ToList(); - //bool result = await _opcUaService.ConnectAsync(device.networkAddress); - - //if (!result) - //{ - // throw new ArgumentNullException($"设备未连接"); - - //} - List infos = await opcUa.ReadNodeAsync(deviceParams); - //var infos = _opcService.BrowseNodesAsync("ns=2;s=Devices/分厂一/车间一/测试空设备"); - - //await _opcUaService.DisconnectAsync(); - return infos; } @@ -162,67 +190,34 @@ public class DeviceCollectionBusiness /// OPC节点值列表 /// 输出参数值DTO列表 public void SaveParam(BaseDeviceInfo device, List opcItemValues, - out List paramValues) + out List paramValues) { - var deviceParams = device.deviceParams.ToList(); - var now = DateTime.Now; - - // 使用字典提高查找效率 - var opcValueDict = opcItemValues.ToDictionary(v => v.NodeId, v => v); - - // 构建参数值列表和数据库实体列表 - var paramValueList = new List(); - var dbEntityList = new List(); - - foreach (var param in deviceParams) + paramValues = new List(); + try { - // 查找对应的OPC值 - opcValueDict.TryGetValue(param.paramAddr, out var opcNode); - - var paramValue = opcNode?.Value?.ToString() ?? string.Empty; - - // 构建DTO - paramValueList.Add(new DeviceParamValueDto + foreach (OpcNode opcItem in opcItemValues) { - deviceCode = param.deviceCode, - paramCode = param.paramCode, - paramName = param.paramName, - netWork = param.netWork, - paramAddr = param.paramAddr, - paramType = param.paramType, - isFlag = param.isFlag, - paramValue = paramValue, - }); + BaseDeviceParamVal deviceParamVal = new BaseDeviceParamVal(); - // 构建数据库实体(批量插入) - dbEntityList.Add(new BaseDeviceParamVal - { - DEVICE_ID = device.objid, - DEVICE_CODE = device.deviceCode, - PARAM_CODE = param.paramCode, - PARAM_NAME = param.paramName, - PARAM_VALUE = paramValue, - COLLECT_TIME = now, - RECORD_TIME = now, - PARAM_TYPE = param.paramType, - }); + var paramInfo = device.deviceParams.Where(x => x.paramAddr == opcItem.NodeId).FirstOrDefault(); + if (paramInfo != null) + { + deviceParamVal.paramCode = paramInfo.paramCode; + deviceParamVal.paramName = paramInfo.paramName; + } + deviceParamVal.deviceCode = device.deviceCode; + deviceParamVal.deviceId = device.objid; + deviceParamVal.paramValue = opcItem.Value.ToString(); + deviceParamVal.paramType = opcItem.DataType; + deviceParamVal.collectTime = DateTime.Now; + + paramValues.Add(deviceParamVal); + } + _paramValService.Insert(paramValues); + }catch (Exception e) + { + throw new InvalidOperationException($"设备参数保存异常:{e.Message}"); } - paramValues = paramValueList; - - // 批量保存到数据库(最高效的方式) - if (dbEntityList.Count > 0) - { - try - { - _paramValService.Insert(dbEntityList); - _serilog.Info($"设备{device.deviceCode}成功保存{dbEntityList.Count}条参数值到数据库"); - } - catch (Exception ex) - { - _serilog.Info($"设备{device.deviceCode}保存参数值到数据库失败:{ex.Message}"); - throw; - } - } } } \ No newline at end of file diff --git a/Sln.Imm.Daemon.Model/dao/BaseDeviceParamVal.cs b/Sln.Imm.Daemon.Model/dao/BaseDeviceParamVal.cs index 22a09bd..48629fa 100644 --- a/Sln.Imm.Daemon.Model/dao/BaseDeviceParamVal.cs +++ b/Sln.Imm.Daemon.Model/dao/BaseDeviceParamVal.cs @@ -15,54 +15,54 @@ public class BaseDeviceParamVal /// 备 注:主键 /// [SugarColumn(ColumnName = "RECORD_ID", IsPrimaryKey = true)] - public decimal RECORD_ID { get; set; } + public decimal objId { get; set; } /// /// 备 注:参数编号 /// [SugarColumn(ColumnName = "PARAM_CODE")] - public string? PARAM_CODE { get; set; } + public string? paramCode { get; set; } /// /// 备 注:设备编号 /// [SugarColumn(ColumnName = "DEVICE_CODE")] - public string? DEVICE_CODE { get; set; } + public string? deviceCode { get; set; } /// /// 备 注:设备ID /// [SugarColumn(ColumnName = "DEVICE_ID")] - public decimal? DEVICE_ID { get; set; } + public decimal? deviceId { get; set; } /// /// 备 注:参数名称 /// [SugarColumn(ColumnName = "PARAM_NAME")] - public string? PARAM_NAME { get; set; } + public string? paramName { get; set; } /// /// 备 注:参数值 /// [SugarColumn(ColumnName = "PARAM_VALUE")] - public string? PARAM_VALUE { get; set; } + public string? paramValue { get; set; } /// /// 备 注:采集时间 /// [SugarColumn(ColumnName = "COLLECT_TIME")] - public DateTime? COLLECT_TIME { get; set; } + public DateTime? collectTime { get; set; } /// /// 备 注:记录时间(默认当前时间) /// [SugarColumn(ColumnName = "RECORD_TIME")] - public DateTime RECORD_TIME { get; set; } + public DateTime recordTime { get; set; } /// /// 备 注:参数类型 /// [SugarColumn(ColumnName = "PARAM_TYPE")] - public string? PARAM_TYPE { get; set; } + public string? paramType { get; set; } } \ No newline at end of file diff --git a/Sln.Imm.Daemon.Opc/OpcDeviceFactorySetup.cs b/Sln.Imm.Daemon.Opc/OpcDeviceFactorySetup.cs index e2f7bad..751f597 100644 --- a/Sln.Imm.Daemon.Opc/OpcDeviceFactorySetup.cs +++ b/Sln.Imm.Daemon.Opc/OpcDeviceFactorySetup.cs @@ -16,13 +16,13 @@ namespace Sln.Imm.Daemon.Opc { public static void AddOpcDeviceFactorySetup(this IServiceCollection services) { - services.AddSingleton>(x => + services.AddSingleton>(x => { var _cacheService = x.GetService(); - List deviceInfos = _cacheService.GetValueAsync("BaseDeviceInfoCache").Result; + List deviceInfos = _cacheService.GetValueAsync("BaseDeviceInfoCache").Result; - List opcs = new List(); + Dictionary opcs = new Dictionary(); if (deviceInfos != null) { foreach (var item in deviceInfos) @@ -36,10 +36,10 @@ namespace Sln.Imm.Daemon.Opc } else { - opcDev = x.GetService(); + opcDev = x.GetService(); } - if(opcDev != null) + if (opcDev != null) { var res = opcDev.ConnectAsync(item.networkAddress).Result; @@ -50,13 +50,13 @@ namespace Sln.Imm.Daemon.Opc } else { - opcs.Add(opcDev); + opcs.Add(item, opcDev); } } } } } - + return opcs; }); } diff --git a/Sln.Imm.Daemon/Program.cs b/Sln.Imm.Daemon/Program.cs index 79c4c0d..e8909a5 100644 --- a/Sln.Imm.Daemon/Program.cs +++ b/Sln.Imm.Daemon/Program.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using Sln.Imm.Daemon.Business; using Sln.Imm.Daemon.Cache; using Sln.Imm.Daemon.Config; +using Sln.Imm.Daemon.Model.dao; using Sln.Imm.Daemon.Model.dto; using Sln.Imm.Daemon.Opc; using Sln.Imm.Daemon.Opc.Impl; @@ -36,30 +37,30 @@ namespace Sln.Imm.Daemon var deviceCollectionBusiness = ServiceProvider.GetService(); - //deviceCollectionBusiness?.Handle(); + deviceCollectionBusiness?.Handle(); - List opcs = ServiceProvider.GetService>(); + //List opcs = ServiceProvider.GetService>(); - if( opcs != null ) - { - foreach( var opc in opcs) - { - var res = opc.ReadNodeAsync(new List() - { - "ns=4;s=APPL.Core1.sv_CoreOutput.NormalIn.Velocity.Output.rOutputValue", - "ns=4;s=APPL.Core1.sv_CoreSetTimes.MoveIn.dSetMoveTime" - }); + //if( opcs != null ) + //{ + // foreach( var opc in opcs) + // { + // var res = opc.ReadNodeAsync(new List() + // { + // "ns=4;s=APPL.Core1.sv_CoreOutput.NormalIn.Velocity.Output.rOutputValue", + // "ns=4;s=APPL.Core1.sv_CoreSetTimes.MoveIn.dSetMoveTime" + // }); - Console.WriteLine($"数据采集完成:{JsonConvert.SerializeObject(res)}"); + // Console.WriteLine($"数据采集完成:{JsonConvert.SerializeObject(res)}"); - Thread.Sleep(5000); + // Thread.Sleep(5000); - opc.DisconnectAsync(); + // opc.DisconnectAsync(); - Console.WriteLine($"断开设备连接"); - } - } + // Console.WriteLine($"断开设备连接"); + // } + //} Task.Delay(-1).Wait(); @@ -105,7 +106,6 @@ namespace Sln.Imm.Daemon new SqliteCache(new SqliteCacheOptions { CachePath = "D:\\working_area\\project\\澳柯玛注塑采集\\cache\\FusionCache.db" - //CachePath = "/Users/wenxiansheng/Public/WorkSpace/Mesnac/项目资料/澳柯玛注塑车间MES项目/数据缓存/FusionCache.db" })); services.AddOpcDeviceFactorySetup();