updateHistory
往服务端 Historian 写入数据 (而不是当前 read / write 操作的"实时值"):
高敏感操作
HistoryUpdate 多数生产 Server 默认禁止, 需要管理员明确开启 + 合规审计. 详见服务端要求.
签名
public List<Enums.StatusCode> updateHistory(
String nodeId,
HistoryUpdateType updateType,
List<OpcUaDataValue> values);
HistoryUpdateType
| 值 | code | 含义 |
|---|---|---|
HistoryUpdateType.INSERT | 1 | 仅当时间点不存在才插入 |
HistoryUpdateType.REPLACE | 2 | 仅当时间点存在才替换 |
HistoryUpdateType.UPDATE | 3 | Insert + Replace 任一适用 |
HistoryUpdateType.REMOVE | 4 | 删除该时间点 (values 数组中各 DataValue 的 SourceTimestamp 决定要删除哪些点, value 字段被服务端忽略) |
用法
补录历史数据
import com.darra.opcua.*;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
// 当前 SDK 暴露的 OpcUaDataValue 没有公共构造器. 实际生产中要先从 readHistory
// 拉到 OpcUaDataValue 再修改后回写, 或等 SDK 后续版本暴露构造器.
//
// 演示: 假设 dvList 是从其它 readHistoryXxx 拿到的 OpcUaDataValue 列表
List<OpcUaDataValue> dvList = ua.readHistory("ns=2;s=Temperature",
yesterday, today, 100);
try {
List<Enums.StatusCode> results = ua.updateHistory(
"ns=2;s=Temperature", HistoryUpdateType.UPDATE, dvList);
for (int i = 0; i < results.size(); i++) {
System.out.println(" [" + i + "] " + results.get(i));
}
} finally {
for (OpcUaDataValue dv : dvList) if (dv != null) dv.close();
}
仅插入 (不覆盖已有)
ua.updateHistory("ns=2;s=Temperature", HistoryUpdateType.INSERT, dvList);
删除单点 (按 SourceTimestamp)
ua.updateHistory("ns=2;s=Temperature", HistoryUpdateType.REMOVE, dvList);
// 服务端只看每个 dv 的 SourceTimestamp, 找到该点就删
权限要求
- 节点 AccessLevel bit 8 (HistoryWrite) 必须置位
- 用户必须有 HistoryUpdate 权限
- 大多数生产 Server 默认禁止, 需要管理员明确开启
错误码
| 错误码 | 含义 |
|---|---|
BadHistoryOperationInvalid | 该节点不支持 HistoryUpdate |
BadUserAccessDenied | 无权限 |
BadEntryExists | (Insert 模式) 该时间点已存在 |
BadNoEntryExists | (Replace / Remove 模式) 该时间点不存在 |