NumericRange
概述
OPC UA Part 4 §7.27 NumericRange 表示 Value 属性的数组 / 矩阵子范围:
| 字符串 | 含义 |
|---|---|
| "" | 整段 |
| "5" | 第 5 个 |
| "3:7" | 第 3-7 个 |
| "1:3,2:4" | 二维 |
API
| 成员 | 类别 | 读写 | 说明 |
|---|---|---|---|
| NumericRange::ALL | const | 读 | 整段 |
| NumericRange::single(i32) | 工厂 | — | 单一索引 |
| NumericRange::span(start, end) | 工厂 | — | 区间 |
| NumericRange::multi(Vec<NumericRange>) | 工厂 | — | 多维 |
| NumericRange::parse(s) | 静态 | — | 解析 |
| range.to_string() | — | — | 序列化 (impl Display) |
| range.start() / end() / sub_ranges() / is_all() | 方法 | 读 | 字段 |
| ua.read_range(nid, range, attr) | 扩展 | 读 | 读子段 |
| ua.write_range(nid, range, value) | 扩展 | 写 | 写子段 |
代码示例
use opcua::{DarraOpcUa, NumericRange, Variant, StatusCode, AttributeId};
let ua = DarraOpcUa::new("opc.tcp://localhost:4840")?;
ua.connect()?;
// 1) 单个元素
let dv = ua.read_range("ns=2;s=Arr", &NumericRange::single(3), AttributeId::Value)?;
println!("Arr[3] = {:?}", dv.value);
// 2) 区间
let dv2 = ua.read_range("ns=2;s=Arr", &NumericRange::span(0, 99), AttributeId::Value)?;
for v in dv2.value.as_double_array()? {
println!("{}", v);
}
// 3) 二维子段
let r2d = NumericRange::multi(vec![
NumericRange::span(0, 9), NumericRange::span(0, 9),
]);
let dv3 = ua.read_range("ns=2;s=Matrix", &r2d, AttributeId::Value)?;
// 4) 写单个
let rc = ua.write_range("ns=2;s=Arr", &NumericRange::single(0), Variant::from(42.5))?;
// 5) 解析
let r = NumericRange::parse("3:7")?;
println!("{}", r);
// 6) 整段
let dv = ua.read_range("ns=2;s=Arr", &NumericRange::ALL, AttributeId::Value)?;
实现说明
- Stack 不提供 *WithRange PInvoke 时 read_range/write_range 返回
Err(NotImplemented) - range.is_all() 时直接转发 read
错误处理
| StatusCode | 含义 |
|---|---|
| Good | 成功 |
| BadIndexRangeInvalid | range 字符串非法 / 节点非数组 |
| BadIndexRangeNoData | range 在数据范围外 |
| BadTypeMismatch | 写入类型不符 |
最佳实践
- 大数组只取片
- 矩阵按行 / 列拆
- 写入只动改了的索引
- 不要每次都 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 |