readHistoryProcessed (聚合)
最强大的 HistoryRead 模式, 配合标准聚合函数. 给区间 + 聚合函数 + 子区间宽度, 服务端返回每个子区间的聚合结果.
前置 / 配套
- 拉所有原始点请用 ReadRaw.
- 指定时间点的内插值请用 ReadAtTime.
- 标准聚合 NodeId 常量在
HistoryAggregate类.
签名
public List<OpcUaDataValue> readHistoryProcessed(
String nodeId,
Instant start,
Instant end,
double processingIntervalMs,
String aggregateNodeId);
HistoryAggregate 标准聚合常量
| 常量 | NodeId | 含义 |
|---|---|---|
HistoryAggregate.AVERAGE | i=2342 | 算术平均 |
HistoryAggregate.MINIMUM | i=2346 | 最小值 |
HistoryAggregate.MAXIMUM | i=2347 | 最大值 |
HistoryAggregate.COUNT | i=2352 | Good 状态点数 |
HistoryAggregate.TOTAL | i=2348 | 累计总和 |
HistoryAggregate.STANDARD_DEVIATION_SAMPLE | i=11427 | 样本标准差 |
HistoryAggregate.TIME_AVERAGE | i=11285 | 时间加权平均 |
HistoryAggregate.RANGE | i=2353 | Max − Min |
HistoryAggregate.DELTA | i=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