You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2023/05/21 04:34:26 UTC

[plc4x] 01/03: feat(plc4py): Work on the templates

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

hutcheb pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit ad7fbdb97d5fac6c2c3a3160a9da5ca3a4074c83
Author: Ben Hutcheson <be...@gmail.com>
AuthorDate: Sat May 20 01:12:27 2023 +0200

    feat(plc4py): Work on the templates
---
 .../python/PythonLanguageTemplateHelper.java       | 107 +++++---------
 .../python/complex-type-template.python.ftlh       |   6 +-
 .../plc4py/protocols/modbus/readwrite/DataItem.py  |   6 +-
 .../protocols/modbus/readwrite/ModbusAsciiADU.py   |   6 +-
 .../protocols/modbus/readwrite/ModbusConstants.py  |   2 +-
 .../readwrite/ModbusDeviceInformationObject.py     |  10 +-
 .../plc4py/protocols/modbus/readwrite/ModbusPDU.py | 160 ++++++++++-----------
 .../modbus/readwrite/ModbusPDUDiagnosticRequest.py |  10 +-
 .../readwrite/ModbusPDUDiagnosticResponse.py       |  10 +-
 .../protocols/modbus/readwrite/ModbusPDUError.py   |   6 +-
 .../ModbusPDUGetComEventCounterRequest.py          |   4 +-
 .../ModbusPDUGetComEventCounterResponse.py         |  12 +-
 .../readwrite/ModbusPDUGetComEventLogRequest.py    |   4 +-
 .../readwrite/ModbusPDUGetComEventLogResponse.py   |  28 ++--
 .../ModbusPDUMaskWriteHoldingRegisterRequest.py    |  14 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.py   |  14 +-
 .../modbus/readwrite/ModbusPDUReadCoilsRequest.py  |  10 +-
 .../modbus/readwrite/ModbusPDUReadCoilsResponse.py |  12 +-
 .../ModbusPDUReadDeviceIdentificationRequest.py    |  13 +-
 .../ModbusPDUReadDeviceIdentificationResponse.py   |  27 ++--
 .../ModbusPDUReadDiscreteInputsRequest.py          |  10 +-
 .../ModbusPDUReadDiscreteInputsResponse.py         |  12 +-
 .../ModbusPDUReadExceptionStatusRequest.py         |   4 +-
 .../ModbusPDUReadExceptionStatusResponse.py        |   6 +-
 .../readwrite/ModbusPDUReadFifoQueueRequest.py     |   6 +-
 .../readwrite/ModbusPDUReadFifoQueueResponse.py    |  28 ++--
 .../readwrite/ModbusPDUReadFileRecordRequest.py    |  11 +-
 .../ModbusPDUReadFileRecordRequestItem.py          |  14 +-
 .../readwrite/ModbusPDUReadFileRecordResponse.py   |  11 +-
 .../ModbusPDUReadFileRecordResponseItem.py         |  14 +-
 .../ModbusPDUReadHoldingRegistersRequest.py        |  10 +-
 .../ModbusPDUReadHoldingRegistersResponse.py       |  12 +-
 .../ModbusPDUReadInputRegistersRequest.py          |  10 +-
 .../ModbusPDUReadInputRegistersResponse.py         |  12 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.py |  24 ++--
 ...PDUReadWriteMultipleHoldingRegistersResponse.py |  12 +-
 .../readwrite/ModbusPDUReportServerIdRequest.py    |   4 +-
 .../readwrite/ModbusPDUReportServerIdResponse.py   |  12 +-
 .../readwrite/ModbusPDUWriteFileRecordRequest.py   |  11 +-
 .../ModbusPDUWriteFileRecordRequestItem.py         |  24 ++--
 .../readwrite/ModbusPDUWriteFileRecordResponse.py  |  11 +-
 .../ModbusPDUWriteFileRecordResponseItem.py        |  22 +--
 .../ModbusPDUWriteMultipleCoilsRequest.py          |  18 +--
 .../ModbusPDUWriteMultipleCoilsResponse.py         |  10 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.py |  18 +--
 ...dbusPDUWriteMultipleHoldingRegistersResponse.py |  10 +-
 .../readwrite/ModbusPDUWriteSingleCoilRequest.py   |  10 +-
 .../readwrite/ModbusPDUWriteSingleCoilResponse.py  |  10 +-
 .../ModbusPDUWriteSingleRegisterRequest.py         |  10 +-
 .../ModbusPDUWriteSingleRegisterResponse.py        |  10 +-
 .../protocols/modbus/readwrite/ModbusRtuADU.py     |   6 +-
 .../protocols/modbus/readwrite/ModbusTcpADU.py     |  14 +-
 .../plc4py/protocols/simulated/readwrite/Dummy.py  |   4 +-
 .../plc4py/plc4py/spi/generation/WriteBuffer.py    |  14 ++
 54 files changed, 360 insertions(+), 515 deletions(-)

diff --git a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
index 56e1534400..e706ef78b7 100644
--- a/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
+++ b/code-generation/language-python/src/main/java/org/apache/plc4x/language/python/PythonLanguageTemplateHelper.java
@@ -212,6 +212,11 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         }
     }
 
+    public String getReservedValue(ReservedField reservedField) {
+        final String languageTypeName = getLanguageTypeNameForTypeReference(reservedField.getType());
+        return languageTypeName + "(" + reservedField.getReferenceValue() + ")";
+    }
+
     public String getFieldOptions(TypedField field, List<Argument> parserArguments) {
         StringBuilder sb = new StringBuilder();
         final Optional<Term> encodingOptional = field.getEncoding();
@@ -276,36 +281,33 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         final int sizeInBits = simpleTypeReference.getSizeInBits();
         switch (simpleTypeReference.getBaseType()) {
             case BIT:
-                return "read_boolean(read_buffer)";
+                return "read_boolean";
             case BYTE:
-                return "read_byte(read_buffer, " + sizeInBits + ")";
+                return "read_byte";
             case UINT:
-                if (sizeInBits <= 4) return "read_unsigned_byte(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 8) return "read_unsigned_short(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 16) return "read_unsigned_int(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 32) return "read_unsigned_long(read_buffer, " + sizeInBits + ")";
-                return "read_unsigned_big_integer(read_buffer, " + sizeInBits + ")";
+                if (sizeInBits <= 4) return "read_unsigned_byte";
+                if (sizeInBits <= 8) return "read_unsigned_short";
+                if (sizeInBits <= 16) return "read_unsigned_int";
+                return "read_unsigned_long";
             case INT:
-                if (sizeInBits <= 8) return "read_signed_byte(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 16) return "read_signed_short(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 32) return "read_signed_int(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 64) return "read_signed_long(read_buffer, " + sizeInBits + ")";
-                return "read_signed_big_integer(read_buffer, " + sizeInBits + ")";
+                if (sizeInBits <= 8) return "read_signed_byte";
+                if (sizeInBits <= 16) return "read_signed_short";
+                if (sizeInBits <= 32) return "read_signed_int";
+                return "read_signed_long";
             case FLOAT:
-                if (sizeInBits <= 32) return "read_float(read_buffer, " + sizeInBits + ")";
-                if (sizeInBits <= 64) return "read_double(read_buffer, " + sizeInBits + ")";
-                return "read_big_decimal(read_buffer, " + sizeInBits + ")";
+                if (sizeInBits <= 32) return "read_float";
+                return "read_double";
             case STRING:
-                return "read_string(read_buffer, " + sizeInBits + ")";
+                return "read_string";
             case VSTRING:
                 VstringTypeReference vstringTypeReference = (VstringTypeReference) simpleTypeReference;
-                return "read_string(read_buffer, " + toParseExpression(null, INT_TYPE_REFERENCE, vstringTypeReference.getLengthExpression(), null) + ")";
+                return "read_string";
             case TIME:
-                return "read_time(read_buffer)";
+                return "read_time";
             case DATE:
-                return "read_date(read_buffer)";
+                return "read_date";
             case DATETIME:
-                return "read_date_time(read_buffer)";
+                return "read_date_time";
             default:
                 throw new UnsupportedOperationException("Unsupported type " + simpleTypeReference.getBaseType());
         }
@@ -674,31 +676,6 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         }
     }
 
