将PollLevelType类型改为int类型

This commit is contained in:
2025-09-05 19:59:21 +08:00
parent 8b86f079e5
commit 6e123b47cc
16 changed files with 88 additions and 146 deletions

View File

@@ -35,8 +35,7 @@ public class DbVariable
/// <summary>
/// 变量的轮询级别,决定数据采集频率。
/// </summary>
[SugarColumn(ColumnDataType="varchar(20)",SqlParameterDbType=typeof(EnumToStringConvert))]
public PollLevelType PollLevel { get; set; }
public int PollLevel { get; set; }
/// <summary>
/// 指示此变量是否处于激活状态。

View File

@@ -263,7 +263,7 @@ public static class ExcelHelper
variable.OpcUaNodeId = "";
variable.Protocol = ProtocolType.S7;
variable.PollLevel = PollLevelType.ThirtySeconds;
variable.PollLevel = 30000; // ThirtySeconds
variableDatas.Add(variable);
}

View File

@@ -260,7 +260,7 @@ public class ExcelService : IExcelService
variable.OpcUaNodeId = "";
variable.Protocol = ProtocolType.S7;
variable.PollLevel = PollLevelType.ThirtySeconds;
variable.PollLevel = 30000; // ThirtySeconds
variableDatas.Add(variable);
}

View File

@@ -52,25 +52,22 @@ public class OpcUaBackgroundService : BackgroundService
private readonly int _opcUaSubscriptionSamplingIntervalMs = 1000;
// 模拟 PollingIntervals实际应用中可能从配置或数据库加载
private static readonly Dictionary<PollLevelType, TimeSpan> PollingIntervals
= new Dictionary<PollLevelType, TimeSpan>
private static readonly Dictionary<int, TimeSpan> PollingIntervals
= new Dictionary<int, TimeSpan>
{
{ PollLevelType.TenMilliseconds, TimeSpan.FromMilliseconds((int)PollLevelType.TenMilliseconds) },
{ PollLevelType.HundredMilliseconds, TimeSpan.FromMilliseconds((int)PollLevelType.HundredMilliseconds) },
{
PollLevelType.FiveHundredMilliseconds,
TimeSpan.FromMilliseconds((int)PollLevelType.FiveHundredMilliseconds)
},
{ PollLevelType.OneSecond, TimeSpan.FromMilliseconds((int)PollLevelType.OneSecond) },
{ PollLevelType.FiveSeconds, TimeSpan.FromMilliseconds((int)PollLevelType.FiveSeconds) },
{ PollLevelType.TenSeconds, TimeSpan.FromMilliseconds((int)PollLevelType.TenSeconds) },
{ PollLevelType.TwentySeconds, TimeSpan.FromMilliseconds((int)PollLevelType.TwentySeconds) },
{ PollLevelType.ThirtySeconds, TimeSpan.FromMilliseconds((int)PollLevelType.ThirtySeconds) },
{ PollLevelType.OneMinute, TimeSpan.FromMilliseconds((int)PollLevelType.OneMinute) },
{ PollLevelType.ThreeMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.ThreeMinutes) },
{ PollLevelType.FiveMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.FiveMinutes) },
{ PollLevelType.TenMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.TenMinutes) },
{ PollLevelType.ThirtyMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.ThirtyMinutes) }
{ 10, TimeSpan.FromMilliseconds(10) }, // TenMilliseconds
{ 100, TimeSpan.FromMilliseconds(100) }, // HundredMilliseconds
{ 500, TimeSpan.FromMilliseconds(500) }, // FiveHundredMilliseconds
{ 1000, TimeSpan.FromMilliseconds(1000) }, // OneSecond
{ 5000, TimeSpan.FromMilliseconds(5000) }, // FiveSeconds
{ 10000, TimeSpan.FromMilliseconds(10000) }, // TenSeconds
{ 20000, TimeSpan.FromMilliseconds(20000) }, // TwentySeconds
{ 30000, TimeSpan.FromMilliseconds(30000) }, // ThirtySeconds
{ 60000, TimeSpan.FromMilliseconds(60000) }, // OneMinute
{ 180000, TimeSpan.FromMilliseconds(180000) }, // ThreeMinutes
{ 300000, TimeSpan.FromMilliseconds(300000) }, // FiveMinutes
{ 600000, TimeSpan.FromMilliseconds(600000) }, // TenMinutes
{ 1800000, TimeSpan.FromMilliseconds(1800000) } // ThirtyMinutes
};
public OpcUaBackgroundService(IDataCenterService dataCenterService,IDataProcessingService dataProcessingService, ILogger<OpcUaBackgroundService> logger)
@@ -283,12 +280,12 @@ public class OpcUaBackgroundService : BackgroundService
var variableGroup = opcUaVariables.GroupBy(variable => variable.PollLevel);
foreach (var vGroup in variableGroup)
{
var pollLevelType = vGroup.Key;
var pollLevel = vGroup.Key;
var opcUaNodes
= vGroup.Select(variableDto => new OpcUaNode() { NodeId = variableDto.OpcUaNodeId })
.ToList();
PollingIntervals.TryGetValue(pollLevelType, out var pollLevel);
PollingIntervals.TryGetValue(pollLevel, out var interval);
opcUaService.SubscribeToNode(opcUaNodes,HandleDataChanged,10000,1000);
}
}

