跳到主要内容

添加 MonitoredItem

前置阅读

sub.AddNode(...)

DarraUa_MonitoredItemHandle AddNode(
std::string const& node_id,
OnDataChange cb,
AttributeId attr = AttributeId::Value,
double sampling_ms = -1.0);

// using OnDataChange = std::function<void(DataValue const&)>;
参数默认说明
node_id监控的 NodeId
cb数据变化回调 (lambda / std::function)
attrValue (13)监控的 Attribute
sampling_ms-1 (跟订阅)服务端采样间隔. 0 = 尽快

返回: MonitoredItemHandle (本地句柄, 用于后续 Modify / Remove)

异常: Exception (BadNodeIdUnknown 等)

auto h  = sub.AddNode("ns=2;s=Temperature", [](DataValue const& dv) {
std::cout << "T = " << dv.Value().AsString() << "\n";
});

auto h2 = sub.AddNode("ns=2;s=Pressure", [](DataValue const& dv) {
std::cout << "P = " << dv.Value().AsString() << "\n";
}, AttributeId::Value, /*sampling_ms=*/100.0);

sub.AddMany(node_ids, cb, attr)

一次 RPC 添加多个 MI, 比循环 AddNode 快得多:

std::vector<std::pair<DarraUa_MonitoredItemHandle, Status>> AddMany(
std::vector<std::string> const& node_ids,
OnDataChange cb,
AttributeId attr = AttributeId::Value);

返回每项 (handle, status). 共用一个 callback (按 NodeId 区分时, 在 callback 内自己分流).

std::vector<std::string> nodes;
for (int i = 1; i <= 100; ++i) nodes.push_back("ns=2;s=T" + std::to_string(i));

auto results = sub.AddMany(nodes, [](DataValue const& dv) {
std::cout << "value = " << dv.Value().AsString() << "\n";
});

for (size_t i = 0; i < nodes.size(); ++i) {
auto [h, st] = results[i];
if (st == Status::Good) {
std::cout << " " << nodes[i] << " -> handle=" << h << "\n";
} else {
std::cout << " " << nodes[i] << " FAILED: 0x"
<< std::hex << static_cast<uint32_t>(st) << "\n";
}
}

性能: 100 个 MI 用 AddMany 约 1 次 RPC (~10 ms), 用循环 AddNode 约 100 次 RPC (~500-1000 ms).


数据回调签名

回调类型是 std::function<void(DataValue const&)>. 回调里的 DataValue借用, 生命周期仅在回调内, 不要保存指针:

sub.AddNode("ns=2;s=T1", [](DataValue const& dv) {
// OK: 在回调内同步处理
if (!dv.IsGood()) return;
double t = 0; dv.Value().TryGetDouble(t);
LogToFile(t);

// 不要这样: dv 在回调结束后失效
// s_global_dv = &dv;
});

详见 数据回调.


移除

sub.Remove(h);                              // 按 handle
sub.RemoveByNodeId("ns=2;s=Temperature"); // 按 NodeId 移除全部对应

不同 Attribute 的监控

除了默认监控 Value, 也能监控 Status / Quality:

sub.AddNode("ns=2;s=T1", cb, AttributeId::Value);
sub.AddNode("ns=2;s=T1", cb, AttributeId::AccessLevel);

DataChangeFilter (死区)

当前 SDK 默认不设 filter (任何变化都推). 如需 Absolute / Percent 死区, 走底层 API (后续版本会暴露).

下一步