References between Objects in different Object lists are mapped using an array index field for the related structure array. For example, the AutomationComponentConfigurationDataType has ServerAddressIndex that contains an index into the ServerAddress in the ConnectionConfigurationSetConfDataType. Indices are defined as Int32; a negative number indicates no Reference exists.

OPC UA uses Namespaces, and in a defined scope, all identifiers (NodeId, QualifiedName) use a NamespaceIndex instead of a NamespaceUri. The scope has a NamespaceArray with URIs where the NamespaceIndex is defined as an index into this array. For a Server, the scope is the complete Server. For a UANodeSet XML file, it is the file.

A ConnectionConfigurationSet (see 6.8.2) contains node identifiers related to different scopes, as illustrated in Figure F.2. In this illustration, the ConnectionConfigurationSet contains information for two different Servers. Node identifiers in the Information Model for the ConnectionManager (i.e., an instance of ConnectionConfigurationSetType) use PortableNodeIdentifier (see 10.32) to support the resolution for the dedicated scope (see also 13.3).

image151.png

Figure F.2 – Scopes within a ConnectionConfigurationSet

To reduce the overall size of the DataTypes defined in this Clause (i.e. ConnectionConfigurationSetConfDataType), NodeId, AliasName and RelativePath are used instead of their portable version. The scope of those identifiers is defined by the related ServerAddressConfDataType structure containing a Namespace array. The NamespaceIndex of a node identifier is used as an index into the Namespace array of the related ServerAddressConfDataType.

A ConnectionManager can map NodeId and RelativePath  contained in the DataTypes to their portable versions using the NamespaceUri from the Namespace array when it loads the ConnectionConfigurationSet from the data structure.

There is no generic DataType defined to represent a SelectionListType Variable. A generic definition would create additional overhead since the values may have different DataTypes.

To simplify the handling of SelectionListType, each Variable that is of SelectionListType is mapped to:

  • A Structure field with the corresponding DataType representing the current value. The field name is constructed from the Variable name (<Variable name>).
  • A Structure field with an array of the corresponding DataType representing the additional selection options (selectable values associated with the selection list – the list may contain only the current value if this selection list currently does not provide for modifications). The field name is constructed from the Variable name with ‘Selection’ suffix (<Variable name>Selection).
  • A Structure field with DataType Boolean indicates if the list of selectable values is enterable by a Client. The field is omitted if the specification requires that RestrictToList is set to TRUE (i.e. no values can be entered; only a selection is possible). The field name is constructed from the Variable name with ‘Modify’ suffix (<Variable name>Modify).

Structured DataTypes may only be extended by subtyping. This is a problem if Structures are embedded into other Structures, e.g., the ConnectionConfigurationSet-related Structure has an array of AutomationComponent related Structures. Therefore, each Structure has an additional field with an array of KeyValuePairs that may be used for potential future standardized or vendor-specific extensions.

ConnectionConfiguration and communication flow-related configuration Structures use Structures with optional fields to handle the optional Variables.

In other configuration Structures, AllowSubtypes is needed. Since AllowSubtypes cannot be combined with IsOptional, optional handling is done with empty arrays or null values for the used DataType.