跳到主要内容

HistoryReadProcessed (C)

最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.

前置 / 配套

API

DARRA_OPCUA_API DarraUa_Status DARRA_OPCUA_CALL DarraUa_Session_HistoryReadProcessed(
DarraUa_SessionHandle h,
const char* node_id_str,
DarraUa_DateTime start_time,
DarraUa_DateTime end_time,
double processing_interval_ms,
const char* aggregate_type_node_id,
DarraUa_DataValue*** out_values,
uint32_t* out_count);
参数说明
processing_interval_ms子区间长度 (毫秒, > 0)
aggregate_type_node_id标准 Aggregate NodeId 字符串

返回值长度 ≈ ceil((end - start) / processing_interval), 顺序按时间正序.


标准聚合函数 NodeId (ns=0)

NodeId名称含义
i=2342Average算术平均
i=11285TimeAverage时间加权平均
i=2348Total累计总和
i=2346Minimum最小值
i=2347Maximum最大值
i=2353RangeMax − Min
i=2352Count点数
i=11427StandardDeviationSample样本标准差
i=11286Deltaend - start 差值

完整列表见 OPC UA 聚合函数标准 (Part 13 §5.4).


用法

24 小时温度的每小时平均

DarraUa_DateTime end   = utc_now_ft();
DarraUa_DateTime start = end - 864000000000LL; /* 24 小时 */

DarraUa_DataValue** values = NULL;
uint32_t count = 0;

DarraUa_Status st = DarraUa_Session_HistoryReadProcessed(
h, "ns=2;s=Temperature",
start, end,
/*interval*/ 3600000.0, /* 1 hour */
/*aggregate*/ "i=2342", /* Average */
&values, &count);
/* count ≈ 24, 每个是该小时的平均值 */

for (uint32_t i = 0; i < count; ++i) {
double avg = 0.0;
DarraUa_Variant_GetDouble(DarraUa_DataValue_GetValue(values[i]), &avg);
printf("hour %u avg = %.2f\n", (unsigned)i, avg);
}
DarraUa_DataValueArray_Delete(values, count);

一周每天的最大温度

DarraUa_Session_HistoryReadProcessed(
h, "ns=2;s=Temperature",
week_ago, today,
/*interval*/ 86400000.0, /* 1 day */
/*aggregate*/ "i=2347", /* Maximum */
&values, &count);

一小时累计流量

DarraUa_Session_HistoryReadProcessed(
h, "ns=2;s=FlowRate",
hour_ago, now,
/*interval*/ 3600000.0,
/*aggregate*/ "i=2348", /* Total */
&values, &count);

性能优势

  • 避免拉百万点原始数据再客户端算
  • 服务端常对历史数据建索引, 聚合极快
  • 跨日 / 跨周报表的标准方案

服务端要求

  • Historian 必须实现该聚合函数 (服务端 ServerCapabilities/AggregateFunctions 列出支持的)
  • 不支持的聚合返回 BadAggregateNotSupported

下一步