跳到主要内容

NodeCollection — s.Nodes()

darra::opcua::NodeCollection 是 Session 的节点访问入口, 通过索引器返回 Node 包装对象, 不立即触发 RPC (Lazy Load).

前置阅读

索引器

索引返回说明
Nodes()[std::string const& node_id]Node字符串 NodeId 访问

预定义入口方法

为方便, 内置常用入口:

类别属性类型访问说明
标准入口Root()NodeRAddress Space 根 (i=84)
Objects()NodeR业务数据根 (i=85)
Types()NodeR类型定义根 (i=86)
Views()NodeR视图根 (i=87)
Server()NodeRServer 自身对象 (i=2253)
// 这两行等价
auto t1 = s.Nodes().Server()["ServerStatus"]["CurrentTime"].Value();
auto t2 = s.Nodes()["i=2253"]["ServerStatus"]["CurrentTime"].Value();

Lazy Load 机制

auto node = s.Nodes()["ns=2;s=Temperature"];  // ← 不触发 RPC
auto dv = node.Value(); // ← 第一次 .Value() 才触发 Read

第二次访问 .Value() 还是会重新 Read (无缓存), 因为变量值随时变. 想缓存自己存变量.


子节点 BrowseName 索引

auto sub = node["ChildName"];   // 通过 BrowseName 浏览子节点

底层逻辑:

  1. 立即用 Browse(currentNodeId) 拿到子节点列表
  2. 找到 BrowseName == "ChildName" 的子, 返回 Node 包装
  3. 找不到返回 NodeId 为空的 Node, 后续 .Value() 会抛 Exception

第一次访问会有 RPC 开销 (~5-10 ms), 后续路径访问连串都是单次 Browse 的结果.


何时用索引器, 何时用字符串

场景推荐
已知精确 NodeId字符串 (s.Read("ns=2;s=..."))
标准节点 (Server 状态等)Nodes().Server()[...]
浏览树 / 写一次性脚本索引器 (Nodes()["..."]["..."])
批量 (100+ 节点)ReadMany / BrowseMany, 不要循环

下一步