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(NumericRange...) | 工厂 | — | 多维 |
| NumericRange.parse(s) | 静态 | — | 解析 |
| NumericRange.tryParse(s) | 静态 | — | 安全解析 (Optional) |
| range.toString() | — | — | 序列化 |
| range.start() / end() / subRanges() / isAll() | 属性 | 读 | 字段 |
| ua.readRange(nid, range, attr) | 扩展 | 读 | 读子段 |
| ua.writeRange(nid, range, value) | 扩展 | 写 | 写子段 |
代码示例
import com.darra.opcua.*;
try (DarraOpcUa ua = new DarraOpcUa("opc.tcp://localhost:4840")) {
ua.connect();
// 1) 单个元素
try (DataValue dv = ua.readRange("ns=2;s=Arr", NumericRange.single(3))) {
System.out.println("Arr[3] = " + dv.value);
}
// 2) 区间
try (DataValue dv = ua.readRange("ns=2;s=Arr", NumericRange.span(0, 99))) {
for (double v : dv.value.asDoubleArray())
System.out.println(v);
}
// 3) 二维子段
NumericRange r2D = NumericRange.multi(
NumericRange.span(0, 9), NumericRange.span(0, 9));
try (DataValue dv = ua.readRange("ns=2;s=Matrix", r2D)) {
System.out.println("10×10 共 " + dv.value.asDoubleArray().length);
}
// 4) 写单个
StatusCode rc = ua.writeRange("ns=2;s=Arr", NumericRange.single(0),
new Variant(42.5));
// 5) 解析
NumericRange r = NumericRange.parse("3:7");
System.out.println(r.toString());
}
实现说明
- Stack 不提供 *WithRange PInvoke 时 readRange/writeRange 抛 UnsupportedOperationException
- range.isAll() 时直接转发 read
错误处理
| StatusCode | 含义 |
|---|---|
| Good | 成功 |
| BadIndexRangeInvalid | range 字符串非法 / 节点非数组 |
| BadIndexRangeNoData | range 在数据范围外 |
最佳实践
- 大数组只取片
- 矩阵按行 / 列拆
- 写入只动改了的索引
- 不要每次都 parse, 用 span / single
跨语言对照
| 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 |