Triggering Links
概述
OPC UA Part 4 §5.12.5 SetTriggering 把一个 MI 设为 trigger, 触发时把一组 linked MI 一并 burst 上报。典型场景: 阈值触发时回吐窗口数据。
API
| 方法 | 类别 | 读写 | 说明 |
|---|---|---|---|
| sub.addTriggeringLinks(triggerMi, linkedMis) | 写 | 写 | 添加联动, 返回每条 link 的 StatusCode 列表 |
| sub.removeTriggeringLinks(triggerMi, linkedMis) | 写 | 写 | 移除 |
代码示例
import com.darra.opcua.*;
import java.util.List;
try (DarraOpcUa ua = new DarraOpcUa("opc.tcp://localhost:4840")) {
ua.connect();
OpcUaSubscription sub = ua.createSubscription(100);
// 1) trigger - Reporting
long trigMi = sub.add("ns=2;s=Temp.High", AttributeId.Value, 200);
// 2) linked - Sampling, 平时不上报
long mi1 = sub.add("ns=2;s=Vibration.X", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
long mi2 = sub.add("ns=2;s=Vibration.Y", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
long mi3 = sub.add("ns=2;s=Vibration.Z", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
// 3) 设置联动
List<StatusCode> addRes = sub.addTriggeringLinks(trigMi, List.of(mi1, mi2, mi3));
for (int i = 0; i < addRes.size(); i++)
System.out.println("link[" + i + "] = " + addRes.get(i));
sub.addDataChangedListener(args ->
System.out.printf("[mi=%d] %s%n", args.clientHandle, args.value.value));
// 4) 解除
sub.removeTriggeringLinks(trigMi, List.of(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 |