DataChangeFilter
概述
OPC UA Part 4 §7.17 DataChangeFilter: Trigger / DeadbandType / DeadbandValue 三件套。
API
| 类 / 字段 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DataChangeFilter { trigger, deadband_type, deadband_value } | 结构 | — | 过滤器 (POD) |
| sub.Add(node_id, attr, sampling_ms, mode, queue_size, discard_oldest, filter) | 方法 | 写 | 带 filter 的重载 |
相关结构 (DataChangeTrigger):
- Status (0) — 仅 StatusCode 变化
- StatusValue (1) — StatusCode 或 Value (默认)
- StatusValueTimestamp (2) — 任一变化
相关结构 (DeadbandType):
- None (0) — 无死区
- Absolute (1) — 绝对死区
- Percent (2) — 百分比 (基于 EURange)
代码示例
#include <darra/opcua.h>
using namespace darra::opcua;
DarraOpcUa ua("opc.tcp://localhost:4840");
ua.Connect();
auto sub = ua.CreateSubscription(100);
// 1) 绝对死区 0.5
DataChangeFilter f1{
.trigger = DataChangeTrigger::StatusValue,
.deadband_type = DeadbandType::Absolute,
.deadband_value = 0.5
};
auto mi1 = sub->Add("ns=2;s=Temp", AttributeId::Value, 100,
MonitoringMode::Reporting, 1, true, &f1);
// 2) 百分比死区 2%
DataChangeFilter f2{ .deadband_type = DeadbandType::Percent, .deadband_value = 2.0 };
auto mi2 = sub->Add("ns=2;s=Flow", AttributeId::Value, 100,
MonitoringMode::Reporting, 1, true, &f2);
// 3) 仅 Status
DataChangeFilter f3{ .trigger = DataChangeTrigger::Status };
auto mi3 = sub->Add("ns=2;s=Comm.Status", AttributeId::Value, 200,
MonitoringMode::Reporting, 1, true, &f3);
sub->OnDataChanged([](const DataChangeEventArgs& e) {
std::cout << "[mi=" << e.client_handle << "] " << e.value.value << "\n";
});
实现说明
- 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 |