Triggering Links — 触发联动上报
概述
OPC UA Part 4 §5.12.5 SetTriggering 把一个 MonitoredItem 设为 trigger, 当其 fire 时把一组 linked MI 一并 burst 上报。典型场景:
- trigger MI = 阈值监控 (例如
Temp > 80°C,Reporting/Disabled模式) - linked MI = 一组高频但默认
Sampling不上报的 MI, fire 时一并取证
实现等同 PLC 的"故障录波" — 平时不录, 触发后回吐窗口数据。
API
| 方法 | 类别 | 读写 | 说明 |
|---|---|---|---|
| sub.AddTriggeringLinks(triggerMi, linkedMis) | 写 | 写 | 添加联动, 返回每条 link 的 StatusCode |
| sub.RemoveTriggeringLinks(triggerMi, linkedMis) | 写 | 写 | 移除联动 |
代码示例
using DarraOpcUa_Client;
using var ua = new DarraOpcUa("opc.tcp://localhost:4840");
ua.Connect();
using var sub = ua.CreateSubscription(100);
// 1) 阈值监控 (trigger), Reporting 模式
uint trigMi = sub.Add("ns=2;s=Temp.High", AttributeId.Value, samplingIntervalMs: 200);
// 2) 一组高频信号 (linked), Sampling 模式 — 平时不上报
uint mi1 = sub.Add("ns=2;s=Vibration.X", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
uint mi2 = sub.Add("ns=2;s=Vibration.Y", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
uint mi3 = sub.Add("ns=2;s=Vibration.Z", AttributeId.Value, 50,
MonitoringMode.Sampling, 10, true, null);
// 3) 设置联动 — Temp.High 触发时, Vibration.X/Y/Z burst 上报
var addRes = sub.AddTriggeringLinks(trigMi, new uint[] { mi1, mi2, mi3 });
for (int i = 0; i < addRes.Count; i++)
Console.WriteLine($"link[{i}] = {addRes[i]}");
sub.DataChanged += (s, e) =>
{
Console.WriteLine($"[mi={e.ClientHandle}] {e.Value.Value}");
};
// 4) 解除联动
sub.RemoveTriggeringLinks(trigMi, new uint[] { mi3 });
实现说明
- Stack 不提供
DarraUa_Subscription_SetTriggering时, SDK graceful 降级:- 返回每项
BadNotSupported - 推一条
Diagnostic类别 Warn 事件
- 返回每项
- 服务端不支持 SetTriggering 时返回
BadServiceUnsupported, 极少见 (主流 Stack 都支持)
与 MonitoringMode 配合
| trigger Mode | linked Mode | 行为 |
|---|---|---|
| Reporting | Sampling | trigger fire 时, linked burst 上报 (典型) |
| Reporting | Disabled | linked 完全不上报, 即使被触发也不补 |
| Sampling | Sampling | 都不上报, SetTriggering 无效 |
最佳实践
- 录波场景 — trigger 用阈值 + Reporting, linked 用高频信号 + Sampling, 故障时取证
- trigger 数 ≤ 10 — 太多触发源会让服务端 publish 队列爆
- 同 sub 内 — trigger 和 linked 必须在同一个 Subscription
- link 关闭时主动 Remove — 退出窗口前调
RemoveTriggeringLinks, 不依赖 GC - 检查返回 StatusCode — 部分 Server 对 trigger MI 不存在 / 已删除返回
BadMonitoredItemIdInvalid
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| AddTriggeringLinks | add_triggering_links | addTriggeringLinks | AddTriggeringLinks | add_triggering_links | DarraUa_Subscription_AddTriggeringLinks |
| RemoveTriggeringLinks | remove_triggering_links | removeTriggeringLinks | RemoveTriggeringLinks | remove_triggering_links | DarraUa_Subscription_RemoveTriggeringLinks |