跳到主要内容

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

最佳实践

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

跨语言对照

C#PythonJavaC++RustC
NumericRangeNumericRangeNumericRangeNumericRangeNumericRangeDarraUa_NumericRange
ReadRangeread_rangereadRangeReadRangeread_rangeDarraUa_Session_ReadRange
WriteRangewrite_rangewriteRangeWriteRangewrite_rangeDarraUa_Session_WriteRange

下一步