跳到主要内容

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成功
BadIndexRangeInvalidrange 字符串非法 / 节点非数组
BadIndexRangeNoDatarange 在数据范围外

最佳实践

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

跨语言对照

C#PythonJavaC++RustC
NumericRangeNumericRangeNumericRangeNumericRangeNumericRangeDarraUa_NumericRange
ReadRangeread_rangereadRangeReadRangeread_rangeDarraUa_Session_ReadRange
WriteRangewrite_rangewriteRangeWriteRangewrite_rangeDarraUa_Session_WriteRange

下一步