You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2022/08/24 16:12:20 UTC

[plc4x] 11/12: chore(plc4go/ads): Updated go code for ADS

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch feature/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 513fa67186b32273be4a5981c0107b313475b310
Author: Christofer Dutz <ch...@rivian.com>
AuthorDate: Wed Aug 24 18:11:17 2022 +0200

    chore(plc4go/ads): Updated go code for ADS
---
 plc4go/protocols/ads/readwrite/ParserHelper.go     |   7 +-
 plc4go/protocols/ads/readwrite/XmlParserHelper.go  |   5 +-
 .../protocols/ads/readwrite/model/AdsDataType.go   |  92 +++---
 plc4go/protocols/ads/readwrite/model/DataItem.go   | 104 +++---
 .../protocols/ads/readwrite/model/PlcValueType.go  | 361 +++++++++++++++++++++
 .../ads/readwrite/model/ReservedIndexGroups.go     |  88 +++--
 6 files changed, 519 insertions(+), 138 deletions(-)

diff --git a/plc4go/protocols/ads/readwrite/ParserHelper.go b/plc4go/protocols/ads/readwrite/ParserHelper.go
index 886924168..1e0a3a4f1 100644
--- a/plc4go/protocols/ads/readwrite/ParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/ParserHelper.go
@@ -35,15 +35,12 @@ func (m AdsParserHelper) Parse(typeName string, arguments []string, io utils.Rea
 	case "AmsSerialFrame":
 		return model.AmsSerialFrameParse(io)
 	case "DataItem":
-		dataFormatName, err := utils.StrToString(arguments[0])
-		if err != nil {
-			return nil, errors.Wrap(err, "Error parsing")
-		}
+		plcValueType, _ := model.PlcValueTypeByName(arguments[0])
 		stringLength, err := utils.StrToInt32(arguments[1])
 		if err != nil {
 			return nil, errors.Wrap(err, "Error parsing")
 		}
-		return model.DataItemParse(io, dataFormatName, stringLength)
+		return model.DataItemParse(io, plcValueType, stringLength)
 	case "AdsTableSizes":
 		return model.AdsTableSizesParse(io)
 	case "AdsMultiRequestItem":
diff --git a/plc4go/protocols/ads/readwrite/XmlParserHelper.go b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
index 39125b2e7..06b1eb683 100644
--- a/plc4go/protocols/ads/readwrite/XmlParserHelper.go
+++ b/plc4go/protocols/ads/readwrite/XmlParserHelper.go
@@ -45,14 +45,13 @@ func (m AdsXmlParserHelper) Parse(typeName string, xmlString string, parserArgum
 	case "AmsSerialFrame":
 		return model.AmsSerialFrameParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "DataItem":
-		// TODO: find a way to parse the sub types
-		var dataFormatName string
+		plcValueType, _ := model.PlcValueTypeByName(parserArguments[0])
 		parsedInt1, err := strconv.ParseInt(parserArguments[1], 10, 32)
 		if err != nil {
 			return nil, err
 		}
 		stringLength := int32(parsedInt1)
-		return model.DataItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), dataFormatName, stringLength)
+		return model.DataItemParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)), plcValueType, stringLength)
 	case "AdsTableSizes":
 		return model.AdsTableSizesParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "AdsMultiRequestItem":
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataType.go b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
index 99d9680ee..6918b275c 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataType.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataType.go
@@ -32,7 +32,7 @@ type AdsDataType int8
 
 type IAdsDataType interface {
 	NumBytes() uint16
-	DataFormatName() string
+	PlcValueType() PlcValueType
 	Serialize(writeBuffer utils.WriteBuffer) error
 }
 
@@ -305,182 +305,182 @@ func AdsDataTypeFirstEnumForFieldNumBytes(value uint16) (AdsDataType, error) {
 	return 0, errors.Errorf("enum for %v describing NumBytes not found", value)
 }
 
