DataChangeFilter
概述
OPC UA Part 4 §7.17 DataChangeFilter 让客户端告诉服务端何时 push 数据:
- Trigger — 触发条件 (Status / StatusValue / StatusValueTimestamp)
- DeadbandType — 死区类型 (None / Absolute / Percent)
- DeadbandValue — 死区数值
API
| 类 / 字段 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DataChangeFilter.builder() | 构造 | — | 构造器 |
| sub.add(nodeId, attr, samplingMs, mode, queueSize, discardOldest, filter) | 方法 | 写 | 带 filter 的重载 |
相关结构:
public enum DataChangeTrigger {
STATUS, // 仅 StatusCode 变化
STATUS_VALUE, // StatusCode 或 Value (默认)
STATUS_VALUE_TIMESTAMP // 任一变化
}
public enum DeadbandType {
NONE, // 无死区
ABSOLUTE, // 绝对死区
PERCENT // 百分比 (基于 EURange)
}
代码示例
import com.darra.opcua.*;
try (DarraOpcUa ua = new DarraOpcUa("opc.tcp://localhost:4840")) {
ua.connect();
OpcUaSubscription sub = ua.createSubscription(100);
// 1) 绝对死区 0.5
DataChangeFilter f1 = DataChangeFilter.builder()
.trigger(DataChangeTrigger.STATUS_VALUE)
.deadbandType(DeadbandType.ABSOLUTE)
.deadbandValue(0.5)
.build();
long mi1 = sub.add("ns=2;s=Temp", AttributeId.Value, 100,
MonitoringMode.Reporting, 1, true, f1);
// 2) 百分比死区 2%
DataChangeFilter f2 = DataChangeFilter.builder()
.deadbandType(DeadbandType.PERCENT).deadbandValue(2.0).build();
long mi2 = sub.add("ns=2;s=Flow", AttributeId.Value, 100,
MonitoringMode.Reporting, 1, true, f2);
// 3) 仅 Status
DataChangeFilter f3 = DataChangeFilter.builder()
.trigger(DataChangeTrigger.STATUS).build();
long mi3 = sub.add("ns=2;s=Comm.Status", AttributeId.Value, 200,
MonitoringMode.Reporting, 1, true, f3);
sub.addDataChangedListener(args ->
System.out.printf("[mi=%d] %s (%s)%n",
args.clientHandle, 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 |