-    public String getReservedValue(ReservedField reservedField) {
-        final String languageTypeName = getLanguageTypeNameForTypeReference(reservedField.getType());
-        switch (languageTypeName) {
-            case "*big.Int":
-                emitRequiredImport("math/big");
-                return "big.NewInt(" + reservedField.getReferenceValue() + ")";
-            case "*big.Float":
-                emitRequiredImport("math/big");
-                return "*big.Float(" + reservedField.getReferenceValue() + ")";
-            default:
-                return languageTypeName + "(" + reservedField.getReferenceValue() + ")";
-        }
-    }
-
-    public String toTypeSafeCompare(ReservedField reservedField) {
-        final String languageTypeName = getLanguageTypeNameForTypeReference(reservedField.getType());
-        switch (languageTypeName) {
-            case "*big.Int":
-            case "*big.Float":
-                emitRequiredImport("math/big");
-                return "reserved.Cmp(" + getReservedValue(reservedField) + ") != 0";
-            default:
-                return "reserved != " + getReservedValue(reservedField);
-        }
-    }
 
     public String toParseExpression(Field field, TypeReference resultType, Term term, List<Argument> parserArguments) {
         Tracer tracer = Tracer.start("toParseExpression");
@@ -815,8 +792,8 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         switch (operation) {
             case "^":
                 tracer = tracer.dive("^");
-                emitRequiredImport("math");
-                return tracer + "Math.pow(" +
+                emitRequiredImport("from math import pow");
+                return tracer + "pow(" +
                     castExpressionForTypeReference + "(" + toExpression(field, fieldType, a, parserArguments, serializerArguments, serialize, false) + "), " +
                     castExpressionForTypeReference + "(" + toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false) + "))";
             // If we start casting for comparisons, equals or non equals, really messy things happen.
@@ -853,9 +830,9 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
                         toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false);
                 }
                 return tracer +
-                    castExpressionForTypeReference + "(" + toExpression(field, fieldType, a, parserArguments, serializerArguments, serialize, false) + ") " +
+                    toExpression(field, fieldType, a, parserArguments, serializerArguments, serialize, false) +
                     operation + " " +
-                    castExpressionForTypeReference + "(" + toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false) + ")";
+                    toExpression(field, fieldType, b, parserArguments, serializerArguments, serialize, false);
         }
     }
 
