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 2021/01/31 11:20:57 UTC

[plc4x] 45/45: PLC4X-276 - [S7] The most of the supported types don't work correctly - Fixed this by extending the syntax for enum fields to allow providing a "field name" to use for serialization/deserialization

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

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

commit 6fc4b9430cc0f20723ce168aa3babc9e88509660
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sun Jan 31 12:17:45 2021 +0100

    PLC4X-276 - [S7] The most of the supported types don't work correctly
    - Fixed this by extending the syntax for enum fields to allow providing a "field name" to use for serialization/deserialization
    
    NO JIRA:
    - Continued working on getting more of the S7 datatypes working in the PLC4C S7 driver (All except the temporal types now work)
---
 .../BaseFreemarkerLanguageTemplateHelper.java      | 144 ++--
 .../resources/templates/c/enum-template-c.ftlh     |  21 +
 .../resources/templates/c/enum-template-h.ftlh     |   1 +
 .../resources/templates/c/pojo-template-c.ftlh     |  18 +
 .../resources/templates/java/enum-template.ftlh    |  21 +
 .../main/resources/templates/java/io-template.ftlh |   8 +
 .../plugins/codegenerator/language/mspec/MSpec.g4  |   2 +-
 .../mspec/model/fields/DefaultEnumField.java       |   8 +-
 .../mspec/parser/MessageFormatListener.java        |  22 +-
 .../plc4go/s7/readwrite/model/TransportSize.go     | 811 +++++++++++++++++----
 .../s7/src/main/resources/protocols/s7/s7.mspec    |   2 +-
 sandbox/plc4c/api/include/plc4c/data.h             |   2 +-
 sandbox/plc4c/drivers/s7/src/driver_s7.c           |  67 +-
 .../plc4c/drivers/s7/src/driver_s7_encode_decode.c |   6 +-
 sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c   |   5 +
 .../plc4c/examples/hello-world/src/hello_world.c   |  62 +-
 .../modbus/include/modbus_data_type_sizes.h        |   1 +
 .../modbus/src/modbus_data_type_sizes.c            |  20 +
 .../generated-sources/s7/include/cotp_tpdu_size.h  |   1 +
 .../s7/include/data_transport_size.h               |   1 +
 .../generated-sources/s7/include/memory_area.h     |   1 +
 .../generated-sources/s7/include/transport_size.h  |  11 +
 .../generated-sources/s7/src/cotp_tpdu_size.c      |  29 +
 .../generated-sources/s7/src/data_transport_size.c |  14 +
 .../plc4c/generated-sources/s7/src/memory_area.c   |  30 +
 .../plc4c/generated-sources/s7/src/s7_address.c    |  12 +-
 .../generated-sources/s7/src/transport_size.c      | 281 +++++++
 sandbox/plc4c/pom.xml                              |   2 +-
 sandbox/plc4c/spi/src/data.c                       |  29 +-
 29 files changed, 1362 insertions(+), 270 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index bd767b2..cce146b 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -43,6 +43,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     // As they should be shared over all language template implementations,
     // these are defined here manually.
     private static Map<String, SimpleTypeReference> builtInFields;
