跳到主要内容

Darra OPC UA Client — Python SDK

Darra OPC UA Client Python 绑定. 跨语言对齐的高级 API, 你在这里学到的概念可以直接迁移到 C# / Java / C++ / Rust / C.

章节导航

安装

pip install darra-opcua

Wheel 包内含跨平台原生库 (Windows x64 / Linux x64 / macOS arm64), pip 安装后无需手动配置. 无需 ctypes 加载路径设置.

系统要求

要求
Python3.8+ (推荐 3.11)
OSWindows 10/11, Windows Server 2019+, Linux (glibc 2.28+), macOS 12+
CPUx64, ARM64
协议OPC UA TCP (opc.tcp://)

模块导入

from darra_opcua import (
OpcUaSession, # 主类 (= DarraOpcUa 别名)
OpcUaVariant, OpcUaDataValue,
OpcUaSubscription, EventSubscription,
OpcUaNode, NodeCollection, NamespaceCollection, Reference,
OpcUaDiscovery,
MessageSecurityMode, UserTokenType, SessionState,
BuiltinType, NodeClass, AttributeId, MonitoringMode,
StatusCode, OpcUaException,
HistoryAggregate, HistoryUpdateType,
well_known_nodes as wkn,
)

主要类型:

类型用途
OpcUaSessionClient 主类 (= DarraOpcUa, 二者等价)
OpcUaSubscription数据订阅容器 (= Subscription)
EventSubscription事件订阅 (Alarms & Conditions)
NodeCollection / OpcUaNodeLazy Load 节点访问
OpcUaVariant / OpcUaDataValue数据封装
OpcUaDiscoveryget_endpoints / find_servers (静态方法)
well_known_nodes (模块)OPC Foundation 标准节点常量, 短别名 wkn
OpcUaException携带 status_code 的异常

一分钟快速开始

from darra_opcua import OpcUaSession, OpcUaVariant

with OpcUaSession("opc.tcp://localhost:4840") as ua:
ua.connect()

# 读
with ua.read("ns=2;s=Temperature") as dv:
print(f"Temperature = {dv.value} °C")

# 写
ua.write("ns=2;s=Setpoint", OpcUaVariant().set_double(42.0))

# 订阅
with ua.create_subscription(500) as sub:
sub.data_changed.append(
lambda e: print(f"{e.node_id} = {e.value_string}"))
sub.add_node("ns=2;s=Counter")

import time
time.sleep(3)

高级 API 概览

功能入口 API说明
连接 / 加密OpcUaSession(...) + connect()NONE / Sign / SignAndEncrypt + Username / Anonymous / Certificate
单点读写ua.read / write单节点单 Attribute
批量读ua.read_many(node_ids[, attribute])一次 RPC, N 节点
浏览树ua.browse / browse_many / browse_with_paging / browse_next完整分页支持
路径解析ua.resolve / translate_browse_paths浏览路径 → NodeId
注册节点ua.register_nodes / unregister_nodes高频访问加速 30-50%
数据订阅ua.create_subscription + sub.add_node / add_manypublishing / sampling 双层
事件订阅ua.subscribe_events报警 & 条件
调方法ua.call(obj_id, mtd_id, [...])OPC UA Method 节点
历史读ua.read_history / ua.read_history_*Raw / Modified / AtTime / Processed / Events
历史写ua.update_history / ua.delete_history_rangeInsert / Replace / Update / Delete
心跳ua.keep_alive_interval_ms后台周期探测
自动重连(内置)检测断线 → Republish 订阅
统一事件ua.events.*会话 / 订阅 / 数据 / 通讯异常
服务发现OpcUaDiscovery.get_endpoints / find_servers不需要 Session
标准节点wkn.SERVER_SERVER_STATUS_CURRENT_TIMEOPC Foundation 标准 NodeId 常量

Python 特定要点

  • Context manager (with): OpcUaSession / OpcUaSubscription / OpcUaDataValue / OpcUaVariant 全部支持 with, 自动 dispose native 内存. 强烈推荐, 不要手动 close().
  • snake_case 方法名: ua.read / ua.browse / ua.create_subscription (不是 Read / Browse).
  • datetime 全 UTC: 历史 / 时间戳一律用 datetime.datetime (tzinfo=timezone.utc), 不要本地时间.
  • MessageSecurityMode.NONE 大写: Python 关键字 None 冲突, 用 MessageSecurityMode.NONE (其余值 Sign / SignAndEncrypt 大小写同 C#).
  • 回调防 GC: SDK 内部已用 list 持有 ctypes 回调引用 (防 native 调用时 Python 端 GC 释放函数对象). 用户代码无需关心, 但写自定义 ctypes 时要注意.
  • GIL: 回调在 C 层 Publish 线程触发, Python 端会拿 GIL 跑回调. 长操作会阻塞 Publish 队列, 建议放到队列让另一个线程消费.

跨语言对齐

C# SDK 的 API 命名 / 行为是其他语言绑定的参考实现. Python 绑定的命名遵循 PEP 8 (snake_case + property + context manager), 但语义一致 (例如 C# ua.Read ↔ Python ua.read). 选 Python 作为入门, 后续切其他语言时只需查 跨语言映射.

按左侧侧边栏顺序读完即可掌握全部 SDK API.