跳到主要内容

Triggering Links

概述

OPC UA Part 4 §5.12.5 SetTriggering 把一个 MI 设为 trigger, 触发时把一组 linked MI 一并 burst 上报。

API

方法类别读写说明
sub.add_triggering_links(trigger_mi, linked_mis)添加, 返回 Vec<StatusCode>
sub.remove_triggering_links(trigger_mi, linked_mis)移除

代码示例

use opcua::{DarraOpcUa, AttributeId, MonitoringMode};

let ua = DarraOpcUa::new("opc.tcp://localhost:4840")?;
ua.connect()?;
let sub = ua.create_subscription(100)?;

// 1) trigger - Reporting
let trig_mi = sub.add("ns=2;s=Temp.High", AttributeId::Value, 200.0,
MonitoringMode::Reporting, 1, true, None)?;

// 2) linked - Sampling, 平时不上报
let mi1 = sub.add("ns=2;s=Vibration.X", AttributeId::Value, 50.0,
MonitoringMode::Sampling, 10, true, None)?;
let mi2 = sub.add("ns=2;s=Vibration.Y", AttributeId::Value, 50.0,
MonitoringMode::Sampling, 10, true, None)?;
let mi3 = sub.add("ns=2;s=Vibration.Z", AttributeId::Value, 50.0,
MonitoringMode::Sampling, 10, true, None)?;

// 3) 设置联动
let add_res = sub.add_triggering_links(trig_mi, &[mi1, mi2, mi3])?;
for (i, rc) in add_res.iter().enumerate() {
println!("link[{}] = {:?}", i, rc);
}

sub.on_data_changed(|args| {
println!("[mi={}] {:?}", args.client_handle, args.value.value);
});

// 4) 解除
sub.remove_triggering_links(trig_mi, &[mi3])?;

实现说明

  • Stack 不提供 SetTriggering 时返回每项 BadNotSupported, 推 Diagnostic Warn

与 MonitoringMode 配合

trigger Modelinked Mode行为
ReportingSamplingtrigger fire 时 linked burst 上报 (典型)
ReportingDisabledlinked 完全不上报
SamplingSampling都不上报, 无效

最佳实践

  • 录波场景: trigger 阈值 + Reporting, linked 高频 + Sampling
  • trigger 数 ≤ 10
  • trigger 和 linked 必须在同一 Subscription
  • 退出窗口前主动 remove

跨语言对照

C#PythonJavaC++RustC
AddTriggeringLinksadd_triggering_linksaddTriggeringLinksAddTriggeringLinksadd_triggering_linksDarraUa_Subscription_AddTriggeringLinks

下一步