#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.Serilog; namespace Sln.Imm.Daemon.Business; public class DeviceCollectionBusiness { private readonly SerilogHelper _serilog; private readonly BaseDeviceInfoCacheService _cacheService; private readonly IOpcService _opcUaService; public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService,OpcUaService opcUaService) { _serilog = serilogHelper; _cacheService = cacheService; _opcUaService = opcUaService; this.Handle(); } public async Task Handle() { bool isFalg = true; var deviceInfos = await _cacheService.GetValueAsync("BaseDeviceInfoCache"); do { lock (string.Empty) { foreach (var item in deviceInfos) { Task.Run(async () => { try { _serilog.Info($"开始采集{item.deviceName},设备数据"); var opcItemValues = await this.ReadParam(item); this.SaveParam(item, opcItemValues, out List paramValues); _serilog.Info($"{item.deviceName}数据采集完成:{JsonConvert.SerializeObject(paramValues)}"); } catch (Exception e) { _serilog.Info($"{item.deviceName}数据读取异常:{e.Message}"); } }); } Task.Delay(1000 * 1).Wait(); } } while (isFalg); } /// /// 读取设备参数 /// /// public async Task> ReadParam(BaseDeviceInfo device) { try { if (device == null) { throw new ArgumentNullException($"设备信息不允许为空"); } List deviceParams = device.deviceParams.Select(x => x.paramAddr).ToList(); bool result = await _opcUaService.ConnectAsync(device.networkAddress); if (!result) { throw new ArgumentNullException($"设备未连接"); } List infos = await _opcUaService.ReadNodeAsync(deviceParams); //var infos = _opcService.BrowseNodesAsync("ns=2;s=Devices/分厂一/车间一/测试空设备"); await _opcUaService.DisconnectAsync(); return infos; } catch (Exception e) { throw new InvalidOperationException($"设备参数读取异常:{e.Message}"); } } /// /// /// /// /// public void SaveParam(BaseDeviceInfo device, List opcItemValues, out List paramValues) { var deviceParams = device.deviceParams.ToList(); paramValues = deviceParams .GroupJoin(opcItemValues, param => param.paramAddr, value => value.NodeId, (param, values) => new { Param = param, Values = values }) .SelectMany( x => x.Values.DefaultIfEmpty(), (x, value) => new DeviceParamValueDto { deviceCode = x.Param.deviceCode, paramCode = x.Param.paramCode, paramName = x.Param.paramName, netWork = x.Param.netWork, paramAddr = x.Param.paramAddr, paramType = x.Param.paramType, isFlag = x.Param.isFlag, paramValue = value.Value.ToString(), }) .ToList(); //保存数据库 } }