NumericRange
概述
OPC UA Part 4 §7.27 NumericRange 表示 Value 属性的数组 / 矩阵子范围:
| 字符串 | 含义 |
|---|---|
| "" | 整段 |
| "5" | 第 5 个 |
| "3:7" | 第 3-7 个 |
| "1:3,2:4" | 二维 |
API
| 成员 | 类别 | 读写 | 说明 |
|---|---|---|---|
| NumericRange::All() | 静态 | 读 | 整段 |
| NumericRange::Single(int) | 工厂 | — | 单一索引 |
| NumericRange::Span(start, end) | 工厂 | — | 区间 |
| NumericRange::Multi(std::vector<NumericRange>) | 工厂 | — | 多维 |
| NumericRange::Parse(s) | 静态 | — | 解析 |
| NumericRange::TryParse(s, out) | 静态 | — | 安全解析 |
| range.ToString() | — | — | 序列化 |
| range.start() / end() / sub_ranges() / IsAll() | 属性 | 读 | 字段 |
| ua.ReadRange(nid, range, attr) | 扩展 | 读 | 读子段 |
| ua.WriteRange(nid, range, value) | 扩展 | 写 | 写子段 |
代码示例
#include <darra/opcua.h>
using namespace darra::opcua;
DarraOpcUa ua("opc.tcp://localhost:4840");
ua.Connect();
// 1) 单个元素
auto dv = ua.ReadRange("ns=2;s=Arr", NumericRange::Single(3));
std::cout << "Arr[3] = " << dv.value << "\n";
// 2) 区间
auto dv2 = ua.ReadRange("ns=2;s=Arr", NumericRange::Span(0, 99));
for (double v : dv2.value.AsDoubleArray())
std::cout << v << "\n";
// 3) 二维子段
auto r2D = NumericRange::Multi({
NumericRange::Span(0, 9), NumericRange::Span(0, 9)
});
auto dv3 = ua.ReadRange("ns=2;s=Matrix", r2D);
// 4) 写单个
auto rc = ua.WriteRange("ns=2;s=Arr", NumericRange::Single(0), Variant(42.5));
// 5) 解析
auto r = NumericRange::Parse("3:7");
std::cout << r.ToString() << "\n";
实现说明
- Stack 不提供 *WithRange PInvoke 时 ReadRange/WriteRange 抛 std::runtime_error
- range.IsAll() 时直接转发 Read
错误处理
| StatusCode | 含义 |
|---|---|
| Good | 成功 |
| BadIndexRangeInvalid | range 字符串非法 / 节点非数组 |
| BadIndexRangeNoData | range 在数据范围外 |
最佳实践
- 大数组只取片
- 矩阵按行 / 列拆
- 写入只动改了的索引
- 不要每次都 Parse
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| NumericRange | NumericRange | NumericRange | NumericRange | NumericRange | DarraUa_NumericRange |
| ReadRange | read_range | readRange | ReadRange | read_range | DarraUa_Session_ReadRange |
| WriteRange | write_range | writeRange | WriteRange | write_range | DarraUa_Session_WriteRange |