readHistoryAtTime
给一组离散时间点, 服务端按 "前一个 / 后一个 / 线性插值" 算法返回那个时刻的值. 用于"对齐时序":
前置 / 配套
- 想拉聚合统计请用 ReadProcessed.
- 想拉区间所有原始点请用 ReadRaw.
签名
public List<OpcUaDataValue> readHistoryAtTime(
String nodeId,
List<Instant> times,
boolean useSimpleBounds);
| 参数 | 说明 |
|---|---|
nodeId | 目标 NodeId |
times | 离散时间点列表 (UTC Instant) |
useSimpleBounds | true = 阶梯型 (用 ≤ t 的最近点); false = 线性插值 |
用法
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.util.List;
import java.util.stream.IntStream;
import java.util.stream.Collectors;
// 拉过去 24 小时, 每整点的温度
Instant midnight = LocalDate.now(ZoneOffset.UTC)
.atStartOfDay().toInstant(ZoneOffset.UTC);
List<Instant> hours = IntStream.rangeClosed(0, 24)
.mapToObj(h -> midnight.plusSeconds(h * 3600L))
.collect(Collectors.toList());
List<OpcUaDataValue> values = ua.readHistoryAtTime(
"ns=2;s=Temperature", hours, true);
try {
for (int i = 0; i < hours.size(); i++) {
OpcUaDataValue dv = values.get(i);
if (dv != null) {
System.out.println(hours.get(i) + ": " + dv.variant());
}
}
} finally {
for (OpcUaDataValue dv : values) if (dv != null) dv.close();
}
与 ReadProcessed 的区别
| API | 返回 |
|---|---|
| ReadAtTime | 每个时间点对应一个内插值 (不聚合) |
| ReadProcessed | 每个子区间一个聚合值 (Avg / Min / Max / ...) |
例 "拉 24 小时, 每小时一个值":
- ReadAtTime: 输入 25 个整点, 返回 25 个内插点 (每个整点的值, 可能是相邻原始点的线性插值)
- ReadProcessed: aggregate=Average, interval=1 h, 返回 24 个区间的平均值
应用场景
- 时序对齐: 不同传感器采样时间不同, 要拉到同一时刻才能比较
- 数据库导出: 整点抽样
- 报表: 每天 24 行