DA — Data Access
Data Access (DA) 是 OPC UA 最基础的访问类型, 几乎每个 OPC UA Server 都实现 DA. 它定义了如何用标准方式暴露和访问实时数据.
配套阅读
- 基础知识 — 节点 — Variable NodeClass 与 Attribute
- 基础知识 — 订阅模型 — DataChangeFilter 死区配置
- 示例 — 多点订阅采集
DA 核心节点类型
| Type | 用途 |
|---|---|
BaseDataVariableType | 通用数据变量基类 |
DataItemType | 实时数据项 (含工程单位) |
AnalogItemType | 模拟量 (含 EU Range / Engineering Units) |
DiscreteItemType | 离散量 (开关 / 状态) |
TwoStateDiscreteType | 两态离散 (布尔) |
MultiStateDiscreteType | 多态离散 (枚举) |
MultiStateValueDiscreteType | 多态值离散 |
标准 Property
DA 变量通常带这些 Property:
| Property | 含义 | 示例值 |
|---|---|---|
EngineeringUnits | 工程单位 (含 NamespaceUri / Unit Id / DisplayName / Description) | °C |
EURange | 工程单位范围 [Low, High] | [-50, 200] |
InstrumentRange | 物理仪表量程 | [-100, 300] |
ValuePrecision | 数值精度 | 0.1 |
Definition | 定义 (可选) | "Boiler outlet temperature" |
客户端读取示例
// 读温度值
var temp = ua.Read("ns=2;s=Boiler1.Temperature");
Console.WriteLine($"Value = {temp.Value.AsDouble}");
// 读单位
var unit = ua.Read("ns=2;s=Boiler1.Temperature.EngineeringUnits");
Console.WriteLine($"Unit = {unit.Value}"); // EUInformation 结构
// 读量程范围
var range = ua.Read("ns=2;s=Boiler1.Temperature.EURange"); // 返回 Range 结构
死区订阅 (DataChangeFilter)
DA 变量订阅时常用 Percent 死区, 减少噪声:
sub.Add("ns=2;s=Boiler1.Temperature",
samplingIntervalMs: 100,
deadband: new DataChangeFilter {
DeadbandType = DeadbandType.Percent,
DeadbandValue = 1.0, // 1% of EURange
Trigger = DataChangeTrigger.StatusValue
});
实战要点
- AnalogItemType 必须有 EURange Property, 否则不能算 Percent 死区
- DiscreteItemType 用 Status 作变化触发
- 客户端不要硬编码
°C等单位字面量, 要从EngineeringUnits.UnitId拿 (UNECE 编码)