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 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 |