#region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2025 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:Mr.Wen's MacBook Pro * 命名空间:Sln.Imm.Daemon.Business * 唯一标识:2152B53A-F33E-47F0-9112-21E05DFC903D * * 创建者:WenJY * 电子邮箱: * 创建时间:2025-09-11 09:42:39 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using Newtonsoft.Json; using Sln.Imm.Daemon.Cache; using Sln.Imm.Daemon.Model.dao; using Sln.Imm.Daemon.Model.dto; using Sln.Imm.Daemon.Opc; using Sln.Imm.Daemon.Opc.Impl; using Sln.Imm.Daemon.Repository.service.@base; using Sln.Imm.Daemon.Serilog; namespace Sln.Imm.Daemon.Business; public class DeviceCollectionBusiness { private readonly SerilogHelper _serilog; private readonly BaseDeviceInfoCacheService _cacheService; private readonly Dictionary _opcs; private readonly IBaseService _paramValService; public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService, Dictionary opcs, IBaseService paramValService) { _serilog = serilogHelper; _cacheService = cacheService; _opcs = opcs; _paramValService = paramValService; //this.Handle(); } public async Task Handle() { bool isFlag = true; int i = 0; do { i++; foreach (var (item, opcua) in _opcs) { try { _serilog.Info($"开始采集{item.deviceName}"); var opcItemValues = await this.ReadParam(item, opcua); 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(); } } Thread.Sleep(2000); } 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); //} /// /// 读取设备参数 /// /// public async Task> ReadParam(BaseDeviceInfo device,IOpcService opcUa) { try { if (device == null) { throw new ArgumentNullException($"设备信息不允许为空"); } List deviceParams = device.deviceParams.Select(x => x.paramAddr).ToList(); List infos = await opcUa.ReadNodeAsync(deviceParams); return infos; } catch (Exception e) { throw new InvalidOperationException($"设备参数读取异常:{e.Message}"); } } /// /// 保存设备参数值到数据库 /// /// 设备信息 /// OPC节点值列表 /// 输出参数值DTO列表 public void SaveParam(BaseDeviceInfo device, List opcItemValues, out List paramValues) { paramValues = new List(); try { foreach (OpcNode opcItem in opcItemValues) { BaseDeviceParamVal deviceParamVal = new BaseDeviceParamVal(); 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}"); } } }