readHistoryModified
如果服务端允许 HistoryUpdate (修改历史), 数据可能被改过. readHistoryModified 拉到所有版本及修改记录, 用于审计 / 法规合规.
前置 / 配套
- 普通读取不带审计请用 ReadRaw.
- 写历史 / 修改历史请看 HistoryUpdate.
签名
public List<OpcUaDataValue> readHistoryModified(
String nodeId,
Instant start,
Instant end,
int maxValues,
boolean returnBounds);
| 参数 | 说明 |
|---|---|
nodeId | 目标 NodeId |
start / end | 区间 (UTC Instant) |
maxValues | 0 = 不限 |
returnBounds | true = 同时返回区间外的边界点 |
返回 List<OpcUaDataValue> (每项需 close). 当前 SDK 透出基础 DataValue, 内部 ModificationInfo (UserName / ModificationTime / ModificationType) 暂未暴露 (后续可加 getter).
用法
import java.time.Instant;
List<OpcUaDataValue> modified = ua.readHistoryModified("ns=2;s=Temperature",
yesterday, today, 0, false);
try {
for (OpcUaDataValue dv : modified) {
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 : modified) if (dv != null) dv.close();
}
何时用
- 法规合规: GMP / FDA 21 CFR Part 11 等要求"数据可追溯"
- 审计日志: 谁动了关键参数
- 数据修复回滚: 知道改之前的值是什么
服务端要求
- 必须实现 HistoryUpdate
- 必须保留修改历史 (而不是直接覆盖)
- 用户身份必须正确传递 (Username / Certificate Token)