TranslateBrowsePaths
translate_browse_paths 服务把 "BrowsePath 字符串"批量解析为 NodeId, 单次 RPC.
比循环 resolve 快得多.
前置阅读
- 想链式探索建议用 Node 索引器.
- 100+ 路径批量初始化必用本 API.
签名
pub fn Session::translate_browse_paths(
&self,
paths: &[(String, String)], // (starting_node_id, browse_path)
) -> Result<Vec<TranslateResult>, OpcUaError>;
TranslateResult 字段
pub struct TranslateResult {
/// 解析得到的 NodeId, 空字符串表示解析失败 (看 status).
pub node_id: String,
/// 该路径的 StatusCode (Good = 解析成功).
pub status: StatusCode,
}
impl Display for TranslateResult { /* "NodeId [Status]" 或 "<failed: Status>" */ }
用法
let paths = vec![
("i=85".into(), "/Server/ServerStatus/CurrentTime".into()),
("i=85".into(), "/Server/ServerStatus/State".into()),
("ns=2;s=Boiler1".into(), "/Temperature".into()),
("ns=2;s=Boiler1".into(), "/Pressure".into()),
];
let results = s.translate_browse_paths(&paths)?;
for r in &results {
if r.status.is_good() {
println!("OK: {}", r.node_id);
} else {
println!("Fail: {}", r.status);
}
}
BrowsePath 段格式
| 格式 | 含义 |
|---|---|
BrowseName | ns=0 默认 |
ns:BrowseName | 指定 NamespaceIndex |
/seg1/seg2/seg3 | 多段, 用 / 分 |
例子:
| BrowsePath | 含义 |
|---|---|
/Server | ns=0 下子节点 Server |
/2:Boiler1 | ns=2 下子节点 Boiler1 |
/Server/2:Boilers/2:Boiler1/2:Temperature | 多层组合 |
与 resolve 的对比
| API | RPC 次数 | 适用 |
|---|---|---|
resolve(path) | 1 (内部走 TranslateBrowsePaths 单条) | 偶尔用, 单条路径 |
translate_browse_paths(&paths) | 1 | 100+ 路径批量 |
node.child(a).child(b).child(c) | N (每段一次 Browse) | 探索式 |
100 个 Tag 的初始化 NodeId 解析, 用 translate_browse_paths 比循环 resolve
快 10-100 倍.
错误处理
整体 RPC 失败返回 Err(OpcUaError). 单条路径失败不会让整个请求失败 — results[i].status
独立反映每条路径的解析结果, node_id 空字符串表示该路径未找到节点.