asyncua模块实现OPC UA通讯

asyncua是OPCUA的python实现,使用起来非常方便,其github地址是https://github.com/FreeOpcUa/opcua-asyncio

UaExpert是OPC UA Client的GUI工具,当编写好server代码后并运行,我们可以使用UaExpert去和server进行通信。UaExpert使用教程参考:https://blog.youkuaiyun.com/watsoncheung/article/details/124268979

1. OPCUA的两种工作方式

客户端/服务器模式:在这种模式下,OPC UA 客户端向 OPC UA 服务器请求数据,服务器接收请求并向客户端发送数据。

发布/订阅模式:在这种模式下,OPC UA 服务器将数据“发布”到网络上,而客户端可以“订阅”特定的数据。当服务器更新数据时,客户端会收到更新的数据。

这两种模式可以根据应用场景的需要进行选择。例如,客户端/服务器模式适用于客户端需要向服务器请求单个数据项的情况,而发布/订阅模式则适用于客户端需要定期接收大量数据的情况。

OPC UA Server示例代码:

import logging
import asyncio
from asyncua import Server


logging.basicConfig(level=logging.INFO)
_logger = logging.getLogger('asyncua')


async def main():
    # 创建server
    server = Server()

    # 初始化server
    await server.init()

    # 设置server的endpoint地址
    server.set_endpoint('opc.tcp://192.168.5.86:4840/freeopcua/server/')
    # 设置server的名字
    server.set_server_name('MyOPCUAServer')

    # 设置自己的namespace,也可以不做
    uri = 'http://examples.freeopcua.github.io'
    idx = await server.register_namespace(uri)

    # 在上面的namespace下添加一个对象,名叫MyObject
    myobj = await server.nodes.objects.add_object(idx, 'MyObject')
    # 在MyObject下添加一个变量,名叫MyVariable,初始值是6.7
    myvar = await myobj.add_variable(idx, 'MyVariable', 6.7)
    # 设置改变量为可写
    await myvar.set_writable()

    _logger.info('Starting server!')

    # 让server一直运行
    async with server:
        while Tru
### 如何使用 Python 实现 OPC UA 的数据变化订阅 在 Python 中,可以利用 `asyncua` 库来实现 OPC UA 数据的变化订阅功能。通过定义一个自定义的处理程序类(继承自 `SubHandler`),可以在节点值发生变化时触发回调函数。 以下是基于引用中的代码片段构建的一个完整的示例[^2]: ```python import asyncio from asyncua import Client, ua class SubHandler: """ 订阅器处理器用于接收并处理数据变化通知。 """ def datachange_notification(self, node, val, data): # 提取节点 ID 并打印设备和标签信息以及新值 id_node = node.nodeid.Identifier.split('.', maxsplit=2) id_device = id_node[1] tag = id_node[2] print(f"Device: {id_device}, Tag: {tag}, Value: {val}") async def main(): url = "opc.tcp://192.168.0.74:49320" # 创建客户端实例并与服务器建立连接 async with Client(url=url) as client: # 获取目标节点 (例如 ns=2;s=通道 1.设备 1.标记 1) tag_node = client.get_node("ns=2;s=通道 1.设备 1.标记 1") # 初始化订阅服务 sub = await client.create_subscription(500, SubHandler()) # 添加要监控的节点到订阅中 handle = await sub.subscribe_data_change(tag_node) # 防止程序立即退出,保持运行状态以便接收更新 while True: await asyncio.sleep(1) if __name__ == "__main__": try: asyncio.run(main()) except KeyboardInterrupt: print("\nProgram terminated by user.") ``` #### 关键点解析 - **Client 类**: 使用 `Client` 来创建与 OPC UA 服务器的连接[^2]。 - **Subscription 和 DataChangeNotification**: 调用 `client.create_subscription()` 方法设置订阅间隔时间,并传入自定义的 `SubHandler` 处理对象[^2]。 - **SubHandler 类**: 定义了一个名为 `datachange_notification` 的方法,在每次检测到指定节点的数据发生改变时被调用[^2]。 - **异步编程模型**: 整个过程依赖于 `asyncio` 模块支持的协程机制,因此所有的操作都需声明为异步 (`await`) 函数[^2]。 此脚本会持续监听所选节点上的任何数值变动,并实时输出这些更改的信息至控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草莓仙生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值