@@ -884,7 +861,8 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
             return tracer + "None";
         } else if (term instanceof BooleanLiteral) {
             tracer = tracer.dive("boolean literal instanceOf");
-            return tracer + getCastExpressionForTypeReference(fieldType) + "(" + ((BooleanLiteral) term).getValue() + ")";
+            String bool = Boolean.toString(((BooleanLiteral) term).getValue());
+            return tracer + bool.substring(0,1).toUpperCase() + bool.substring(1);
         } else if (term instanceof NumericLiteral) {
             tracer = tracer.dive("numeric literal instanceOf");
             if (getCastExpressionForTypeReference(fieldType).equals("string")) {
@@ -1130,8 +1108,8 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
             .stream().findFirst().orElseThrow(IllegalStateException::new);
         // The Ceil function expects 64 bit floating point values.
         TypeReference tr = new DefaultFloatTypeReference(SimpleTypeReference.SimpleBaseType.FLOAT, 64);
-        emitRequiredImport("math");
-        return tracer + "math.Ceil(" + toExpression(field, tr, va, parserArguments, serializerArguments, serialize, suppressPointerAccess) + ")";
+        emitRequiredImport("from math import ceil");
+        return tracer + "ceil(" + toExpression(field, tr, va, parserArguments, serializerArguments, serialize, suppressPointerAccess) + ")";
     }
 
     private String toArraySizeInBytesVariableExpression(Field field, TypeReference typeReference, VariableLiteral variableLiteral, List<Argument> parserArguments, List<Argument> serializerArguments, boolean suppressPointerAccess, Tracer tracer) {
@@ -1144,7 +1122,7 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
             .asVariableLiteral()
             .orElseThrow(() -> new RuntimeException("ARRAY_SIZE_IN_BYTES needs a variable literal"));
         // "io" and "m" are always available in every parser.
-        boolean isSerializerArg = "readBuffer".equals(va.getName()) || "writeBuffer".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
+        boolean isSerializerArg = "read_buffer".equals(va.getName()) || "write_buffer".equals(va.getName()) || "self".equals(va.getName()) || "element".equals(va.getName());
         if (!isSerializerArg && serializerArguments != null) {
             for (Argument serializerArgument : serializerArguments) {
                 if (serializerArgument.getName().equals(va.getName())) {
@@ -1159,7 +1137,8 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         } else {
             sb.append(toVariableExpression(field, typeReference, va, parserArguments, serializerArguments, true, suppressPointerAccess));
         }
-        return tracer + getCastExpressionForTypeReference(typeReference) + "(" + va.getName() + "ArraySizeInBytes(" + sb + "))";
+        emitRequiredImport("from sys import getsizeof");
+        return tracer + getCastExpressionForTypeReference(typeReference) + "(getsizeof(" + sb + "))";
     }
 
     private String toCountVariableExpression(Field field, TypeReference typeReference, VariableLiteral variableLiteral, List<Argument> parserArguments, List<Argument> serializerArguments, boolean serialize, boolean suppressPointerAccess, Tracer tracer) {
@@ -1764,26 +1743,6 @@ public class PythonLanguageTemplateHelper extends BaseFreemarkerLanguageTemplate
         return extractedTrace + StringUtils.capitalize(cleanedString);
     }
 
-    public String getEndiannessOptions(boolean read, boolean separatorPrefix) {
-        return getEndiannessOptions(read, separatorPrefix, Collections.emptyList());
-    }
-
-    public String getEndiannessOptions(boolean read, boolean separatorPrefix, List<Argument> parserArguments) {
-        Optional<Term> byteOrder = thisType.getAttribute("byteOrder");
-        if (byteOrder.isPresent()) {
-            emitRequiredImport("encoding/binary");
-            if(read) {
-                return (separatorPrefix ? ", " : "") + "utils.WithByteOrderForReadBufferByteBased(" +
-                    toParseExpression(null, new DefaultByteOrderTypeReference(), byteOrder.orElseThrow(), parserArguments) +
-                    ")";
-            } else {
-                return (separatorPrefix ? ", " : "") + "utils.WithByteOrderForByteBasedBuffer(" +
-                    toSerializationExpression(null, new DefaultByteOrderTypeReference(), byteOrder.orElseThrow(), parserArguments) +
-                    ")";
-            }
-        }
-        return "";
-    }
 
     /**
      * Converts a camel-case string to snake-case.
diff --git a/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh b/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
index e6e2584b03..11ce0db831 100644
--- a/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
+++ b/code-generation/language-python/src/main/resources/templates/python/complex-type-template.python.ftlh
@@ -220,7 +220,7 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()></#if>(<#if ty
 
         # Array Field (${arrayField.name})
                         <#if arrayField.type.elementTypeReference.isByteBased()>
-        write_buffer.write_byte_array(self.${helper.camelCaseToSnakeCase(namedField.name)}, 8, logical_name="${namedField.name}")
+        write_buffer.write_byte_array(self.${helper.camelCaseToSnakeCase(namedField.name)}, logical_name="${namedField.name}")
                         <#elseif arrayField.type.elementTypeReference.isSimpleTypeReference()>
         write_buffer.write_simple_array(self.${helper.camelCaseToSnakeCase(namedField.name)}, ${helper.getDataWriterCall(arrayField.type.elementTypeReference, namedField.name)}, logical_name="${namedField.name}")
                         <#else>
@@ -369,12 +369,12 @@ class ${type.name}<#if type.isDiscriminatedParentTypeDefinition()></#if>(<#if ty
         if self.${helper.camelCaseToSnakeCase(arrayField.name)} is not None:
         <#if arrayElementTypeReference.isSimpleTypeReference()>
             <#assign simpleTypeReference = arrayElementTypeReference.asSimpleTypeReference().orElseThrow()>
-            length_in_bits += ${simpleTypeReference.sizeInBits} * self.${helper.camelCaseToSnakeCase(arrayField.name)}.<#if arrayElementTypeReference.isByteBased()>length<#else>size()</#if>
+            length_in_bits += ${simpleTypeReference.sizeInBits} * len(self.${helper.camelCaseToSnakeCase(arrayField.name)})
         <#elseif arrayField.isCountArrayField()>
             i: int = 0
             <#assign nonSimpleTypeReference = arrayElementTypeReference.asNonSimpleTypeReference().orElseThrow()>
             for element in self.${helper.camelCaseToSnakeCase(arrayField.name)}:
-                last: bool = ++i >= self.${helper.camelCaseToSnakeCase(arrayField.name)}.size()
+                last: bool = ++i >= len(self.${helper.camelCaseToSnakeCase(arrayField.name)})
                 length_in_bits += element.get_length_in_bits()
 
         <#else>
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/DataItem.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/DataItem.py
index ddbc20e5c2..58f87c19d6 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/DataItem.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/DataItem.py
@@ -99,15 +99,15 @@ class DataItem:
         if EvaluationHelper.equals(data_type, ModbusDataType.get_byte()):  # List
             # Array field (value)
             # Count array
-            if c_int32(numberOfValues) * c_int32(c_int32(8)) > Integer.MAX_VALUE:
+            if numberOfValues * c_int32(8) > Integer.MAX_VALUE:
                 raise ParseException(
                     "Array count of "
-                    + (c_int32(numberOfValues) * c_int32(c_int32(8)))
+                    + (numberOfValues * c_int32(8))
                     + " exceeds the maximum allowed count of "
                     + Integer.MAX_VALUE
                 )
 
-            item_count: int = int(c_int32(numberOfValues) * c_int32(c_int32(8)))
+            item_count: int = int(numberOfValues * c_int32(8))
             value: List[PlcValue] = []
             for cur_item in range(item_count):
                 value.append(PlcBOOL(c_bool(read_buffer.readBit(""))))
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusAsciiADU.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusAsciiADU.py
index 8a06bc3a2d..2a478ce666 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusAsciiADU.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusAsciiADU.py
@@ -88,9 +88,7 @@ class ModbusAsciiADU(PlcMessage, ModbusADU):
         cur_pos: int = 0
 
         address: c_uint8 = read_simple_field(
-            "address",
-            read_unsigned_short(read_buffer, 8),
-            WithOption.WithByteOrder(get_bi_g__endian()),
+            "address", read_unsigned_short, WithOption.WithByteOrder(get_bi_g__endian())
         )
 
         pdu: ModbusPDU = read_simple_field(
@@ -103,7 +101,7 @@ class ModbusAsciiADU(PlcMessage, ModbusADU):
 
         crc: c_uint8 = read_checksum_field(
             "crc",
-            read_unsigned_short(read_buffer, 8),
+            read_unsigned_short,
             (c_uint8)(ascii_lrc_check(address, pdu)),
             WithOption.WithByteOrder(get_bi_g__endian()),
         )
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusConstants.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusConstants.py
index 5d35fc9fa9..a007c12c9f 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusConstants.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusConstants.py
@@ -66,7 +66,7 @@ class ModbusConstants(PlcMessage):
 
         modbus_tcp_default_port: c_uint16 = read_const_field(
             "modbusTcpDefaultPort",
-            read_unsigned_int(read_buffer, 16),
+            read_unsigned_int,
             ModbusConstants.MODBUSTCPDEFAULTPORT,
         )
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusDeviceInformationObject.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusDeviceInformationObject.py
index 259271e9c5..91d2cd9ddb 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusDeviceInformationObject.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusDeviceInformationObject.py
@@ -47,7 +47,7 @@ class ModbusDeviceInformationObject(PlcMessage):
         write_buffer.write_unsigned_byte(object_length, logical_name="objectLength")
 
         # Array Field (data)
-        write_buffer.write_byte_array(self.data, 8, logical_name="data")
+        write_buffer.write_byte_array(self.data, logical_name="data")
 
         write_buffer.pop_context("ModbusDeviceInformationObject")
 
@@ -66,7 +66,7 @@ class ModbusDeviceInformationObject(PlcMessage):
 
         # Array field
         if self.data is not None:
-            length_in_bits += 8 * self.data.length
+            length_in_bits += 8 * len(self.data)
 
         return length_in_bits
 
@@ -79,12 +79,10 @@ class ModbusDeviceInformationObject(PlcMessage):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        object_id: c_uint8 = read_simple_field(
-            "objectId", read_unsigned_short(read_buffer, 8)
-        )
+        object_id: c_uint8 = read_simple_field("objectId", read_unsigned_short)
 
         object_length: c_uint8 = read_implicit_field(
-            "objectLength", read_unsigned_short(read_buffer, 8)
+            "objectLength", read_unsigned_short
         )
 
         data: List[c_byte] = read_buffer.read_byte_array("data", int(objectLength))
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDU.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDU.py
index 3f4e929ee4..37f45d9c28 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDU.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDU.py
@@ -112,150 +112,148 @@ class ModbusPDU(ABC, PlcMessage):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        error_flag: c_bool = read_discriminator_field(
-            "errorFlag", read_boolean(read_buffer)
-        )
+        error_flag: c_bool = read_discriminator_field("errorFlag", read_boolean)
 
         function_flag: c_uint8 = read_discriminator_field(
-            "functionFlag", read_unsigned_short(read_buffer, 7)
+            "functionFlag", read_unsigned_short
         )
 
         # Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
         builder: ModbusPDUBuilder = None
-        if EvaluationHelper.equals(errorFlag, c_bool(c_bool(true))):
+        if EvaluationHelper.equals(errorFlag, c_bool(True)):
             builder = ModbusPDUError.staticParseBuilder(read_buffer, response)
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x02))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadDiscreteInputsRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x02))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadDiscreteInputsResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x01))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadCoilsRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x01))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadCoilsResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x05))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUWriteSingleCoilRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x05))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUWriteSingleCoilResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0F))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUWriteMultipleCoilsRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0F))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUWriteMultipleCoilsResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x04))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadInputRegistersRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x04))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadInputRegistersResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x03))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadHoldingRegistersRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x03))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadHoldingRegistersResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x06))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUWriteSingleRegisterRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x06))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUWriteSingleRegisterResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x10))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUWriteMultipleHoldingRegistersRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x10))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUWriteMultipleHoldingRegistersResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x17))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = (
                 ModbusPDUReadWriteMultipleHoldingRegistersRequest.staticParseBuilder(
@@ -263,9 +261,9 @@ class ModbusPDU(ABC, PlcMessage):
                 )
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x17))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = (
                 ModbusPDUReadWriteMultipleHoldingRegistersResponse.staticParseBuilder(
@@ -273,161 +271,161 @@ class ModbusPDU(ABC, PlcMessage):
                 )
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x16))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUMaskWriteHoldingRegisterRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x16))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUMaskWriteHoldingRegisterResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x18))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadFifoQueueRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x18))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadFifoQueueResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x14))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadFileRecordRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x14))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadFileRecordResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x15))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUWriteFileRecordRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x15))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUWriteFileRecordResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x07))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadExceptionStatusRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x07))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadExceptionStatusResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x08))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUDiagnosticRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x08))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUDiagnosticResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0B))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUGetComEventCounterRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0B))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUGetComEventCounterResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0C))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUGetComEventLogRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x0C))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUGetComEventLogResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x11))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReportServerIdRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x11))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReportServerIdResponse.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x2B))
-            and EvaluationHelper.equals(response, c_bool(c_bool(false)))
+            and EvaluationHelper.equals(response, c_bool(False))
         ):
             builder = ModbusPDUReadDeviceIdentificationRequest.staticParseBuilder(
                 read_buffer, response
             )
         if (
-            EvaluationHelper.equals(errorFlag, c_bool(c_bool(false)))
+            EvaluationHelper.equals(errorFlag, c_bool(False))
             and EvaluationHelper.equals(functionFlag, c_uint8(0x2B))
-            and EvaluationHelper.equals(response, c_bool(c_bool(true)))
+            and EvaluationHelper.equals(response, c_bool(True))
         ):
             builder = ModbusPDUReadDeviceIdentificationResponse.staticParseBuilder(
                 read_buffer, response
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticRequest.py
index c64daebf0b..33405fb7fe 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUDiagnosticRequest(PlcMessage, ModbusPDU):
     sub_function: c_uint16
     data: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x08
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUDiagnosticRequest(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        sub_function: c_uint16 = read_simple_field(
-            "subFunction", read_unsigned_int(read_buffer, 16)
-        )
+        sub_function: c_uint16 = read_simple_field("subFunction", read_unsigned_int)
 
-        data: c_uint16 = read_simple_field("data", read_unsigned_int(read_buffer, 16))
+        data: c_uint16 = read_simple_field("data", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUDiagnosticRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticResponse.py
index ae00e09287..17218f27f7 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUDiagnosticResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUDiagnosticResponse(PlcMessage, ModbusPDU):
     sub_function: c_uint16
     data: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x08
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUDiagnosticResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        sub_function: c_uint16 = read_simple_field(
-            "subFunction", read_unsigned_int(read_buffer, 16)
-        )
+        sub_function: c_uint16 = read_simple_field("subFunction", read_unsigned_int)
 
-        data: c_uint16 = read_simple_field("data", read_unsigned_int(read_buffer, 16))
+        data: c_uint16 = read_simple_field("data", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUDiagnosticResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUError.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUError.py
index 0bc22be06f..f16f2dc7d4 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUError.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUError.py
@@ -33,7 +33,7 @@ import math
 class ModbusPDUError(PlcMessage, ModbusPDU):
     exception_code: ModbusErrorCode
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(true)
+    error_flag: c_bool = True
     function_flag: c_uint8 = 0
     response: c_bool = False
 
@@ -72,9 +72,7 @@ class ModbusPDUError(PlcMessage, ModbusPDU):
         exception_code: ModbusErrorCode = read_enum_field(
             "exceptionCode",
             "ModbusErrorCode",
-            DataReaderEnumDefault(
-                ModbusErrorCode.enumForValue, read_unsigned_short(read_buffer, 8)
-            ),
+            DataReaderEnumDefault(ModbusErrorCode.enumForValue, read_unsigned_short),
         )
 
         read_buffer.close_context("ModbusPDUError")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterRequest.py
index ebd135c89c..7969c246f3 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterRequest.py
@@ -31,9 +31,9 @@ import math
 @dataclass
 class ModbusPDUGetComEventCounterRequest(PlcMessage, ModbusPDU):
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0B
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterResponse.py
index c9bb72146c..f6de691a25 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventCounterResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUGetComEventCounterResponse(PlcMessage, ModbusPDU):
     status: c_uint16
     event_count: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0B
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -74,13 +74,9 @@ class ModbusPDUGetComEventCounterResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        status: c_uint16 = read_simple_field(
-            "status", read_unsigned_int(read_buffer, 16)
-        )
+        status: c_uint16 = read_simple_field("status", read_unsigned_int)
 
-        event_count: c_uint16 = read_simple_field(
-            "eventCount", read_unsigned_int(read_buffer, 16)
-        )
+        event_count: c_uint16 = read_simple_field("eventCount", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUGetComEventCounterResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogRequest.py
index 6d641496d2..b7a2775dfb 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogRequest.py
@@ -31,9 +31,9 @@ import math
 @dataclass
 class ModbusPDUGetComEventLogRequest(PlcMessage, ModbusPDU):
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0C
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogResponse.py
index cd8d6286c5..ae854e58ef 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUGetComEventLogResponse.py
@@ -39,9 +39,9 @@ class ModbusPDUGetComEventLogResponse(PlcMessage, ModbusPDU):
     message_count: c_uint16
     events: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0C
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -51,7 +51,7 @@ class ModbusPDUGetComEventLogResponse(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUGetComEventLogResponse")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint8 = c_uint8(c_uint8(len(self.events))) + c_uint8(c_uint8(6))
+        byte_count: c_uint8 = c_uint8(len(self.events)) + c_uint8(6)
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Simple Field (status)
@@ -66,7 +66,7 @@ class ModbusPDUGetComEventLogResponse(PlcMessage, ModbusPDU):
         )
 
         # Array Field (events)
-        write_buffer.write_byte_array(self.events, 8, logical_name="events")
+        write_buffer.write_byte_array(self.events, logical_name="events")
 
         write_buffer.pop_context("ModbusPDUGetComEventLogResponse")
 
@@ -91,7 +91,7 @@ class ModbusPDUGetComEventLogResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.events is not None:
-            length_in_bits += 8 * self.events.length
+            length_in_bits += 8 * len(self.events)
 
         return length_in_bits
 
@@ -101,24 +101,16 @@ class ModbusPDUGetComEventLogResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
-        status: c_uint16 = read_simple_field(
-            "status", read_unsigned_int(read_buffer, 16)
-        )
+        status: c_uint16 = read_simple_field("status", read_unsigned_int)
 
-        event_count: c_uint16 = read_simple_field(
-            "eventCount", read_unsigned_int(read_buffer, 16)
-        )
+        event_count: c_uint16 = read_simple_field("eventCount", read_unsigned_int)
 
-        message_count: c_uint16 = read_simple_field(
-            "messageCount", read_unsigned_int(read_buffer, 16)
-        )
+        message_count: c_uint16 = read_simple_field("messageCount", read_unsigned_int)
 
         events: List[c_byte] = read_buffer.read_byte_array(
-            "events", int(c_int32(byteCount) - c_int32(c_int32(6)))
+            "events", int(byteCount - c_int32(6))
         )
 
         read_buffer.close_context("ModbusPDUGetComEventLogResponse")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.py
index 51137cb412..346d1b3372 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.py
@@ -35,9 +35,9 @@ class ModbusPDUMaskWriteHoldingRegisterRequest(PlcMessage, ModbusPDU):
     and_mask: c_uint16
     or_mask: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x16
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -84,16 +84,12 @@ class ModbusPDUMaskWriteHoldingRegisterRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         reference_address: c_uint16 = read_simple_field(
-            "referenceAddress", read_unsigned_int(read_buffer, 16)
+            "referenceAddress", read_unsigned_int
         )
 
-        and_mask: c_uint16 = read_simple_field(
-            "andMask", read_unsigned_int(read_buffer, 16)
-        )
+        and_mask: c_uint16 = read_simple_field("andMask", read_unsigned_int)
 
-        or_mask: c_uint16 = read_simple_field(
-            "orMask", read_unsigned_int(read_buffer, 16)
-        )
+        or_mask: c_uint16 = read_simple_field("orMask", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUMaskWriteHoldingRegisterRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.py
index b67c7e9946..6a3430e395 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.py
@@ -35,9 +35,9 @@ class ModbusPDUMaskWriteHoldingRegisterResponse(PlcMessage, ModbusPDU):
     and_mask: c_uint16
     or_mask: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x16
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -84,16 +84,12 @@ class ModbusPDUMaskWriteHoldingRegisterResponse(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         reference_address: c_uint16 = read_simple_field(
-            "referenceAddress", read_unsigned_int(read_buffer, 16)
+            "referenceAddress", read_unsigned_int
         )
 
-        and_mask: c_uint16 = read_simple_field(
-            "andMask", read_unsigned_int(read_buffer, 16)
-        )
+        and_mask: c_uint16 = read_simple_field("andMask", read_unsigned_int)
 
-        or_mask: c_uint16 = read_simple_field(
-            "orMask", read_unsigned_int(read_buffer, 16)
-        )
+        or_mask: c_uint16 = read_simple_field("orMask", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUMaskWriteHoldingRegisterResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsRequest.py
index 444b90bedc..cfbada8254 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUReadCoilsRequest(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x01
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUReadCoilsRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUReadCoilsRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsResponse.py
index 0ccdd3a6f0..5ce3b8fec7 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadCoilsResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadCoilsResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x01
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReadCoilsResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadCoilsResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReadCoilsResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReadCoilsResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.py
index 7f2be71e4b..aa32b5e194 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.py
@@ -37,9 +37,9 @@ class ModbusPDUReadDeviceIdentificationRequest(PlcMessage, ModbusPDU):
     object_id: c_uint8
     MEITYPE: c_uint8 = 0x0E
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x2B
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -89,7 +89,7 @@ class ModbusPDUReadDeviceIdentificationRequest(PlcMessage, ModbusPDU):
 
         mei_type: c_uint8 = read_const_field(
             "meiType",
-            read_unsigned_short(read_buffer, 8),
+            read_unsigned_short,
             ModbusPDUReadDeviceIdentificationRequest.MEITYPE,
         )
 
@@ -97,14 +97,11 @@ class ModbusPDUReadDeviceIdentificationRequest(PlcMessage, ModbusPDU):
             "level",
             "ModbusDeviceInformationLevel",
             DataReaderEnumDefault(
-                ModbusDeviceInformationLevel.enumForValue,
-                read_unsigned_short(read_buffer, 8),
+                ModbusDeviceInformationLevel.enumForValue, read_unsigned_short
             ),
         )
 
-        object_id: c_uint8 = read_simple_field(
-            "objectId", read_unsigned_short(read_buffer, 8)
-        )
+        object_id: c_uint8 = read_simple_field("objectId", read_unsigned_short)
 
         read_buffer.close_context("ModbusPDUReadDeviceIdentificationRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.py
index 4a35f54d77..1afcab8b39 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.py
@@ -51,9 +51,9 @@ class ModbusPDUReadDeviceIdentificationResponse(PlcMessage, ModbusPDU):
     objects: List[ModbusDeviceInformationObject]
     MEITYPE: c_uint8 = 0x0E
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x2B
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -139,7 +139,7 @@ class ModbusPDUReadDeviceIdentificationResponse(PlcMessage, ModbusPDU):
         if self.objects is not None:
             i: int = 0
             for element in self.objects:
-                last: bool = ++i >= self.objects.size()
+                last: bool = ++i >= len(self.objects)
                 length_in_bits += element.get_length_in_bits()
 
         return length_in_bits
@@ -152,7 +152,7 @@ class ModbusPDUReadDeviceIdentificationResponse(PlcMessage, ModbusPDU):
 
         mei_type: c_uint8 = read_const_field(
             "meiType",
-            read_unsigned_short(read_buffer, 8),
+            read_unsigned_short,
             ModbusPDUReadDeviceIdentificationResponse.MEITYPE,
         )
 
@@ -160,21 +160,17 @@ class ModbusPDUReadDeviceIdentificationResponse(PlcMessage, ModbusPDU):
             "level",
             "ModbusDeviceInformationLevel",
             DataReaderEnumDefault(
-                ModbusDeviceInformationLevel.enumForValue,
-                read_unsigned_short(read_buffer, 8),
+                ModbusDeviceInformationLevel.enumForValue, read_unsigned_short
             ),
         )
 
-        individual_access: c_bool = read_simple_field(
-            "individualAccess", read_boolean(read_buffer)
-        )
+        individual_access: c_bool = read_simple_field("individualAccess", read_boolean)
 
         conformity_level: ModbusDeviceInformationConformityLevel = read_enum_field(
             "conformityLevel",
             "ModbusDeviceInformationConformityLevel",
             DataReaderEnumDefault(
-                ModbusDeviceInformationConformityLevel.enumForValue,
-                read_unsigned_short(read_buffer, 7),
+                ModbusDeviceInformationConformityLevel.enumForValue, read_unsigned_short
             ),
         )
 
@@ -182,17 +178,14 @@ class ModbusPDUReadDeviceIdentificationResponse(PlcMessage, ModbusPDU):
             "moreFollows",
             "ModbusDeviceInformationMoreFollows",
             DataReaderEnumDefault(
-                ModbusDeviceInformationMoreFollows.enumForValue,
-                read_unsigned_short(read_buffer, 8),
+                ModbusDeviceInformationMoreFollows.enumForValue, read_unsigned_short
             ),
         )
 
-        next_object_id: c_uint8 = read_simple_field(
-            "nextObjectId", read_unsigned_short(read_buffer, 8)
-        )
+        next_object_id: c_uint8 = read_simple_field("nextObjectId", read_unsigned_short)
 
         number_of_objects: c_uint8 = read_implicit_field(
-            "numberOfObjects", read_unsigned_short(read_buffer, 8)
+            "numberOfObjects", read_unsigned_short
         )
 
         objects: List[ModbusDeviceInformationObject] = read_count_array_field(
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.py
index 97b20800b8..917bb03c7f 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUReadDiscreteInputsRequest(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x02
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUReadDiscreteInputsRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUReadDiscreteInputsRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.py
index afa39fcc4e..fe3492ffdd 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadDiscreteInputsResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x02
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReadDiscreteInputsResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadDiscreteInputsResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReadDiscreteInputsResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReadDiscreteInputsResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.py
index be5fd8d8d2..9880d2c998 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.py
@@ -31,9 +31,9 @@ import math
 @dataclass
 class ModbusPDUReadExceptionStatusRequest(PlcMessage, ModbusPDU):
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x07
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.py
index 7e66a893f9..4882eb8c5e 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.py
@@ -32,9 +32,9 @@ import math
 class ModbusPDUReadExceptionStatusResponse(PlcMessage, ModbusPDU):
     value: c_uint8
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x07
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -66,7 +66,7 @@ class ModbusPDUReadExceptionStatusResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        value: c_uint8 = read_simple_field("value", read_unsigned_short(read_buffer, 8))
+        value: c_uint8 = read_simple_field("value", read_unsigned_short)
 
         read_buffer.close_context("ModbusPDUReadExceptionStatusResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueRequest.py
index 1a5dd76b9d..b0bfdb5b0b 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueRequest.py
@@ -33,9 +33,9 @@ import math
 class ModbusPDUReadFifoQueueRequest(PlcMessage, ModbusPDU):
     fifo_pointer_address: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x18
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -70,7 +70,7 @@ class ModbusPDUReadFifoQueueRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         fifo_pointer_address: c_uint16 = read_simple_field(
-            "fifoPointerAddress", read_unsigned_int(read_buffer, 16)
+            "fifoPointerAddress", read_unsigned_int
         )
 
         read_buffer.close_context("ModbusPDUReadFifoQueueRequest")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueResponse.py
index cfa769833e..febb4aacf2 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFifoQueueResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadFifoQueueResponse(PlcMessage, ModbusPDU):
     fifo_value: List[c_uint16]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x18
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -46,15 +46,15 @@ class ModbusPDUReadFifoQueueResponse(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUReadFifoQueueResponse")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint16 = c_uint16(
-            (c_uint16(c_uint16(len(self.fifo_value))) * c_uint16(c_uint16(2)))
-        ) + c_uint16(c_uint16(2))
+        byte_count: c_uint16 = (
+            c_uint16(len(self.fifo_value)) * c_uint16(2)
+        ) + c_uint16(2)
         write_buffer.write_unsigned_short(byte_count, logical_name="byteCount")
 
         # Implicit Field (fifo_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        fifo_count: c_uint16 = c_uint16(
-            (c_uint16(c_uint16(len(self.fifo_value))) * c_uint16(c_uint16(2)))
-        ) / c_uint16(c_uint16(2))
+        fifo_count: c_uint16 = (
+            c_uint16(len(self.fifo_value)) * c_uint16(2)
+        ) / c_uint16(2)
         write_buffer.write_unsigned_short(fifo_count, logical_name="fifoCount")
 
         # Array Field (fifoValue)
@@ -79,7 +79,7 @@ class ModbusPDUReadFifoQueueResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.fifo_value is not None:
-            length_in_bits += 16 * self.fifo_value.size()
+            length_in_bits += 16 * len(self.fifo_value)
 
         return length_in_bits
 
@@ -89,16 +89,12 @@ class ModbusPDUReadFifoQueueResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint16 = read_implicit_field(
-            "byteCount", read_unsigned_int(read_buffer, 16)
-        )
+        byte_count: c_uint16 = read_implicit_field("byteCount", read_unsigned_int)
 
-        fifo_count: c_uint16 = read_implicit_field(
-            "fifoCount", read_unsigned_int(read_buffer, 16)
-        )
+        fifo_count: c_uint16 = read_implicit_field("fifoCount", read_unsigned_int)
 
         fifo_value: List[c_uint16] = read_count_array_field(
-            "fifoValue", read_unsigned_int(read_buffer, 16), fifo_count
+            "fifoValue", read_unsigned_int, fifo_count
         )
 
         read_buffer.close_context("ModbusPDUReadFifoQueueResponse")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequest.py
index 99850b8f93..5c82c4ca22 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequest.py
@@ -28,6 +28,7 @@ from plc4py.protocols.modbus.readwrite.ModbusPDUReadFileRecordRequestItem import
     ModbusPDUReadFileRecordRequestItem,
 )
 from plc4py.spi.generation.WriteBuffer import WriteBuffer
+from sys import getsizeof
 from typing import List
 import math
 
@@ -36,9 +37,9 @@ import math
 class ModbusPDUReadFileRecordRequest(PlcMessage, ModbusPDU):
     items: List[ModbusPDUReadFileRecordRequestItem]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x14
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -48,7 +49,7 @@ class ModbusPDUReadFileRecordRequest(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUReadFileRecordRequest")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint8 = c_uint8(itemsArraySizeInBytes(self.items))
+        byte_count: c_uint8 = c_uint8(getsizeof(self.items))
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (items)
@@ -79,9 +80,7 @@ class ModbusPDUReadFileRecordRequest(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         items: List[ModbusPDUReadFileRecordRequestItem] = read_length_array_field(
             "items",
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.py
index d7b322ba45..5b4bd6870d 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.py
@@ -91,20 +91,14 @@ class ModbusPDUReadFileRecordRequestItem(PlcMessage):
         cur_pos: int = 0
 
         reference_type: c_uint8 = read_simple_field(
-            "referenceType", read_unsigned_short(read_buffer, 8)
+            "referenceType", read_unsigned_short
         )
 
-        file_number: c_uint16 = read_simple_field(
-            "fileNumber", read_unsigned_int(read_buffer, 16)
-        )
+        file_number: c_uint16 = read_simple_field("fileNumber", read_unsigned_int)
 
-        record_number: c_uint16 = read_simple_field(
-            "recordNumber", read_unsigned_int(read_buffer, 16)
-        )
+        record_number: c_uint16 = read_simple_field("recordNumber", read_unsigned_int)
 
-        record_length: c_uint16 = read_simple_field(
-            "recordLength", read_unsigned_int(read_buffer, 16)
-        )
+        record_length: c_uint16 = read_simple_field("recordLength", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUReadFileRecordRequestItem")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponse.py
index d00ce01c9c..a2694e04ee 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponse.py
@@ -28,6 +28,7 @@ from plc4py.protocols.modbus.readwrite.ModbusPDUReadFileRecordResponseItem impor
     ModbusPDUReadFileRecordResponseItem,
 )
 from plc4py.spi.generation.WriteBuffer import WriteBuffer
+from sys import getsizeof
 from typing import List
 import math
 
@@ -36,9 +37,9 @@ import math
 class ModbusPDUReadFileRecordResponse(PlcMessage, ModbusPDU):
     items: List[ModbusPDUReadFileRecordResponseItem]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x14
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -48,7 +49,7 @@ class ModbusPDUReadFileRecordResponse(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUReadFileRecordResponse")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint8 = c_uint8(itemsArraySizeInBytes(self.items))
+        byte_count: c_uint8 = c_uint8(getsizeof(self.items))
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (items)
@@ -79,9 +80,7 @@ class ModbusPDUReadFileRecordResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         items: List[ModbusPDUReadFileRecordResponseItem] = read_length_array_field(
             "items",
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.py
index 63dc78d3d0..7ac3ee9a0e 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.py
@@ -41,7 +41,7 @@ class ModbusPDUReadFileRecordResponseItem(PlcMessage):
         write_buffer.push_context("ModbusPDUReadFileRecordResponseItem")
 
         # Implicit Field (data_length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        data_length: c_uint8 = c_uint8(c_uint8(len(self.data))) + c_uint8(c_uint8(1))
+        data_length: c_uint8 = c_uint8(len(self.data)) + c_uint8(1)
         write_buffer.write_unsigned_byte(data_length, logical_name="dataLength")
 
         # Simple Field (referenceType)
@@ -50,7 +50,7 @@ class ModbusPDUReadFileRecordResponseItem(PlcMessage):
         )
 
         # Array Field (data)
-        write_buffer.write_byte_array(self.data, 8, logical_name="data")
+        write_buffer.write_byte_array(self.data, logical_name="data")
 
         write_buffer.pop_context("ModbusPDUReadFileRecordResponseItem")
 
@@ -69,7 +69,7 @@ class ModbusPDUReadFileRecordResponseItem(PlcMessage):
 
         # Array field
         if self.data is not None:
-            length_in_bits += 8 * self.data.length
+            length_in_bits += 8 * len(self.data)
 
         return length_in_bits
 
@@ -82,16 +82,14 @@ class ModbusPDUReadFileRecordResponseItem(PlcMessage):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        data_length: c_uint8 = read_implicit_field(
-            "dataLength", read_unsigned_short(read_buffer, 8)
-        )
+        data_length: c_uint8 = read_implicit_field("dataLength", read_unsigned_short)
 
         reference_type: c_uint8 = read_simple_field(
-            "referenceType", read_unsigned_short(read_buffer, 8)
+            "referenceType", read_unsigned_short
         )
 
         data: List[c_byte] = read_buffer.read_byte_array(
-            "data", int(c_int32(dataLength) - c_int32(c_int32(1)))
+            "data", int(dataLength - c_int32(1))
         )
 
         read_buffer.close_context("ModbusPDUReadFileRecordResponseItem")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.py
index d647466eb1..2755637cf2 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUReadHoldingRegistersRequest(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x03
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUReadHoldingRegistersRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUReadHoldingRegistersRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.py
index 2f34aa9447..97f4481caf 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadHoldingRegistersResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x03
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReadHoldingRegistersResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadHoldingRegistersResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReadHoldingRegistersResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReadHoldingRegistersResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersRequest.py
index f417da4e02..aeb129918e 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUReadInputRegistersRequest(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x04
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUReadInputRegistersRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUReadInputRegistersRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersResponse.py
index b540e08136..dd58ee6093 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadInputRegistersResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadInputRegistersResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x04
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReadInputRegistersResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadInputRegistersResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReadInputRegistersResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReadInputRegistersResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.py
index ba29db1fd0..5381ddd5a7 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.py
@@ -39,9 +39,9 @@ class ModbusPDUReadWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
     write_quantity: c_uint16
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x17
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -75,7 +75,7 @@ class ModbusPDUReadWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadWriteMultipleHoldingRegistersRequest")
 
@@ -103,7 +103,7 @@ class ModbusPDUReadWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -114,24 +114,18 @@ class ModbusPDUReadWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         read_starting_address: c_uint16 = read_simple_field(
-            "readStartingAddress", read_unsigned_int(read_buffer, 16)
+            "readStartingAddress", read_unsigned_int
         )
 
-        read_quantity: c_uint16 = read_simple_field(
-            "readQuantity", read_unsigned_int(read_buffer, 16)
-        )
+        read_quantity: c_uint16 = read_simple_field("readQuantity", read_unsigned_int)
 
         write_starting_address: c_uint16 = read_simple_field(
-            "writeStartingAddress", read_unsigned_int(read_buffer, 16)
+            "writeStartingAddress", read_unsigned_int
         )
 
-        write_quantity: c_uint16 = read_simple_field(
-            "writeQuantity", read_unsigned_int(read_buffer, 16)
-        )
+        write_quantity: c_uint16 = read_simple_field("writeQuantity", read_unsigned_int)
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.py
index 249c0da70b..52e74ca916 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReadWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x17
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReadWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReadWriteMultipleHoldingRegistersResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReadWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReadWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdRequest.py
index fd8e32be31..c55d8a9609 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdRequest.py
@@ -31,9 +31,9 @@ import math
 @dataclass
 class ModbusPDUReportServerIdRequest(PlcMessage, ModbusPDU):
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x11
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdResponse.py
index a2087de9a9..447a3bbad2 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUReportServerIdResponse.py
@@ -34,9 +34,9 @@ import math
 class ModbusPDUReportServerIdResponse(PlcMessage, ModbusPDU):
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x11
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -50,7 +50,7 @@ class ModbusPDUReportServerIdResponse(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUReportServerIdResponse")
 
@@ -66,7 +66,7 @@ class ModbusPDUReportServerIdResponse(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -76,9 +76,7 @@ class ModbusPDUReportServerIdResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequest.py
index 5b97b0ea39..2a94562625 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequest.py
@@ -28,6 +28,7 @@ from plc4py.protocols.modbus.readwrite.ModbusPDUWriteFileRecordRequestItem impor
     ModbusPDUWriteFileRecordRequestItem,
 )
 from plc4py.spi.generation.WriteBuffer import WriteBuffer
+from sys import getsizeof
 from typing import List
 import math
 
@@ -36,9 +37,9 @@ import math
 class ModbusPDUWriteFileRecordRequest(PlcMessage, ModbusPDU):
     items: List[ModbusPDUWriteFileRecordRequestItem]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x15
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -48,7 +49,7 @@ class ModbusPDUWriteFileRecordRequest(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUWriteFileRecordRequest")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint8 = c_uint8(itemsArraySizeInBytes(self.items))
+        byte_count: c_uint8 = c_uint8(getsizeof(self.items))
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (items)
@@ -79,9 +80,7 @@ class ModbusPDUWriteFileRecordRequest(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         items: List[ModbusPDUWriteFileRecordRequestItem] = read_length_array_field(
             "items",
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.py
index 9f900ad63d..b6d324a65f 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.py
@@ -57,13 +57,11 @@ class ModbusPDUWriteFileRecordRequestItem(PlcMessage):
         )
 
         # Implicit Field (record_length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        record_length: c_uint16 = c_uint16(c_uint16(len(self.record_data))) / c_uint16(
-            c_uint16(2)
-        )
+        record_length: c_uint16 = c_uint16(len(self.record_data)) / c_uint16(2)
         write_buffer.write_unsigned_short(record_length, logical_name="recordLength")
 
         # Array Field (recordData)
-        write_buffer.write_byte_array(self.record_data, 8, logical_name="recordData")
+        write_buffer.write_byte_array(self.record_data, logical_name="recordData")
 
         write_buffer.pop_context("ModbusPDUWriteFileRecordRequestItem")
 
@@ -88,7 +86,7 @@ class ModbusPDUWriteFileRecordRequestItem(PlcMessage):
 
         # Array field
         if self.record_data is not None:
-            length_in_bits += 8 * self.record_data.length
+            length_in_bits += 8 * len(self.record_data)
 
         return length_in_bits
 
@@ -102,23 +100,17 @@ class ModbusPDUWriteFileRecordRequestItem(PlcMessage):
         cur_pos: int = 0
 
         reference_type: c_uint8 = read_simple_field(
-            "referenceType", read_unsigned_short(read_buffer, 8)
+            "referenceType", read_unsigned_short
         )
 
-        file_number: c_uint16 = read_simple_field(
-            "fileNumber", read_unsigned_int(read_buffer, 16)
-        )
+        file_number: c_uint16 = read_simple_field("fileNumber", read_unsigned_int)
 
-        record_number: c_uint16 = read_simple_field(
-            "recordNumber", read_unsigned_int(read_buffer, 16)
-        )
+        record_number: c_uint16 = read_simple_field("recordNumber", read_unsigned_int)
 
-        record_length: c_uint16 = read_implicit_field(
-            "recordLength", read_unsigned_int(read_buffer, 16)
-        )
+        record_length: c_uint16 = read_implicit_field("recordLength", read_unsigned_int)
 
         record_data: List[c_byte] = read_buffer.read_byte_array(
-            "recordData", int(c_int32(recordLength) * c_int32(c_int32(2)))
+            "recordData", int(recordLength * c_int32(2))
         )
 
         read_buffer.close_context("ModbusPDUWriteFileRecordRequestItem")
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponse.py
index 0b6c5b10fd..4aa64c8e21 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponse.py
@@ -28,6 +28,7 @@ from plc4py.protocols.modbus.readwrite.ModbusPDUWriteFileRecordResponseItem impo
     ModbusPDUWriteFileRecordResponseItem,
 )
 from plc4py.spi.generation.WriteBuffer import WriteBuffer
+from sys import getsizeof
 from typing import List
 import math
 
@@ -36,9 +37,9 @@ import math
 class ModbusPDUWriteFileRecordResponse(PlcMessage, ModbusPDU):
     items: List[ModbusPDUWriteFileRecordResponseItem]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x15
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -48,7 +49,7 @@ class ModbusPDUWriteFileRecordResponse(PlcMessage, ModbusPDU):
         write_buffer.push_context("ModbusPDUWriteFileRecordResponse")
 
         # Implicit Field (byte_count) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        byte_count: c_uint8 = c_uint8(itemsArraySizeInBytes(self.items))
+        byte_count: c_uint8 = c_uint8(getsizeof(self.items))
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (items)
@@ -79,9 +80,7 @@ class ModbusPDUWriteFileRecordResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         items: List[ModbusPDUWriteFileRecordResponseItem] = read_length_array_field(
             "items",
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.py
index c4f92aefb7..58ef6c91a1 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.py
@@ -56,13 +56,11 @@ class ModbusPDUWriteFileRecordResponseItem(PlcMessage):
         )
 
         # Implicit Field (record_length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        record_length: c_uint16 = c_uint16(c_uint16(len(self.record_data))) / c_uint16(
-            c_uint16(2)
-        )
+        record_length: c_uint16 = c_uint16(len(self.record_data)) / c_uint16(2)
         write_buffer.write_unsigned_short(record_length, logical_name="recordLength")
 
         # Array Field (recordData)
-        write_buffer.write_byte_array(self.record_data, 8, logical_name="recordData")
+        write_buffer.write_byte_array(self.record_data, logical_name="recordData")
 
         write_buffer.pop_context("ModbusPDUWriteFileRecordResponseItem")
 
@@ -87,7 +85,7 @@ class ModbusPDUWriteFileRecordResponseItem(PlcMessage):
 
         # Array field
         if self.record_data is not None:
-            length_in_bits += 8 * self.record_data.length
+            length_in_bits += 8 * len(self.record_data)
 
         return length_in_bits
 
@@ -101,20 +99,14 @@ class ModbusPDUWriteFileRecordResponseItem(PlcMessage):
         cur_pos: int = 0
 
         reference_type: c_uint8 = read_simple_field(
-            "referenceType", read_unsigned_short(read_buffer, 8)
+            "referenceType", read_unsigned_short
         )
 
-        file_number: c_uint16 = read_simple_field(
-            "fileNumber", read_unsigned_int(read_buffer, 16)
-        )
+        file_number: c_uint16 = read_simple_field("fileNumber", read_unsigned_int)
 
-        record_number: c_uint16 = read_simple_field(
-            "recordNumber", read_unsigned_int(read_buffer, 16)
-        )
+        record_number: c_uint16 = read_simple_field("recordNumber", read_unsigned_int)
 
-        record_length: c_uint16 = read_implicit_field(
-            "recordLength", read_unsigned_int(read_buffer, 16)
-        )
+        record_length: c_uint16 = read_implicit_field("recordLength", read_unsigned_int)
 
         record_data: List[c_byte] = read_buffer.read_byte_array(
             "recordData", int(recordLength)
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.py
index a57653364b..c3a3710d54 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.py
@@ -37,9 +37,9 @@ class ModbusPDUWriteMultipleCoilsRequest(PlcMessage, ModbusPDU):
     quantity: c_uint16
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0F
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -61,7 +61,7 @@ class ModbusPDUWriteMultipleCoilsRequest(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUWriteMultipleCoilsRequest")
 
@@ -83,7 +83,7 @@ class ModbusPDUWriteMultipleCoilsRequest(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -94,16 +94,12 @@ class ModbusPDUWriteMultipleCoilsRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.py
index 9575571c0a..9b39bd2c44 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteMultipleCoilsResponse(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x0F
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUWriteMultipleCoilsResponse(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteMultipleCoilsResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.py
index d8c827ce03..c4fd0147d3 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.py
@@ -37,9 +37,9 @@ class ModbusPDUWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
     quantity: c_uint16
     value: List[c_byte]
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x10
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -61,7 +61,7 @@ class ModbusPDUWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
         write_buffer.write_unsigned_byte(byte_count, logical_name="byteCount")
 
         # Array Field (value)
-        write_buffer.write_byte_array(self.value, 8, logical_name="value")
+        write_buffer.write_byte_array(self.value, logical_name="value")
 
         write_buffer.pop_context("ModbusPDUWriteMultipleHoldingRegistersRequest")
 
@@ -83,7 +83,7 @@ class ModbusPDUWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
 
         # Array field
         if self.value is not None:
-            length_in_bits += 8 * self.value.length
+            length_in_bits += 8 * len(self.value)
 
         return length_in_bits
 
@@ -94,16 +94,12 @@ class ModbusPDUWriteMultipleHoldingRegistersRequest(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
-        byte_count: c_uint8 = read_implicit_field(
-            "byteCount", read_unsigned_short(read_buffer, 8)
-        )
+        byte_count: c_uint8 = read_implicit_field("byteCount", read_unsigned_short)
 
         value: List[c_byte] = read_buffer.read_byte_array("value", int(byteCount))
 
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.py
index 4ea61b0482..a9b3c87a17 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
     starting_address: c_uint16
     quantity: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x10
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -77,12 +77,10 @@ class ModbusPDUWriteMultipleHoldingRegistersResponse(PlcMessage, ModbusPDU):
         cur_pos: int = 0
 
         starting_address: c_uint16 = read_simple_field(
-            "startingAddress", read_unsigned_int(read_buffer, 16)
+            "startingAddress", read_unsigned_int
         )
 
-        quantity: c_uint16 = read_simple_field(
-            "quantity", read_unsigned_int(read_buffer, 16)
-        )
+        quantity: c_uint16 = read_simple_field("quantity", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteMultipleHoldingRegistersResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.py
index 8ce893a370..a55665ed45 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteSingleCoilRequest(PlcMessage, ModbusPDU):
     address: c_uint16
     value: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x05
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUWriteSingleCoilRequest(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        address: c_uint16 = read_simple_field(
-            "address", read_unsigned_int(read_buffer, 16)
-        )
+        address: c_uint16 = read_simple_field("address", read_unsigned_int)
 
-        value: c_uint16 = read_simple_field("value", read_unsigned_int(read_buffer, 16))
+        value: c_uint16 = read_simple_field("value", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteSingleCoilRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.py
index d7d8728e1e..64a55d403e 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteSingleCoilResponse(PlcMessage, ModbusPDU):
     address: c_uint16
     value: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x05
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUWriteSingleCoilResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        address: c_uint16 = read_simple_field(
-            "address", read_unsigned_int(read_buffer, 16)
-        )
+        address: c_uint16 = read_simple_field("address", read_unsigned_int)
 
-        value: c_uint16 = read_simple_field("value", read_unsigned_int(read_buffer, 16))
+        value: c_uint16 = read_simple_field("value", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteSingleCoilResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.py
index c6e6276f39..1cc9cc5fa8 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteSingleRegisterRequest(PlcMessage, ModbusPDU):
     address: c_uint16
     value: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x06
-    response: c_bool = c_bool(false)
+    response: c_bool = False
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUWriteSingleRegisterRequest(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        address: c_uint16 = read_simple_field(
-            "address", read_unsigned_int(read_buffer, 16)
-        )
+        address: c_uint16 = read_simple_field("address", read_unsigned_int)
 
-        value: c_uint16 = read_simple_field("value", read_unsigned_int(read_buffer, 16))
+        value: c_uint16 = read_simple_field("value", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteSingleRegisterRequest")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.py
index 2a9adefeed..32e7ae5f4a 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.py
@@ -34,9 +34,9 @@ class ModbusPDUWriteSingleRegisterResponse(PlcMessage, ModbusPDU):
     address: c_uint16
     value: c_uint16
     # Accessors for discriminator values.
-    error_flag: c_bool = c_bool(false)
+    error_flag: c_bool = False
     function_flag: c_uint8 = 0x06
-    response: c_bool = c_bool(true)
+    response: c_bool = True
 
     def __post_init__(self):
         super().__init__()
@@ -74,11 +74,9 @@ class ModbusPDUWriteSingleRegisterResponse(PlcMessage, ModbusPDU):
         start_pos: int = read_buffer.get_pos()
         cur_pos: int = 0
 
-        address: c_uint16 = read_simple_field(
-            "address", read_unsigned_int(read_buffer, 16)
-        )
+        address: c_uint16 = read_simple_field("address", read_unsigned_int)
 
-        value: c_uint16 = read_simple_field("value", read_unsigned_int(read_buffer, 16))
+        value: c_uint16 = read_simple_field("value", read_unsigned_int)
 
         read_buffer.close_context("ModbusPDUWriteSingleRegisterResponse")
         # Create the instance
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusRtuADU.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusRtuADU.py
index 9386f1e799..e69805d713 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusRtuADU.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusRtuADU.py
@@ -89,9 +89,7 @@ class ModbusRtuADU(PlcMessage, ModbusADU):
         cur_pos: int = 0
 
         address: c_uint8 = read_simple_field(
-            "address",
-            read_unsigned_short(read_buffer, 8),
-            WithOption.WithByteOrder(get_bi_g__endian()),
+            "address", read_unsigned_short, WithOption.WithByteOrder(get_bi_g__endian())
         )
 
         pdu: ModbusPDU = read_simple_field(
@@ -104,7 +102,7 @@ class ModbusRtuADU(PlcMessage, ModbusADU):
 
         crc: c_uint16 = read_checksum_field(
             "crc",
-            read_unsigned_int(read_buffer, 16),
+            read_unsigned_int,
             (c_uint16)(rtu_crc_check(address, pdu)),
             WithOption.WithByteOrder(get_bi_g__endian()),
         )
diff --git a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusTcpADU.py b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusTcpADU.py
index b8016d45cb..9f32a57f28 100644
--- a/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusTcpADU.py
+++ b/sandbox/plc4py/plc4py/protocols/modbus/readwrite/ModbusTcpADU.py
@@ -60,9 +60,7 @@ class ModbusTcpADU(PlcMessage, ModbusADU):
         )
 
         # Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
-        length: c_uint16 = c_uint16(self.pdu.getlength_in_bytes(ctx)) + c_uint16(
-            c_uint16(1)
-        )
+        length: c_uint16 = self.pdu.getlength_in_bytes(ctx) + c_uint16(1)
         write_buffer.write_unsigned_short(length, logical_name="length")
 
         # Simple Field (unitIdentifier)
@@ -111,26 +109,24 @@ class ModbusTcpADU(PlcMessage, ModbusADU):
 
         transaction_identifier: c_uint16 = read_simple_field(
             "transactionIdentifier",
-            read_unsigned_int(read_buffer, 16),
+            read_unsigned_int,
             WithOption.WithByteOrder(get_bi_g__endian()),
         )
 
         protocol_identifier: c_uint16 = read_const_field(
             "protocolIdentifier",
-            read_unsigned_int(read_buffer, 16),
+            read_unsigned_int,
             ModbusTcpADU.PROTOCOLIDENTIFIER,
             WithOption.WithByteOrder(get_bi_g__endian()),
         )
 
         length: c_uint16 = read_implicit_field(
-            "length",
-            read_unsigned_int(read_buffer, 16),
-            WithOption.WithByteOrder(get_bi_g__endian()),
+            "length", read_unsigned_int, WithOption.WithByteOrder(get_bi_g__endian())
         )
 
         unit_identifier: c_uint8 = read_simple_field(
             "unitIdentifier",
-            read_unsigned_short(read_buffer, 8),
+            read_unsigned_short,
             WithOption.WithByteOrder(get_bi_g__endian()),
         )
 
diff --git a/sandbox/plc4py/plc4py/protocols/simulated/readwrite/Dummy.py b/sandbox/plc4py/plc4py/protocols/simulated/readwrite/Dummy.py
index 7a4c5e59a5..74d6d89273 100644
--- a/sandbox/plc4py/plc4py/protocols/simulated/readwrite/Dummy.py
+++ b/sandbox/plc4py/plc4py/protocols/simulated/readwrite/Dummy.py
@@ -63,9 +63,7 @@ class Dummy(PlcMessage):
         cur_pos: int = 0
 
         dummy: c_uint16 = read_simple_field(
-            "dummy",
-            read_unsigned_int(read_buffer, 16),
-            WithOption.WithByteOrder(get_bi_g__endian()),
+            "dummy", read_unsigned_int, WithOption.WithByteOrder(get_bi_g__endian())
         )
 
         read_buffer.close_context("Dummy")
diff --git a/sandbox/plc4py/plc4py/spi/generation/WriteBuffer.py b/sandbox/plc4py/plc4py/spi/generation/WriteBuffer.py
index 25c85c0c5b..a4eaaa0ad1 100644
--- a/sandbox/plc4py/plc4py/spi/generation/WriteBuffer.py
+++ b/sandbox/plc4py/plc4py/spi/generation/WriteBuffer.py
@@ -36,6 +36,7 @@ from bitarray import bitarray
 from bitarray.util import zeros
 
 from plc4py.api.exceptions.exceptions import SerializationException
+from plc4py.api.messages.PlcMessage import PlcMessage
 from plc4py.utils.GenericTypes import ByteOrder, ByteOrderAware
 
 
@@ -126,6 +127,11 @@ class WriteBuffer(ByteOrderAware, PositionAware):
     def write_virtual(self, value: str, logical_name: str = "", **kwargs) -> None:
         raise NotImplementedError
 
+    def write_complex_array(
+        self, value: List[PlcMessage], logical_name: str = "", **kwargs
+    ) -> None:
+        raise NotImplementedError
+
     #
     # This method can be used to influence serializing (e.g. intercept whole types and render them in a simplified form)
     #
@@ -276,6 +282,14 @@ class WriteBufferByteBased(WriteBuffer):
             raise SerializationException("Double can only contain max 64 bits")
         self._handle_numeric_encoding(c_double(value.value), bit_length, **kwargs)
 
+    def write_complex_array(
+        self, value: List[PlcMessage], logical_name: str = "", **kwargs
+    ) -> None:
+        for item in value:
+            self.push_context(logical_name, **kwargs)
+            self.write_serializable(item)
+            self.pop_context(logical_name, **kwargs)
+
     def _handle_numeric_encoding(self, value: NUMERIC_UNION, bit_length: int, **kwargs):
         byte_order = kwargs.get("byte_order", self.byte_order)
         value_encoding: str = kwargs.get("encoding", "default")