Python-opcua编程(5)-数据变化通知(datachange_notification)

        在OPCUA服务器端,当数据或者变化时,要做一些处理。例如:在聚合服务器或者网关程序中,当客户端修改某一个变量时,需要将修改值传递给底层服务器或者现场总线设备(比如modbus设备。

      这是一种中继方式。SubHanlder 相当于AfterWriteCallback 程序。

演示代码

import sys
sys.path.insert(0, "..")
import time
from opcua import  Server
class SubHandler(object):
   def datachange_notification(self, node, val, data):
       print(node.get_browse_name().Name+" DataChanged")
       pass
if __name__ == "__main__":

    # setup our server
    server = Server()
    server.set_endpoint("opc.tcp://127.0.0.1:48400/freeopcua/server/")
    uri = "http://examples.freeopcua.github.io"
    idx = server.register_namespace(uri)

    # get Objects node, this is where we should put our nodes
    objects = server.get_objects_node()

    # populating our address space
    myobj = objects.add_object(idx, "MyObject")
    myvar = myobj.add_variable(idx, "MyVariable", 6.7)
    myvar.set_writable()    # Set MyVariable to be writable by clients
    
    # starting!
    server.start()
    handler = SubHandler()
    sub = server.create_subscription(100, handler)
    sub.subscribe_data_change(myvar)
    try:
        count = 0
        while True:
            time.sleep(1)
            count += 0.1
            myvar.set_value(count)
    finally:
        #close connection, remove subcsriptions, etc
        server.stop()

在上面的程序中,使用下列函数实现订阅

subscribe_data_change(nodesattr=<AttributeIds.Value: 13>queuesize=0)

nodes可以为一个node 也可以为以节点的数组,例如

sub.subscribe_data_change([myvar1,myvar2])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Python多节点订阅opcua的示例代码: ```python from opcua import Client from opcua import ua # 定义订阅的节点ID node_ids = [ "ns=2;i=1", "ns=2;i=2", "ns=2;i=3" ] # 定义订阅的节点名称 node_names = [ "Node1", "Node2", "Node3" ] # 定义订阅的节点数据类型 node_datatypes = [ ua.NodeId(ua.ObjectIds.Int16), ua.NodeId(ua.ObjectIds.Float), ua.NodeId(ua.ObjectIds.String) ] # 定义订阅的节点值变化处理函数 def datachange_notification(node, val, data): print("Node {} value changed to: {}".format(node, val)) if __name__ == "__main__": # 创建OPC UA客户端 client = Client("opc.tcp://localhost:4840/freeopcua/server/") # 连接到OPC UA服务器 client.connect() # 创建订阅对象 subscription = client.create_subscription(500, datachange_notification) # 添加订阅的节点 for i in range(len(node_ids)): node = client.get_node(node_ids[i]) handle = subscription.subscribe_data_change(node, data=node_datatypes[i]) print("Subscribed to node {} with handle {}".format(node_names[i], handle)) # 等待订阅的节点值变化 try: while True: pass finally: # 取消订阅 subscription.unsubscribe_all() # 断开连接 client.disconnect() ``` 该示例代码中,我们首先定义了三个订阅的节点ID、名称和数据类型,然后定义了一个处理节点值变化的函数。在主函数中,我们创建了一个OPC UA客户端并连接到OPC UA服务器,然后创建了一个订阅对象,并添加了三个订阅的节点。最后,我们等待订阅的节点值变化,直到程序被中断。当节点值发生变化时,处理函数会被调用并输出节点名称和新的节点值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值