OPC UA Variant 的 0x06 与 0x86 差在哪:怎样判定标量和数组

2026-10-24

Variant首字节的低六位给内建类型ID,bit7表示数组,bit6表示数组维度。因此06是Int32标量,86是Int32数组;先拆掩码再决定是否读取数组长度,不能把整个86当作类型号134。

适用版本与输入范围

依据 OPC Foundation 官方参考,v105 链接在核对时显示 v1.05.07,具体 Part 与章节见文末。示例只处理明确声明的值与结构,不实现网络会话、证书或完整服务端。 本文所有输入均为原创合成数据,未接真实设备。

标量和数组从同一个类型ID分流

附件06 2A 00 00 00解为42,86后先跟小端Int32长度3,再跟1、-2、3三个Int32。两个输入低六位都是6,表示相同元素类型,不代表相同容器形状。若总从第二字节开始读取数值,数组长度3会被误写成实际测量值,后面的元素也会整体错位。程序在读内容前就根据array标志选择标量或数组路径。

长度必须由元素宽度再次校验

本题明示只支持无维度、非null的Int32子集,数组总长应为一字节掩码、四字节数量加每元素四字节。显式负例声明两项却只给一项,不能让切片读到多少就输出多少。负数元素使用signed=True,所以FEFFFFFF还原为-2,避免把它当4294967294。其他内建类型有不同布局,不能仅换一个名称就复用固定四字节步进。

维度标志依赖数组标志

46把bit6置一却没有bit7,是矛盾组合,应先拒绝。C6这样的多维Int32数组则需要额外维度解析,不属于此程序范围;这里不会忽略尾部维度后继续生成一维值。工程接口应将类型、是否数组和实际内容分开存储,避免序列化成JSON后标量42与单元素数组[42]被自动合并,后续写入又生成不同的Variant形状。

支持子集与完整SDK有明确边界

null数组、数组维度、嵌套Variant及其他内建类型有各自规则,本题用少量独立代码验证掩码分流,不替代完整SDK。报告type_id保留6,array表示形状,value按路径输出数字或列表。现场节点还应核对DataType与ValueRank,不能因为收到的Variant能解就认定符合项目点表。附件未连接服务器或读写节点,适合在接入前测试自定义桥接层有没有把标量与数组意外转换。

下载与复跑

将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。

本次实际运行通过 4 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。type_id不包含形状位;array决定value是标量还是列表,程序不支持其他类型或null数组。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。

对象或字段的基础关系可回到楼宇与工业数据接入链路核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。

一级依据

来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。