HistoryReadProcessed (C)
最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.
前置 / 配套
- 拉所有原始点请用 ReadRaw.
- 指定时间点的内插值请用 ReadAtTime.
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=2342 | Average | 算术平均 |
i=11285 | TimeAverage | 时间加权平均 |
i=2348 | Total | 累计总和 |
i=2346 | Minimum | 最小值 |
i=2347 | Maximum | 最大值 |
i=2353 | Range | Max − Min |
i=2352 | Count | 点数 |
i=11427 | StandardDeviationSample | 样本标准差 |
i=11286 | Delta | end - 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