跳到主要内容

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 Modelinked Mode行为
ReportingSamplingtrigger fire 时, linked burst 上报 (典型)
ReportingDisabledlinked 完全不上报, 即使被触发也不补
SamplingSampling都不上报, SetTriggering 无效

最佳实践

  • 录波场景 — trigger 用阈值 + Reporting, linked 用高频信号 + Sampling, 故障时取证
  • trigger 数 ≤ 10 — 太多触发源会让服务端 publish 队列爆
  • 同 sub 内 — trigger 和 linked 必须在同一个 Subscription
  • link 关闭时主动 Remove — 退出窗口前调 RemoveTriggeringLinks, 不依赖 GC
  • 检查返回 StatusCode — 部分 Server 对 trigger MI 不存在 / 已删除返回 BadMonitoredItemIdInvalid

跨语言对照

C#PythonJavaC++RustC
AddTriggeringLinksadd_triggering_linksaddTriggeringLinksAddTriggeringLinksadd_triggering_linksDarraUa_Subscription_AddTriggeringLinks
RemoveTriggeringLinksremove_triggering_linksremoveTriggeringLinksRemoveTriggeringLinksremove_triggering_linksDarraUa_Subscription_RemoveTriggeringLinks

下一步