特性:为 OpcUaServiceManager 和 S7ServiceManager 添加 VariableChanged 事件订阅

- OpcUaServiceManager 更新:
     - 添加了 OnVariableChanged 事件订阅
     - 实现了 OnVariableChanged 事件处理方法,根据变量属性变化类型进行相应处理
     - 对于 OPC UA Node ID、更新类型或轮询间隔变化,重新设置设备订阅
     - 对于激活状态变化,更新设备上下文中的变量列表
     - 对于变量删除,从设备上下文中移除对应变量

   - S7ServiceManager 更新:
     - 添加了 OnVariableChanged 事件订阅
     - 实现了 OnVariableChanged 事件处理方法,根据变量属性变化类型进行相应处理
     - 对于 S7 地址变化,更新设备上下文中的变量映射
     - 对于激活状态变化,更新设备上下文中的变量列表
     - 对于变量删除,从设备上下文中移除对应变量

   - 改进系统响应性:
     - 使 OPC UA 和 S7 服务能够实时响应变量属性变更
     - 提高了系统在变量配置更改时的动态适应能力
     - 确保服务能够根据变量状态变化及时更新其内部数据结构
This commit is contained in:
2025-10-02 19:47:29 +08:00
parent f3e7793293
commit acd397ea55
3 changed files with 171 additions and 29 deletions

View File

@@ -47,6 +47,7 @@ namespace DMS.Infrastructure.Services.S7
_eventService.OnVariableActiveChanged += OnVariableActiveChanged;
_eventService.OnBatchImportVariables += OnBatchImportVariables;
_eventService.OnVariableChanged += OnVariableChanged;
}
private void OnVariableActiveChanged(object? sender, VariablesActiveChangedEventArgs e)
@@ -407,6 +408,71 @@ namespace DMS.Infrastructure.Services.S7
_logger.LogError(ex, "处理批量导入变量事件时发生错误");
}
}
/// <summary>
/// 处理变量变更事件
/// </summary>
private void OnVariableChanged(object? sender, VariableChangedEventArgs e)
{
try
{
_logger.LogDebug("处理变量变更事件: 变量ID={VariableId}, 变更类型={ChangeType}, 变更属性={PropertyType}",
e.Variable.Id, e.ChangeType, e.PropertyType);
// 根据变更类型和属性类型进行相应处理
switch (e.ChangeType)
{
case ActionChangeType.Updated:
// 如果变量的S7相关属性发生变化
switch (e.PropertyType)
{
case VariablePropertyType.S7Address:
// S7地址变化需要更新设备上下文中的变量映射
if (_deviceContexts.TryGetValue(e.Variable.VariableTable.DeviceId, out var context))
{
// 先移除旧地址的变量
context.Variables.Remove(e.Variable.S7Address, out _);
// 添加新地址的变量
context.Variables.AddOrUpdate(e.Variable.S7Address, e.Variable, (key, oldValue) => e.Variable);
_logger.LogInformation("已更新设备 {DeviceId} 中变量 {VariableId} 的S7地址映射",
e.Variable.VariableTable.DeviceId, e.Variable.Id);
}
break;
case VariablePropertyType.IsActive:
// 变量激活状态变化,更新变量列表
if (_deviceContexts.TryGetValue(e.Variable.VariableTable.DeviceId, out var context2))
{
if (e.Variable.IsActive)
{
// 添加变量到监控列表
context2.Variables.AddOrUpdate(e.Variable.S7Address, e.Variable, (key, oldValue) => e.Variable);
}
else
{
// 从监控列表中移除变量
context2.Variables.Remove(e.Variable.S7Address, out _);
}
}
break;
}
break;
case ActionChangeType.Deleted:
// 变量被删除时,从设备上下文的变量列表中移除
if (_deviceContexts.TryGetValue(e.Variable.VariableTable.DeviceId, out var context3))
{
context3.Variables.Remove(e.Variable.S7Address, out _);
}
break;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "处理变量变更事件时发生错误: 变量ID={VariableId}, 变更类型={ChangeType}",
e.Variable.Id, e.ChangeType);
}
}
}
/// <summary>