OPC UA 数字 NodeId 为什么有 2、4、7 字节:怎样按编码字节解析
数字NodeId有TwoByte、FourByte和完整Numeric三种二进制形式,长度分别为2、4、7字节,均含编码字节。它们可以表达同一节点;编码更短不是节点类型不同,也不说明节点读写能力更少。
适用版本与输入范围
依据 OPC Foundation 官方参考,v105 链接在核对时显示 v1.05.07,具体 Part 与章节见文末。示例只处理明确声明的值与结构,不实现网络会话、证书或完整服务端。 本文所有输入均为原创合成数据,未接真实设备。
编码字节决定后续字段宽度
附件用ns=0、i=42分别给出00 2A、01 00 2A 00和02 00 00 2A 00 00 00,三种输入都应还原同一namespace和identifier。TwoByte省略命名空间字段,固定为0,并把标识压成一字节;FourByte用一字节命名空间和两字节标识;Numeric则用两字节命名空间和四字节标识。不能拿一种固定偏移去解析所有数字NodeId。
多字节整数按小端读取
完整Numeric样例的namespace=300编码为2C01,identifier=70000编码为70110100。这个输入能发现只测试ns=0和小标识时被掩盖的端序错误。TwoByte允许的标识范围0到255,FourByte的命名空间0到255、标识0到65535,超出就需完整Numeric。程序负责解码指定形式,不强制输入必须选择最短形式;较长编码表达同一值仍可合法,不应自动判成错误节点。
完整长度核对防止切片容错
FourByte负例只有01 02 2A,缺少标识的高字节。Python切片加整数转换仍能产生42,但报文并不完整,程序在转换前拒绝。不同Identifier类型如String或GUID,以及ExpandedNodeId附加标志,都不在本题三种编码子集里,不会被猜成Numeric。真实服务解析应先从流中消费恰好相应长度,本演示输入已经单独提取一个NodeId,故多余尾字节也应报长度错误。
原编码与语义身份分别比较
报告encoding记录输入形式,namespace与identifier组成数值身份。两个结果只在encoding不同,不能直接说节点不同;反之标识42相同但namespace不同,也不能合并。若要跨服务器比较还须把索引解析为URI。本程序不连接OPC服务器、不浏览节点、不验证读数,只提供二进制字段核对。工程日志保留原始hex可以复查客户端或SDK选择的压缩形式,避免用字符串相等掩盖命名空间差异。
下载与复跑
将输入 fixture.json与独立程序 verify.py放在同一目录,用 Python 3.12 执行 python verify.py,无需安装第三方包。程序从自身目录读取输入并写入 report.json,不要求当前终端恰好位于下载目录。也可查看本次实跑报告和复跑说明。
本次实际运行通过 5 条输入断言,包括标有“显式负例”的记录;负例以JSON字段承载,不会把下载文件本身做成损坏编码。encoding记录二进制形式;namespace与identifier才是本服务器下的语义字段。 修改输入后应同时审查期望结果,不能只改断言数字让测试变绿。
对象或字段的基础关系可回到楼宇与工业数据接入链路核对,更多接口入口在设备协议库。若需要把已确认的数据点接入展项编排,可了解SoftControl 展厅中控;具体接入能力以项目确认和实际测试为准。
一级依据
来源核对日期:2026-10-24。离线结果只证明给定输入的解析或计算行为;现场兼容性、响应时间、硬件准确度和具体产品支持均未测量。
相关阅读
留言讨论
评论发布后会被人工复核,违规内容将被删除。
如果发表没有反应,可以前往联系我们告诉我们。