In IODDs data types can either be used to represent the structure of a variable and this variable is mapped to an OPC UA Variable (see section 7.3.6), or an IODD data type is used in the context of an array or record. The following subsections describe the mapping, including whether an OPC UA Variable is used as sub-variable.

For each IODD Record a new OPC UA DataType as subtype of Structure is created.

  • The NodeId of the new DataType is composed of the NodeId of the ObjectType generated for the IODD (see section 7.3.2) and the Record/@id (“<ObjectTypeId>||<Record id>”).
  • The BrowseName and DisplayName are server-specific. It is recommended to use the Name element of the Variable in the IODD (default language English resolved textId) and “DataType” as postfix. For example, when the Variable Name has the textId “V_N_autosafeparameter”, which is defined as “autosafe parameter” in the IODD as default, the DataType BrowseName is “autosafe parameterDataType”. The DisplayName is LocalizedText, thus also different locales can be provided, using the corresponding texts of the IODD for the different locales.
  • The DataType shall use OPC Binary Encoding as definition. The DataTypeDefinition Attribute shall describe the structure according to the IODD and the rules defined next.
  • In the StructureDefinition (DataTypeDefinition Attribute) the field defaultEncodingId shall be “Default Binary”, the field baseDataType shall be “Structure”, and the field structureType “Structure_0”.
  • The array of fields (of type StructureField) shall be filled: For each IODD RecordItem defined in the IODD an entry shall be made with the following rules:
  • The Name of the IODD RecordItem (default language English resolved textId) shall map to the field name of StructureField
  • The Description of the IODD RecordItem shall map to the field description of StructureField
  • The data type of the IODD RecordItem shall map to the dataType of StructureField following Table 66

Table 66 – Mapping of data types used in IODD Record

IO-Link data type

OPC UA DataType

Remark

IntegerT

Specific Integer or Enumeration DataType

Details see section 12.2.2

UIntegerT

Specific UInteger or Enumeration DataType

Details see section 12.2.2

Float32T

Float

Details see section 12.2.3

BooleanT

Boolean

Details see section 12.2.1

OctetStringT

Byte[]

Details see section 12.2.5

StringT

String

Details see section 12.2.4

TimeT

DateTime

Details see section 12.2.6

TimeSpanT

Duration

Details see section 12.2.7.2

  • The field valueRank shall be “Scalar”
  • The field arrayDimensions shall be null, except for the OctetStringT data type mapping, where the fixedLength element is mapped to arrayDimensions
  • The field maxStringLength shall contain the fixedLength for Strings, otherwise “0”
  • The field isOptional shall be “False”

In addition to the structured DataType more things need to be considered. If the new defined Structure DataType is used in an OPC UA Variable, the following rules apply.

  • If all entries of the IODD Record are readable (RO or RW), the Variable becomes readable, otherwise the Variable as such is not readable.
  • If all entries of the IODD Record are writable (WO or RW), the Variable becomes writeable, otherwise the Variable as such is not writeable.
  • If the IODD Record has “subindexAccessSupported” to “True”, each entry of the structure is also exposed as subvariables following the general rules (e.g. for IntegerT, which might lead to an Enum DataType or usage of specific VariableTypes). If the individual entry is readable, the Variable becomes readable, if the individual entry is writable the Variable becomes writeable.
  • If the IODD Record has “subindexAccessSupported” to “False”, but it contains entries that would map to Variables with additional Properties, those entries shall be exposed as subvariables following the general rules (because of the meta data). If the whole record is readable, they shall become readable but not writeable, otherwise they become neither readable nor writeable. Such subvariables shall be created for all StringT, and some IntegerT, UIntegerT, FloatT, and BooleanT (depending whether the concrete mapping would create a Property on the Variable). If does not need to be provided for OctetStringT, TimeT, and TimeSpanT.
  • If an entry of the IODD Record is referenced by a RecordItemRef it shall be exposed as sub-variable, even if the RecordItemRef is in an optional IODD Menu.

Note that a VariableRef and RecordItemRef defines additional characteristics (see 7.3). Those need to be considered as well.

An IODD variable having the IODD data type ArrayT is mapped to an OPC UA Variable with ValueRank OneDimensionalArray.

The data type used in the array of the IODD is the base for the mapping of the data type to OPC UA (see 12.2). That does include the VariableType to use and what Properties on the Variable shall exist.

The ValueRank Attribute of the OPC UA Variable shall be OneDimensionalArray.

The ArrayDimensions Attribute of the OPC UA Variable shall be an array with exactly one entry. The value of that entry shall be the size element of the IODD Variable.