跳到主要内容

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#PythonJavaC++RustC
DataChangeFilterDataChangeFilterDataChangeFilterDataChangeFilterDataChangeFilterDarraUa_DataChangeFilter

下一步