Darra OPC UA Client — Python SDK
Darra OPC UA Client Python 绑定. 跨语言对齐的高级 API, 你在这里学到的概念可以直接迁移到 C# / Java / C++ / Rust / C.
章节导航
- 入门 → Session 会话 (构造 / 连接 / read / write / KeepAlive)
- 浏览 → Nodes 节点 (browse / 路径解析 / register_nodes)
- 实时 → Subscription 订阅 (create_subscription / MonitoredItem / data_changed)
- 历史 → History 历史 (raw / modified / at_time / processed / events / update / delete)
- 调用 → Method 方法 (call)
- 发现 → Discovery 发现 (get_endpoints / find_servers)
- 数据 → Data Types (OpcUaVariant / OpcUaDataValue / well_known_nodes)
- 安全 → Security (证书 / 加密)
安装
- pip (推荐)
- requirements.txt
- Poetry
pip install darra-opcua
darra-opcua>=0.7.0
poetry add darra-opcua
Wheel 包内含跨平台原生库 (Windows x64 / Linux x64 / macOS arm64), pip 安装后无需手动配置. 无需 ctypes 加载路径设置.
系统要求
| 项 | 要求 |
|---|---|
| Python | 3.8+ (推荐 3.11) |
| OS | Windows 10/11, Windows Server 2019+, Linux (glibc 2.28+), macOS 12+ |
| CPU | x64, 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,
)
主要类型:
| 类型 | 用途 |
|---|---|
OpcUaSession | Client 主类 (= DarraOpcUa, 二者等价) |
OpcUaSubscription | 数据订阅容器 (= Subscription) |
EventSubscription | 事件订阅 (Alarms & Conditions) |
NodeCollection / OpcUaNode | Lazy Load 节点访问 |
OpcUaVariant / OpcUaDataValue | 数据封装 |
OpcUaDiscovery | get_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_many | publishing / 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_range | Insert / Replace / Update / Delete |
| 心跳 | ua.keep_alive_interval_ms | 后台周期探测 |
| 自动重连 | (内置) | 检测断线 → Republish 订阅 |
| 统一事件 | ua.events.* | 会话 / 订阅 / 数据 / 通讯异常 |
| 服务发现 | OpcUaDiscovery.get_endpoints / find_servers | 不需要 Session |
| 标准节点 | wkn.SERVER_SERVER_STATUS_CURRENT_TIME 等 | OPC 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.