引用如何组织数据
地址空间里的节点并不靠目录树排列,而是靠引用连接。每条引用包含源节点、引用类型、目标节点与方向,引用类型本身也是节点,因此类型之间也能形成层次(子类型关系)。分层引用回答「谁属于谁」,用来组织设备、部件与属性;非分层引用回答「这是哪一类」,把实例与它的类型定义连起来。浏览服务返回的是一组引用描述,而不是简单的文件名列表。
基本信息
| 浏览服务 | Browse / BrowseNext,按节点展开引用 |
|---|---|
| 浏览方向 | 正向、反向、双向 |
| 过滤条件 | 引用类型、是否包含子类型、节点类别掩码 |
| 续点 | 结果过多时服务器返回续点,客户端必须继续取完并释放 |
| 分层引用 | 组织、组件、属性、子类型、子节点 |
| 非分层引用 | 类型定义,指向实例所属的类型节点 |
典型使用场景
- 列出某台设备的全部部件:从设备对象按组件引用展开
- 遍历类型层次:从报警基类型顺子类型找出所有可用报警类型
- 反向查归属:拿到一个变量节点,反查它挂在哪个设备对象下
- 路径定位:用浏览路径从根节点一步定位到目标变量,避免硬编码节点标识
- 完整性检查:核对必选组件是否都存在,作为接入验收项
- 客户端建模:按引用结构自动生成界面导航,而不是手工维护清单
常用引用类型
| 引用类型 | 方向含义 | 用法 |
|---|---|---|
| 组织 | 文件夹到成员 | 把节点归入某个目录,不代表组成关系 |
| 组件 | 对象到部件 | 设备到模块、模块到变量,生命期绑定 |
| 属性 | 对象到属性变量 | 描述性数据,如工程单位与量程 |
| 子节点 | 抽象包含以上两类 | 浏览时用它一次拿到组件与属性 |
| 子类型 | 父类型到子类型 | 遍历类型树,判断兼容性 |
| 类型定义 | 实例到类型 | 实例由哪个类型定义,决定其结构 |
浏览请求的关键参数
浏览请求的关键参数
# Browse 服务常用参数
# NodeId 起点节点,例如设备对象
# BrowseDirection 正向 / 反向 / 双向
# ReferenceTypeId 只看组件时填该引用;填子节点会带出属性
# IncludeSubtypes 是否包含该引用的子类型
# NodeClassMask 只看变量时填 Variable,滤掉对象与方法
# 反向浏览常用来回答:这个变量属于哪台设备、哪个模块续点是一次性资源:取完结果后必须显式结束浏览或继续到空,否则服务器会为每个未释放的续点保留上下文,长时间运行会累积内存。
只按显示名匹配节点不可靠:不同命名空间可以出现同名节点,定位应使用节点标识或浏览路径。