ReadHistory (Raw)
public IReadOnlyList<DataValue> ReadHistory(
string nodeId,
DateTime startTime,
DateTime endTime,
uint maxValues = 0);
最常用的历史读, 返回 [startTime, endTime] 区间内全部原始数据点.
前置 / 配套
- 高频数据点过多时改用 ReadProcessed 聚合.
- 想要含修改记录请用 ReadModified.
参数
| 参数 | 默认 | 说明 |
|---|---|---|
nodeId | — | 目标 NodeId |
startTime | — | 区间起 (UTC) |
endTime | — | 区间止 (UTC) |
maxValues | 0 (不限) | 单次返回上限 |
用法
var dvs = ua.ReadHistory("ns=2;s=Temperature",
startTime: DateTime.UtcNow.AddHours(-1),
endTime: DateTime.UtcNow,
maxValues: 1000);
foreach (var dv in dvs) using (dv)
Console.WriteLine($"{dv.SourceTimestamp:O}: {dv.Value} ({dv.Status})");
异常
| 异常 | 含义 |
|---|---|
OpcUaException(BadHistoryOperationUnsupported) | 服务端无 Historian |
OpcUaException(BadNotReadable) | 节点无 HistoryRead 权限 |
OpcUaException(BadCommunicationError) | 网络故障 |
ContinuationPoint 处理 (内部)
如果数据量大, 服务端可能分多次返回 (ContinuationPoint). SDK 内部已自动循环 BrowseNext 等价的 HistoryReadNext, 客户端拿到的是合并后的完整列表.
性能与最佳实践
-
高频数据 (1000 Hz+) 拉一天 = 86 M+ 点 → 必须用
maxValues限制或改用 ReadProcessed 聚合 -
DataValue列表里每个元素都是IDisposable, 建议:foreach (var dv in dvs) using (dv) { /* 用完即释放 */ } -
时间戳一律 UTC, 不要传本地时间