跳到主要内容

NumericRange

概述

OPC UA Part 4 §7.27 NumericRange 表示 Value 属性的数组 / 矩阵子范围:

字符串含义
""整段
"5"第 5 个
"3:7"第 3-7 个
"1:3,2:4"二维

API

成员类别读写说明
NumericRange::ALLconst整段
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成功
BadIndexRangeInvalidrange 字符串非法 / 节点非数组
BadIndexRangeNoDatarange 在数据范围外
BadTypeMismatch写入类型不符

最佳实践

  • 大数组只取片
  • 矩阵按行 / 列拆
  • 写入只动改了的索引
  • 不要每次都 parse

跨语言对照

C#PythonJavaC++RustC
NumericRangeNumericRangeNumericRangeNumericRangeNumericRangeDarraUa_NumericRange
ReadRangeread_rangereadRangeReadRangeread_rangeDarraUa_Session_ReadRange
WriteRangewrite_rangewriteRangeWriteRangewrite_rangeDarraUa_Session_WriteRange

下一步