+
     {
         builtInFields = new HashMap<>();
         builtInFields.put("curPos", new SimpleTypeReference() {
@@ -180,7 +181,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         // If this is a subtype of a discriminated type, we have to add a reference to the parent type.
         if (baseType instanceof DiscriminatedComplexTypeDefinition) {
             DiscriminatedComplexTypeDefinition discriminatedComplexTypeDefinition = (DiscriminatedComplexTypeDefinition) baseType;
-            if(!discriminatedComplexTypeDefinition.isAbstract()) {
+            if (!discriminatedComplexTypeDefinition.isAbstract()) {
                 complexTypeReferences.add(((ComplexTypeReference)
                     discriminatedComplexTypeDefinition.getParentType().getTypeReference()).getName());
             }
@@ -190,13 +191,13 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         if (baseType instanceof ComplexTypeDefinition) {
             ComplexTypeDefinition complexTypeDefinition = (ComplexTypeDefinition) baseType;
             for (Field field : complexTypeDefinition.getFields()) {
-                if(field instanceof PropertyField) {
+                if (field instanceof PropertyField) {
                     PropertyField propertyField = (PropertyField) field;
                     if (propertyField.getType() instanceof ComplexTypeReference) {
                         ComplexTypeReference complexTypeReference = (ComplexTypeReference) propertyField.getType();
                         complexTypeReferences.add(complexTypeReference.getName());
                     }
-                } else if(field instanceof SwitchField) {
+                } else if (field instanceof SwitchField) {
                     SwitchField switchField = (SwitchField) field;
                     for (DiscriminatedComplexTypeDefinition switchCase : switchField.getCases()) {
                         complexTypeReferences.addAll(getComplexTypeReferences(switchCase));
@@ -215,7 +216,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
             }
         }
         // If the type has any parser arguments, these have to be checked too.
-        if(baseType.getParserArguments() != null) {
+        if (baseType.getParserArguments() != null) {
             for (Argument parserArgument : baseType.getParserArguments()) {
                 if (parserArgument.getType() instanceof ComplexTypeReference) {
                     ComplexTypeReference complexTypeReference = (ComplexTypeReference) parserArgument.getType();
@@ -229,19 +230,19 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     /**
      * Little helper to return the type of a given property.
      *
-     * @param baseType base type definition that contains the given property.
+     * @param baseType     base type definition that contains the given property.
      * @param propertyName name of the property
      * @return the type reference of the given property
      */
     public Optional<TypeReference> getTypeReferenceForProperty(ComplexTypeDefinition baseType, String propertyName) {
         // If this is a built-in type, use that.
-        if(builtInFields.containsKey(propertyName)) {
+        if (builtInFields.containsKey(propertyName)) {
             return Optional.of(builtInFields.get(propertyName));
         }
         // Check if the expression root is referencing a field
         final Optional<PropertyField> propertyFieldOptional = baseType.getPropertyFields().stream().filter(
             propertyField -> propertyField.getName().equals(propertyName)).findFirst();
-        if(propertyFieldOptional.isPresent()) {
+        if (propertyFieldOptional.isPresent()) {
             final PropertyField propertyField = propertyFieldOptional.get();
             return Optional.of(propertyField.getType());
         }
@@ -249,12 +250,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         final Optional<ImplicitField> implicitFieldOptional = baseType.getFields().stream().filter(
             field -> field instanceof ImplicitField).map(field -> (ImplicitField) field).filter(
             implicitField -> implicitField.getName().equals(propertyName)).findFirst();
-        if(implicitFieldOptional.isPresent()) {
+        if (implicitFieldOptional.isPresent()) {
             final ImplicitField implicitField = implicitFieldOptional.get();
             return Optional.of(implicitField.getType());
         }
         // Check if the expression root is referencing an argument
-        if(baseType.getParserArguments() != null) {
+        if (baseType.getParserArguments() != null) {
             final Optional<Argument> argumentOptional = Arrays.stream(baseType.getParserArguments()).filter(
                 argument -> argument.getName().equals(propertyName)).findFirst();
             if (argumentOptional.isPresent()) {
@@ -267,7 +268,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         final Optional<DiscriminatorField> discriminatorFieldOptional = baseType.getFields().stream().filter(
             field -> field instanceof DiscriminatorField).map(field -> (DiscriminatorField) field).filter(
             discriminatorField -> discriminatorField.getName().equals(propertyName)).findFirst();
-        if(discriminatorFieldOptional.isPresent()) {
+        if (discriminatorFieldOptional.isPresent()) {
             final DiscriminatorField discriminatorField = discriminatorFieldOptional.get();
             return Optional.of(discriminatorField.getType());
         }
@@ -286,10 +287,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         }
         ComplexTypeReference complexTypeReference = (ComplexTypeReference) typeReference;
         final TypeDefinition typeDefinition = types.get(complexTypeReference.getName());
-        if(typeDefinition == null) {
+        if (typeDefinition == null) {
             throw new RuntimeException("Couldn't find given enum type definition with name " + complexTypeReference.getName());
         }
-        if(!(typeDefinition instanceof EnumTypeDefinition)) {
+        if (!(typeDefinition instanceof EnumTypeDefinition)) {
             throw new RuntimeException("Referenced type with name " + complexTypeReference.getName() + " is not an enum type");
         }
         EnumTypeDefinition enumTypeDefinition = (EnumTypeDefinition) typeDefinition;
@@ -302,8 +303,8 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
      **********************************************************************************/
 
     public boolean hasFieldOfType(String fieldTypeName) {
-        if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
-           return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
+        if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+            return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
         }
         return false;
     }
@@ -312,14 +313,14 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         for (String name : names) {
             boolean foundName = false;
             for (Field field : fields) {
-                if(field instanceof NamedField) {
-                    if(name.equals(((NamedField) field).getName())) {
+                if (field instanceof NamedField) {
+                    if (name.equals(((NamedField) field).getName())) {
                         foundName = true;
                         break;
                     }
                 }
             }
-            if(!foundName) {
+            if (!foundName) {
                 return false;
             }
         }
@@ -327,7 +328,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public Field getFieldForNameFromCurrentOrParent(String fieldName) {
-        if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+        if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
             return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
                 .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
         }
@@ -335,7 +336,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public Field getFieldForNameFromCurrent(String fieldName) {
-        if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+        if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
             return ((ComplexTypeDefinition) getThisTypeDefinition()).getPropertyFields()
                 .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
         }
@@ -363,12 +364,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean isEnumField(Field field) {
-        if(field instanceof TypedField) {
+        if (field instanceof TypedField) {
             TypedField typedField = (TypedField) field;
             TypeReference typeReference = typedField.getType();
-            if(!isSimpleTypeReference(typeReference)) {
+            if (!isSimpleTypeReference(typeReference)) {
                 TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(typedField.getType());
-                if(typeDefinition instanceof EnumTypeDefinition) {
+                if (typeDefinition instanceof EnumTypeDefinition) {
                     return true;
                 }
             }
@@ -421,11 +422,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean isCountArrayField(Field field) {
-        if(field instanceof ArrayField) {
+        if (field instanceof ArrayField) {
             ArrayField arrayField = (ArrayField) field;
             return arrayField.getLoopType() == ArrayField.LoopType.COUNT;
         }
-        if(field instanceof ManualArrayField) {
+        if (field instanceof ManualArrayField) {
             ManualArrayField arrayField = (ManualArrayField) field;
             return arrayField.getLoopType() == ManualArrayField.LoopType.COUNT;
         }
@@ -433,11 +434,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean isLengthArrayField(Field field) {
-        if(field instanceof ArrayField) {
+        if (field instanceof ArrayField) {
             ArrayField arrayField = (ArrayField) field;
             return arrayField.getLoopType() == ArrayField.LoopType.LENGTH;
         }
-        if(field instanceof ManualArrayField) {
+        if (field instanceof ManualArrayField) {
             ManualArrayField arrayField = (ManualArrayField) field;
             return arrayField.getLoopType() == ManualArrayField.LoopType.LENGTH;
         }
@@ -445,11 +446,11 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean isTerminatedArrayField(Field field) {
-        if(field instanceof ArrayField) {
+        if (field instanceof ArrayField) {
             ArrayField arrayField = (ArrayField) field;
             return arrayField.getLoopType() == ArrayField.LoopType.TERMINATED;
         }
-        if(field instanceof ManualArrayField) {
+        if (field instanceof ManualArrayField) {
             ManualArrayField arrayField = (ManualArrayField) field;
             return arrayField.getLoopType() == ManualArrayField.LoopType.TERMINATED;
         }
@@ -481,7 +482,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public Collection<Field> getPropertyAndSwitchFields(TypeDefinition typeDefinition) {
-        if(thisType instanceof ComplexTypeDefinition) {
+        if (thisType instanceof ComplexTypeDefinition) {
             return ((ComplexTypeDefinition) thisType).getFields().stream().filter(
                 field -> (field instanceof PropertyField) || (field instanceof SwitchField)).collect(Collectors.toList());
         }
@@ -509,7 +510,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public TypeDefinition getTypeDefinitionForTypeReference(TypeReference typeReference) {
-        if(!(typeReference instanceof ComplexTypeReference)) {
+        if (!(typeReference instanceof ComplexTypeReference)) {
             throw new RuntimeException("Type reference must be a complex type reference");
         }
         return getTypeDefinitions().get(((ComplexTypeReference) typeReference).getName());
@@ -623,11 +624,12 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     /**
      * Get an ordered list of generated names for the discriminators.
      * These names can be used to access the type definitions as well as well as the values.
+     *
      * @return list of symbolic names for the discriminators.
      */
     public List<String> getDiscriminatorNames() {
         TypeDefinition baseType = thisType;
-        if(thisType.getParentType() != null) {
+        if (thisType.getParentType() != null) {
             baseType = thisType.getParentType();
         }
         final SwitchField switchField = getSwitchField(baseType);
@@ -642,6 +644,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
      * Check if there's any field with the given name.
      * This is required to suppress the generation of a discriminator field
      * in case a named field is providing the information.
+     *
      * @param discriminatorName name of the discriminator name
      * @return true if a field with the given name already exists in the same type.
      */
@@ -652,31 +655,32 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     /**
      * Converts a given discriminator description into a symbolic name.
+     *
      * @param discriminatorExpression discriminator expression
      * @return name
      */
     public String getDiscriminatorName(Term discriminatorExpression) {
-        if(discriminatorExpression instanceof Literal) {
+        if (discriminatorExpression instanceof Literal) {
             Literal literal = (Literal) discriminatorExpression;
-            if(literal instanceof NullLiteral) {
+            if (literal instanceof NullLiteral) {
                 return "null";
-            } else if(literal instanceof BooleanLiteral) {
+            } else if (literal instanceof BooleanLiteral) {
                 return Boolean.toString(((BooleanLiteral) literal).getValue());
-            } else if(literal instanceof NumericLiteral) {
+            } else if (literal instanceof NumericLiteral) {
                 return ((NumericLiteral) literal).getNumber().toString();
-            } else if(literal instanceof StringLiteral) {
+            } else if (literal instanceof StringLiteral) {
                 return ((StringLiteral) literal).getValue();
-            } else if(literal instanceof VariableLiteral) {
+            } else if (literal instanceof VariableLiteral) {
                 VariableLiteral variableLiteral = (VariableLiteral) literal;
                 return getVariableLiteralName(variableLiteral);
             }
-        } else if(discriminatorExpression instanceof UnaryTerm) {
+        } else if (discriminatorExpression instanceof UnaryTerm) {
             UnaryTerm unaryTerm = (UnaryTerm) discriminatorExpression;
             return getDiscriminatorName(unaryTerm.getA());
-        } else if(discriminatorExpression instanceof BinaryTerm) {
+        } else if (discriminatorExpression instanceof BinaryTerm) {
             BinaryTerm binaryTerm = (BinaryTerm) discriminatorExpression;
             return getDiscriminatorName(binaryTerm.getA()) + "_" + getDiscriminatorName(binaryTerm.getB());
-        } else if(discriminatorExpression instanceof TernaryTerm) {
+        } else if (discriminatorExpression instanceof TernaryTerm) {
             TernaryTerm ternaryTerm = (TernaryTerm) discriminatorExpression;
             return getDiscriminatorName(ternaryTerm.getA()) + "_" + getDiscriminatorName(ternaryTerm.getB())
                 + "_" + getDiscriminatorName(ternaryTerm.getC());
@@ -686,7 +690,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     private String getVariableLiteralName(VariableLiteral variableLiteral) {
         String rest = "";
-        if(variableLiteral.getChild() != null) {
+        if (variableLiteral.getChild() != null) {
             rest = getVariableLiteralName(variableLiteral.getChild());
             rest = rest.substring(0, 1).toUpperCase() + rest.substring(1);
         }
@@ -695,6 +699,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     /**
      * Get a list of the types for every discriminator name.
+     *
      * @return Map mapping discriminator names to types.
      */
     public Map<String, TypeReference> getDiscriminatorTypes() {
@@ -741,6 +746,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     /**
      * Get a list of the values for every discriminator name for every discriminated type.
+     *
      * @return Map mapping discriminator names to discriminator values for every discriminated type.
      */
     public Map<String, Map<String, String>> getDiscriminatorValues() {
@@ -765,13 +771,13 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public TypeReference getArgumentType(TypeReference typeReference, int index) {
-        if(typeReference instanceof ComplexTypeReference) {
+        if (typeReference instanceof ComplexTypeReference) {
             ComplexTypeReference complexTypeReference = (ComplexTypeReference) typeReference;
-            if(!getTypeDefinitions().containsKey(complexTypeReference.getName())) {
+            if (!getTypeDefinitions().containsKey(complexTypeReference.getName())) {
                 throw new RuntimeException("Could not find definition of complex type " + complexTypeReference.getName());
             }
             TypeDefinition complexTypeDefinition = getTypeDefinitions().get(complexTypeReference.getName());
-            if(complexTypeDefinition.getParserArguments().length <= index) {
+            if (complexTypeDefinition.getParserArguments().length <= index) {
                 throw new RuntimeException("Type " + complexTypeReference.getName() + " specifies too few parser arguments");
             }
             return complexTypeDefinition.getParserArguments()[index].getType();
@@ -787,7 +793,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
      */
     public List<Argument> getSerializerArguments(Argument[] arguments) {
         List<Argument> serializerArguments = new LinkedList<>();
-        if(arguments != null) {
+        if (arguments != null) {
             for (Argument argument : arguments) {
                 if ("lastItem".equals(argument.getName())) {
                     serializerArguments.add(argument);
@@ -799,7 +805,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     public List<Term> getSerializerTerms(Term[] terms) {
         List<Term> serializerTerms = new LinkedList<>();
-        if(terms != null) {
+        if (terms != null) {
             for (Term term : terms) {
                 if (term.contains("lastItem")) {
                     serializerTerms.add(term);
@@ -810,7 +816,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean hasLastItemTerm(Term[] terms) {
-        if(terms != null) {
+        if (terms != null) {
             for (Term term : terms) {
                 if (term.contains("lastItem")) {
                     return true;
@@ -821,28 +827,28 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
     }
 
     public boolean discriminatorValueNeedsStringEqualityCheck(Term term) {
-        if(term instanceof VariableLiteral) {
+        if (term instanceof VariableLiteral) {
             VariableLiteral variableLiteral = (VariableLiteral) term;
             // If this literal references an Enum type, then we have to output it differently.
             if (getTypeDefinitions().get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
                 return false;
             }
 
-            if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
+            if (getThisTypeDefinition() instanceof ComplexTypeDefinition) {
                 Field referencedField = ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().filter(field -> ((field instanceof NamedField) && ((NamedField) field).getName().equals(variableLiteral.getName()))).findFirst().orElse(null);
-                if(referencedField != null) {
-                    if(referencedField instanceof TypedField) {
+                if (referencedField != null) {
+                    if (referencedField instanceof TypedField) {
                         TypedField typedField = (TypedField) referencedField;
-                        if(typedField.getType() instanceof StringTypeReference) {
+                        if (typedField.getType() instanceof StringTypeReference) {
                             return true;
                         }
                     }
                 }
             }
-            if(getThisTypeDefinition().getParserArguments() != null) {
+            if (getThisTypeDefinition().getParserArguments() != null) {
                 for (Argument parserArgument : getThisTypeDefinition().getParserArguments()) {
                     if (parserArgument.getName().equals(variableLiteral.getName())) {
-                        if(parserArgument.getType() instanceof StringTypeReference) {
+                        if (parserArgument.getType() instanceof StringTypeReference) {
                             return true;
                         }
                     }
@@ -862,4 +868,34 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         return filteredEnumValues.values();
     }
 
+    public Collection<EnumValue> getEnumValuesForUniqueConstantValues(EnumValue[] enumValues, String constantName) {
+        Map<String, EnumValue> filteredEnumValues = new TreeMap<>();
+        for (EnumValue enumValue : enumValues) {
+            if (!filteredEnumValues.containsKey(enumValue.getConstant(constantName))) {
+                filteredEnumValues.put(enumValue.getConstant(constantName), enumValue);
+            }
+        }
+        return filteredEnumValues.values();
+    }
+
+    public Collection<EnumValue> getEnumValuesForConstantValue(EnumValue[] enumValues, String constantName, String constantValue) {
+        List<EnumValue> filteredEnumValues = new ArrayList<>();
+        for (EnumValue enumValue : enumValues) {
+            if(enumValue.getConstant(constantName).equals(constantValue)) {
+                filteredEnumValues.add(enumValue);
+            }
+        }
+        return filteredEnumValues;
+    }
+
+    public SimpleTypeReference getEnumFieldSimpleTypeReference(TypeReference type, String fieldName) {
+        TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(type);
+        if (typeDefinition instanceof EnumTypeDefinition) {
+            if (((EnumTypeDefinition) typeDefinition).getConstantType(fieldName) instanceof SimpleTypeReference) {
+                return (SimpleTypeReference) ((EnumTypeDefinition) typeDefinition).getConstantType(fieldName);
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
index 2211ef6..2328390 100644
--- a/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/enum-template-c.ftlh
@@ -101,5 +101,26 @@ ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))
     }
   }
 }
+
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(constantName)}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} value) {
+    <#if helper.isStringTypeReference(type.getConstantType(constantName))>
+        <#list helper.getEnumValuesForUniqueConstantValues(type.enumValues, constantName) as enumValue>
+    if (strcmp(value, ${helper.escapeEnumValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}) == 0) {
+        return ${helper.getCTypeName(type.name)}_${enumValue.name};
+    }
+        </#list>
+    <#else>
+    switch(value) {
+    <#list helper.getEnumValuesForUniqueConstantValues(type.enumValues, constantName) as enumValue>
+        case ${helper.escapeEnumValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}: {
+            return ${helper.getCTypeName(type.name)}_${enumValue.name};
+        }
+    </#list>
+        default: {
+            return -1;
+        }
+    }
+    </#if>
+}
     </#list>
 </#if>
diff --git a/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh b/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
index 266c39b..497195d 100644
--- a/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/enum-template-h.ftlh
@@ -82,6 +82,7 @@ ${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_value_for_in
     <#list type.constantNames as constantName>
 
 ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} ${helper.getCTypeName(type.name)}_get_${helper.camelCaseToSnakeCase(constantName)}(${helper.getCTypeName(type.name)} value);
+${helper.getCTypeName(type.name)} ${helper.getCTypeName(type.name)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(constantName)}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))} value);
     </#list>
 </#if>
 
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index fb38e1a..43ac99a 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -265,10 +265,21 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
 
 <#if indentContent>  </#if>  // Enum field (${enumField.name})
 <#if indentContent>  </#if>  ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getNullValueForTypeReference(enumField.type)};
+            <#if enumField.fieldName?has_content>
+<#if indentContent>  </#if>  {
+<#if indentContent>  </#if>    ${helper.getLanguageTypeNameForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))} _constantValue = ${helper.getNullValueForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))};
+<#if indentContent>  </#if>    _res = ${helper.getReadBufferReadMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "&_constantValue")};
+<#if indentContent>  </#if>    if(_res != OK) {
+<#if indentContent>  </#if>      return _res;
+<#if indentContent>  </#if>    }
+<#if indentContent>  </#if>    ${enumField.name} = ${helper.getLanguageTypeNameForTypeReference(enumField.type)}_get_first_enum_for_field_${helper.camelCaseToSnakeCase(enumField.fieldName)}(_constantValue);
+<#if indentContent>  </#if>  }
+            <#else>
 <#if indentContent>  </#if>  _res = ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type), "&" + enumField.name)};
 <#if indentContent>  </#if>  if(_res != OK) {
 <#if indentContent>  </#if>    return _res;
 <#if indentContent>  </#if>  }
+            </#if>
 <#if indentContent>  </#if>  (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
             <#break>
         <#case "implicit">
@@ -461,10 +472,17 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
             <#assign enumField = field>
 
 <#if indentContent>    </#if>  // Enum field (${enumField.name})
+                <#if enumField.fieldName?has_content>
+<#if indentContent>    </#if>  _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), helper.getLanguageTypeNameForTypeReference(enumField.type) + "_get_" + helper.camelCaseToSnakeCase(enumField.fieldName) + "(_message->" + helper.getFieldName(baseType, enumField) + ")")};
+<#if indentContent>    </#if>  if(_res != OK) {
+<#if indentContent>    </#if>    return _res;
+<#if indentContent>    </#if>  }
+                <#else>
 <#if indentContent>    </#if>  _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "_message->" + helper.getFieldName(baseType, enumField))};
 <#if indentContent>    </#if>  if(_res != OK) {
 <#if indentContent>    </#if>    return _res;
 <#if indentContent>    </#if>  }
+                </#if>
             <#break>
         <#case "implicit">
             <#assign implicitField = field>
diff --git a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
index c182bbc..bdc44b3 100644
--- a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
@@ -51,7 +51,9 @@ import org.apache.plc4x.java.spi.generation.Message;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 public enum ${type.name} {
@@ -100,6 +102,25 @@ public enum ${type.name} {
         return ${constantName};
     }
 
+    public static ${type.name} firstEnumForField${constantName?cap_first}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)} fieldValue) {
+        for (${type.name} _val : ${type.name}.values()) {
+            if(_val.get${constantName?cap_first}() == fieldValue) {
+                return _val;
+            }
+        }
+        return null;
+    }
+
+    public static List<${type.name}> enumsForField${constantName?cap_first}(${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName), true)} fieldValue) {
+        List<${type.name}> _values = new ArrayList();
+        for (${type.name} _val : ${type.name}.values()) {
+            if(_val.get${constantName?cap_first}() == fieldValue) {
+                _values.add(_val);
+            }
+        }
+        return _values;
+    }
+
     </#list>
 </#if>
 <#if type.type?has_content>
diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index dc127b6..bc15070 100644
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -252,7 +252,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
         <#assign enumField = field>
 
         // Enum field (${enumField.name})
+        <#if enumField.fieldName?has_content>
+        ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.firstEnumForField${enumField.fieldName?cap_first}(${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))});
+        <#else>
         ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getLanguageTypeNameForField(field)}.enumForValue(${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))});
+        </#if>
         <#break>
     <#case "implicit">
         <#assign implicitField = field>
@@ -471,7 +475,11 @@ public class ${type.name}IO implements <#if outputFlavor != "passive">MessageIO<
 
         // Enum field (${enumField.name})
         ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${enumField.name?cap_first}();
+        <#if enumField.fieldName?has_content>
+        ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "(" + enumField.name + ".get" + enumField.fieldName?cap_first + "())")};
+        <#else>
         ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")};
+        </#if>
         <#break>
     <#case "implicit">
         <#assign implicitField = field>
diff --git a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4 b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index d79ba85..add3267 100644
--- a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -80,7 +80,7 @@ discriminatorField
  ;
 
 enumField
- : 'enum' type=typeReference name=idExpression
+ : 'enum' type=typeReference name=idExpression (fieldName=idExpression)?
  ;
 
 implicitField
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
index 97c7912..4c36511 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultEnumField.java
@@ -27,12 +27,14 @@ public class DefaultEnumField extends DefaultTaggedField implements EnumField {
 
     private final TypeReference type;
     private final String name;
+    private final String fieldName;
     private final Term[] params;
 
-    public DefaultEnumField(String[] tags, TypeReference type, String name, Term[] params) {
+    public DefaultEnumField(String[] tags, TypeReference type, String name, String fieldName, Term[] params) {
         super(tags);
         this.type = type;
         this.name = name;
+        this.fieldName = fieldName;
         this.params = params;
     }
 
@@ -44,6 +46,10 @@ public class DefaultEnumField extends DefaultTaggedField implements EnumField {
         return name;
     }
 
+    public String getFieldName() {
+        return fieldName;
+    }
+
     public Term[] getParams() {
         return params;
     }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 135fd4f..251e09d 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -197,8 +197,12 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterEnumField(MSpecParser.EnumFieldContext ctx) {
         ComplexTypeReference type = new DefaultComplexTypeReference(ctx.type.complexTypeReference.getText());
         String name = getIdString(ctx.name);
+        String fieldName = null;
+        if (ctx.fieldName != null) {
+            fieldName = getIdString(ctx.fieldName);
+        }
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
-        Field field = new DefaultEnumField(null, type, name, params);
+        Field field = new DefaultEnumField(null, type, name, fieldName, params);
         if (parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
@@ -341,7 +345,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String typeName = ctx.name.getText();
         List<Argument> parserArguments = new LinkedList<>();
         // For DataIO types, add all the arguments from the parent type.
-        if(!(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext)) {
+        if (!(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext)) {
             if (((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params != null) {
                 parserArguments.addAll(Arrays.asList(getParserArguments(
                     ((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params.argument())));
@@ -401,7 +405,7 @@ public class MessageFormatListener extends MSpecBaseListener {
                 MSpecParser.ExpressionContext expression = ctx.constantValueExpressions.expression(i);
                 String constant = unquoteString(expression.getText());
                 // String expressions are double escaped
-                if(constant.startsWith("\"")) {
+                if (constant.startsWith("\"")) {
                     constant = unquoteString(constant);
                 }
                 constants.put(constantName, constant);
@@ -423,7 +427,7 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     private TypeReference getTypeReference(MSpecParser.TypeReferenceContext ctx) {
         if (ctx.simpleTypeReference != null) {
-            return getSimpleTypeReference (ctx.simpleTypeReference);
+            return getSimpleTypeReference(ctx.simpleTypeReference);
         } else {
             return new DefaultComplexTypeReference(ctx.complexTypeReference.getText());
         }
@@ -433,7 +437,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         SimpleTypeReference.SimpleBaseType simpleBaseType =
             SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
         // String types need an additional "encoding" field and an optional size.
-        if(simpleBaseType == SimpleTypeReference.SimpleBaseType.STRING) {
+        if (simpleBaseType == SimpleTypeReference.SimpleBaseType.STRING) {
             int size = (ctx.size != null) ? Integer.parseInt(ctx.size.getText()) : -1;
             String encoding = (ctx.encoding != null) ? ctx.encoding.getText() : "UTF-8";
             return new DefaultStringTypeReference(simpleBaseType, size, encoding);
@@ -444,17 +448,15 @@ public class MessageFormatListener extends MSpecBaseListener {
             return new DefaultIntegerTypeReference(simpleBaseType, size);
         }
         // If exponent and mantissa are present, it's a floating point representation.
-        else if((ctx.exponent != null) && (ctx.mantissa != null)) {
+        else if ((ctx.exponent != null) && (ctx.mantissa != null)) {
             int exponent = Integer.parseInt(ctx.exponent.getText());
             int mantissa = Integer.parseInt(ctx.mantissa.getText());
             return new DefaultFloatTypeReference(simpleBaseType, exponent, mantissa);
-        }
-        else if((simpleBaseType == SimpleTypeReference.SimpleBaseType.TIME) ||
+        } else if ((simpleBaseType == SimpleTypeReference.SimpleBaseType.TIME) ||
             (simpleBaseType == SimpleTypeReference.SimpleBaseType.DATE) ||
             (simpleBaseType == SimpleTypeReference.SimpleBaseType.DATETIME)) {
             return new DefaultTemporalTypeReference(simpleBaseType);
-        }
-        else if(simpleBaseType == SimpleTypeReference.SimpleBaseType.BIT) {
+        } else if (simpleBaseType == SimpleTypeReference.SimpleBaseType.BIT) {
             return new DefaultBooleanTypeReference();
         }
         // In all other cases (bit) it's just assume it's length it 1.
diff --git a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
index 26cf716..38f3d8d 100644
--- a/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
+++ b/plc4go/internal/plc4go/s7/readwrite/model/TransportSize.go
@@ -27,10 +27,11 @@ type TransportSize int8
 type ITransportSize interface {
     Supported_S7_300() bool
     Supported_LOGO() bool
+    Code() uint8
     SizeInBytes() uint8
     Supported_S7_400() bool
     Supported_S7_1200() bool
-    SizeCode() uint8
+    ShortName() uint8
     Supported_S7_1500() bool
     DataTransportSize() DataTransportSize
     BaseType() TransportSize
@@ -41,38 +42,35 @@ type ITransportSize interface {
 const(
     TransportSize_BOOL TransportSize = 0x01
     TransportSize_BYTE TransportSize = 0x02
-    TransportSize_WORD TransportSize = 0x04
-    TransportSize_DWORD TransportSize = 0x06
-    TransportSize_LWORD TransportSize = 0x00
-    TransportSize_INT TransportSize = 0x05
-    TransportSize_UINT TransportSize = 0x05
-    TransportSize_SINT TransportSize = 0x02
-    TransportSize_USINT TransportSize = 0x02
-    TransportSize_DINT TransportSize = 0x07
-    TransportSize_UDINT TransportSize = 0x07
-    TransportSize_LINT TransportSize = 0x00
-    TransportSize_ULINT TransportSize = 0x00
-    TransportSize_REAL TransportSize = 0x08
-    TransportSize_LREAL TransportSize = 0x30
-    TransportSize_CHAR TransportSize = 0x03
-    TransportSize_WCHAR TransportSize = 0x13
-    TransportSize_STRING TransportSize = 0x03
-    TransportSize_WSTRING TransportSize = 0x00
-    TransportSize_TIME TransportSize = 0x0B
-    TransportSize_LTIME TransportSize = 0x00
-    TransportSize_DATE TransportSize = 0x09
-    TransportSize_TIME_OF_DAY TransportSize = 0x06
-    TransportSize_TOD TransportSize = 0x06
-    TransportSize_DATE_AND_TIME TransportSize = 0x0F
-    TransportSize_DT TransportSize = 0x0F
+    TransportSize_WORD TransportSize = 0x03
+    TransportSize_DWORD TransportSize = 0x04
+    TransportSize_LWORD TransportSize = 0x05
+    TransportSize_INT TransportSize = 0x06
+    TransportSize_UINT TransportSize = 0x07
+    TransportSize_SINT TransportSize = 0x08
+    TransportSize_USINT TransportSize = 0x09
+    TransportSize_DINT TransportSize = 0x0A
+    TransportSize_UDINT TransportSize = 0x0B
+    TransportSize_LINT TransportSize = 0x0C
+    TransportSize_ULINT TransportSize = 0x0D
+    TransportSize_REAL TransportSize = 0x0E
+    TransportSize_LREAL TransportSize = 0x0F
+    TransportSize_CHAR TransportSize = 0x10
+    TransportSize_WCHAR TransportSize = 0x11
+    TransportSize_STRING TransportSize = 0x12
+    TransportSize_WSTRING TransportSize = 0x13
+    TransportSize_TIME TransportSize = 0x14
+    TransportSize_LTIME TransportSize = 0x16
+    TransportSize_DATE TransportSize = 0x17
+    TransportSize_TIME_OF_DAY TransportSize = 0x18
+    TransportSize_TOD TransportSize = 0x19
+    TransportSize_DATE_AND_TIME TransportSize = 0x1A
+    TransportSize_DT TransportSize = 0x1B
 )
 
 
 func (e TransportSize) Supported_S7_300() bool {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return false
-        }
         case 0x01: { /* '0x01' */
             return true
         }
@@ -86,32 +84,71 @@ func (e TransportSize) Supported_S7_300() bool {
             return true
         }
         case 0x05: { /* '0x05' */
-            return true
+            return false
         }
         case 0x06: { /* '0x06' */
             return true
         }
         case 0x07: { /* '0x07' */
-            return true
+            return false
         }
         case 0x08: { /* '0x08' */
-            return true
+            return false
         }
         case 0x09: { /* '0x09' */
+            return false
+        }
+        case 0x0A: { /* '0x0A' */
             return true
         }
         case 0x0B: { /* '0x0B' */
+            return false
+        }
+        case 0x0C: { /* '0x0C' */
+            return false
+        }
+        case 0x0D: { /* '0x0D' */
+            return false
+        }
+        case 0x0E: { /* '0x0E' */
             return true
         }
         case 0x0F: { /* '0x0F' */
+            return false
+        }
+        case 0x10: { /* '0x10' */
+            return true
+        }
+        case 0x11: { /* '0x11' */
+            return false
+        }
+        case 0x12: { /* '0x12' */
             return true
         }
         case 0x13: { /* '0x13' */
             return false
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return true
+        }
+        case 0x16: { /* '0x16' */
             return false
         }
+        case 0x17: { /* '0x17' */
+            return true
+        }
+        case 0x18: { /* '0x18' */
+            return true
+        }
+        case 0x19: { /* '0x19' */
+            return true
+        }
+        case 0x1A: { /* '0x1A' */
+            return true
+        }
+        case 0x1B: { /* '0x1B' */
+            return true
+        }
         default: {
             return false
         }
@@ -120,9 +157,6 @@ func (e TransportSize) Supported_S7_300() bool {
 
 func (e TransportSize) Supported_LOGO() bool {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return false
-        }
         case 0x01: { /* '0x01' */
             return true
         }
@@ -136,7 +170,7 @@ func (e TransportSize) Supported_LOGO() bool {
             return true
         }
         case 0x05: { /* '0x05' */
-            return true
+            return false
         }
         case 0x06: { /* '0x06' */
             return true
@@ -150,16 +184,55 @@ func (e TransportSize) Supported_LOGO() bool {
         case 0x09: { /* '0x09' */
             return true
         }
+        case 0x0A: { /* '0x0A' */
+            return true
+        }
         case 0x0B: { /* '0x0B' */
             return true
         }
+        case 0x0C: { /* '0x0C' */
+            return false
+        }
+        case 0x0D: { /* '0x0D' */
+            return false
+        }
+        case 0x0E: { /* '0x0E' */
+            return true
+        }
         case 0x0F: { /* '0x0F' */
             return false
         }
+        case 0x10: { /* '0x10' */
+            return true
+        }
+        case 0x11: { /* '0x11' */
+            return true
+        }
+        case 0x12: { /* '0x12' */
+            return true
+        }
         case 0x13: { /* '0x13' */
             return true
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return true
+        }
+        case 0x16: { /* '0x16' */
+            return false
+        }
+        case 0x17: { /* '0x17' */
+            return true
+        }
+        case 0x18: { /* '0x18' */
+            return true
+        }
+        case 0x19: { /* '0x19' */
+            return true
+        }
+        case 0x1A: { /* '0x1A' */
+            return false
+        }
+        case 0x1B: { /* '0x1B' */
             return false
         }
         default: {
@@ -168,11 +241,94 @@ func (e TransportSize) Supported_LOGO() bool {
     }
 }
 
-func (e TransportSize) SizeInBytes() uint8 {
+func (e TransportSize) Code() uint8 {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return 8
+        case 0x01: { /* '0x01' */
+            return 0x01
+        }
+        case 0x02: { /* '0x02' */
+            return 0x02
+        }
+        case 0x03: { /* '0x03' */
+            return 0x04
+        }
+        case 0x04: { /* '0x04' */
+            return 0x06
+        }
+        case 0x05: { /* '0x05' */
+            return 0x00
+        }
+        case 0x06: { /* '0x06' */
+            return 0x05
+        }
+        case 0x07: { /* '0x07' */
+            return 0x05
+        }
+        case 0x08: { /* '0x08' */
+            return 0x02
+        }
+        case 0x09: { /* '0x09' */
+            return 0x02
+        }
+        case 0x0A: { /* '0x0A' */
+            return 0x07
+        }
+        case 0x0B: { /* '0x0B' */
+            return 0x07
+        }
+        case 0x0C: { /* '0x0C' */
+            return 0x00
+        }
+        case 0x0D: { /* '0x0D' */
+            return 0x00
+        }
+        case 0x0E: { /* '0x0E' */
+            return 0x08
         }
+        case 0x0F: { /* '0x0F' */
+            return 0x30
+        }
+        case 0x10: { /* '0x10' */
+            return 0x03
+        }
+        case 0x11: { /* '0x11' */
+            return 0x13
+        }
+        case 0x12: { /* '0x12' */
+            return 0x03
+        }
+        case 0x13: { /* '0x13' */
+            return 0x00
+        }
+        case 0x14: { /* '0x14' */
+            return 0x0B
+        }
+        case 0x16: { /* '0x16' */
+            return 0x00
+        }
+        case 0x17: { /* '0x17' */
+            return 0x09
+        }
+        case 0x18: { /* '0x18' */
+            return 0x06
+        }
+        case 0x19: { /* '0x19' */
+            return 0x06
+        }
+        case 0x1A: { /* '0x1A' */
+            return 0x0F
+        }
+        case 0x1B: { /* '0x1B' */
+            return 0x0F
+        }
+        default: {
+            return 0
+        }
+    }
+}
+
+func (e TransportSize) SizeInBytes() uint8 {
+    switch e  {
         case 0x01: { /* '0x01' */
             return 1
         }
@@ -180,38 +336,77 @@ func (e TransportSize) SizeInBytes() uint8 {
             return 1
         }
         case 0x03: { /* '0x03' */
-            return 1
+            return 2
         }
         case 0x04: { /* '0x04' */
-            return 2
+            return 4
         }
         case 0x05: { /* '0x05' */
-            return 2
+            return 8
         }
         case 0x06: { /* '0x06' */
-            return 4
+            return 2
         }
         case 0x07: { /* '0x07' */
-            return 4
+            return 2
         }
         case 0x08: { /* '0x08' */
-            return 4
+            return 1
         }
         case 0x09: { /* '0x09' */
-            return 2
+            return 1
+        }
+        case 0x0A: { /* '0x0A' */
+            return 4
         }
         case 0x0B: { /* '0x0B' */
             return 4
         }
+        case 0x0C: { /* '0x0C' */
+            return 8
+        }
+        case 0x0D: { /* '0x0D' */
+            return 16
+        }
+        case 0x0E: { /* '0x0E' */
+            return 4
+        }
         case 0x0F: { /* '0x0F' */
-            return 12
+            return 8
+        }
+        case 0x10: { /* '0x10' */
+            return 1
+        }
+        case 0x11: { /* '0x11' */
+            return 2
+        }
+        case 0x12: { /* '0x12' */
+            return 1
         }
         case 0x13: { /* '0x13' */
             return 2
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return 4
+        }
+        case 0x16: { /* '0x16' */
             return 8
         }
+        case 0x17: { /* '0x17' */
+            return 2
+        }
+        case 0x18: { /* '0x18' */
+            return 4
+        }
+        case 0x19: { /* '0x19' */
+            return 4
+        }
+        case 0x1A: { /* '0x1A' */
+            return 12
+        }
+        case 0x1B: { /* '0x1B' */
+            return 12
+        }
         default: {
             return 0
         }
@@ -220,9 +415,6 @@ func (e TransportSize) SizeInBytes() uint8 {
 
 func (e TransportSize) Supported_S7_400() bool {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return false
-        }
         case 0x01: { /* '0x01' */
             return true
         }
@@ -236,32 +428,71 @@ func (e TransportSize) Supported_S7_400() bool {
             return true
         }
         case 0x05: { /* '0x05' */
-            return true
+            return false
         }
         case 0x06: { /* '0x06' */
             return true
         }
         case 0x07: { /* '0x07' */
-            return true
+            return false
         }
         case 0x08: { /* '0x08' */
-            return true
+            return false
         }
         case 0x09: { /* '0x09' */
+            return false
+        }
+        case 0x0A: { /* '0x0A' */
             return true
         }
         case 0x0B: { /* '0x0B' */
+            return false
+        }
+        case 0x0C: { /* '0x0C' */
+            return false
+        }
+        case 0x0D: { /* '0x0D' */
+            return false
+        }
+        case 0x0E: { /* '0x0E' */
             return true
         }
         case 0x0F: { /* '0x0F' */
+            return false
+        }
+        case 0x10: { /* '0x10' */
+            return true
+        }
+        case 0x11: { /* '0x11' */
+            return false
+        }
+        case 0x12: { /* '0x12' */
             return true
         }
         case 0x13: { /* '0x13' */
             return false
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return true
+        }
+        case 0x16: { /* '0x16' */
             return false
         }
+        case 0x17: { /* '0x17' */
+            return true
+        }
+        case 0x18: { /* '0x18' */
+            return true
+        }
+        case 0x19: { /* '0x19' */
+            return true
+        }
+        case 0x1A: { /* '0x1A' */
+            return true
+        }
+        case 0x1B: { /* '0x1B' */
+            return true
+        }
         default: {
             return false
         }
@@ -270,9 +501,6 @@ func (e TransportSize) Supported_S7_400() bool {
 
 func (e TransportSize) Supported_S7_1200() bool {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return false
-        }
         case 0x01: { /* '0x01' */
             return true
         }
@@ -286,7 +514,7 @@ func (e TransportSize) Supported_S7_1200() bool {
             return true
         }
         case 0x05: { /* '0x05' */
-            return true
+            return false
         }
         case 0x06: { /* '0x06' */
             return true
@@ -300,29 +528,65 @@ func (e TransportSize) Supported_S7_1200() bool {
         case 0x09: { /* '0x09' */
             return true
         }
+        case 0x0A: { /* '0x0A' */
+            return true
+        }
         case 0x0B: { /* '0x0B' */
             return true
         }
-        case 0x0F: { /* '0x0F' */
+        case 0x0C: { /* '0x0C' */
+            return false
+        }
+        case 0x0D: { /* '0x0D' */
             return false
         }
+        case 0x0E: { /* '0x0E' */
+            return true
+        }
+        case 0x0F: { /* '0x0F' */
+            return true
+        }
+        case 0x10: { /* '0x10' */
+            return true
+        }
+        case 0x11: { /* '0x11' */
+            return true
+        }
+        case 0x12: { /* '0x12' */
+            return true
+        }
         case 0x13: { /* '0x13' */
             return true
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
             return true
         }
+        case 0x16: { /* '0x16' */
+            return false
+        }
+        case 0x17: { /* '0x17' */
+            return true
+        }
+        case 0x18: { /* '0x18' */
+            return true
+        }
+        case 0x19: { /* '0x19' */
+            return true
+        }
+        case 0x1A: { /* '0x1A' */
+            return false
+        }
+        case 0x1B: { /* '0x1B' */
+            return false
+        }
         default: {
             return false
         }
     }
 }
 
-func (e TransportSize) SizeCode() uint8 {
+func (e TransportSize) ShortName() uint8 {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return 'X'
-        }
         case 0x01: { /* '0x01' */
             return 'X'
         }
@@ -330,36 +594,75 @@ func (e TransportSize) SizeCode() uint8 {
             return 'B'
         }
         case 0x03: { /* '0x03' */
-            return 'B'
+            return 'W'
         }
         case 0x04: { /* '0x04' */
-            return 'W'
+            return 'D'
         }
         case 0x05: { /* '0x05' */
-            return 'W'
+            return 'X'
         }
         case 0x06: { /* '0x06' */
-            return 'D'
+            return 'W'
         }
         case 0x07: { /* '0x07' */
-            return 'D'
+            return 'W'
         }
         case 0x08: { /* '0x08' */
-            return 'D'
+            return 'B'
         }
         case 0x09: { /* '0x09' */
-            return 'X'
+            return 'B'
+        }
+        case 0x0A: { /* '0x0A' */
+            return 'D'
         }
         case 0x0B: { /* '0x0B' */
+            return 'D'
+        }
+        case 0x0C: { /* '0x0C' */
+            return 'X'
+        }
+        case 0x0D: { /* '0x0D' */
             return 'X'
         }
+        case 0x0E: { /* '0x0E' */
+            return 'D'
+        }
         case 0x0F: { /* '0x0F' */
             return 'X'
         }
+        case 0x10: { /* '0x10' */
+            return 'B'
+        }
+        case 0x11: { /* '0x11' */
+            return 'X'
+        }
+        case 0x12: { /* '0x12' */
+            return 'X'
+        }
         case 0x13: { /* '0x13' */
             return 'X'
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return 'X'
+        }
+        case 0x16: { /* '0x16' */
+            return 'X'
+        }
+        case 0x17: { /* '0x17' */
+            return 'X'
+        }
+        case 0x18: { /* '0x18' */
+            return 'X'
+        }
+        case 0x19: { /* '0x19' */
+            return 'X'
+        }
+        case 0x1A: { /* '0x1A' */
+            return 'X'
+        }
+        case 0x1B: { /* '0x1B' */
             return 'X'
         }
         default: {
@@ -370,9 +673,6 @@ func (e TransportSize) SizeCode() uint8 {
 
 func (e TransportSize) Supported_S7_1500() bool {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return true
-        }
         case 0x01: { /* '0x01' */
             return true
         }
@@ -400,16 +700,55 @@ func (e TransportSize) Supported_S7_1500() bool {
         case 0x09: { /* '0x09' */
             return true
         }
+        case 0x0A: { /* '0x0A' */
+            return true
+        }
         case 0x0B: { /* '0x0B' */
             return true
         }
+        case 0x0C: { /* '0x0C' */
+            return true
+        }
+        case 0x0D: { /* '0x0D' */
+            return true
+        }
+        case 0x0E: { /* '0x0E' */
+            return true
+        }
         case 0x0F: { /* '0x0F' */
             return true
         }
+        case 0x10: { /* '0x10' */
+            return true
+        }
+        case 0x11: { /* '0x11' */
+            return true
+        }
+        case 0x12: { /* '0x12' */
+            return true
+        }
         case 0x13: { /* '0x13' */
             return true
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return true
+        }
+        case 0x16: { /* '0x16' */
+            return true
+        }
+        case 0x17: { /* '0x17' */
+            return true
+        }
+        case 0x18: { /* '0x18' */
+            return true
+        }
+        case 0x19: { /* '0x19' */
+            return true
+        }
+        case 0x1A: { /* '0x1A' */
+            return true
+        }
+        case 0x1B: { /* '0x1B' */
             return true
         }
         default: {
@@ -420,9 +759,6 @@ func (e TransportSize) Supported_S7_1500() bool {
 
 func (e TransportSize) DataTransportSize() DataTransportSize {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return 0
-        }
         case 0x01: { /* '0x01' */
             return DataTransportSize_BIT
         }
@@ -436,10 +772,10 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
             return DataTransportSize_BYTE_WORD_DWORD
         }
         case 0x05: { /* '0x05' */
-            return DataTransportSize_INTEGER
+            return 0
         }
         case 0x06: { /* '0x06' */
-            return DataTransportSize_BYTE_WORD_DWORD
+            return DataTransportSize_INTEGER
         }
         case 0x07: { /* '0x07' */
             return DataTransportSize_INTEGER
@@ -450,16 +786,55 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
         case 0x09: { /* '0x09' */
             return DataTransportSize_BYTE_WORD_DWORD
         }
+        case 0x0A: { /* '0x0A' */
+            return DataTransportSize_INTEGER
+        }
         case 0x0B: { /* '0x0B' */
+            return DataTransportSize_INTEGER
+        }
+        case 0x0C: { /* '0x0C' */
             return 0
         }
+        case 0x0D: { /* '0x0D' */
+            return 0
+        }
+        case 0x0E: { /* '0x0E' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
         case 0x0F: { /* '0x0F' */
             return 0
         }
+        case 0x10: { /* '0x10' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
+        case 0x11: { /* '0x11' */
+            return 0
+        }
+        case 0x12: { /* '0x12' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
         case 0x13: { /* '0x13' */
             return 0
         }
-        case 0x30: { /* '0x30' */
+        case 0x14: { /* '0x14' */
+            return 0
+        }
+        case 0x16: { /* '0x16' */
+            return 0
+        }
+        case 0x17: { /* '0x17' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
+        case 0x18: { /* '0x18' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
+        case 0x19: { /* '0x19' */
+            return DataTransportSize_BYTE_WORD_DWORD
+        }
+        case 0x1A: { /* '0x1A' */
+            return 0
+        }
+        case 0x1B: { /* '0x1B' */
             return 0
         }
         default: {
@@ -470,9 +845,6 @@ func (e TransportSize) DataTransportSize() DataTransportSize {
 
 func (e TransportSize) BaseType() TransportSize {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return 0
-        }
         case 0x01: { /* '0x01' */
             return 0
         }
@@ -483,34 +855,73 @@ func (e TransportSize) BaseType() TransportSize {
             return 0
         }
         case 0x04: { /* '0x04' */
-            return 0
+            return TransportSize_WORD
         }
         case 0x05: { /* '0x05' */
             return 0
         }
         case 0x06: { /* '0x06' */
-            return TransportSize_WORD
+            return 0
         }
         case 0x07: { /* '0x07' */
             return TransportSize_INT
         }
         case 0x08: { /* '0x08' */
-            return 0
+            return TransportSize_INT
         }
         case 0x09: { /* '0x09' */
-            return 0
+            return TransportSize_INT
+        }
+        case 0x0A: { /* '0x0A' */
+            return TransportSize_INT
         }
         case 0x0B: { /* '0x0B' */
+            return TransportSize_INT
+        }
+        case 0x0C: { /* '0x0C' */
+            return TransportSize_INT
+        }
+        case 0x0D: { /* '0x0D' */
+            return TransportSize_INT
+        }
+        case 0x0E: { /* '0x0E' */
             return 0
         }
         case 0x0F: { /* '0x0F' */
+            return TransportSize_REAL
+        }
+        case 0x10: { /* '0x10' */
+            return 0
+        }
+        case 0x11: { /* '0x11' */
+            return 0
+        }
+        case 0x12: { /* '0x12' */
             return 0
         }
         case 0x13: { /* '0x13' */
             return 0
         }
-        case 0x30: { /* '0x30' */
-            return TransportSize_REAL
+        case 0x14: { /* '0x14' */
+            return 0
+        }
+        case 0x16: { /* '0x16' */
+            return TransportSize_TIME
+        }
+        case 0x17: { /* '0x17' */
+            return 0
+        }
+        case 0x18: { /* '0x18' */
+            return 0
+        }
+        case 0x19: { /* '0x19' */
+            return 0
+        }
+        case 0x1A: { /* '0x1A' */
+            return 0
+        }
+        case 0x1B: { /* '0x1B' */
+            return 0
         }
         default: {
             return 0
@@ -520,9 +931,6 @@ func (e TransportSize) BaseType() TransportSize {
 
 func (e TransportSize) DataProtocolId() string {
     switch e  {
-        case 0x00: { /* '0x00' */
-            return "IEC61131_LWORD"
-        }
         case 0x01: { /* '0x01' */
             return "IEC61131_BOOL"
         }
@@ -530,37 +938,76 @@ func (e TransportSize) DataProtocolId() string {
             return "IEC61131_BYTE"
         }
         case 0x03: { /* '0x03' */
-            return "IEC61131_CHAR"
+            return "IEC61131_WORD"
         }
         case 0x04: { /* '0x04' */
-            return "IEC61131_WORD"
+            return "IEC61131_DWORD"
         }
         case 0x05: { /* '0x05' */
-            return "IEC61131_INT"
+            return "IEC61131_LWORD"
         }
         case 0x06: { /* '0x06' */
-            return "IEC61131_DWORD"
+            return "IEC61131_INT"
         }
         case 0x07: { /* '0x07' */
-            return "IEC61131_DINT"
+            return "IEC61131_UINT"
         }
         case 0x08: { /* '0x08' */
-            return "IEC61131_REAL"
+            return "IEC61131_SINT"
         }
         case 0x09: { /* '0x09' */
-            return "IEC61131_DATE"
+            return "IEC61131_USINT"
+        }
+        case 0x0A: { /* '0x0A' */
+            return "IEC61131_DINT"
         }
         case 0x0B: { /* '0x0B' */
-            return "IEC61131_TIME"
+            return "IEC61131_UDINT"
+        }
+        case 0x0C: { /* '0x0C' */
+            return "IEC61131_LINT"
+        }
+        case 0x0D: { /* '0x0D' */
+            return "IEC61131_ULINT"
+        }
+        case 0x0E: { /* '0x0E' */
+            return "IEC61131_REAL"
         }
         case 0x0F: { /* '0x0F' */
-            return "IEC61131_DATE_AND_TIME"
+            return "IEC61131_LREAL"
         }
-        case 0x13: { /* '0x13' */
+        case 0x10: { /* '0x10' */
+            return "IEC61131_CHAR"
+        }
+        case 0x11: { /* '0x11' */
             return "IEC61131_WCHAR"
         }
-        case 0x30: { /* '0x30' */
-            return "IEC61131_LREAL"
+        case 0x12: { /* '0x12' */
+            return "IEC61131_STRING"
+        }
+        case 0x13: { /* '0x13' */
+            return "IEC61131_WSTRING"
+        }
+        case 0x14: { /* '0x14' */
+            return "IEC61131_TIME"
+        }
+        case 0x16: { /* '0x16' */
+            return "IEC61131_LTIME"
+        }
+        case 0x17: { /* '0x17' */
+            return "IEC61131_DATE"
+        }
+        case 0x18: { /* '0x18' */
+            return "IEC61131_TIME_OF_DAY"
+        }
+        case 0x19: { /* '0x19' */
+            return "IEC61131_TIME_OF_DAY"
+        }
+        case 0x1A: { /* '0x1A' */
+            return "IEC61131_DATE_AND_TIME"
+        }
+        case 0x1B: { /* '0x1B' */
+            return "IEC61131_DATE_AND_TIME"
         }
         default: {
             return ""
@@ -569,68 +1016,116 @@ func (e TransportSize) DataProtocolId() string {
 }
 func TransportSizeByValue(value int8) TransportSize {
     switch value {
-        case 0x00:
-            return TransportSize_LWORD
         case 0x01:
             return TransportSize_BOOL
         case 0x02:
             return TransportSize_BYTE
         case 0x03:
-            return TransportSize_CHAR
-        case 0x04:
             return TransportSize_WORD
+        case 0x04:
+            return TransportSize_DWORD
         case 0x05:
-            return TransportSize_INT
+            return TransportSize_LWORD
         case 0x06:
-            return TransportSize_DWORD
+            return TransportSize_INT
         case 0x07:
-            return TransportSize_DINT
+            return TransportSize_UINT
         case 0x08:
-            return TransportSize_REAL
+            return TransportSize_SINT
         case 0x09:
-            return TransportSize_DATE
+            return TransportSize_USINT
+        case 0x0A:
+            return TransportSize_DINT
         case 0x0B:
-            return TransportSize_TIME
+            return TransportSize_UDINT
+        case 0x0C:
+            return TransportSize_LINT
+        case 0x0D:
+            return TransportSize_ULINT
+        case 0x0E:
+            return TransportSize_REAL
         case 0x0F:
-            return TransportSize_DATE_AND_TIME
-        case 0x13:
-            return TransportSize_WCHAR
-        case 0x30:
             return TransportSize_LREAL
+        case 0x10:
+            return TransportSize_CHAR
+        case 0x11:
+            return TransportSize_WCHAR
+        case 0x12:
+            return TransportSize_STRING
+        case 0x13:
+            return TransportSize_WSTRING
+        case 0x14:
+            return TransportSize_TIME
+        case 0x16:
+            return TransportSize_LTIME
+        case 0x17:
+            return TransportSize_DATE
+        case 0x18:
+            return TransportSize_TIME_OF_DAY
+        case 0x19:
+            return TransportSize_TOD
+        case 0x1A:
+            return TransportSize_DATE_AND_TIME
+        case 0x1B:
+            return TransportSize_DT
     }
     return 0
 }
 
 func TransportSizeByName(value string) TransportSize {
     switch value {
-    case "LWORD":
-        return TransportSize_LWORD
     case "BOOL":
         return TransportSize_BOOL
     case "BYTE":
         return TransportSize_BYTE
-    case "CHAR":
-        return TransportSize_CHAR
     case "WORD":
         return TransportSize_WORD
-    case "INT":
-        return TransportSize_INT
     case "DWORD":
         return TransportSize_DWORD
+    case "LWORD":
+        return TransportSize_LWORD
+    case "INT":
+        return TransportSize_INT
+    case "UINT":
+        return TransportSize_UINT
+    case "SINT":
+        return TransportSize_SINT
+    case "USINT":
+        return TransportSize_USINT
     case "DINT":
         return TransportSize_DINT
+    case "UDINT":
+        return TransportSize_UDINT
+    case "LINT":
+        return TransportSize_LINT
+    case "ULINT":
+        return TransportSize_ULINT
     case "REAL":
         return TransportSize_REAL
-    case "DATE":
-        return TransportSize_DATE
+    case "LREAL":
+        return TransportSize_LREAL
+    case "CHAR":
+        return TransportSize_CHAR
+    case "WCHAR":
+        return TransportSize_WCHAR
+    case "STRING":
+        return TransportSize_STRING
+    case "WSTRING":
+        return TransportSize_WSTRING
     case "TIME":
         return TransportSize_TIME
+    case "LTIME":
+        return TransportSize_LTIME
+    case "DATE":
+        return TransportSize_DATE
+    case "TIME_OF_DAY":
+        return TransportSize_TIME_OF_DAY
+    case "TOD":
+        return TransportSize_TOD
     case "DATE_AND_TIME":
         return TransportSize_DATE_AND_TIME
-    case "WCHAR":
-        return TransportSize_WCHAR
-    case "LREAL":
-        return TransportSize_LREAL
+    case "DT":
+        return TransportSize_DT
     }
     return 0
 }
@@ -668,34 +1163,58 @@ func (e TransportSize) Serialize(io utils.WriteBuffer) error {
 
 func (e TransportSize) String() string {
     switch e {
-    case TransportSize_LWORD:
-        return "LWORD"
     case TransportSize_BOOL:
         return "BOOL"
     case TransportSize_BYTE:
         return "BYTE"
-    case TransportSize_CHAR:
-        return "CHAR"
     case TransportSize_WORD:
         return "WORD"
-    case TransportSize_INT:
-        return "INT"
     case TransportSize_DWORD:
         return "DWORD"
+    case TransportSize_LWORD:
+        return "LWORD"
+    case TransportSize_INT:
+        return "INT"
+    case TransportSize_UINT:
+        return "UINT"
+    case TransportSize_SINT:
+        return "SINT"
+    case TransportSize_USINT:
+        return "USINT"
     case TransportSize_DINT:
         return "DINT"
+    case TransportSize_UDINT:
+        return "UDINT"
+    case TransportSize_LINT:
+        return "LINT"
+    case TransportSize_ULINT:
+        return "ULINT"
     case TransportSize_REAL:
         return "REAL"
-    case TransportSize_DATE:
-        return "DATE"
+    case TransportSize_LREAL:
+        return "LREAL"
+    case TransportSize_CHAR:
+        return "CHAR"
+    case TransportSize_WCHAR:
+        return "WCHAR"
+    case TransportSize_STRING:
+        return "STRING"
+    case TransportSize_WSTRING:
+        return "WSTRING"
     case TransportSize_TIME:
         return "TIME"
+    case TransportSize_LTIME:
+        return "LTIME"
+    case TransportSize_DATE:
+        return "DATE"
+    case TransportSize_TIME_OF_DAY:
+        return "TIME_OF_DAY"
+    case TransportSize_TOD:
+        return "TOD"
     case TransportSize_DATE_AND_TIME:
         return "DATE_AND_TIME"
-    case TransportSize_WCHAR:
-        return "WCHAR"
-    case TransportSize_LREAL:
-        return "LREAL"
+    case TransportSize_DT:
+        return "DT"
     }
     return ""
 }
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 928531d..38dcb47 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -166,7 +166,7 @@
     [discriminator uint 8 'addressType']
     [typeSwitch 'addressType'
         ['0x10' S7AddressAny
-            [enum     TransportSize 'transportSize']
+            [enum     TransportSize 'transportSize' 'code']
             [simple   uint 16       'numberOfElements']
             [simple   uint 16       'dbNumber']
             [enum     MemoryArea    'area']
diff --git a/sandbox/plc4c/api/include/plc4c/data.h b/sandbox/plc4c/api/include/plc4c/data.h
index 67c0d91..265f7aa 100644
--- a/sandbox/plc4c/api/include/plc4c/data.h
+++ b/sandbox/plc4c/api/include/plc4c/data.h
@@ -141,7 +141,7 @@ plc4c_data *plc4c_data_create_constant_string_data(unsigned int size, char *s);
  * @param s the char value
  * @return pointer to plc4c_data
  */
-plc4c_data *plc4c_data_create_char_data(char s);
+plc4c_data *plc4c_data_create_char_data(char* s);
 
 /**
  * Creates a plc4c_data which contains a list of values
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7.c b/sandbox/plc4c/drivers/s7/src/driver_s7.c
index 2cfd568..40a5938 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7.c
@@ -18,13 +18,16 @@
 */
 
 #include "plc4c/driver_s7.h"
-#include "plc4c/driver_s7_sm.h"
+
+#include <string.h>
+
 #include "plc4c/driver_s7_encode_decode.h"
+#include "plc4c/driver_s7_sm.h"
 
-plc4c_return_code plc4c_driver_s7_configure_function(
-    plc4c_list* parameters, void** configuration) {
+plc4c_return_code plc4c_driver_s7_configure_function(plc4c_list* parameters,
+                                                     void** configuration) {
   plc4c_driver_s7_config* s7_config = malloc(sizeof(plc4c_driver_s7_config));
-  if(s7_config == NULL) {
+  if (s7_config == NULL) {
     return NO_MEMORY;
   }
 
@@ -70,13 +73,60 @@ plc4c_driver* plc4c_driver_s7_create() {
  *
  */
 
-char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io, int32_t stringLength, char* encoding) {
-  // TODO: Implement ...
+char* plc4c_s7_read_write_parse_s7_string(plc4c_spi_read_buffer* io,
+                                          int32_t stringLength,
+                                          char* encoding) {
+  if (strcmp(encoding, "UTF-8") == 0) {
+    // Read the max length (which is not interesting for us.
+    uint8_t maxLen;
+    plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &maxLen);
+    if (res != OK) {
+      return NULL;
+    }
+    // Read the effective length of the string.
+    uint8_t effectiveStringLength;
+    res = plc4c_spi_read_unsigned_byte(io, 8, &effectiveStringLength);
+    if (res != OK) {
+      return NULL;
+    }
+    char* result = malloc(sizeof(char) * (effectiveStringLength + 1));
+    if (result == NULL) {
+      return NULL;
+    }
+    char* curPos = result;
+    for(int i = 0; i < effectiveStringLength; i++) {
+      uint8_t val;
+      plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val);
+      if (res != OK) {
+        return NULL;
+      }
+      *curPos = (char) val;
+      curPos++;
+    }
+    *curPos = '\0';
+    return result;
+  } else if (strcmp(encoding, "UTF-16") == 0) {
+  }
   return "";
 }
 
-char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io, char* encoding) {
-  // TODO: Implement ...
+char* plc4c_s7_read_write_parse_s7_char(plc4c_spi_read_buffer* io,
+                                        char* encoding) {
+  if (strcmp(encoding, "UTF-8") == 0) {
+    char* result = malloc(sizeof(char) * 2);
+    if (result == NULL) {
+      return NULL;
+    }
+    uint8_t val;
+    plc4c_return_code res = plc4c_spi_read_unsigned_byte(io, 8, &val);
+    if (res != OK) {
+      return NULL;
+    }
+    *result = (char) val;
+    *(result+1) = '\0';
+    return result;
+  } else if (strcmp(encoding, "UTF-16") == 0) {
+  }
   return "";
 }
 
@@ -109,4 +159,3 @@ time_t plc4c_s7_read_write_parse_tia_date_time(plc4c_spi_read_buffer* io) {
   // TODO: Implement ...
   return 0;
 }
-
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c b/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
index defc8dd..955a45d 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7_encode_decode.c
@@ -220,8 +220,8 @@ plc4c_return_code plc4c_driver_s7_encode_address(
 
     if ((*cur_pos == '(') && (strcmp(data_type, "STRING") == 0)) {
       // Next comes the string_length
-      last_pos = cur_pos;
-      while (isalpha(*cur_pos)) {
+      last_pos = ++cur_pos;
+      while (isdigit(*cur_pos)) {
         cur_pos++;
       }
       len = cur_pos - last_pos;
@@ -307,7 +307,7 @@ plc4c_return_code plc4c_driver_s7_encode_address(
 
     // Check the optional transport size code.
     if(transfer_size_code != NULL) {
-      if(plc4c_s7_read_write_transport_size_get_size_code(any_address->s7_address_any_transport_size) != *transfer_size_code) {
+      if(plc4c_s7_read_write_transport_size_get_short_name(any_address->s7_address_any_transport_size) != *transfer_size_code) {
         return INVALID_ADDRESS;
       }
     }
diff --git a/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c b/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
index b8adcf0..1b0a811 100644
--- a/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
+++ b/sandbox/plc4c/drivers/s7/src/driver_s7_sm_read.c
@@ -131,6 +131,11 @@ plc4c_return_code plc4c_driver_s7_read_machine_function(
         char* data_protocol_id = plc4c_s7_read_write_transport_size_get_data_protocol_id(transport_size);
         uint16_t num_elements = s7_address->s7_var_request_parameter_item_address_address->s7_address_any_number_of_elements;
         int32_t string_length = 0;
+        if(transport_size == plc4c_s7_read_write_transport_size_STRING) {
+          // TODO: This needs to be changed to read arrays of strings.
+          string_length = num_elements;
+          num_elements = 1;
+        }
 
         // Convert the linked list with uint8_t elements into an array of uint8_t.
         plc4c_s7_read_write_s7_var_payload_data_item* cur_response_item = cur_response_item_element->value;
diff --git a/sandbox/plc4c/examples/hello-world/src/hello_world.c b/sandbox/plc4c/examples/hello-world/src/hello_world.c
index 1a13892..9c9e158 100644
--- a/sandbox/plc4c/examples/hello-world/src/hello_world.c
+++ b/sandbox/plc4c/examples/hello-world/src/hello_world.c
@@ -69,8 +69,8 @@ enum plc4c_connection_state_t {
 };
 typedef enum plc4c_connection_state_t plc4c_connection_state;
 
-#pragma clang diagnostic push
-#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
+//#pragma clang diagnostic push
+//#pragma ide diagnostic ignored "hicpp-multiway-paths-covered"
 
 int main() {
   bool loop = true;
@@ -195,81 +195,83 @@ int main() {
         }
         printf("SUCCESS\n");
 
-        printf("Adding an item for '%I0.0:BOOL' ... ");
-        result =
+        /*result =
             plc4c_read_request_add_item(read_request, "BOOL", "%DB4:0.0:BOOL");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "BYTE", "%DB4:1:BYTE");
+            plc4c_read_request_add_item(read_request, "BYTE", "%DB4.1:BYTE");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "WORD", "%DB4:2:WORD");
+            plc4c_read_request_add_item(read_request, "WORD", "%DB4.2:WORD");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "DWORD", "%DB4:4:DWORD");
+            plc4c_read_request_add_item(read_request, "DWORD", "%DB4.4:DWORD");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "SINT", "%DB4:16:SINT");
+            plc4c_read_request_add_item(read_request, "SINT", "%DB4.16:SINT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "USINT", "%DB4:17:USINT");
+            plc4c_read_request_add_item(read_request, "USINT", "%DB4.17:USINT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "INT", "%DB4:18:INT");
+            plc4c_read_request_add_item(read_request, "INT", "%DB4.18:INT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "UINT", "%DB4:20:UINT");
+            plc4c_read_request_add_item(read_request, "UINT", "%DB4.20:UINT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "DINT", "%DB4:22:DINT");
+            plc4c_read_request_add_item(read_request, "DINT", "%DB4.22:DINT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "UDINT", "%DB4:26:UDINT");
+            plc4c_read_request_add_item(read_request, "UDINT", "%DB4.26:UDINT");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
         result =
-            plc4c_read_request_add_item(read_request, "REAL", "%DB4:46:REAL");
+            plc4c_read_request_add_item(read_request, "REAL", "%DB4.46:REAL");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
-        }
+        }*/
+
+        // Works till here ...
+
         // S7 reports "Not supported"
-        /*result =
+        result =
             plc4c_read_request_add_item(read_request, "TIME", "%DB4:58:TIME");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
-        result =
+        /*result =
             plc4c_read_request_add_item(read_request, "DATE", "%DB4:70:DATE");
         if (result != OK) {
           printf("FAILED\n");
@@ -281,36 +283,38 @@ int main() {
           printf("FAILED\n");
           return -1;
         }*/
-        result =
+        /*result =
             plc4c_read_request_add_item(read_request, "TOD", "%DB4:76:TOD");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
-        }
-        /*result =
+        }*/
+        result =
             plc4c_read_request_add_item(read_request, "CHAR", "%DB4:136:CHAR");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
-        result =
+        // UTF-16 doesn't work well in a portable way
+        /*result =
             plc4c_read_request_add_item(read_request, "WCHAR", "%DB4:138:WCHAR");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
-        }
+        }*/
         result =
             plc4c_read_request_add_item(read_request, "STRING", "%DB4:140:STRING(10)");
         if (result != OK) {
           printf("FAILED\n");
           return -1;
         }
-        result =
-            plc4c_read_request_add_item(read_request, "WSTRING", "%DB4:396:WSTRING(10)");
-        if (result != OK) {
-          printf("FAILED\n");
-          return -1;
-        }*/
+        // UTF-16 doesn't work well in a portable way
+        /*result =
+               plc4c_read_request_add_item(read_request, "WSTRING", "%DB4:396:WSTRING(10)");
+           if (result != OK) {
+             printf("FAILED\n");
+             return -1;
+           }*/
         printf("SUCCESS\n");
 
         // Execute the read-request.
@@ -354,7 +358,7 @@ int main() {
         while (cur_element != NULL) {
           plc4c_response_value_item *value_item = cur_element->value;
 
-          printf("Value %s (%s):", value_item->item->name,
+          printf("Value %s (%s): ", value_item->item->name,
                  plc4c_response_code_to_message(value_item->response_code));
           plc4c_data_printf(value_item->value);
           printf("\n");
diff --git a/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h b/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
index 945e5e1..04a5ebf 100644
--- a/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
+++ b/sandbox/plc4c/generated-sources/modbus/include/modbus_data_type_sizes.h
@@ -68,6 +68,7 @@ int plc4c_modbus_read_write_modbus_data_type_sizes_num_values();
 plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_value_for_index(int index);
 
 uint8_t plc4c_modbus_read_write_modbus_data_type_sizes_get_data_type_size(plc4c_modbus_read_write_modbus_data_type_sizes value);
+plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_get_first_enum_for_field_data_type_size(uint8_t value);
 
 #ifdef __cplusplus
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
index 263ce2d..0eeaabd 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_data_type_sizes.c
@@ -294,3 +294,23 @@ uint8_t plc4c_modbus_read_write_modbus_data_type_sizes_get_data_type_size(plc4c_
     }
   }
 }
+
+plc4c_modbus_read_write_modbus_data_type_sizes plc4c_modbus_read_write_modbus_data_type_sizes_get_first_enum_for_field_data_type_size(uint8_t value) {
+    switch(value) {
+        case 1: {
+            return plc4c_modbus_read_write_modbus_data_type_sizes_BOOL;
+        }
+        case 2: {
+            return plc4c_modbus_read_write_modbus_data_type_sizes_WORD;
+        }
+        case 4: {
+            return plc4c_modbus_read_write_modbus_data_type_sizes_DWORD;
+        }
+        case 8: {
+            return plc4c_modbus_read_write_modbus_data_type_sizes_LWORD;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h b/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
index 6906a00..fc27eb4 100644
--- a/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/cotp_tpdu_size.h
@@ -48,6 +48,7 @@ int plc4c_s7_read_write_cotp_tpdu_size_num_values();
 plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_value_for_index(int index);
 
 uint16_t plc4c_s7_read_write_cotp_tpdu_size_get_size_in_bytes(plc4c_s7_read_write_cotp_tpdu_size value);
+plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_get_first_enum_for_field_size_in_bytes(uint16_t value);
 
 #ifdef __cplusplus
 }
diff --git a/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h b/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
index 4525b5b..70ff8cd 100644
--- a/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/data_transport_size.h
@@ -48,6 +48,7 @@ int plc4c_s7_read_write_data_transport_size_num_values();
 plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_value_for_index(int index);
 
 bool plc4c_s7_read_write_data_transport_size_get_size_in_bits(plc4c_s7_read_write_data_transport_size value);
+plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_get_first_enum_for_field_size_in_bits(bool value);
 
 #ifdef __cplusplus
 }
diff --git a/sandbox/plc4c/generated-sources/s7/include/memory_area.h b/sandbox/plc4c/generated-sources/s7/include/memory_area.h
index f6f357e..55694cb 100644
--- a/sandbox/plc4c/generated-sources/s7/include/memory_area.h
+++ b/sandbox/plc4c/generated-sources/s7/include/memory_area.h
@@ -50,6 +50,7 @@ int plc4c_s7_read_write_memory_area_num_values();
 plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_value_for_index(int index);
 
 char* plc4c_s7_read_write_memory_area_get_short_name(plc4c_s7_read_write_memory_area value);
+plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_get_first_enum_for_field_short_name(char* value);
 
 #ifdef __cplusplus
 }
diff --git a/sandbox/plc4c/generated-sources/s7/include/transport_size.h b/sandbox/plc4c/generated-sources/s7/include/transport_size.h
index 8f77697..1eebc59 100644
--- a/sandbox/plc4c/generated-sources/s7/include/transport_size.h
+++ b/sandbox/plc4c/generated-sources/s7/include/transport_size.h
@@ -69,26 +69,37 @@ int plc4c_s7_read_write_transport_size_num_values();
 plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_value_for_index(int index);
 
 bool plc4c_s7_read_write_transport_size_get_supported__s7_300(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_300(bool value);
 
 bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__logo(bool value);
 
 uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(uint8_t value);
 
 uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_size_in_bytes(uint8_t value);
 
 bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_400(bool value);
 
 bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1200(bool value);
 
 uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_short_name(uint8_t value);
 
 bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1500(bool value);
 
 plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_data_transport_size(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_transport_size(plc4c_s7_read_write_data_transport_size value);
 
 plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_type(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_base_type(plc4c_s7_read_write_transport_size value);
 
 char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_write_transport_size value);
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_protocol_id(char* value);
 
 #ifdef __cplusplus
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c b/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
index d5deae3..3e98970 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_tpdu_size.c
@@ -114,3 +114,32 @@ uint16_t plc4c_s7_read_write_cotp_tpdu_size_get_size_in_bytes(plc4c_s7_read_writ
     }
   }
 }
+
+plc4c_s7_read_write_cotp_tpdu_size plc4c_s7_read_write_cotp_tpdu_size_get_first_enum_for_field_size_in_bytes(uint16_t value) {
+    switch(value) {
+        case 1024: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_1024;
+        }
+        case 128: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_128;
+        }
+        case 2048: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_2048;
+        }
+        case 256: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_256;
+        }
+        case 4096: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_4096;
+        }
+        case 512: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_512;
+        }
+        case 8192: {
+            return plc4c_s7_read_write_cotp_tpdu_size_SIZE_8192;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c b/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
index 14b508d..c58ff58 100644
--- a/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/data_transport_size.c
@@ -114,3 +114,17 @@ bool plc4c_s7_read_write_data_transport_size_get_size_in_bits(plc4c_s7_read_writ
     }
   }
 }
+
+plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_data_transport_size_get_first_enum_for_field_size_in_bits(bool value) {
+    switch(value) {
+        case false: {
+            return plc4c_s7_read_write_data_transport_size_NULL;
+        }
+        case true: {
+            return plc4c_s7_read_write_data_transport_size_BIT;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/memory_area.c b/sandbox/plc4c/generated-sources/s7/src/memory_area.c
index 51a929f..b822207 100644
--- a/sandbox/plc4c/generated-sources/s7/src/memory_area.c
+++ b/sandbox/plc4c/generated-sources/s7/src/memory_area.c
@@ -132,3 +132,33 @@ char* plc4c_s7_read_write_memory_area_get_short_name(plc4c_s7_read_write_memory_
     }
   }
 }
+
+plc4c_s7_read_write_memory_area plc4c_s7_read_write_memory_area_get_first_enum_for_field_short_name(char* value) {
+    if (strcmp(value, "C") == 0) {
+        return plc4c_s7_read_write_memory_area_COUNTERS;
+    }
+    if (strcmp(value, "D") == 0) {
+        return plc4c_s7_read_write_memory_area_DIRECT_PERIPHERAL_ACCESS;
+    }
+    if (strcmp(value, "DB") == 0) {
+        return plc4c_s7_read_write_memory_area_DATA_BLOCKS;
+    }
+    if (strcmp(value, "DBI") == 0) {
+        return plc4c_s7_read_write_memory_area_INSTANCE_DATA_BLOCKS;
+    }
+    if (strcmp(value, "I") == 0) {
+        return plc4c_s7_read_write_memory_area_INPUTS;
+    }
+    if (strcmp(value, "LD") == 0) {
+        return plc4c_s7_read_write_memory_area_LOCAL_DATA;
+    }
+    if (strcmp(value, "M") == 0) {
+        return plc4c_s7_read_write_memory_area_FLAGS_MARKERS;
+    }
+    if (strcmp(value, "Q") == 0) {
+        return plc4c_s7_read_write_memory_area_OUTPUTS;
+    }
+    if (strcmp(value, "T") == 0) {
+        return plc4c_s7_read_write_memory_area_TIMERS;
+    }
+}
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 0f239fb..923cb2c 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -67,9 +67,13 @@ plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* io
                     
     // Enum field (transportSize)
     plc4c_s7_read_write_transport_size transportSize = plc4c_s7_read_write_transport_size_null();
-    _res = plc4c_spi_read_signed_byte(io, 8, (int8_t*) &transportSize);
-    if(_res != OK) {
-      return _res;
+    {
+      uint8_t _constantValue = 0;
+      _res = plc4c_spi_read_unsigned_byte(io, 8, (uint8_t*) &_constantValue);
+      if(_res != OK) {
+        return _res;
+      }
+      transportSize = plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(_constantValue);
     }
     (*_message)->s7_address_any_transport_size = transportSize;
 
@@ -153,7 +157,7 @@ plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffe
     case plc4c_s7_read_write_s7_address_type_plc4c_s7_read_write_s7_address_any: {
 
       // Enum field (transportSize)
-      _res = plc4c_spi_write_signed_byte(io, 8, _message->s7_address_any_transport_size);
+      _res = plc4c_spi_write_unsigned_byte(io, 8, plc4c_s7_read_write_transport_size_get_code(_message->s7_address_any_transport_size));
       if(_res != OK) {
         return _res;
       }
diff --git a/sandbox/plc4c/generated-sources/s7/src/transport_size.c b/sandbox/plc4c/generated-sources/s7/src/transport_size.c
index c8bb738..17fd0d8 100644
--- a/sandbox/plc4c/generated-sources/s7/src/transport_size.c
+++ b/sandbox/plc4c/generated-sources/s7/src/transport_size.c
@@ -288,6 +288,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_300(plc4c_s7_read_writ
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_300(bool value) {
+    switch(value) {
+        case false: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        case true: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -374,6 +388,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__logo(plc4c_s7_read_write_
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__logo(bool value) {
+    switch(value) {
+        case false: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        case true: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -460,6 +488,56 @@ uint8_t plc4c_s7_read_write_transport_size_get_code(plc4c_s7_read_write_transpor
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_code(uint8_t value) {
+    switch(value) {
+        case 0: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        case 1: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        case 2: {
+            return plc4c_s7_read_write_transport_size_BYTE;
+        }
+        case 3: {
+            return plc4c_s7_read_write_transport_size_CHAR;
+        }
+        case 4: {
+            return plc4c_s7_read_write_transport_size_WORD;
+        }
+        case 5: {
+            return plc4c_s7_read_write_transport_size_INT;
+        }
+        case 6: {
+            return plc4c_s7_read_write_transport_size_DWORD;
+        }
+        case 7: {
+            return plc4c_s7_read_write_transport_size_DINT;
+        }
+        case 8: {
+            return plc4c_s7_read_write_transport_size_REAL;
+        }
+        case 9: {
+            return plc4c_s7_read_write_transport_size_DATE;
+        }
+        case 11: {
+            return plc4c_s7_read_write_transport_size_TIME;
+        }
+        case 15: {
+            return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+        }
+        case 19: {
+            return plc4c_s7_read_write_transport_size_WCHAR;
+        }
+        case 48: {
+            return plc4c_s7_read_write_transport_size_LREAL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -546,6 +624,32 @@ uint8_t plc4c_s7_read_write_transport_size_get_size_in_bytes(plc4c_s7_read_write
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_size_in_bytes(uint8_t value) {
+    switch(value) {
+        case 1: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        case 12: {
+            return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+        }
+        case 16: {
+            return plc4c_s7_read_write_transport_size_ULINT;
+        }
+        case 2: {
+            return plc4c_s7_read_write_transport_size_WORD;
+        }
+        case 4: {
+            return plc4c_s7_read_write_transport_size_DWORD;
+        }
+        case 8: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -632,6 +736,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_400(plc4c_s7_read_writ
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_400(bool value) {
+    switch(value) {
+        case false: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        case true: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -718,6 +836,20 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1200(plc4c_s7_read_wri
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1200(bool value) {
+    switch(value) {
+        case false: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        case true: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -804,6 +936,26 @@ uint8_t plc4c_s7_read_write_transport_size_get_short_name(plc4c_s7_read_write_tr
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_short_name(uint8_t value) {
+    switch(value) {
+        case 'B': {
+            return plc4c_s7_read_write_transport_size_BYTE;
+        }
+        case 'D': {
+            return plc4c_s7_read_write_transport_size_DWORD;
+        }
+        case 'W': {
+            return plc4c_s7_read_write_transport_size_WORD;
+        }
+        case 'X': {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -890,6 +1042,17 @@ bool plc4c_s7_read_write_transport_size_get_supported__s7_1500(plc4c_s7_read_wri
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_supported__s7_1500(bool value) {
+    switch(value) {
+        case true: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_data_transport_size(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -976,6 +1139,26 @@ plc4c_s7_read_write_data_transport_size plc4c_s7_read_write_transport_size_get_d
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_transport_size(plc4c_s7_read_write_data_transport_size value) {
+    switch(value) {
+        case plc4c_s7_read_write_data_transport_size_BIT: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        case plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD: {
+            return plc4c_s7_read_write_transport_size_BYTE;
+        }
+        case plc4c_s7_read_write_data_transport_size_INTEGER: {
+            return plc4c_s7_read_write_transport_size_INT;
+        }
+        case -1: {
+            return plc4c_s7_read_write_transport_size_LWORD;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_type(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -1062,6 +1245,29 @@ plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_base_t
   }
 }
 
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_base_type(plc4c_s7_read_write_transport_size value) {
+    switch(value) {
+        case plc4c_s7_read_write_transport_size_INT: {
+            return plc4c_s7_read_write_transport_size_UINT;
+        }
+        case plc4c_s7_read_write_transport_size_REAL: {
+            return plc4c_s7_read_write_transport_size_LREAL;
+        }
+        case plc4c_s7_read_write_transport_size_TIME: {
+            return plc4c_s7_read_write_transport_size_LTIME;
+        }
+        case plc4c_s7_read_write_transport_size_WORD: {
+            return plc4c_s7_read_write_transport_size_DWORD;
+        }
+        case -1: {
+            return plc4c_s7_read_write_transport_size_BOOL;
+        }
+        default: {
+            return -1;
+        }
+    }
+}
+
 char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_write_transport_size value) {
   switch(value) {
     case plc4c_s7_read_write_transport_size_BOOL: { /* '0x01' */
@@ -1147,3 +1353,78 @@ char* plc4c_s7_read_write_transport_size_get_data_protocol_id(plc4c_s7_read_writ
     }
   }
 }
+
+plc4c_s7_read_write_transport_size plc4c_s7_read_write_transport_size_get_first_enum_for_field_data_protocol_id(char* value) {
+    if (strcmp(value, "IEC61131_BOOL") == 0) {
+        return plc4c_s7_read_write_transport_size_BOOL;
+    }
+    if (strcmp(value, "IEC61131_BYTE") == 0) {
+        return plc4c_s7_read_write_transport_size_BYTE;
+    }
+    if (strcmp(value, "IEC61131_CHAR") == 0) {
+        return plc4c_s7_read_write_transport_size_CHAR;
+    }
+    if (strcmp(value, "IEC61131_DATE") == 0) {
+        return plc4c_s7_read_write_transport_size_DATE;
+    }
+    if (strcmp(value, "IEC61131_DATE_AND_TIME") == 0) {
+        return plc4c_s7_read_write_transport_size_DATE_AND_TIME;
+    }
+    if (strcmp(value, "IEC61131_DINT") == 0) {
+        return plc4c_s7_read_write_transport_size_DINT;
+    }
+    if (strcmp(value, "IEC61131_DWORD") == 0) {
+        return plc4c_s7_read_write_transport_size_DWORD;
+    }
+    if (strcmp(value, "IEC61131_INT") == 0) {
+        return plc4c_s7_read_write_transport_size_INT;
+    }
+    if (strcmp(value, "IEC61131_LINT") == 0) {
+        return plc4c_s7_read_write_transport_size_LINT;
+    }
+    if (strcmp(value, "IEC61131_LREAL") == 0) {
+        return plc4c_s7_read_write_transport_size_LREAL;
+    }
+    if (strcmp(value, "IEC61131_LTIME") == 0) {
+        return plc4c_s7_read_write_transport_size_LTIME;
+    }
+    if (strcmp(value, "IEC61131_LWORD") == 0) {
+        return plc4c_s7_read_write_transport_size_LWORD;
+    }
+    if (strcmp(value, "IEC61131_REAL") == 0) {
+        return plc4c_s7_read_write_transport_size_REAL;
+    }
+    if (strcmp(value, "IEC61131_SINT") == 0) {
+        return plc4c_s7_read_write_transport_size_SINT;
+    }
+    if (strcmp(value, "IEC61131_STRING") == 0) {
+        return plc4c_s7_read_write_transport_size_STRING;
+    }
+    if (strcmp(value, "IEC61131_TIME") == 0) {
+        return plc4c_s7_read_write_transport_size_TIME;
+    }
+    if (strcmp(value, "IEC61131_TIME_OF_DAY") == 0) {
+        return plc4c_s7_read_write_transport_size_TIME_OF_DAY;
+    }
+    if (strcmp(value, "IEC61131_UDINT") == 0) {
+        return plc4c_s7_read_write_transport_size_UDINT;
+    }
+    if (strcmp(value, "IEC61131_UINT") == 0) {
+        return plc4c_s7_read_write_transport_size_UINT;
+    }
+    if (strcmp(value, "IEC61131_ULINT") == 0) {
+        return plc4c_s7_read_write_transport_size_ULINT;
+    }
+    if (strcmp(value, "IEC61131_USINT") == 0) {
+        return plc4c_s7_read_write_transport_size_USINT;
+    }
+    if (strcmp(value, "IEC61131_WCHAR") == 0) {
+        return plc4c_s7_read_write_transport_size_WCHAR;
+    }
+    if (strcmp(value, "IEC61131_WORD") == 0) {
+        return plc4c_s7_read_write_transport_size_WORD;
+    }
+    if (strcmp(value, "IEC61131_WSTRING") == 0) {
+        return plc4c_s7_read_write_transport_size_WSTRING;
+    }
+}
diff --git a/sandbox/plc4c/pom.xml b/sandbox/plc4c/pom.xml
index 4e187bf..e3e4df2 100644
--- a/sandbox/plc4c/pom.xml
+++ b/sandbox/plc4c/pom.xml
@@ -287,7 +287,7 @@
         </plugins>
         <!--
           Developers working in plc4c will probably use an IDE like CLion to edit just this
-          Part of the project. These IDEs generate some work-directries we need to exclude.
+          Part of the project. These IDEs generate some work-directories we need to exclude.
         -->
         <pluginManagement>
           <plugins>
diff --git a/sandbox/plc4c/spi/src/data.c b/sandbox/plc4c/spi/src/data.c
index a688732..f12f00a 100644
--- a/sandbox/plc4c/spi/src/data.c
+++ b/sandbox/plc4c/spi/src/data.c
@@ -154,7 +154,7 @@ plc4c_data *plc4c_data_create_constant_string_data(unsigned int size, char *s) {
   return data;
 }
 
-plc4c_data *plc4c_data_create_char_data(char s) {
+plc4c_data *plc4c_data_create_char_data(char* s) {
   plc4c_data *data = malloc(sizeof(plc4c_data));
   data->data_type = PLC4C_CONSTANT_STRING;
   data->size = 1;
@@ -188,6 +188,10 @@ plc4c_data *plc4c_data_create_void_pointer_data(void *v) {
 }
 
 void plc4c_data_printf(plc4c_data *data) {
+  if (data == NULL) {
+    printf("NULL");
+    return;
+  }
   switch (data->data_type) {
     case PLC4C_BOOL:
       printf("%s", data->data.boolean_value ? "true" : "false");
@@ -196,25 +200,25 @@ void plc4c_data_printf(plc4c_data *data) {
       printf("%d", data->data.char_value);
       break;
     case PLC4C_UCHAR:
-      printf("%d", data->data.uchar_value);
+      printf("%u", data->data.uchar_value);
       break;
     case PLC4C_SHORT:
       printf("%d", data->data.short_value);
       break;
     case PLC4C_USHORT:
-      printf("%d", data->data.ushort_value);
+      printf("%u", data->data.ushort_value);
       break;
     case PLC4C_INT:
       printf("%d", data->data.int_value);
       break;
     case PLC4C_UINT:
-      printf("%iu", data->data.uint_value);
+      printf("%u", data->data.uint_value);
       break;
     case PLC4C_LINT:
-      printf("%d", data->data.lint_value);
+      printf("%I64d", data->data.lint_value);
       break;
     case PLC4C_ULINT:
-      printf("%d", data->data.ulint_value);
+      printf("%I64u", data->data.ulint_value);
       break;
     case PLC4C_FLOAT:
       printf("%f", data->data.float_value);
@@ -226,14 +230,19 @@ void plc4c_data_printf(plc4c_data *data) {
       printf("%s", data->data.const_string_value);
       break;
     case PLC4C_LIST:
-      printf("{");
+      printf("[");
       plc4c_list_element *cur_element =
           plc4c_utils_list_tail(&data->data.list_value);
       while (cur_element != NULL) {
-        plc4c_response_value_item *value_item = cur_element->value;
-        plc4c_data_printf(value_item->value);
+        plc4c_data *data_item = cur_element->value;
+        plc4c_data_printf(data_item);
+        cur_element = cur_element->next;
+        if (cur_element != NULL) {
+          printf(", ");
+        }
       }
-      printf("}");
+      printf("]");
+      break;
     case PLC4C_VOID_POINTER:
       if (data->custom_printf != NULL) {
         data->custom_printf(data);