变频器集成以及增加点动控制(0209)

This commit is contained in:
2026-02-09 11:36:37 +08:00
parent 88dfc53b9d
commit d6ad01274a
45 changed files with 7161 additions and 1578 deletions

View File

@ -17,24 +17,36 @@ class SubHandler:
def __init__(self):
self.data_changes = {}
self.change_count = 0
# 缓存节点名称,避免在回调中频繁查询
self.node_names = {}
def datachange_notification(self, node, val, data):
"""
数据变化时的回调函数
注意:此函数在订阅线程中调用,必须快速返回,避免耗时操作
"""
self.change_count += 1
node_name = node.get_display_name().Text
# 从缓存获取节点名称,避免发起网络请求
node_id = str(node)
if node_id in self.node_names:
node_name = self.node_names[node_id]
else:
# 如果缓存中没有尝试从节点ID中提取名称备用方案
node_name = node_id
# 存储数据变化
self.data_changes[node_name] = {
'value': val,
'timestamp': time.strftime('%Y-%m-%d %H:%M:%S'),
'node_id': str(node)
'node_id': node_id
}
print(f"🔔 数据变化 #{self.change_count}")
print(f" 节点: {node_name}")
print(f" 数值: {val}")
print(f" 时间: {self.data_changes[node_name]['timestamp']}")
print(f" 节点ID: {node}")
print("-" * 50)
class OPCUAClientSubscription:
@ -95,6 +107,23 @@ class OPCUAClientSubscription:
upper_weight_node = upper_device.get_child("2:upper_weight")
lower_weight_node = lower_device.get_child("2:lower_weight")
# 【关键优化】在订阅前预获取并缓存节点名称,避免回调中发起网络请求
try:
upper_name = upper_weight_node.get_display_name().Text
except Exception:
upper_name = "upper_weight"
try:
lower_name = lower_weight_node.get_display_name().Text
except Exception:
lower_name = "lower_weight"
# 缓存节点名称
self.handler.node_names[str(upper_weight_node)] = upper_name
self.handler.node_names[str(lower_weight_node)] = lower_name
print(f"📋 已缓存节点名称: {upper_name}, {lower_name}")
# 开始监控
upper_handle = self.subscription.subscribe_data_change(upper_weight_node)
lower_handle = self.subscription.subscribe_data_change(lower_weight_node)
@ -109,6 +138,8 @@ class OPCUAClientSubscription:
except Exception as e:
print(f"❌ 设置订阅失败: {e}")
import traceback
traceback.print_exc()
return False
def get_current_values(self):
@ -149,7 +180,7 @@ class OPCUAClientSubscription:
# 每5秒显示一次统计信息
if current_time - last_stats_time >= 5:
elapsed = current_time - start_time
changes_per_minute = (self.handler.change_count / elapsed) * 60
changes_per_minute = (self.handler.change_count / elapsed) * 60 if elapsed > 0 else 0
print(f"\n📈 统计信息 (运行时间: {elapsed:.1f}s)")
print(f" 总变化次数: {self.handler.change_count}")
@ -186,6 +217,8 @@ def main():
except Exception as e:
print(f"❌ 客户端运行错误: {e}")
import traceback
traceback.print_exc()
finally:
client.disconnect()
@ -198,6 +231,6 @@ if __name__ == "__main__":
try:
main()
except KeyboardInterrupt:
print("\n👋 用户中断程序")
sys.exit(0)
except Exception as e:
print(f"❌ 客户端运行错误: {e}")
sys.exit(1)