特性:为 OpcUaServiceManager 和 S7ServiceManager 添加 VariableChanged 事件订阅
- OpcUaServiceManager 更新:
- 添加了 OnVariableChanged 事件订阅
- 实现了 OnVariableChanged 事件处理方法,根据变量属性变化类型进行相应处理
- 对于 OPC UA Node ID、更新类型或轮询间隔变化,重新设置设备订阅
- 对于激活状态变化,更新设备上下文中的变量列表
- 对于变量删除,从设备上下文中移除对应变量
- S7ServiceManager 更新:
- 添加了 OnVariableChanged 事件订阅
- 实现了 OnVariableChanged 事件处理方法,根据变量属性变化类型进行相应处理
- 对于 S7 地址变化,更新设备上下文中的变量映射
- 对于激活状态变化,更新设备上下文中的变量列表
- 对于变量删除,从设备上下文中移除对应变量
- 改进系统响应性:
- 使 OPC UA 和 S7 服务能够实时响应变量属性变更
- 提高了系统在变量配置更改时的动态适应能力
- 确保服务能够根据变量状态变化及时更新其内部数据结构
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user