change - 修改采集逻辑

master
wenjy 4 weeks ago
parent 59eaa8bc33
commit 54151e8536

@ -40,11 +40,11 @@ public class DeviceCollectionBusiness
private readonly BaseDeviceInfoCacheService _cacheService;
private readonly List<IOpcService> _opcs;
private readonly Dictionary<BaseDeviceInfo, IOpcService> _opcs;
private readonly IBaseService<BaseDeviceParamVal> _paramValService;
public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService, List<IOpcService> opcs, IBaseService<BaseDeviceParamVal> paramValService)
public DeviceCollectionBusiness(SerilogHelper serilogHelper, BaseDeviceInfoCacheService cacheService, Dictionary<BaseDeviceInfo, IOpcService> opcs, IBaseService<BaseDeviceParamVal> 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<DeviceParamValueDto> paramValues);
this.SaveParam(item, opcItemValues, out List<BaseDeviceParamVal> 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();
_serilog.Info($"读取完成断开连接");
}
await Task.Delay(1000 * 1);
} while (isFalg);
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<DeviceParamValueDto> 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);
//}
/// <summary>
/// 读取设备参数
/// </summary>
@ -132,20 +172,8 @@ public class DeviceCollectionBusiness
List<string> deviceParams = device.deviceParams.Select(x => x.paramAddr).ToList();
//bool result = await _opcUaService.ConnectAsync(device.networkAddress);
//if (!result)
//{
// throw new ArgumentNullException($"设备未连接");
//}
List<OpcNode> 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
/// <param name="opcItemValues">OPC节点值列表</param>
/// <param name="paramValues">输出参数值DTO列表</param>
public void SaveParam(BaseDeviceInfo device, List<OpcNode> opcItemValues,
out List<DeviceParamValueDto> paramValues)
out List<BaseDeviceParamVal> paramValues)
{
var deviceParams = device.deviceParams.ToList();
var now = DateTime.Now;
// 使用字典提高查找效率
var opcValueDict = opcItemValues.ToDictionary(v => v.NodeId, v => v);
// 构建参数值列表和数据库实体列表
var paramValueList = new List<DeviceParamValueDto>();
var dbEntityList = new List<BaseDeviceParamVal>();
foreach (var param in deviceParams)
paramValues = new List<BaseDeviceParamVal>();
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;
}
}
}
}

@ -15,54 +15,54 @@ public class BaseDeviceParamVal
/// 备 注:主键
///</summary>
[SugarColumn(ColumnName = "RECORD_ID", IsPrimaryKey = true)]
public decimal RECORD_ID { get; set; }
public decimal objId { get; set; }
/// <summary>
/// 备 注:参数编号
///</summary>
[SugarColumn(ColumnName = "PARAM_CODE")]
public string? PARAM_CODE { get; set; }
public string? paramCode { get; set; }
/// <summary>
/// 备 注:设备编号
///</summary>
[SugarColumn(ColumnName = "DEVICE_CODE")]
public string? DEVICE_CODE { get; set; }
public string? deviceCode { get; set; }
/// <summary>
/// 备 注:设备ID
///</summary>
[SugarColumn(ColumnName = "DEVICE_ID")]
public decimal? DEVICE_ID { get; set; }
public decimal? deviceId { get; set; }
/// <summary>
/// 备 注:参数名称
///</summary>
[SugarColumn(ColumnName = "PARAM_NAME")]
public string? PARAM_NAME { get; set; }
public string? paramName { get; set; }
/// <summary>
/// 备 注:参数值
///</summary>
[SugarColumn(ColumnName = "PARAM_VALUE")]
public string? PARAM_VALUE { get; set; }
public string? paramValue { get; set; }
/// <summary>
/// 备 注:采集时间
///</summary>
[SugarColumn(ColumnName = "COLLECT_TIME")]
public DateTime? COLLECT_TIME { get; set; }
public DateTime? collectTime { get; set; }
/// <summary>
/// 备 注:记录时间(默认当前时间)
///</summary>
[SugarColumn(ColumnName = "RECORD_TIME")]
public DateTime RECORD_TIME { get; set; }
public DateTime recordTime { get; set; }
/// <summary>
/// 备 注:参数类型
///</summary>
[SugarColumn(ColumnName = "PARAM_TYPE")]
public string? PARAM_TYPE { get; set; }
public string? paramType { get; set; }
}

@ -16,13 +16,13 @@ namespace Sln.Imm.Daemon.Opc
{
public static void AddOpcDeviceFactorySetup(this IServiceCollection services)
{
services.AddSingleton<List<IOpcService>>(x =>
services.AddSingleton<Dictionary<BaseDeviceInfo, IOpcService>>(x =>
{
var _cacheService = x.GetService<BaseDeviceInfoCacheService>();
List<BaseDeviceInfo> deviceInfos = _cacheService.GetValueAsync("BaseDeviceInfoCache").Result;
List<BaseDeviceInfo> deviceInfos = _cacheService.GetValueAsync("BaseDeviceInfoCache").Result;
List<IOpcService> opcs = new List<IOpcService>();
Dictionary<BaseDeviceInfo, IOpcService> opcs = new Dictionary<BaseDeviceInfo, IOpcService>();
if (deviceInfos != null)
{
foreach (var item in deviceInfos)
@ -39,7 +39,7 @@ namespace Sln.Imm.Daemon.Opc
opcDev = x.GetService<OpcDaService>();
}
if(opcDev != null)
if (opcDev != null)
{
var res = opcDev.ConnectAsync(item.networkAddress).Result;
@ -50,7 +50,7 @@ namespace Sln.Imm.Daemon.Opc
}
else
{
opcs.Add(opcDev);
opcs.Add(item, opcDev);
}
}
}

@ -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>();
//deviceCollectionBusiness?.Handle();
deviceCollectionBusiness?.Handle();
List<IOpcService> opcs = ServiceProvider.GetService<List<IOpcService>>();
//List<IOpcService> opcs = ServiceProvider.GetService<List<IOpcService>>();
if( opcs != null )
{
foreach( var opc in opcs)
{
var res = opc.ReadNodeAsync(new List<string>()
{
"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<string>()
// {
// "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();

Loading…
Cancel
Save