跳到主要内容

readHistoryProcessed (聚合)

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

前置 / 配套
  • 拉所有原始点请用 ReadRaw.
  • 指定时间点的内插值请用 ReadAtTime.
  • 标准聚合 NodeId 常量在 HistoryAggregate 类.

签名

public List<OpcUaDataValue> readHistoryProcessed(
String nodeId,
Instant start,
Instant end,
double processingIntervalMs,
String aggregateNodeId);

HistoryAggregate 标准聚合常量

常量NodeId含义
HistoryAggregate.AVERAGEi=2342算术平均
HistoryAggregate.MINIMUMi=2346最小值
HistoryAggregate.MAXIMUMi=2347最大值
HistoryAggregate.COUNTi=2352Good 状态点数
HistoryAggregate.TOTALi=2348累计总和
HistoryAggregate.STANDARD_DEVIATION_SAMPLEi=11427样本标准差
HistoryAggregate.TIME_AVERAGEi=11285时间加权平均
HistoryAggregate.RANGEi=2353Max − Min
HistoryAggregate.DELTAi=11286区间末 − 区间始

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


用法

24 小时温度的每小时平均

import java.time.Instant;
import java.time.Duration;

List<OpcUaDataValue> values = ua.readHistoryProcessed(
"ns=2;s=Temperature",
Instant.now().minus(Duration.ofDays(1)),
Instant.now(),
3_600_000.0, /* 1 hour */
HistoryAggregate.AVERAGE);
// 返回 24 个 OpcUaDataValue, 每个是该小时的平均值
try {
for (OpcUaDataValue dv : values) {
if (dv != null) System.out.println(dv.variant());
}
} finally {
for (OpcUaDataValue dv : values) if (dv != null) dv.close();
}

一周每天的最大温度

List<OpcUaDataValue> maxes = ua.readHistoryProcessed(
"ns=2;s=Temperature",
today.minus(Duration.ofDays(7)),
today,
86_400_000.0, /* 1 day */
HistoryAggregate.MAXIMUM);

一小时累计流量

List<OpcUaDataValue> totals = ua.readHistoryProcessed(
"ns=2;s=FlowRate",
Instant.now().minus(Duration.ofHours(1)),
Instant.now(),
3_600_000.0,
HistoryAggregate.TOTAL);

性能优势

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

服务端要求

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

下一步