DataChangeFilter
概述
OPC UA Part 4 §7.17 DataChangeFilter: trigger / deadband_type / deadband_value 三件套。
API
| 类型 / 函数 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DarraUa_DataChangeFilter (struct) | 类型 | — | 过滤器 POD |
| DarraUa_Subscription_AddWithFilter(sub, nid, attr, sampling_ms, mode, queue_size, discard_oldest, filter, &out_mi) | 函数 | 写 | 带 filter 的 add |
typedef struct {
DarraUa_DataChangeTrigger trigger; // STATUS / STATUS_VALUE / STATUS_VALUE_TIMESTAMP
DarraUa_DeadbandType deadband_type; // NONE / ABSOLUTE / PERCENT
double deadband_value;
} DarraUa_DataChangeFilter;
相关结构:
typedef enum {
DCT_STATUS = 0, // 仅 StatusCode 变化
DCT_STATUS_VALUE = 1, // StatusCode 或 Value (默认)
DCT_STATUS_VALUE_TIMESTAMP = 2 // 任一变化
} DarraUa_DataChangeTrigger;
typedef enum {
DBT_NONE = 0, // 无死区
DBT_ABSOLUTE = 1, // 绝对死区
DBT_PERCENT = 2 // 百分比 (基于 EURange)
} DarraUa_DeadbandType;
代码示例
#include <opcua.h>
DarraUa_Session* ua;
DarraUa_Session_New("opc.tcp://localhost:4840", &ua);
DarraUa_Session_Connect(ua);
DarraUa_Subscription* sub;
DarraUa_Session_CreateSubscription(ua, 100.0, &sub);
// 1) 绝对死区 0.5
DarraUa_DataChangeFilter f1 = {
.trigger = DCT_STATUS_VALUE,
.deadband_type = DBT_ABSOLUTE,
.deadband_value = 0.5,
};
uint32_t mi1;
DarraUa_Subscription_AddWithFilter(sub, "ns=2;s=Temp", ATTR_VALUE,
100.0, MM_REPORTING, 1, 1 /*true*/, &f1, &mi1);
// 2) 百分比死区 2%
DarraUa_DataChangeFilter f2 = {
.deadband_type = DBT_PERCENT, .deadband_value = 2.0
};
uint32_t mi2;
DarraUa_Subscription_AddWithFilter(sub, "ns=2;s=Flow", ATTR_VALUE,
100.0, MM_REPORTING, 1, 1, &f2, &mi2);
// 3) 仅 Status
DarraUa_DataChangeFilter f3 = { .trigger = DCT_STATUS };
uint32_t mi3;
DarraUa_Subscription_AddWithFilter(sub, "ns=2;s=Comm.Status", ATTR_VALUE,
200.0, MM_REPORTING, 1, 1, &f3, &mi3);
实现说明
- Stack 不支持时 SDK graceful 降级:
- 仍调底层 add 注册 MI, filter 失效, 数据全量上报
- filter 缓存到本地, 重连/重建时仍可还原
- 通过事件回调推一条 Diagnostic Warn
最佳实践
- 模拟量首选 Absolute, 例如 0.5°C
- 大量程信号用 Percent
- 数字量不需 filter
- 死区不要太大, 经验 0.1%-2%
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| DataChangeFilter | DataChangeFilter | DataChangeFilter | DataChangeFilter | DataChangeFilter | DarraUa_DataChangeFilter |