DataChangeFilter
概述
OPC UA Part 4 §7.17 DataChangeFilter 让客户端告诉服务端何时 push 数据, 减少 Publish 流量:
- Trigger — 触发条件 (Status / StatusValue / StatusValueTimestamp)
- DeadbandType — 死区类型 (None / Absolute / Percent)
- DeadbandValue — 死区数值
API
| 类 / 字段 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DataChangeFilter(trigger, deadband_type, deadband_value) | 类 | — | 过滤器 |
| sub.add(node_id, attr, sampling_ms, mode, queue_size, discard_oldest, filter) | 方法 | 写 | 带 filter 的重载 |
相关结构:
class DataChangeTrigger(IntEnum):
STATUS = 0 # 仅 StatusCode 变化
STATUS_VALUE = 1 # StatusCode 或 Value 变化 (默认)
STATUS_VALUE_TIMESTAMP = 2 # 任一变化
class DeadbandType(IntEnum):
NONE = 0 # 无死区
ABSOLUTE = 1 # 绝对死区
PERCENT = 2 # 百分比死区 (基于 EURange)
代码示例
from opcua import (
DarraOpcUa, AttributeId, MonitoringMode,
DataChangeFilter, DataChangeTrigger, DeadbandType
)
with DarraOpcUa("opc.tcp://localhost:4840") as ua:
ua.connect()
sub = ua.create_subscription(publishing_interval_ms=100)
# 1) 绝对死区 0.5
filter1 = DataChangeFilter(
trigger=DataChangeTrigger.STATUS_VALUE,
deadband_type=DeadbandType.ABSOLUTE,
deadband_value=0.5,
)
mi1 = sub.add("ns=2;s=Temp", AttributeId.VALUE, 100,
MonitoringMode.REPORTING, 1, True, filter1)
# 2) 百分比死区 2%
filter2 = DataChangeFilter(deadband_type=DeadbandType.PERCENT, deadband_value=2.0)
mi2 = sub.add("ns=2;s=Flow", AttributeId.VALUE, 100,
MonitoringMode.REPORTING, 1, True, filter2)
# 3) 仅 Status 变化
filter3 = DataChangeFilter(trigger=DataChangeTrigger.STATUS)
mi3 = sub.add("ns=2;s=Comm.Status", AttributeId.VALUE, 200,
MonitoringMode.REPORTING, 1, True, filter3)
@sub.on_data_changed
def on_dc(args):
print(f"[mi={args.client_handle}] {args.value.value} ({args.value.status})")
实现说明
- Stack 不支持时 SDK graceful 降级:
- 仍调底层 add 注册 MI, filter 失效, 数据全量上报
- filter 缓存到本地, 重连/重建时仍可还原
- 推一条 Diagnostic Warn 事件
- Percent 死区依赖目标节点的 EURange Property
最佳实践
- 模拟量首选 Absolute, 例如 0.5°C
- 大量程信号用 Percent
- 数字量不需 filter
- 死区不要太大, 经验 0.1%-2%
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| DataChangeFilter | DataChangeFilter | DataChangeFilter | DataChangeFilter | DataChangeFilter | DarraUa_DataChangeFilter |