read_history_modified
如果服务端允许 HistoryUpdate (修改历史), 数据可能被改过. read_history_modified
拉到所有版本及修改记录, 用于审计 / 法规合规.
前置 / 配套
- 普通读取不带审计请用 ReadRaw.
- 写历史 / 修改历史请看 HistoryUpdate.
签名
pub fn Session::read_history_modified(
&self,
node_id: &str,
start: SystemTime,
end: SystemTime,
max_values: u32,
return_bounds: bool,
) -> Result<Vec<DataValue>, OpcUaError>;
| 参数 | 说明 |
|---|---|
node_id | 目标 NodeId |
start / end | UTC 区间 |
max_values | 上限, 0 = 不限 |
return_bounds | true = 返回区间边界点 (插值/最近值); false = 只返区间内的 |
返回值
Vec<DataValue>. 每个 DataValue 含修改记录的完整 Variant + Status + Timestamp.
当前 SDK 把修改记录按时间序列扁平返回 — 同一个 source_timestamp 上可能出现多条
(原始 + 修改后) DataValue, 客户端按需排序去重.
用法
use std::time::{Duration, SystemTime};
let now = SystemTime::now();
let yesterday = now - Duration::from_secs(86400);
let modified = s.read_history_modified(
"ns=2;s=Temperature",
yesterday, now,
/*max*/ 0, /*bounds*/ true,
)?;
for m in &modified {
println!("{:?}: {:?} ({})",
m.source_timestamp(), m.variant(), m.status());
}
何时用
- 法规合规: GMP / FDA 21 CFR Part 11 等要求"数据可追溯"
- 审计日志: 谁动了关键参数
- 数据修复回滚: 知道改之前的值是什么
服务端要求
- 必须实现 HistoryUpdate
- 必须保留修改历史 (而不是直接覆盖)
- 用户身份必须正确传递 (Username / Certificate Token)
错误
| StatusCode | 原因 |
|---|---|
BAD_HISTORY_OPERATION_UNSUPPORTED | 服务端不支持 ReadModified |
BAD_NOT_READABLE | 节点无 HistoryRead 权限 |
与 ReadRaw 的差别
| API | 返回 |
|---|---|
read_history | 每个时间点最新版本 (覆盖前的看不到) |
read_history_modified | 每个时间点所有版本 + 修改记录 |