报错信息如下;
ERROR:asyncua.common.subscription:DataChange subscription created but handler has no datachange_notification method
上述报错原因在于创建监控句柄SubscriptionHandler类时,节点数据变化的函数名称有问题,不是默认的datachange_notification,我写的是data_change_notification
完整的监控句柄SubscriptionHandler类代码如下:
class SubscriptionHandler:"""The SubscriptionHandler is used to handle the data that is received for the subscription."""def datachange_notification(self, node: Node, val, data):"""Callback for asyncua Subscription.This method will be called when the Client received a data change message from the Server."""print(node, val, data)def event_notification(self, event: Event):"""called for every event notification from server"""print(event)def status_change_notification(self, status):"""called for every status change notification from server"""print(status)
# 建立数据改变监控事件handler = SubscriptionHandler()subscription = await client.create_subscription(500, handler) # 500ms 发布间隔# 获取订阅节点数据node = await client.nodes.root.get_child('Objects/2:Message/3:start_message')await subscription.subscribe_data_change(node)
opcua的Client监控多个节点数据变化的使用方法参考文章:
opcua-asyncio:订阅多个地址
import sys
sys.path.insert(0, "..")
import time
import asyncio
from asyncua import Client, ua, Nodeurl = 'opc.tcp://192.168.200.204:8999'class SubscriptionHandler:def datachange_notification(self, node: Node, val, data):print(str(val))async def main():client = Client(url=url)async with client:handler = SubscriptionHandler()subscription = await client.create_subscription(500, handler)nodes = [client.get_node("ns=2;s=CncData/MachineStatus/Status"),client.get_node("ns=2;s=CncData/MachineStatus/Part/PieceToDo"),]await subscription.subscribe_data_change(nodes)while True:await asyncio.sleep(1)if __name__ == "__main__":asyncio.run(main())