Triggering Links
概述
OPC UA Part 4 §5.12.5 SetTriggering 把一个 MI 设为 trigger, 触发时把一组 linked MI 一并 burst 上报。典型场景: 阈值触发时回吐窗口数据 (类 PLC 故障录波)。
API
| 方法 | 类别 | 读写 | 说明 |
|---|---|---|---|
| sub.add_triggering_links(trigger_mi, linked_mis) | 写 | 写 | 添加联动, 返回每条 link 的 StatusCode |
| sub.remove_triggering_links(trigger_mi, linked_mis) | 写 | 写 | 移除 |
代码示例
from opcua import (
DarraOpcUa, AttributeId, MonitoringMode, StatusCode
)
with DarraOpcUa("opc.tcp://localhost:4840") as ua:
ua.connect()
sub = ua.create_subscription(100)
# 1) 阈值监控 (trigger), Reporting
trig_mi = sub.add("ns=2;s=Temp.High", AttributeId.VALUE, 200)
# 2) 高频信号 (linked), Sampling — 平时不上报
mi1 = sub.add("ns=2;s=Vibration.X", AttributeId.VALUE, 50,
MonitoringMode.SAMPLING, 10, True, None)
mi2 = sub.add("ns=2;s=Vibration.Y", AttributeId.VALUE, 50,
MonitoringMode.SAMPLING, 10, True, None)
mi3 = sub.add("ns=2;s=Vibration.Z", AttributeId.VALUE, 50,
MonitoringMode.SAMPLING, 10, True, None)
# 3) 设置联动
add_res = sub.add_triggering_links(trig_mi, [mi1, mi2, mi3])
for i, rc in enumerate(add_res):
print(f"link[{i}] = {rc}")
@sub.on_data_changed
def on_dc(args):
print(f"[mi={args.client_handle}] {args.value.value}")
# 4) 解除联动
sub.remove_triggering_links(trig_mi, [mi3])
实现说明
- Stack 不提供
set_triggeringPInvoke 时返回每项BAD_NOT_SUPPORTED, 推 Diagnostic Warn 事件 - 服务端不支持时返回
BAD_SERVICE_UNSUPPORTED, 极少见
与 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 |