跳到主要内容

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, // 删除该时间点
};

注意 Removevalues 数组中各 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 模式) 该时间点不存在

下一步