Triggering Links
概述
OPC UA Part 4 §5.12.5 SetTriggering 把一个 MI 设为 trigger, 触发时把一组 linked MI 一并 burst 上报。
API
| 方法 | 类别 | 读写 | 说明 |
|---|---|---|---|
| sub.AddTriggeringLinks(trigger_mi, linked_mis) | 写 | 写 | 添加, 返回 vector<StatusCode> |
| sub.RemoveTriggeringLinks(trigger_mi, linked_mis) | 写 | 写 | 移除 |
代码示例
#include <darra/opcua.h>
using namespace darra::opcua;
DarraOpcUa ua("opc.tcp://localhost:4840");
ua.Connect();
auto sub = ua.CreateSubscription(100);
// 1) trigger - Reporting
auto trig_mi = sub->Add("ns=2;s=Temp.High", AttributeId::Value, 200);
// 2) linked - Sampling, 平时不上报
auto mi1 = sub->Add("ns=2;s=Vibration.X", AttributeId::Value, 50,
MonitoringMode::Sampling, 10, true, nullptr);
auto mi2 = sub->Add("ns=2;s=Vibration.Y", AttributeId::Value, 50,
MonitoringMode::Sampling, 10, true, nullptr);
auto mi3 = sub->Add("ns=2;s=Vibration.Z", AttributeId::Value, 50,
MonitoringMode::Sampling, 10, true, nullptr);
// 3) 设置联动
auto add_res = sub->AddTriggeringLinks(trig_mi, { mi1, mi2, mi3 });
for (size_t i = 0; i < add_res.size(); ++i)
std::cout << "link[" << i << "] = " << add_res[i] << "\n";
sub->OnDataChanged([](const DataChangeEventArgs& e) {
std::cout << "[mi=" << e.client_handle << "] " << e.value.value << "\n";
});
// 4) 解除
sub->RemoveTriggeringLinks(trig_mi, { mi3 });
实现说明
- Stack 不提供 SetTriggering 时返回每项 BadNotSupported 并推 Diagnostic Warn
与 MonitoringMode 配合
| trigger Mode | linked Mode | 行为 |
|---|---|---|
| Reporting | Sampling | trigger fire 时 linked burst 上报 (典型) |
| Reporting | Disabled | linked 完全不上报 |
| Sampling | Sampling | 都不上报, 无效 |
最佳实践
- 录波场景: trigger 阈值 + Reporting, linked 高频 + Sampling
- trigger 数 ≤ 10
- trigger 和 linked 必须在同一 Subscription
- 退出窗口前主动 Remove
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| AddTriggeringLinks | add_triggering_links | addTriggeringLinks | AddTriggeringLinks | add_triggering_links | DarraUa_Subscription_AddTriggeringLinks |