跳到主要内容

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_triggering PInvoke 时返回每项 BAD_NOT_SUPPORTED, 推 Diagnostic Warn 事件
  • 服务端不支持时返回 BAD_SERVICE_UNSUPPORTED, 极少见

与 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

下一步