添加 MonitoredItem
前置阅读
- 先创建 Subscription, 见 创建 Subscription.
- 数据回调字段请看 数据回调.
- 改采样参数请看 Modify.
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) |
attr | Value (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 (后续版本会暴露).