View File

@@ -223,7 +223,7 @@ namespace DMS.Infrastructure.Services
// 为每个PollLevel组设置单独的订阅
foreach (var group in variablesByPollLevel)
{
PollLevelType pollLevel = group.Key;
int pollLevel = group.Key;
var variables = group.Value;
_logger.LogInformation("为设备 {DeviceName} 设置PollLevel {PollLevel} 的订阅,变量数: {VariableCount}",
@@ -253,23 +253,23 @@ namespace DMS.Infrastructure.Services
/// <summary>
/// 根据PollLevel获取发布间隔毫秒
/// </summary>
private int GetPublishingIntervalFromPollLevel(PollLevelType pollLevel)
private int GetPublishingIntervalFromPollLevel(int pollLevel)
{
// 根据PollLevelType枚举值映射到发布间隔
// 根据轮询级别值映射到发布间隔
return pollLevel switch
{
PollLevelType.HundredMilliseconds => 100, // TenMilliseconds -> 100ms发布间隔
PollLevelType.FiveHundredMilliseconds => 500, // HundredMilliseconds -> 500ms发布间隔
PollLevelType.OneSecond => 1000, // FiveHundredMilliseconds -> 1000ms发布间隔
PollLevelType.FiveSeconds => 5000, // OneSecond -> 2000ms发布间隔
PollLevelType.TenSeconds => 10000, // TenSeconds -> 10000ms发布间隔
PollLevelType.TwentySeconds => 20000, // TwentySeconds -> 20000ms发布间隔
PollLevelType.ThirtySeconds => 30000, // ThirtySeconds -> 30000ms发布间隔
PollLevelType.OneMinute => 60000, // OneMinute -> 60000ms发布间隔
PollLevelType.FiveMinutes => 300000, // ThreeMinutes -> 120000ms发布间隔
PollLevelType.TenMinutes => 600000, // FiveMinutes -> 180000ms发布间隔
PollLevelType.ThirtyMinutes => 1800000, // TenMinutes -> 300000ms发布间隔
PollLevelType.OneHour => 3600000, // ThirtyMinutes -> 600000ms发布间隔
100 => 100, // HundredMilliseconds -> 100ms发布间隔
500 => 500, // FiveHundredMilliseconds -> 500ms发布间隔
1000 => 1000, // OneSecond -> 1000ms发布间隔
5000 => 5000, // FiveSeconds -> 5000ms发布间隔
10000 => 10000, // TenSeconds -> 10000ms发布间隔
20000 => 20000, // TwentySeconds -> 20000ms发布间隔
30000 => 30000, // ThirtySeconds -> 30000ms发布间隔
60000 => 60000, // OneMinute -> 60000ms发布间隔
300000 => 300000, // FiveMinutes -> 300000ms发布间隔
600000 => 600000, // TenMinutes -> 600000ms发布间隔
1800000 => 1800000, // ThirtyMinutes -> 1800000ms发布间隔
3600000 => 3600000, // OneHour -> 3600000ms发布间隔
_ => _options.SubscriptionPublishingIntervalMs // 默认值
};
}

View File

@@ -30,24 +30,24 @@ public class OptimizedS7BackgroundService : BackgroundService
private readonly int _s7PollOnceSleepTimeMs = 50;
// 存储每个设备的变量按轮询级别分组
private readonly ConcurrentDictionary<int, Dictionary<PollLevelType, List<VariableDto>>> _variablesByPollLevel = new();
private readonly ConcurrentDictionary<int, Dictionary<int, List<VariableDto>>> _variablesByPollLevel = new();
// 模拟 PollingIntervals实际应用中可能从配置或数据库加载
private static readonly Dictionary<PollLevelType, TimeSpan> PollingIntervals = new Dictionary<PollLevelType, TimeSpan>
private static readonly Dictionary<int, TimeSpan> PollingIntervals = new Dictionary<int, TimeSpan>
{
{ PollLevelType.TenMilliseconds, TimeSpan.FromMilliseconds((int)PollLevelType.TenMilliseconds) },
{ PollLevelType.HundredMilliseconds, TimeSpan.FromMilliseconds((int)PollLevelType.HundredMilliseconds) },
{ PollLevelType.FiveHundredMilliseconds, TimeSpan.FromMilliseconds((int)PollLevelType.FiveHundredMilliseconds) },
{ PollLevelType.OneSecond, TimeSpan.FromMilliseconds((int)PollLevelType.OneSecond) },
{ PollLevelType.FiveSeconds, TimeSpan.FromMilliseconds((int)PollLevelType.FiveSeconds) },
{ PollLevelType.TenSeconds, TimeSpan.FromMilliseconds((int)PollLevelType.TenSeconds) },
{ PollLevelType.TwentySeconds, TimeSpan.FromMilliseconds((int)PollLevelType.TwentySeconds) },
{ PollLevelType.ThirtySeconds, TimeSpan.FromMilliseconds((int)PollLevelType.ThirtySeconds) },
{ PollLevelType.OneMinute, TimeSpan.FromMilliseconds((int)PollLevelType.OneMinute) },
{ PollLevelType.ThreeMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.ThreeMinutes) },
{ PollLevelType.FiveMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.FiveMinutes) },
{ PollLevelType.TenMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.TenMinutes) },
{ PollLevelType.ThirtyMinutes, TimeSpan.FromMilliseconds((int)PollLevelType.ThirtyMinutes) }
{ 10, TimeSpan.FromMilliseconds(10) }, // TenMilliseconds
{ 100, TimeSpan.FromMilliseconds(100) }, // HundredMilliseconds
{ 500, TimeSpan.FromMilliseconds(500) }, // FiveHundredMilliseconds
{ 1000, TimeSpan.FromMilliseconds(1000) }, // OneSecond
{ 5000, TimeSpan.FromMilliseconds(5000) }, // FiveSeconds
{ 10000, TimeSpan.FromMilliseconds(10000) }, // TenSeconds
{ 20000, TimeSpan.FromMilliseconds(20000) }, // TwentySeconds
{ 30000, TimeSpan.FromMilliseconds(30000) }, // ThirtySeconds
{ 60000, TimeSpan.FromMilliseconds(60000) }, // OneMinute
{ 180000, TimeSpan.FromMilliseconds(180000) }, // ThreeMinutes
{ 300000, TimeSpan.FromMilliseconds(300000) }, // FiveMinutes
{ 600000, TimeSpan.FromMilliseconds(600000) }, // TenMinutes
{ 1800000, TimeSpan.FromMilliseconds(1800000) } // ThirtyMinutes
};
/// <summary>
@@ -223,7 +223,7 @@ public class OptimizedS7BackgroundService : BackgroundService
/// <summary>
/// 检查是否应该轮询变量
/// </summary>
private bool ShouldPollVariables(List<VariableDto> variables, PollLevelType pollLevel)
private bool ShouldPollVariables(List<VariableDto> variables, int pollLevel)
{
if (!PollingIntervals.TryGetValue(pollLevel, out var interval))
return false;

View File

@@ -26,8 +26,8 @@ namespace DMS.Infrastructure.Services
private readonly ILogger<S7DeviceAgent> _logger;
private Plc _plc;
private bool _isConnected;
private readonly Dictionary<PollLevelType, List<Variable>> _variablesByPollLevel;
private readonly Dictionary<PollLevelType, DateTime> _lastPollTimes;
private readonly Dictionary<int, List<Variable>> _variablesByPollLevel;
private readonly Dictionary<int, DateTime> _lastPollTimes;
public S7DeviceAgent(Device device, IChannelBus channelBus, IMessenger messenger, ILogger<S7DeviceAgent> logger)
{
@@ -36,8 +36,8 @@ namespace DMS.Infrastructure.Services
_messenger = messenger ?? throw new ArgumentNullException(nameof(messenger));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_variablesByPollLevel = new Dictionary<PollLevelType, List<Variable>>();
_lastPollTimes = new Dictionary<PollLevelType, DateTime>();
_variablesByPollLevel = new Dictionary<int, List<Variable>>();
_lastPollTimes = new Dictionary<int, DateTime>();
InitializePlc();
}
@@ -175,7 +175,7 @@ namespace DMS.Infrastructure.Services
}
}
private bool ShouldPoll(PollLevelType pollLevel)
private bool ShouldPoll(int pollLevel)
{
// 获取轮询间隔
var interval = GetPollingInterval(pollLevel);
@@ -189,28 +189,28 @@ namespace DMS.Infrastructure.Services
return true;
}
private TimeSpan GetPollingInterval(PollLevelType pollLevel)
private TimeSpan GetPollingInterval(int pollLevel)
{
return pollLevel switch
{
PollLevelType.TenMilliseconds => TimeSpan.FromMilliseconds(10),
PollLevelType.HundredMilliseconds => TimeSpan.FromMilliseconds(100),
PollLevelType.FiveHundredMilliseconds => TimeSpan.FromMilliseconds(500),
PollLevelType.OneSecond => TimeSpan.FromMilliseconds(1000),
PollLevelType.FiveSeconds => TimeSpan.FromMilliseconds(5000),
PollLevelType.TenSeconds => TimeSpan.FromMilliseconds(10000),
PollLevelType.TwentySeconds => TimeSpan.FromMilliseconds(20000),
PollLevelType.ThirtySeconds => TimeSpan.FromMilliseconds(30000),
PollLevelType.OneMinute => TimeSpan.FromMinutes(1),
PollLevelType.ThreeMinutes => TimeSpan.FromMinutes(3),
PollLevelType.FiveMinutes => TimeSpan.FromMinutes(5),
PollLevelType.TenMinutes => TimeSpan.FromMinutes(10),
PollLevelType.ThirtyMinutes => TimeSpan.FromMinutes(30),
10 => TimeSpan.FromMilliseconds(10), // TenMilliseconds
100 => TimeSpan.FromMilliseconds(100), // HundredMilliseconds
500 => TimeSpan.FromMilliseconds(500), // FiveHundredMilliseconds
1000 => TimeSpan.FromMilliseconds(1000), // OneSecond
5000 => TimeSpan.FromMilliseconds(5000), // FiveSeconds
10000 => TimeSpan.FromMilliseconds(10000), // TenSeconds
20000 => TimeSpan.FromMilliseconds(20000), // TwentySeconds
30000 => TimeSpan.FromMilliseconds(30000), // ThirtySeconds
60000 => TimeSpan.FromMilliseconds(60000), // OneMinute
180000 => TimeSpan.FromMilliseconds(180000), // ThreeMinutes
300000 => TimeSpan.FromMilliseconds(300000), // FiveMinutes
600000 => TimeSpan.FromMilliseconds(600000), // TenMinutes
1800000 => TimeSpan.FromMilliseconds(1800000), // ThirtyMinutes
_ => TimeSpan.FromMilliseconds(1000)
};
}
private async Task PollVariablesByLevelAsync(List<Variable> variables, PollLevelType pollLevel)
private async Task PollVariablesByLevelAsync(List<Variable> variables, int pollLevel)
{
// 批量读取变量
var dataItems = new List<DataItem>();