UpdateHistory
往服务端 Historian 写入数据 (而不是当前 Read / Write 操作的"实时值"):
高敏感操作
HistoryUpdate 多数生产 Server 默认禁止, 需要管理员明确开启 + 合规审计. 详见服务端要求.
签名
std::vector<Status> UpdateHistory(
std::string const& node_id,
HistoryUpdateType update_type,
std::vector<DataValue> const& values);
HistoryUpdateType
枚举定义在 darra/opcua/history.hpp:
enum class HistoryUpdateType : int32_t {
Insert = 1, // 仅当时间点不存在才插入
Replace = 2, // 仅当时间点存在才替换
Update = 3, // Insert + Replace 任一适用 (默认)
Remove = 4, // 删除该时间点
};
注意 Remove 时 values 数组中各 DataValue 的 SourceTimestamp 决定要删的点, value 字段被服务端忽略.
用法
补录历史数据
constexpr int64_t WIN_EPOCH_OFFSET = 116444736000000000LL;
// 构造历史数据 (DataValue 通常从 native handle 构造,
// 后续版本将提供高层 builder)
std::vector<DataValue> dvs;
// ... 准备 dvs (省略, 通常用 SDK 提供的 builder)
auto results = s.UpdateHistory("ns=2;s=Temperature",
HistoryUpdateType::Update, dvs);
for (size_t i = 0; i < results.size(); ++i) {
std::cout << "values[" << i << "] status = 0x"
<< std::hex << static_cast<uint32_t>(results[i]) << "\n";
}
仅插入 (不覆盖已有)
auto results = s.UpdateHistory("ns=2;s=Temperature",
HistoryUpdateType::Insert, dvs);
删除指定时间点
// 用 Remove 类型, DataValue 的 SourceTimestamp 决定删哪个点
auto results = s.UpdateHistory("ns=2;s=Temperature",
HistoryUpdateType::Remove, dvs_with_timestamps);
权限要求
- 节点 AccessLevel bit 8 (HistoryWrite) 必须置位
- 用户必须有 HistoryUpdate 权限
- 大多数生产 Server 默认禁止, 需要管理员明确开启
错误码
| 错误码 | 含义 |
|---|---|
BadHistoryOperationInvalid | 该节点不支持 HistoryUpdate |
BadUserAccessDenied | 无权限 |
BadEntryExists | (Insert 模式) 该时间点已存在 |
BadNoEntryExists | (Replace / Remove 模式) 该时间点不存在 |