-func (e AdsDataType) DataFormatName() string {
+func (e AdsDataType) PlcValueType() PlcValueType {
 	switch e {
 	case 0x01:
 		{ /* '0x01' */
-			return "IEC61131_BOOL"
+			return PlcValueType_BOOL
 		}
 	case 0x02:
 		{ /* '0x02' */
-			return "IEC61131_BOOL"
+			return PlcValueType_BOOL
 		}
 	case 0x03:
 		{ /* '0x03' */
-			return "IEC61131_BYTE"
+			return PlcValueType_BYTE
 		}
 	case 0x04:
 		{ /* '0x04' */
-			return "IEC61131_BYTE"
+			return PlcValueType_BYTE
 		}
 	case 0x05:
 		{ /* '0x05' */
-			return "IEC61131_BYTE"
+			return PlcValueType_BYTE
 		}
 	case 0x06:
 		{ /* '0x06' */
-			return "IEC61131_WORD"
+			return PlcValueType_WORD
 		}
 	case 0x07:
 		{ /* '0x07' */
-			return "IEC61131_WORD"
+			return PlcValueType_WORD
 		}
 	case 0x08:
 		{ /* '0x08' */
-			return "IEC61131_DWORD"
+			return PlcValueType_DWORD
 		}
 	case 0x09:
 		{ /* '0x09' */
-			return "IEC61131_DWORD"
+			return PlcValueType_DWORD
 		}
 	case 0x0A:
 		{ /* '0x0A' */
-			return "IEC61131_SINT"
+			return PlcValueType_SINT
 		}
 	case 0x0B:
 		{ /* '0x0B' */
-			return "IEC61131_SINT"
+			return PlcValueType_SINT
 		}
 	case 0x0C:
 		{ /* '0x0C' */
-			return "IEC61131_USINT"
+			return PlcValueType_USINT
 		}
 	case 0x0D:
 		{ /* '0x0D' */
-			return "IEC61131_USINT"
+			return PlcValueType_USINT
 		}
 	case 0x0E:
 		{ /* '0x0E' */
-			return "IEC61131_INT"
+			return PlcValueType_INT
 		}
 	case 0x0F:
 		{ /* '0x0F' */
-			return "IEC61131_INT"
+			return PlcValueType_INT
 		}
 	case 0x10:
 		{ /* '0x10' */
-			return "IEC61131_UINT"
+			return PlcValueType_UINT
 		}
 	case 0x11:
 		{ /* '0x11' */
-			return "IEC61131_UINT"
+			return PlcValueType_UINT
 		}
 	case 0x12:
 		{ /* '0x12' */
-			return "IEC61131_DINT"
+			return PlcValueType_DINT
 		}
 	case 0x13:
 		{ /* '0x13' */
-			return "IEC61131_DINT"
+			return PlcValueType_DINT
 		}
 	case 0x14:
 		{ /* '0x14' */
-			return "IEC61131_UDINT"
+			return PlcValueType_UDINT
 		}
 	case 0x15:
 		{ /* '0x15' */
-			return "IEC61131_UDINT"
+			return PlcValueType_UDINT
 		}
 	case 0x16:
 		{ /* '0x16' */
-			return "IEC61131_LINT"
+			return PlcValueType_LINT
 		}
 	case 0x17:
 		{ /* '0x17' */
-			return "IEC61131_LINT"
+			return PlcValueType_LINT
 		}
 	case 0x18:
 		{ /* '0x18' */
-			return "IEC61131_ULINT"
+			return PlcValueType_ULINT
 		}
 	case 0x19:
 		{ /* '0x19' */
-			return "IEC61131_ULINT"
+			return PlcValueType_ULINT
 		}
 	case 0x1A:
 		{ /* '0x1A' */
-			return "IEC61131_REAL"
+			return PlcValueType_REAL
 		}
 	case 0x1B:
 		{ /* '0x1B' */
-			return "IEC61131_REAL"
+			return PlcValueType_REAL
 		}
 	case 0x1C:
 		{ /* '0x1C' */
-			return "IEC61131_LREAL"
+			return PlcValueType_LREAL
 		}
 	case 0x1D:
 		{ /* '0x1D' */
-			return "IEC61131_LREAL"
+			return PlcValueType_LREAL
 		}
 	case 0x1E:
 		{ /* '0x1E' */
-			return "IEC61131_CHAR"
+			return PlcValueType_CHAR
 		}
 	case 0x1F:
 		{ /* '0x1F' */
-			return "IEC61131_WCHAR"
+			return PlcValueType_WCHAR
 		}
 	case 0x20:
 		{ /* '0x20' */
-			return "IEC61131_STRING"
+			return PlcValueType_STRING
 		}
 	case 0x21:
 		{ /* '0x21' */
-			return "IEC61131_WSTRING"
+			return PlcValueType_WSTRING
 		}
 	case 0x22:
 		{ /* '0x22' */
-			return "IEC61131_TIME"
+			return PlcValueType_TIME
 		}
 	case 0x23:
 		{ /* '0x23' */
-			return "IEC61131_LTIME"
+			return PlcValueType_LTIME
 		}
 	case 0x24:
 		{ /* '0x24' */
-			return "IEC61131_DATE"
+			return PlcValueType_DATE
 		}
 	case 0x25:
 		{ /* '0x25' */
-			return "IEC61131_TIME_OF_DAY"
+			return PlcValueType_TIME_OF_DAY
 		}
 	case 0x26:
 		{ /* '0x26' */
-			return "IEC61131_TIME_OF_DAY"
+			return PlcValueType_TIME_OF_DAY
 		}
 	case 0x27:
 		{ /* '0x27' */
-			return "IEC61131_DATE_AND_TIME"
+			return PlcValueType_DATE_AND_TIME
 		}
 	case 0x28:
 		{ /* '0x28' */
-			return "IEC61131_DATE_AND_TIME"
+			return PlcValueType_DATE_AND_TIME
 		}
 	default:
 		{
-			return ""
+			return 0
 		}
 	}
 }
 
-func AdsDataTypeFirstEnumForFieldDataFormatName(value string) (AdsDataType, error) {
+func AdsDataTypeFirstEnumForFieldPlcValueType(value PlcValueType) (AdsDataType, error) {
 	for _, sizeValue := range AdsDataTypeValues {
-		if sizeValue.DataFormatName() == value {
+		if sizeValue.PlcValueType() == value {
 			return sizeValue, nil
 		}
 	}
-	return 0, errors.Errorf("enum for %v describing DataFormatName not found", value)
+	return 0, errors.Errorf("enum for %v describing PlcValueType not found", value)
 }
 func AdsDataTypeByValue(value int8) (enum AdsDataType, ok bool) {
 	switch value {
diff --git a/plc4go/protocols/ads/readwrite/model/DataItem.go b/plc4go/protocols/ads/readwrite/model/DataItem.go
index 5d2215378..ad0f76c64 100644
--- a/plc4go/protocols/ads/readwrite/model/DataItem.go
+++ b/plc4go/protocols/ads/readwrite/model/DataItem.go
@@ -29,10 +29,10 @@ import (
 
 // Code generated by code-generation. DO NOT EDIT.
 
-func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLength int32) (api.PlcValue, error) {
+func DataItemParse(readBuffer utils.ReadBuffer, plcValueType PlcValueType, stringLength int32) (api.PlcValue, error) {
 	readBuffer.PullContext("DataItem")
 	switch {
-	case dataFormatName == "IEC61131_BOOL": // BOOL
+	case plcValueType == PlcValueType_BOOL: // BOOL
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 7); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
@@ -45,7 +45,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBOOL(value), nil
-	case dataFormatName == "IEC61131_BYTE": // BitString
+	case plcValueType == PlcValueType_BYTE: // BitString
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint8("value", 8)
 		if _valueErr != nil {
@@ -53,7 +53,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBitString(value), nil
-	case dataFormatName == "IEC61131_WORD": // BitString
+	case plcValueType == PlcValueType_WORD: // BitString
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint16("value", 16)
 		if _valueErr != nil {
@@ -61,7 +61,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBitString(value), nil
-	case dataFormatName == "IEC61131_DWORD": // BitString
+	case plcValueType == PlcValueType_DWORD: // BitString
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
@@ -69,7 +69,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBitString(value), nil
-	case dataFormatName == "IEC61131_SINT": // SINT
+	case plcValueType == PlcValueType_SINT: // SINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt8("value", 8)
 		if _valueErr != nil {
@@ -77,7 +77,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcSINT(value), nil
-	case dataFormatName == "IEC61131_USINT": // USINT
+	case plcValueType == PlcValueType_USINT: // USINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint8("value", 8)
 		if _valueErr != nil {
@@ -85,7 +85,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcUSINT(value), nil
-	case dataFormatName == "IEC61131_INT": // INT
+	case plcValueType == PlcValueType_INT: // INT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt16("value", 16)
 		if _valueErr != nil {
@@ -93,7 +93,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcINT(value), nil
-	case dataFormatName == "IEC61131_UINT": // UINT
+	case plcValueType == PlcValueType_UINT: // UINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint16("value", 16)
 		if _valueErr != nil {
@@ -101,7 +101,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcUINT(value), nil
-	case dataFormatName == "IEC61131_DINT": // DINT
+	case plcValueType == PlcValueType_DINT: // DINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt32("value", 32)
 		if _valueErr != nil {
@@ -109,7 +109,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcDINT(value), nil
-	case dataFormatName == "IEC61131_UDINT": // UDINT
+	case plcValueType == PlcValueType_UDINT: // UDINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
@@ -117,7 +117,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcUDINT(value), nil
-	case dataFormatName == "IEC61131_LINT": // LINT
+	case plcValueType == PlcValueType_LINT: // LINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt64("value", 64)
 		if _valueErr != nil {
@@ -125,7 +125,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcLINT(value), nil
-	case dataFormatName == "IEC61131_ULINT": // ULINT
+	case plcValueType == PlcValueType_ULINT: // ULINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint64("value", 64)
 		if _valueErr != nil {
@@ -133,7 +133,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcULINT(value), nil
-	case dataFormatName == "IEC61131_REAL": // REAL
+	case plcValueType == PlcValueType_REAL: // REAL
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadFloat32("value", 32)
 		if _valueErr != nil {
@@ -141,7 +141,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcREAL(value), nil
-	case dataFormatName == "IEC61131_LREAL": // LREAL
+	case plcValueType == PlcValueType_LREAL: // LREAL
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadFloat64("value", 64)
 		if _valueErr != nil {
@@ -149,7 +149,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcLREAL(value), nil
-	case dataFormatName == "IEC61131_CHAR": // STRING
+	case plcValueType == PlcValueType_CHAR: // STRING
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadString("value", uint32(8))
 		if _valueErr != nil {
@@ -157,7 +157,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcSTRING(value), nil
-	case dataFormatName == "IEC61131_WCHAR": // STRING
+	case plcValueType == PlcValueType_WCHAR: // STRING
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadString("value", uint32(16))
 		if _valueErr != nil {
@@ -165,7 +165,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcSTRING(value), nil
-	case dataFormatName == "IEC61131_STRING": // STRING
+	case plcValueType == PlcValueType_STRING: // STRING
 		// Manual Field (value)
 		value, _valueErr := ParseAmsString(readBuffer, stringLength, "UTF-8")
 		if _valueErr != nil {
@@ -173,7 +173,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcSTRING(value), nil
-	case dataFormatName == "IEC61131_WSTRING": // STRING
+	case plcValueType == PlcValueType_WSTRING: // STRING
 		// Manual Field (value)
 		value, _valueErr := ParseAmsString(readBuffer, stringLength, "UTF-16")
 		if _valueErr != nil {
@@ -181,7 +181,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcSTRING(value), nil
-	case dataFormatName == "IEC61131_TIME": // TIME
+	case plcValueType == PlcValueType_TIME: // TIME
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
@@ -189,7 +189,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcTIME(value), nil
-	case dataFormatName == "IEC61131_LTIME": // LTIME
+	case plcValueType == PlcValueType_LTIME: // LTIME
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint64("value", 64)
 		if _valueErr != nil {
@@ -197,7 +197,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcLTIME(value), nil
-	case dataFormatName == "IEC61131_DATE": // DATE
+	case plcValueType == PlcValueType_DATE: // DATE
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
@@ -205,7 +205,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcDATE(value), nil
-	case dataFormatName == "IEC61131_TIME_OF_DAY": // TIME_OF_DAY
+	case plcValueType == PlcValueType_TIME_OF_DAY: // TIME_OF_DAY
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
@@ -213,7 +213,7 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcTIME_OF_DAY(value), nil
-	case dataFormatName == "IEC61131_DATE_AND_TIME": // DATE_AND_TIME
+	case plcValueType == PlcValueType_DATE_AND_TIME: // DATE_AND_TIME
 		// Simple Field (secondsSinceEpoch)
 		secondsSinceEpoch, _secondsSinceEpochErr := readBuffer.ReadUint32("secondsSinceEpoch", 32)
 		if _secondsSinceEpochErr != nil {
@@ -227,18 +227,18 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataFormatName string, stringLen
 	return nil, errors.New("unsupported type")
 }
 
-func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, dataFormatName string, stringLength int32) error {
+func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, plcValueType PlcValueType, stringLength int32) error {
 	m := struct {
-		DataFormatName string
-		StringLength   int32
+		PlcValueType PlcValueType
+		StringLength int32
 	}{
-		DataFormatName: dataFormatName,
-		StringLength:   stringLength,
+		PlcValueType: plcValueType,
+		StringLength: stringLength,
 	}
 	_ = m
 	writeBuffer.PushContext("DataItem")
 	switch {
-	case dataFormatName == "IEC61131_BOOL": // BOOL
+	case plcValueType == PlcValueType_BOOL: // BOOL
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 7, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
@@ -248,114 +248,114 @@ func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, dataFo
 		if _err := writeBuffer.WriteBit("value", value.GetBool()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_BYTE": // BitString
+	case plcValueType == PlcValueType_BYTE: // BitString
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_WORD": // BitString
+	case plcValueType == PlcValueType_WORD: // BitString
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_DWORD": // BitString
+	case plcValueType == PlcValueType_DWORD: // BitString
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_SINT": // SINT
+	case plcValueType == PlcValueType_SINT: // SINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteInt8("value", 8, value.GetInt8()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_USINT": // USINT
+	case plcValueType == PlcValueType_USINT: // USINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_INT": // INT
+	case plcValueType == PlcValueType_INT: // INT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteInt16("value", 16, value.GetInt16()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_UINT": // UINT
+	case plcValueType == PlcValueType_UINT: // UINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_DINT": // DINT
+	case plcValueType == PlcValueType_DINT: // DINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteInt32("value", 32, value.GetInt32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_UDINT": // UDINT
+	case plcValueType == PlcValueType_UDINT: // UDINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_LINT": // LINT
+	case plcValueType == PlcValueType_LINT: // LINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteInt64("value", 64, value.GetInt64()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_ULINT": // ULINT
+	case plcValueType == PlcValueType_ULINT: // ULINT
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint64("value", 64, value.GetUint64()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_REAL": // REAL
+	case plcValueType == PlcValueType_REAL: // REAL
 		// Simple Field (value)
 		if _err := writeBuffer.WriteFloat32("value", 32, value.GetFloat32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_LREAL": // LREAL
+	case plcValueType == PlcValueType_LREAL: // LREAL
 		// Simple Field (value)
 		if _err := writeBuffer.WriteFloat64("value", 64, value.GetFloat64()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_CHAR": // STRING
+	case plcValueType == PlcValueType_CHAR: // STRING
 		// Simple Field (value)
 		if _err := writeBuffer.WriteString("value", uint32(8), "UTF-8", value.GetString()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_WCHAR": // STRING
+	case plcValueType == PlcValueType_WCHAR: // STRING
 		// Simple Field (value)
 		if _err := writeBuffer.WriteString("value", uint32(16), "UTF-16", value.GetString()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_STRING": // STRING
+	case plcValueType == PlcValueType_STRING: // STRING
 		// Manual Field (value)
 		_valueErr := SerializeAmsString(writeBuffer, value, m.StringLength, "UTF-8")
 		if _valueErr != nil {
 			return errors.Wrap(_valueErr, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_WSTRING": // STRING
+	case plcValueType == PlcValueType_WSTRING: // STRING
 		// Manual Field (value)
 		_valueErr := SerializeAmsString(writeBuffer, value, m.StringLength, "UTF-16")
 		if _valueErr != nil {
 			return errors.Wrap(_valueErr, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_TIME": // TIME
+	case plcValueType == PlcValueType_TIME: // TIME
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_LTIME": // LTIME
+	case plcValueType == PlcValueType_LTIME: // LTIME
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint64("value", 64, value.GetUint64()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_DATE": // DATE
+	case plcValueType == PlcValueType_DATE: // DATE
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_TIME_OF_DAY": // TIME_OF_DAY
+	case plcValueType == PlcValueType_TIME_OF_DAY: // TIME_OF_DAY
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataFormatName == "IEC61131_DATE_AND_TIME": // DATE_AND_TIME
+	case plcValueType == PlcValueType_DATE_AND_TIME: // DATE_AND_TIME
 		// Simple Field (secondsSinceEpoch)
 		if _err := writeBuffer.WriteUint32("secondsSinceEpoch", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'secondsSinceEpoch' field")
diff --git a/plc4go/protocols/ads/readwrite/model/PlcValueType.go b/plc4go/protocols/ads/readwrite/model/PlcValueType.go
new file mode 100644
index 000000000..2817a8ba0
--- /dev/null
+++ b/plc4go/protocols/ads/readwrite/model/PlcValueType.go
@@ -0,0 +1,361 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package model
+
+import (
+	"github.com/apache/plc4x/plc4go/spi/utils"
+	"github.com/pkg/errors"
+	"github.com/rs/zerolog/log"
+)
+
+// Code generated by code-generation. DO NOT EDIT.
+
+// PlcValueType is an enum
+type PlcValueType uint8
+
+type IPlcValueType interface {
+	Serialize(writeBuffer utils.WriteBuffer) error
+}
+
+const (
+	PlcValueType_NULL           PlcValueType = 0x00
+	PlcValueType_BOOL           PlcValueType = 0x01
+	PlcValueType_BYTE           PlcValueType = 0x02
+	PlcValueType_WORD           PlcValueType = 0x03
+	PlcValueType_DWORD          PlcValueType = 0x04
+	PlcValueType_LWORD          PlcValueType = 0x05
+	PlcValueType_USINT          PlcValueType = 0x11
+	PlcValueType_UINT           PlcValueType = 0x12
+	PlcValueType_UDINT          PlcValueType = 0x13
+	PlcValueType_ULINT          PlcValueType = 0x14
+	PlcValueType_SINT           PlcValueType = 0x21
+	PlcValueType_INT            PlcValueType = 0x22
+	PlcValueType_DINT           PlcValueType = 0x23
+	PlcValueType_LINT           PlcValueType = 0x24
+	PlcValueType_REAL           PlcValueType = 0x31
+	PlcValueType_LREAL          PlcValueType = 0x32
+	PlcValueType_CHAR           PlcValueType = 0x41
+	PlcValueType_WCHAR          PlcValueType = 0x42
+	PlcValueType_STRING         PlcValueType = 0x43
+	PlcValueType_WSTRING        PlcValueType = 0x44
+	PlcValueType_TIME           PlcValueType = 0x51
+	PlcValueType_LTIME          PlcValueType = 0x52
+	PlcValueType_DATE           PlcValueType = 0x53
+	PlcValueType_LDATE          PlcValueType = 0x54
+	PlcValueType_TIME_OF_DAY    PlcValueType = 0x55
+	PlcValueType_LTIME_OF_DAY   PlcValueType = 0x56
+	PlcValueType_DATE_AND_TIME  PlcValueType = 0x57
+	PlcValueType_LDATE_AND_TIME PlcValueType = 0x58
+	PlcValueType_Struct         PlcValueType = 0x61
+	PlcValueType_List           PlcValueType = 0x62
+	PlcValueType_RAW_BYTE_ARRAY PlcValueType = 0x71
+)
+
+var PlcValueTypeValues []PlcValueType
+
+func init() {
+	_ = errors.New
+	PlcValueTypeValues = []PlcValueType{
+		PlcValueType_NULL,
+		PlcValueType_BOOL,
+		PlcValueType_BYTE,
+		PlcValueType_WORD,
+		PlcValueType_DWORD,
+		PlcValueType_LWORD,
+		PlcValueType_USINT,
+		PlcValueType_UINT,
+		PlcValueType_UDINT,
+		PlcValueType_ULINT,
+		PlcValueType_SINT,
+		PlcValueType_INT,
+		PlcValueType_DINT,
+		PlcValueType_LINT,
+		PlcValueType_REAL,
+		PlcValueType_LREAL,
+		PlcValueType_CHAR,
+		PlcValueType_WCHAR,
+		PlcValueType_STRING,
+		PlcValueType_WSTRING,
+		PlcValueType_TIME,
+		PlcValueType_LTIME,
+		PlcValueType_DATE,
+		PlcValueType_LDATE,
+		PlcValueType_TIME_OF_DAY,
+		PlcValueType_LTIME_OF_DAY,
+		PlcValueType_DATE_AND_TIME,
+		PlcValueType_LDATE_AND_TIME,
+		PlcValueType_Struct,
+		PlcValueType_List,
+		PlcValueType_RAW_BYTE_ARRAY,
+	}
+}
+
+func PlcValueTypeByValue(value uint8) (enum PlcValueType, ok bool) {
+	switch value {
+	case 0x00:
+		return PlcValueType_NULL, true
+	case 0x01:
+		return PlcValueType_BOOL, true
+	case 0x02:
+		return PlcValueType_BYTE, true
+	case 0x03:
+		return PlcValueType_WORD, true
+	case 0x04:
+		return PlcValueType_DWORD, true
+	case 0x05:
+		return PlcValueType_LWORD, true
+	case 0x11:
+		return PlcValueType_USINT, true
+	case 0x12:
+		return PlcValueType_UINT, true
+	case 0x13:
+		return PlcValueType_UDINT, true
+	case 0x14:
+		return PlcValueType_ULINT, true
+	case 0x21:
+		return PlcValueType_SINT, true
+	case 0x22:
+		return PlcValueType_INT, true
+	case 0x23:
+		return PlcValueType_DINT, true
+	case 0x24:
+		return PlcValueType_LINT, true
+	case 0x31:
+		return PlcValueType_REAL, true
+	case 0x32:
+		return PlcValueType_LREAL, true
+	case 0x41:
+		return PlcValueType_CHAR, true
+	case 0x42:
+		return PlcValueType_WCHAR, true
+	case 0x43:
+		return PlcValueType_STRING, true
+	case 0x44:
+		return PlcValueType_WSTRING, true
+	case 0x51:
+		return PlcValueType_TIME, true
+	case 0x52:
+		return PlcValueType_LTIME, true
+	case 0x53:
+		return PlcValueType_DATE, true
+	case 0x54:
+		return PlcValueType_LDATE, true
+	case 0x55:
+		return PlcValueType_TIME_OF_DAY, true
+	case 0x56:
+		return PlcValueType_LTIME_OF_DAY, true
+	case 0x57:
+		return PlcValueType_DATE_AND_TIME, true
+	case 0x58:
+		return PlcValueType_LDATE_AND_TIME, true
+	case 0x61:
+		return PlcValueType_Struct, true
+	case 0x62:
+		return PlcValueType_List, true
+	case 0x71:
+		return PlcValueType_RAW_BYTE_ARRAY, true
+	}
+	return 0, false
+}
+
+func PlcValueTypeByName(value string) (enum PlcValueType, ok bool) {
+	switch value {
+	case "NULL":
+		return PlcValueType_NULL, true
+	case "BOOL":
+		return PlcValueType_BOOL, true
+	case "BYTE":
+		return PlcValueType_BYTE, true
+	case "WORD":
+		return PlcValueType_WORD, true
+	case "DWORD":
+		return PlcValueType_DWORD, true
+	case "LWORD":
+		return PlcValueType_LWORD, true
+	case "USINT":
+		return PlcValueType_USINT, true
+	case "UINT":
+		return PlcValueType_UINT, true
+	case "UDINT":
+		return PlcValueType_UDINT, true
+	case "ULINT":
+		return PlcValueType_ULINT, true
+	case "SINT":
+		return PlcValueType_SINT, true
+	case "INT":
+		return PlcValueType_INT, true
+	case "DINT":
+		return PlcValueType_DINT, true
+	case "LINT":
+		return PlcValueType_LINT, true
+	case "REAL":
+		return PlcValueType_REAL, true
+	case "LREAL":
+		return PlcValueType_LREAL, true
+	case "CHAR":
+		return PlcValueType_CHAR, true
+	case "WCHAR":
+		return PlcValueType_WCHAR, true
+	case "STRING":
+		return PlcValueType_STRING, true
+	case "WSTRING":
+		return PlcValueType_WSTRING, true
+	case "TIME":
+		return PlcValueType_TIME, true
+	case "LTIME":
+		return PlcValueType_LTIME, true
+	case "DATE":
+		return PlcValueType_DATE, true
+	case "LDATE":
+		return PlcValueType_LDATE, true
+	case "TIME_OF_DAY":
+		return PlcValueType_TIME_OF_DAY, true
+	case "LTIME_OF_DAY":
+		return PlcValueType_LTIME_OF_DAY, true
+	case "DATE_AND_TIME":
+		return PlcValueType_DATE_AND_TIME, true
+	case "LDATE_AND_TIME":
+		return PlcValueType_LDATE_AND_TIME, true
+	case "Struct":
+		return PlcValueType_Struct, true
+	case "List":
+		return PlcValueType_List, true
+	case "RAW_BYTE_ARRAY":
+		return PlcValueType_RAW_BYTE_ARRAY, true
+	}
+	return 0, false
+}
+
+func PlcValueTypeKnows(value uint8) bool {
+	for _, typeValue := range PlcValueTypeValues {
+		if uint8(typeValue) == value {
+			return true
+		}
+	}
+	return false
+}
+
+func CastPlcValueType(structType interface{}) PlcValueType {
+	castFunc := func(typ interface{}) PlcValueType {
+		if sPlcValueType, ok := typ.(PlcValueType); ok {
+			return sPlcValueType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
+func (m PlcValueType) GetLengthInBits() uint16 {
+	return 8
+}
+
+func (m PlcValueType) GetLengthInBytes() uint16 {
+	return m.GetLengthInBits() / 8
+}
+
+func PlcValueTypeParse(readBuffer utils.ReadBuffer) (PlcValueType, error) {
+	val, err := readBuffer.ReadUint8("PlcValueType", 8)
+	if err != nil {
+		return 0, errors.Wrap(err, "error reading PlcValueType")
+	}
+	if enum, ok := PlcValueTypeByValue(val); !ok {
+		log.Debug().Msgf("no value %x found for RequestType", val)
+		return PlcValueType(val), nil
+	} else {
+		return enum, nil
+	}
+}
+
+func (e PlcValueType) Serialize(writeBuffer utils.WriteBuffer) error {
+	return writeBuffer.WriteUint8("PlcValueType", 8, uint8(e), utils.WithAdditionalStringRepresentation(e.PLC4XEnumName()))
+}
+
+// PLC4XEnumName returns the name that is used in code to identify this enum
+func (e PlcValueType) PLC4XEnumName() string {
+	switch e {
+	case PlcValueType_NULL:
+		return "NULL"
+	case PlcValueType_BOOL:
+		return "BOOL"
+	case PlcValueType_BYTE:
+		return "BYTE"
+	case PlcValueType_WORD:
+		return "WORD"
+	case PlcValueType_DWORD:
+		return "DWORD"
+	case PlcValueType_LWORD:
+		return "LWORD"
+	case PlcValueType_USINT:
+		return "USINT"
+	case PlcValueType_UINT:
+		return "UINT"
+	case PlcValueType_UDINT:
+		return "UDINT"
+	case PlcValueType_ULINT:
+		return "ULINT"
+	case PlcValueType_SINT:
+		return "SINT"
+	case PlcValueType_INT:
+		return "INT"
+	case PlcValueType_DINT:
+		return "DINT"
+	case PlcValueType_LINT:
+		return "LINT"
+	case PlcValueType_REAL:
+		return "REAL"
+	case PlcValueType_LREAL:
+		return "LREAL"
+	case PlcValueType_CHAR:
+		return "CHAR"
+	case PlcValueType_WCHAR:
+		return "WCHAR"
+	case PlcValueType_STRING:
+		return "STRING"
+	case PlcValueType_WSTRING:
+		return "WSTRING"
+	case PlcValueType_TIME:
+		return "TIME"
+	case PlcValueType_LTIME:
+		return "LTIME"
+	case PlcValueType_DATE:
+		return "DATE"
+	case PlcValueType_LDATE:
+		return "LDATE"
+	case PlcValueType_TIME_OF_DAY:
+		return "TIME_OF_DAY"
+	case PlcValueType_LTIME_OF_DAY:
+		return "LTIME_OF_DAY"
+	case PlcValueType_DATE_AND_TIME:
+		return "DATE_AND_TIME"
+	case PlcValueType_LDATE_AND_TIME:
+		return "LDATE_AND_TIME"
+	case PlcValueType_Struct:
+		return "Struct"
+	case PlcValueType_List:
+		return "List"
+	case PlcValueType_RAW_BYTE_ARRAY:
+		return "RAW_BYTE_ARRAY"
+	}
+	return ""
+}
+
+func (e PlcValueType) String() string {
+	return e.PLC4XEnumName()
+}
diff --git a/plc4go/protocols/ads/readwrite/model/ReservedIndexGroups.go b/plc4go/protocols/ads/readwrite/model/ReservedIndexGroups.go
index aa594c7aa..257a4568b 100644
--- a/plc4go/protocols/ads/readwrite/model/ReservedIndexGroups.go
+++ b/plc4go/protocols/ads/readwrite/model/ReservedIndexGroups.go
@@ -35,38 +35,41 @@ type IReservedIndexGroups interface {
 }
 
 const (
-	ReservedIndexGroups_ADSIGRP_SYMTAB                     ReservedIndexGroups = 0x0000F000
-	ReservedIndexGroups_ADSIGRP_SYMNAME                    ReservedIndexGroups = 0x0000F001
-	ReservedIndexGroups_ADSIGRP_SYMVAL                     ReservedIndexGroups = 0x0000F002
-	ReservedIndexGroups_ADSIGRP_SYM_HNDBYNAME              ReservedIndexGroups = 0x0000F003
-	ReservedIndexGroups_ADSIGRP_SYM_VALBYNAME              ReservedIndexGroups = 0x0000F004
-	ReservedIndexGroups_ADSIGRP_SYM_VALBYHND               ReservedIndexGroups = 0x0000F005
-	ReservedIndexGroups_ADSIGRP_SYM_RELEASEHND             ReservedIndexGroups = 0x0000F006
-	ReservedIndexGroups_ADSIGRP_SYM_INFOBYNAME             ReservedIndexGroups = 0x0000F007
-	ReservedIndexGroups_ADSIGRP_SYM_VERSION                ReservedIndexGroups = 0x0000F008
-	ReservedIndexGroups_ADSIGRP_SYM_INFOBYNAMEEX           ReservedIndexGroups = 0x0000F009
-	ReservedIndexGroups_ADSIGRP_SYM_DOWNLOAD               ReservedIndexGroups = 0x0000F00A
-	ReservedIndexGroups_ADSIGRP_SYM_UPLOAD                 ReservedIndexGroups = 0x0000F00B
-	ReservedIndexGroups_ADSIGRP_SYM_UPLOADINFO             ReservedIndexGroups = 0x0000F00C
-	ReservedIndexGroups_ADSIGRP_DATA_TYPE_TABLE_UPLOAD     ReservedIndexGroups = 0x0000F00E
-	ReservedIndexGroups_ADSIGRP_SYMBOL_AND_DATA_TYPE_SIZES ReservedIndexGroups = 0x0000F00F
-	ReservedIndexGroups_ADSIGRP_SYMNOTE                    ReservedIndexGroups = 0x0000F010
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIB               ReservedIndexGroups = 0x0000F020
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIX               ReservedIndexGroups = 0x0000F021
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RISIZE             ReservedIndexGroups = 0x0000F025
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOB               ReservedIndexGroups = 0x0000F030
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOX               ReservedIndexGroups = 0x0000F031
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOSIZE            ReservedIndexGroups = 0x0000F035
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_CLEARI             ReservedIndexGroups = 0x0000F040
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_CLEARO             ReservedIndexGroups = 0x0000F050
-	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIOB              ReservedIndexGroups = 0x0000F060
-	ReservedIndexGroups_ADSIGRP_MULTIPLE_READ              ReservedIndexGroups = 0x0000F080
-	ReservedIndexGroups_ADSIGRP_MULTIPLE_WRITE             ReservedIndexGroups = 0x0000F081
-	ReservedIndexGroups_ADSIGRP_MULTIPLE_READ_WRITE        ReservedIndexGroups = 0x0000F082
-	ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE    ReservedIndexGroups = 0x0000F083
-	ReservedIndexGroups_ADSIGRP_DEVICE_DATA                ReservedIndexGroups = 0x0000F100
-	ReservedIndexGroups_ADSIOFFS_DEVDATA_ADSSTATE          ReservedIndexGroups = 0x00000000
-	ReservedIndexGroups_ADSIOFFS_DEVDATA_DEVSTATE          ReservedIndexGroups = 0x00000002
+	ReservedIndexGroups_ADSIGRP_SYMTAB                               ReservedIndexGroups = 0x0000F000
+	ReservedIndexGroups_ADSIGRP_SYMNAME                              ReservedIndexGroups = 0x0000F001
+	ReservedIndexGroups_ADSIGRP_SYMVAL                               ReservedIndexGroups = 0x0000F002
+	ReservedIndexGroups_ADSIGRP_SYM_HNDBYNAME                        ReservedIndexGroups = 0x0000F003
+	ReservedIndexGroups_ADSIGRP_SYM_VALBYNAME                        ReservedIndexGroups = 0x0000F004
+	ReservedIndexGroups_ADSIGRP_SYM_VALBYHND                         ReservedIndexGroups = 0x0000F005
+	ReservedIndexGroups_ADSIGRP_SYM_RELEASEHND                       ReservedIndexGroups = 0x0000F006
+	ReservedIndexGroups_ADSIGRP_SYM_INFOBYNAME                       ReservedIndexGroups = 0x0000F007
+	ReservedIndexGroups_ADSIGRP_SYM_VERSION                          ReservedIndexGroups = 0x0000F008
+	ReservedIndexGroups_ADSIGRP_SYM_INFOBYNAMEEX                     ReservedIndexGroups = 0x0000F009
+	ReservedIndexGroups_ADSIGRP_SYM_DOWNLOAD                         ReservedIndexGroups = 0x0000F00A
+	ReservedIndexGroups_ADSIGRP_SYM_UPLOAD                           ReservedIndexGroups = 0x0000F00B
+	ReservedIndexGroups_ADSIGRP_SYM_UPLOADINFO                       ReservedIndexGroups = 0x0000F00C
+	ReservedIndexGroups_ADSIGRP_DATA_TYPE_TABLE_UPLOAD               ReservedIndexGroups = 0x0000F00E
+	ReservedIndexGroups_ADSIGRP_SYMBOL_AND_DATA_TYPE_SIZES           ReservedIndexGroups = 0x0000F00F
+	ReservedIndexGroups_ADSIGRP_SYMNOTE                              ReservedIndexGroups = 0x0000F010
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIB                         ReservedIndexGroups = 0x0000F020
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIX                         ReservedIndexGroups = 0x0000F021
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RISIZE                       ReservedIndexGroups = 0x0000F025
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOB                         ReservedIndexGroups = 0x0000F030
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOX                         ReservedIndexGroups = 0x0000F031
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWOSIZE                      ReservedIndexGroups = 0x0000F035
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_CLEARI                       ReservedIndexGroups = 0x0000F040
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_CLEARO                       ReservedIndexGroups = 0x0000F050
+	ReservedIndexGroups_ADSIGRP_IOIMAGE_RWIOB                        ReservedIndexGroups = 0x0000F060
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_READ                        ReservedIndexGroups = 0x0000F080
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_WRITE                       ReservedIndexGroups = 0x0000F081
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_READ_WRITE                  ReservedIndexGroups = 0x0000F082
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE              ReservedIndexGroups = 0x0000F083
+	ReservedIndexGroups_ADSIGRP_SUMUP_READEX2                        ReservedIndexGroups = 0x0000F084
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS    ReservedIndexGroups = 0x0000F085
+	ReservedIndexGroups_ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS ReservedIndexGroups = 0x0000F086
+	ReservedIndexGroups_ADSIGRP_DEVICE_DATA                          ReservedIndexGroups = 0x0000F100
+	ReservedIndexGroups_ADSIOFFS_DEVDATA_ADSSTATE                    ReservedIndexGroups = 0x00000000
+	ReservedIndexGroups_ADSIOFFS_DEVDATA_DEVSTATE                    ReservedIndexGroups = 0x00000002
 )
 
 var ReservedIndexGroupsValues []ReservedIndexGroups
@@ -103,6 +106,9 @@ func init() {
 		ReservedIndexGroups_ADSIGRP_MULTIPLE_WRITE,
 		ReservedIndexGroups_ADSIGRP_MULTIPLE_READ_WRITE,
 		ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE,
+		ReservedIndexGroups_ADSIGRP_SUMUP_READEX2,
+		ReservedIndexGroups_ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS,
+		ReservedIndexGroups_ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS,
 		ReservedIndexGroups_ADSIGRP_DEVICE_DATA,
 		ReservedIndexGroups_ADSIOFFS_DEVDATA_ADSSTATE,
 		ReservedIndexGroups_ADSIOFFS_DEVDATA_DEVSTATE,
@@ -173,6 +179,12 @@ func ReservedIndexGroupsByValue(value uint32) (enum ReservedIndexGroups, ok bool
 		return ReservedIndexGroups_ADSIGRP_MULTIPLE_READ_WRITE, true
 	case 0x0000F083:
 		return ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE, true
+	case 0x0000F084:
+		return ReservedIndexGroups_ADSIGRP_SUMUP_READEX2, true
+	case 0x0000F085:
+		return ReservedIndexGroups_ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS, true
+	case 0x0000F086:
+		return ReservedIndexGroups_ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS, true
 	case 0x0000F100:
 		return ReservedIndexGroups_ADSIGRP_DEVICE_DATA, true
 	}
@@ -243,6 +255,12 @@ func ReservedIndexGroupsByName(value string) (enum ReservedIndexGroups, ok bool)
 		return ReservedIndexGroups_ADSIGRP_MULTIPLE_READ_WRITE, true
 	case "ADSIGRP_MULTIPLE_RELEASE_HANDLE":
 		return ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE, true
+	case "ADSIGRP_SUMUP_READEX2":
+		return ReservedIndexGroups_ADSIGRP_SUMUP_READEX2, true
+	case "ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS":
+		return ReservedIndexGroups_ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS, true
+	case "ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS":
+		return ReservedIndexGroups_ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS, true
 	case "ADSIGRP_DEVICE_DATA":
 		return ReservedIndexGroups_ADSIGRP_DEVICE_DATA, true
 	}
@@ -358,6 +376,12 @@ func (e ReservedIndexGroups) PLC4XEnumName() string {
 		return "ADSIGRP_MULTIPLE_READ_WRITE"
 	case ReservedIndexGroups_ADSIGRP_MULTIPLE_RELEASE_HANDLE:
 		return "ADSIGRP_MULTIPLE_RELEASE_HANDLE"
+	case ReservedIndexGroups_ADSIGRP_SUMUP_READEX2:
+		return "ADSIGRP_SUMUP_READEX2"
+	case ReservedIndexGroups_ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS:
+		return "ADSIGRP_MULTIPLE_ADD_DEVICE_NOTIFICATIONS"
+	case ReservedIndexGroups_ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS:
+		return "ADSIGRP_MULTIPLE_DELETE_DEVICE_NOTIFICATIONS"
 	case ReservedIndexGroups_ADSIGRP_DEVICE_DATA:
 		return "ADSIGRP_DEVICE_DATA"
 	}