在OPC UA的地址空间模型中,`VariableType` NodeClass用于定义变量的类型。要描述变量实例的数据结构和维度限制,`ValueRank`和`ArrayDimensions`这两个属性起着关键的协同作用。它们共同决定了变量值是标量、一维数组还是多维数组,并限制了各维度的最大长度。
**ValueRank 属性的作用**
`ValueRank`属性的类型是`Int32`,它用于指示`VariableType`的`Value`属性是否是一个数组,以及该数组具有多少个维度。它提供了以下几个特定的值来描述维度结构:
* **Scalar (-1)**:表示该变量值不是一个数组,即为标量。
* **OneDimension (1)**:表示该变量值是一个一维数组。
* **OneOrMoreDimensions (0)**:表示该变量值是一个具有一个或多个维度的数组。
* **Any (-2)**:表示该变量值可以是标量,也可以是具有任意数量维度的数组。
* **ScalarOrOneDimension (-3)**:表示该变量值可以是标量,也可以是一维数组。
需要注意的是,所有`DataType`都被视为标量,即使它们具有像`ByteString`和`String`这样的数组语义。
**ArrayDimensions 属性的作用**
`ArrayDimensions`属性的类型是`UInt32[]`,它用于指定数组值的每个维度的长度。它明确地指出了每个维度所支持的最大长度。如果最大长度是未知的,则该属性的值为0。
**ValueRank 与 ArrayDimensions 的协同工作**
这两个属性的关联性是:
1. **维度数量的匹配**:`ArrayDimensions`属性指定的元素数量,必须等于`ValueRank`属性所指示的维度数量。如果`ValueRank`的值小于等于0,则`ArrayDimensions`属性必须为null。
2. **维度长度的定义**:`ArrayDimensions`数组中的每个值,代表了对应维度可以支持的最大元素个数。
**示例说明**
资料提供了一个具体的例子来阐述这种协同工作:如果一个`VariableType`的`DataType`指向`Int32`,但其定义类似于C数组 `Int32 myArray[346]`,那么该`VariableType`的`ValueRank`将被设置为 `1`(表示一维数组),而`ArrayDimensions`则会是一个包含一个元素(即 `346`)的数组,从而定义了该变量实例的一维数组的最大长度限制。