跳到主要内容

readHistory (Raw)

public List<OpcUaDataValue> readHistory(
String nodeId,
Instant startTime,
Instant endTime,
int maxValues);

最常用的历史读, 返回 [startTime, endTime] 区间内全部原始数据点.

前置 / 配套

参数

参数默认说明
nodeId目标 NodeId
startTime区间起 (UTC Instant)
endTime区间止 (UTC Instant)
maxValues0 (不限)单次返回上限

用法

import java.time.Instant;
import java.time.Duration;
import java.util.List;

List<OpcUaDataValue> dvs = ua.readHistory("ns=2;s=Temperature",
Instant.now().minus(Duration.ofHours(1)),
Instant.now(),
1000);

try {
for (OpcUaDataValue dv : dvs) {
long ft = dv.sourceTimestamp();
Instant t = (ft > 0)
? Instant.ofEpochMilli((ft - 116444736000000000L) / 10000L)
: Instant.now();
System.out.println(t + ": " + dv.variant() + " (" + dv.getStatusEnum() + ")");
}
} finally {
for (OpcUaDataValue dv : dvs) if (dv != null) dv.close();
}
必须逐项 close

返回的 List<OpcUaDataValue> 每个元素都是 native 内存. try-finally 逐项 close, 否则泄漏.


异常

异常含义
OpcUaException(BadHistoryOperationUnsupported)服务端无 Historian
OpcUaException(BadNotReadable)节点无 HistoryRead 权限
OpcUaException(BadCommunicationError)网络故障

ContinuationPoint 处理 (内部)

如果数据量大, 服务端可能分多次返回 (ContinuationPoint). SDK 内部已自动循环 BrowseNext 等价的 HistoryReadNext, 客户端拿到的是合并后的完整列表.


性能与最佳实践

  • 高频数据 (1000 Hz+) 拉一天 = 86 M+ 点 → 必须用 maxValues 限制或改用 ReadProcessed 聚合
  • OpcUaDataValue 列表里每个元素都是 AutoCloseable, 建议 try-finally 逐项 close
  • 时间戳一律 UTC Instant, 不要传本地时间

下一步