报错信息如下;
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, Node
url = '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())