DataChangeFilter
概述
OPC UA Part 4 §7.17 DataChangeFilter: trigger / deadband_type / deadband_value 三件套。
API
| 类型 / 字段 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DataChangeFilter { trigger, deadband_type, deadband_value } | struct | — | 过滤器 |
| sub.add(node_id, attr, sampling_ms, mode, queue_size, discard_oldest, filter) | 方法 | 写 | 带 filter 的重载 |
相关结构:
pub enum DataChangeTrigger {
Status = 0, // 仅 StatusCode 变化
StatusValue = 1, // StatusCode 或 Value (默认)
StatusValueTimestamp = 2, // 任一变化
}
pub enum DeadbandType {
None = 0, // 无死区
Absolute = 1, // 绝对死区
Percent = 2, // 百分比 (基于 EURange)
}
代码示例
use opcua::{
DarraOpcUa, AttributeId, MonitoringMode,
DataChangeFilter, DataChangeTrigger, DeadbandType,
};
let ua = DarraOpcUa::new("opc.tcp://localhost:4840")?;
ua.connect()?;
let sub = ua.create_subscription(100)?;
// 1) 绝对死区 0.5
let f1 = DataChangeFilter {
trigger: DataChangeTrigger::StatusValue,
deadband_type: DeadbandType::Absolute,
deadband_value: 0.5,
};
let mi1 = sub.add("ns=2;s=Temp", AttributeId::Value, 100,
MonitoringMode::Reporting, 1, true, Some(&f1))?;
// 2) 百分比死区 2%
let f2 = DataChangeFilter {
deadband_type: DeadbandType::Percent,
deadband_value: 2.0,
..Default::default()
};
let mi2 = sub.add("ns=2;s=Flow", AttributeId::Value, 100,
MonitoringMode::Reporting, 1, true, Some(&f2))?;
// 3) 仅 Status
let f3 = DataChangeFilter {
trigger: DataChangeTrigger::Status,
..Default::default()
};
let mi3 = sub.add("ns=2;s=Comm.Status", AttributeId::Value, 200,
MonitoringMode::Reporting, 1, true, Some(&f3))?;
sub.on_data_changed(|args| {
println!("[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 |