跳到主要内容

updateHistory

往服务端 Historian 写入数据 (而不是当前 read / write 操作的"实时值"):

高敏感操作

HistoryUpdate 多数生产 Server 默认禁止, 需要管理员明确开启 + 合规审计. 详见服务端要求.

签名

public List<Enums.StatusCode> updateHistory(
String nodeId,
HistoryUpdateType updateType,
List<OpcUaDataValue> values);

HistoryUpdateType

code含义
HistoryUpdateType.INSERT1仅当时间点不存在才插入
HistoryUpdateType.REPLACE2仅当时间点存在才替换
HistoryUpdateType.UPDATE3Insert + Replace 任一适用
HistoryUpdateType.REMOVE4删除该时间点 (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 模式) 该时间点不存在

下一步