跳到主要内容

translate_browse_paths

translate_browse_paths 服务把 "BrowsePath 字符串"批量解析为 NodeId, 单次 RPC. 比循环 resolve 快得多.

前置阅读

签名

def translate_browse_paths(
self,
paths: List[Tuple[str, str]]) -> List[TranslateResult]: ...

入参每项是 (starting_node_id, browse_path) 二元组.

TranslateResult 字段

@dataclass
class TranslateResult:
node_id: Optional[str] = None # 解析失败时 None
status: StatusCode = StatusCode.Bad

用法

paths = [
("i=85", "/Server/ServerStatus/CurrentTime"),
("i=85", "/Server/ServerStatus/State"),
("ns=2;s=Boiler1", "/Temperature"),
("ns=2;s=Boiler1", "/Pressure"),
]

results = ua.translate_browse_paths(paths)
for r in results:
if r.status == StatusCode.Good:
print(f"OK: {r.node_id}")
else:
print(f"Fail: {r.status.name}")

BrowsePath 段格式

格式含义
BrowseNamens=0 默认
ns:BrowseName指定 NamespaceIndex
/seg1/seg2/seg3多段, 用 /

例子:

BrowsePath含义
/Serverns=0 下子节点 Server
/2:Boiler1ns=2 下子节点 Boiler1
/Server/2:Boilers/2:Boiler1/2:Temperature多层组合

单条解析: resolve

def resolve(self, path: str, start_node_id: Optional[str] = None) -> Optional[OpcUaNode]: ...
node = ua.resolve("/Objects/Server/ServerStatus/CurrentTime")
if node is None:
print("not found")

resolve 内部走 translate_browse_paths 单条; 大量路径批量请直接用 translate_browse_paths.


与 resolve 的对比

APIRPC 次数适用
resolve(path)1 (内部走 translate_browse_paths 单条)偶尔用, 单条路径
translate_browse_paths(paths)1100+ 路径批量
链式索引器 node["a"]["b"]["c"]N (每段一次 browse)探索式

100 个 Tag 的初始化 NodeId 解析, 用 translate_browse_paths 比循环 resolve 快 10-100 倍.

下一步