变频器集成以及增加点动控制(0209)
This commit is contained in:
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user