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

[plc4x] branch develop updated: refactor(codegen): Refactored all usages of BitString to use BYTE, WORD, DWORD or LWORD instead.

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 7e509a6b1 refactor(codegen): Refactored all usages of BitString to use BYTE, WORD, DWORD or LWORD instead.
7e509a6b1 is described below

commit 7e509a6b16de8ed596e473c4138d45456e2940c6
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Sep 28 14:23:34 2022 +0200

    refactor(codegen): Refactored all usages of BitString to use BYTE, WORD, DWORD or LWORD instead.
---
 plc4c/generated-sources/modbus/src/data_item.c     | 156 +++++++++----------
 plc4c/generated-sources/plc4x/src/plc4x_value.c    | 170 ++++++++++-----------
 plc4c/generated-sources/s7/src/data_item.c         | 170 ++++++++++-----------
 plc4go/protocols/ads/readwrite/model/DataItem.go   |  24 +--
 .../knxnetip/readwrite/model/KnxDatapoint.go       |  24 +--
 .../protocols/modbus/readwrite/model/DataItem.go   | 108 +++++--------
 plc4go/protocols/s7/readwrite/model/DataItem.go    | 114 ++++++--------
 .../plc4x/protocol/ads/ManualAdsDriverTest.java    |  27 ++++
 .../knxnetip/readwrite/model/KnxDatapoint.cs       |  24 +--
 .../ads/src/main/resources/protocols/ads/ads.mspec |   8 +-
 protocols/knxnetip/src/main/xslt/knx-types.xsl     |   8 +-
 .../main/resources/protocols/modbus/modbus.mspec   |  20 +--
 .../main/resources/protocols/plc4x/v0/plc4x.mspec  |  16 +-
 .../protocols/plc4x/ParserSerializerTestsuite.xml  |  59 +------
 .../s7/src/main/resources/protocols/s7/s7.mspec    |  16 +-
 15 files changed, 413 insertions(+), 531 deletions(-)

diff --git a/plc4c/generated-sources/modbus/src/data_item.c b/plc4c/generated-sources/modbus/src/data_item.c
index d3b82044e..30d78a4a7 100644
--- a/plc4c/generated-sources/modbus/src/data_item.c
+++ b/plc4c/generated-sources/modbus/src/data_item.c
@@ -77,7 +77,7 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
         }
         *data_item = plc4c_data_create_list_data(value);
 
-    } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* List */
+    } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* BYTE */
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
                 {
@@ -91,21 +91,14 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
                     }
                 }
 
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 8;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+                // Simple Field (value)
+                uint8_t value = 0;
+                _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_byte_data(value);
 
     } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) { /* List */
 
@@ -125,59 +118,38 @@ plc4c_return_code plc4c_modbus_read_write_data_item_parse(plc4c_spi_read_buffer*
         }
         *data_item = plc4c_data_create_list_data(value);
 
-    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* List */
+    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* WORD */
 
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) (numberOfValues) * (16);
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+                // Simple Field (value)
+                uint16_t value = 0;
+                _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
 
-    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* List */
+                *data_item = plc4c_data_create_word_data(value);
 
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) (numberOfValues) * (32);
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* DWORD */
+
+                // Simple Field (value)
+                uint32_t value = 0;
+                _res = plc4c_spi_read_unsigned_int(readBuffer, 32, (uint32_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
 
-    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* List */
+                *data_item = plc4c_data_create_dword_data(value);
 
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) (numberOfValues) * (64);
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+    } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* LWORD */
+
+                // Simple Field (value)
+                uint64_t value = 0;
+                _res = plc4c_spi_read_unsigned_long(readBuffer, 64, (uint64_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_lword_data(value);
 
     } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_SINT) && (numberOfValues == 1)) { /* SINT */
 
@@ -570,23 +542,39 @@ plc4c_return_code plc4c_modbus_read_write_data_item_serialize(plc4c_spi_write_bu
         } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_BOOL) { /* List */
 
                     // Array field
-        } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* List */
+        } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* BYTE */
 
                     // Reserved Field (reserved)
 
-                    // Array field
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.byte_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
         } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) { /* List */
 
                     // Array field
-        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* List */
+        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* WORD */
 
-                    // Array field
-        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (*data_item)->data.word_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* DWORD */
 
-                    // Array field
-        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_int(writeBuffer, 32, (*data_item)->data.dword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* LWORD */
 
-                    // Array field
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_long(writeBuffer, 64, (*data_item)->data.lword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
         } else         if((dataType == plc4c_modbus_read_write_modbus_data_type_SINT) && (numberOfValues == 1)) { /* SINT */
 
                     // Reserved Field (reserved)
@@ -732,29 +720,29 @@ uint16_t plc4c_modbus_read_write_data_item_length_in_bits(plc4c_data* data_item,
 
         // Array field
         lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* List */
+    } else     if((dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) && (numberOfValues == 1)) { /* BYTE */
 
         // Reserved Field (reserved)
         lengthInBits += 8;
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
+        // Simple field (value)
+        lengthInBits += 8;
     } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_BYTE) { /* List */
 
         // Array field
         lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* List */
+    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_WORD) { /* WORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* List */
+        // Simple field (value)
+        lengthInBits += 16;
+    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_DWORD) { /* DWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* List */
+        // Simple field (value)
+        lengthInBits += 32;
+    } else     if(dataType == plc4c_modbus_read_write_modbus_data_type_LWORD) { /* LWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
+        // Simple field (value)
+        lengthInBits += 64;
     } else     if((dataType == plc4c_modbus_read_write_modbus_data_type_SINT) && (numberOfValues == 1)) { /* SINT */
 
         // Reserved Field (reserved)
diff --git a/plc4c/generated-sources/plc4x/src/plc4x_value.c b/plc4c/generated-sources/plc4x/src/plc4x_value.c
index 17f4ba17e..2aababae4 100644
--- a/plc4c/generated-sources/plc4x/src/plc4x_value.c
+++ b/plc4c/generated-sources/plc4x/src/plc4x_value.c
@@ -59,77 +59,49 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_parse(plc4c_spi_read_buffer
 
                 *data_item = plc4c_data_create_bool_data(value);
 
-    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 8;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 16;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 32;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 64;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* BYTE */
+
+                // Simple Field (value)
+                uint8_t value = 0;
+                _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_byte_data(value);
+
+    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* WORD */
+
+                // Simple Field (value)
+                uint16_t value = 0;
+                _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_word_data(value);
+
+    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* DWORD */
+
+                // Simple Field (value)
+                uint32_t value = 0;
+                _res = plc4c_spi_read_unsigned_int(readBuffer, 32, (uint32_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_dword_data(value);
+
+    } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* LWORD */
+
+                // Simple Field (value)
+                uint64_t value = 0;
+                _res = plc4c_spi_read_unsigned_long(readBuffer, 64, (uint64_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_lword_data(value);
 
     } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_USINT) { /* USINT */
 
@@ -287,18 +259,34 @@ plc4c_return_code plc4c_plc4x_read_write_plc4x_value_serialize(plc4c_spi_write_b
                     if(_res != OK) {
                         return _res;
                     }
-        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* List */
+        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* BYTE */
 
-                    // Array field
-        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.byte_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* WORD */
 
-                    // Array field
-        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (*data_item)->data.word_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* DWORD */
 
-                    // Array field
-        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_int(writeBuffer, 32, (*data_item)->data.dword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* LWORD */
 
-                    // Array field
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_long(writeBuffer, 64, (*data_item)->data.lword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
         } else         if(valueType == plc4c_plc4x_read_write_plc4x_value_type_USINT) { /* USINT */
 
                     // Simple field (value)
@@ -408,22 +396,22 @@ uint16_t plc4c_plc4x_read_write_plc4x_value_length_in_bits(plc4c_data* data_item
 
         // Simple field (value)
         lengthInBits += 1;
-    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* List */
+    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_BYTE) { /* BYTE */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* List */
+        // Simple field (value)
+        lengthInBits += 8;
+    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_WORD) { /* WORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* List */
+        // Simple field (value)
+        lengthInBits += 16;
+    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_DWORD) { /* DWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* List */
+        // Simple field (value)
+        lengthInBits += 32;
+    } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_LWORD) { /* LWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
+        // Simple field (value)
+        lengthInBits += 64;
     } else     if(valueType == plc4c_plc4x_read_write_plc4x_value_type_USINT) { /* USINT */
 
         // Simple field (value)
diff --git a/plc4c/generated-sources/s7/src/data_item.c b/plc4c/generated-sources/s7/src/data_item.c
index 0dc86a4a1..f999b07a7 100644
--- a/plc4c/generated-sources/s7/src/data_item.c
+++ b/plc4c/generated-sources/s7/src/data_item.c
@@ -59,77 +59,49 @@ plc4c_return_code plc4c_s7_read_write_data_item_parse(plc4c_spi_read_buffer* rea
 
                 *data_item = plc4c_data_create_bool_data(value);
 
-    } else         if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 8;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 16;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 32;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
-
-    } else         if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* List */
-
-        // Array field (value)
-        // Count array
-        plc4c_list* value;
-        plc4c_utils_list_create(&value);
-        int itemCount = (int) 64;
-        for(int curItem = 0; curItem < itemCount; curItem++) {
-            bool* _val = malloc(sizeof(bool) * 1);
-            _res = plc4c_spi_read_bit(readBuffer, (bool*) _val);
-            if(_res != OK) {
-                return _res;
-            }
-            plc4c_data* _item = plc4c_data_create_bool_data(*_val);
-            plc4c_utils_list_insert_head_value(value, _item);
-        }
-        *data_item = plc4c_data_create_list_data(value);
+    } else         if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* BYTE */
+
+                // Simple Field (value)
+                uint8_t value = 0;
+                _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_byte_data(value);
+
+    } else         if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* WORD */
+
+                // Simple Field (value)
+                uint16_t value = 0;
+                _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_word_data(value);
+
+    } else         if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* DWORD */
+
+                // Simple Field (value)
+                uint32_t value = 0;
+                _res = plc4c_spi_read_unsigned_int(readBuffer, 32, (uint32_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_dword_data(value);
+
+    } else         if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* LWORD */
+
+                // Simple Field (value)
+                uint64_t value = 0;
+                _res = plc4c_spi_read_unsigned_long(readBuffer, 64, (uint64_t*) &value);
+                if(_res != OK) {
+                    return _res;
+                }
+
+                *data_item = plc4c_data_create_lword_data(value);
 
     } else         if(strcmp(dataProtocolId, "IEC61131_SINT") == 0) { /* SINT */
 
@@ -418,18 +390,34 @@ plc4c_return_code plc4c_s7_read_write_data_item_serialize(plc4c_spi_write_buffer
                     if(_res != OK) {
                         return _res;
                     }
-        } else         if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* List */
+        } else         if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* BYTE */
 
-                    // Array field
-        } else         if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, (*data_item)->data.byte_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* WORD */
 
-                    // Array field
-        } else         if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, (*data_item)->data.word_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* DWORD */
 
-                    // Array field
-        } else         if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* List */
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_int(writeBuffer, 32, (*data_item)->data.dword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
+        } else         if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* LWORD */
 
-                    // Array field
+                    // Simple field (value)
+                    _res = plc4c_spi_write_unsigned_long(writeBuffer, 64, (*data_item)->data.lword_value);
+                    if(_res != OK) {
+                        return _res;
+                    }
         } else         if(strcmp(dataProtocolId, "IEC61131_SINT") == 0) { /* SINT */
 
                     // Simple field (value)
@@ -614,22 +602,22 @@ uint16_t plc4c_s7_read_write_data_item_length_in_bits(plc4c_data* data_item, cha
 
         // Simple field (value)
         lengthInBits += 1;
-    } else     if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* List */
+    } else     if(strcmp(dataProtocolId, "IEC61131_BYTE") == 0) { /* BYTE */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* List */
+        // Simple field (value)
+        lengthInBits += 8;
+    } else     if(strcmp(dataProtocolId, "IEC61131_WORD") == 0) { /* WORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* List */
+        // Simple field (value)
+        lengthInBits += 16;
+    } else     if(strcmp(dataProtocolId, "IEC61131_DWORD") == 0) { /* DWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
-    } else     if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* List */
+        // Simple field (value)
+        lengthInBits += 32;
+    } else     if(strcmp(dataProtocolId, "IEC61131_LWORD") == 0) { /* LWORD */
 
-        // Array field
-        lengthInBits += 1 * plc4c_utils_list_size(data_item->data.list_value);
+        // Simple field (value)
+        lengthInBits += 64;
     } else     if(strcmp(dataProtocolId, "IEC61131_SINT") == 0) { /* SINT */
 
         // Simple field (value)
diff --git a/plc4go/protocols/ads/readwrite/model/DataItem.go b/plc4go/protocols/ads/readwrite/model/DataItem.go
index b989797e2..1856eaa47 100644
--- a/plc4go/protocols/ads/readwrite/model/DataItem.go
+++ b/plc4go/protocols/ads/readwrite/model/DataItem.go
@@ -45,38 +45,38 @@ func DataItemParse(readBuffer utils.ReadBuffer, plcValueType PlcValueType, strin
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBOOL(value), nil
-	case plcValueType == PlcValueType_BYTE: // BitString
+	case plcValueType == PlcValueType_BYTE: // BYTE
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint8("value", 8)
 		if _valueErr != nil {
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcBitString(value), nil
-	case plcValueType == PlcValueType_WORD: // BitString
+		return values.NewPlcBYTE(value), nil
+	case plcValueType == PlcValueType_WORD: // WORD
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint16("value", 16)
 		if _valueErr != nil {
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcBitString(value), nil
-	case plcValueType == PlcValueType_DWORD: // BitString
+		return values.NewPlcWORD(value), nil
+	case plcValueType == PlcValueType_DWORD: // DWORD
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint32("value", 32)
 		if _valueErr != nil {
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcBitString(value), nil
-	case plcValueType == PlcValueType_LWORD: // BitString
+		return values.NewPlcDWORD(value), nil
+	case plcValueType == PlcValueType_LWORD: // LWORD
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadUint64("value", 64)
 		if _valueErr != nil {
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcBitString(value), nil
+		return values.NewPlcLWORD(value), nil
 	case plcValueType == PlcValueType_SINT: // SINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt8("value", 8)
@@ -266,22 +266,22 @@ func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, plcVal
 		if _err := writeBuffer.WriteBit("value", value.GetBool()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case plcValueType == PlcValueType_BYTE: // BitString
+	case plcValueType == PlcValueType_BYTE: // BYTE
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case plcValueType == PlcValueType_WORD: // BitString
+	case plcValueType == PlcValueType_WORD: // WORD
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case plcValueType == PlcValueType_DWORD: // BitString
+	case plcValueType == PlcValueType_DWORD: // DWORD
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case plcValueType == PlcValueType_LWORD: // BitString
+	case plcValueType == PlcValueType_LWORD: // LWORD
 		// Simple Field (value)
 		if _err := writeBuffer.WriteUint64("value", 64, value.GetUint64()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
diff --git a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapoint.go b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapoint.go
index b00c1da35..512a07007 100644
--- a/plc4go/protocols/knxnetip/readwrite/model/KnxDatapoint.go
+++ b/plc4go/protocols/knxnetip/readwrite/model/KnxDatapoint.go
@@ -45,7 +45,7 @@ func KnxDatapointParse(readBuffer utils.ReadBuffer, datapointType KnxDatapointTy
 		}
 		readBuffer.CloseContext("KnxDatapoint")
 		return values.NewPlcBOOL(value), nil
-	case datapointType == KnxDatapointType_BYTE: // BitString
+	case datapointType == KnxDatapointType_BYTE: // BYTE
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
@@ -57,8 +57,8 @@ func KnxDatapointParse(readBuffer utils.ReadBuffer, datapointType KnxDatapointTy
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("KnxDatapoint")
-		return values.NewPlcBitString(value), nil
-	case datapointType == KnxDatapointType_WORD: // BitString
+		return values.NewPlcBYTE(value), nil
+	case datapointType == KnxDatapointType_WORD: // WORD
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
@@ -70,8 +70,8 @@ func KnxDatapointParse(readBuffer utils.ReadBuffer, datapointType KnxDatapointTy
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("KnxDatapoint")
-		return values.NewPlcBitString(value), nil
-	case datapointType == KnxDatapointType_DWORD: // BitString
+		return values.NewPlcWORD(value), nil
+	case datapointType == KnxDatapointType_DWORD: // DWORD
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
@@ -83,8 +83,8 @@ func KnxDatapointParse(readBuffer utils.ReadBuffer, datapointType KnxDatapointTy
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("KnxDatapoint")
-		return values.NewPlcBitString(value), nil
-	case datapointType == KnxDatapointType_LWORD: // BitString
+		return values.NewPlcDWORD(value), nil
+	case datapointType == KnxDatapointType_LWORD: // LWORD
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
@@ -96,7 +96,7 @@ func KnxDatapointParse(readBuffer utils.ReadBuffer, datapointType KnxDatapointTy
 			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("KnxDatapoint")
-		return values.NewPlcBitString(value), nil
+		return values.NewPlcLWORD(value), nil
 	case datapointType == KnxDatapointType_USINT: // USINT
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
@@ -7579,7 +7579,7 @@ func KnxDatapointSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, da
 		if _err := writeBuffer.WriteBit("value", value.GetBool()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case datapointType == KnxDatapointType_BYTE: // BitString
+	case datapointType == KnxDatapointType_BYTE: // BYTE
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 8, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
@@ -7589,7 +7589,7 @@ func KnxDatapointSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, da
 		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case datapointType == KnxDatapointType_WORD: // BitString
+	case datapointType == KnxDatapointType_WORD: // WORD
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 8, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
@@ -7599,7 +7599,7 @@ func KnxDatapointSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, da
 		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case datapointType == KnxDatapointType_DWORD: // BitString
+	case datapointType == KnxDatapointType_DWORD: // DWORD
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 8, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
@@ -7609,7 +7609,7 @@ func KnxDatapointSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, da
 		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case datapointType == KnxDatapointType_LWORD: // BitString
+	case datapointType == KnxDatapointType_LWORD: // LWORD
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 8, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
diff --git a/plc4go/protocols/modbus/readwrite/model/DataItem.go b/plc4go/protocols/modbus/readwrite/model/DataItem.go
index 9710262cf..5742dc9d1 100644
--- a/plc4go/protocols/modbus/readwrite/model/DataItem.go
+++ b/plc4go/protocols/modbus/readwrite/model/DataItem.go
@@ -56,23 +56,19 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataType ModbusDataType, numberO
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcList(value), nil
-	case dataType == ModbusDataType_BYTE && numberOfValues == uint16(1): // List
+	case dataType == ModbusDataType_BYTE && numberOfValues == uint16(1): // BYTE
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
 			return nil, errors.Wrap(_err, "Error parsing reserved field")
 		}
 
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((8)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint8("value", 8)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
+		return values.NewPlcBYTE(value), nil
 	case dataType == ModbusDataType_BYTE: // List
 		// Array Field (value)
 		var value []api.PlcValue
@@ -85,42 +81,30 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataType ModbusDataType, numberO
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcList(value), nil
-	case dataType == ModbusDataType_WORD: // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((numberOfValues)*(16)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+	case dataType == ModbusDataType_WORD: // WORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint16("value", 16)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
-	case dataType == ModbusDataType_DWORD: // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((numberOfValues)*(32)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		return values.NewPlcWORD(value), nil
+	case dataType == ModbusDataType_DWORD: // DWORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint32("value", 32)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
-	case dataType == ModbusDataType_LWORD: // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((numberOfValues)*(64)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		return values.NewPlcDWORD(value), nil
+	case dataType == ModbusDataType_LWORD: // LWORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint64("value", 64)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
+		return values.NewPlcLWORD(value), nil
 	case dataType == ModbusDataType_SINT && numberOfValues == uint16(1): // SINT
 		// Reserved Field (Just skip the bytes)
 		if _, _err := readBuffer.ReadUint8("reserved", 8); _err != nil {
@@ -405,18 +389,15 @@ func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, dataTy
 				return errors.Wrap(_itemErr, "Error serializing 'value' field")
 			}
 		}
-	case dataType == ModbusDataType_BYTE && numberOfValues == uint16(1): // List
+	case dataType == ModbusDataType_BYTE && numberOfValues == uint16(1): // BYTE
 		// Reserved Field (Just skip the bytes)
 		if _err := writeBuffer.WriteUint8("reserved", 8, uint8(0x00)); _err != nil {
 			return errors.Wrap(_err, "Error serializing reserved field")
 		}
 
-		// Array Field (value)
-		for i := uint32(0); i < uint32((8)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
 	case dataType == ModbusDataType_BYTE: // List
 		// Array Field (value)
@@ -426,29 +407,20 @@ func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, dataTy
 				return errors.Wrap(_itemErr, "Error serializing 'value' field")
 			}
 		}
-	case dataType == ModbusDataType_WORD: // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((m.NumberOfValues)*(16)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
+	case dataType == ModbusDataType_WORD: // WORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataType == ModbusDataType_DWORD: // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((m.NumberOfValues)*(32)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
+	case dataType == ModbusDataType_DWORD: // DWORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataType == ModbusDataType_LWORD: // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((m.NumberOfValues)*(64)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
+	case dataType == ModbusDataType_LWORD: // LWORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint64("value", 64, value.GetUint64()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
 	case dataType == ModbusDataType_SINT && numberOfValues == uint16(1): // SINT
 		// Reserved Field (Just skip the bytes)
diff --git a/plc4go/protocols/s7/readwrite/model/DataItem.go b/plc4go/protocols/s7/readwrite/model/DataItem.go
index b3ac2319f..e75da7baf 100644
--- a/plc4go/protocols/s7/readwrite/model/DataItem.go
+++ b/plc4go/protocols/s7/readwrite/model/DataItem.go
@@ -45,54 +45,38 @@ func DataItemParse(readBuffer utils.ReadBuffer, dataProtocolId string, stringLen
 		}
 		readBuffer.CloseContext("DataItem")
 		return values.NewPlcBOOL(value), nil
-	case dataProtocolId == "IEC61131_BYTE": // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((8)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+	case dataProtocolId == "IEC61131_BYTE": // BYTE
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint8("value", 8)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
-	case dataProtocolId == "IEC61131_WORD": // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((16)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		return values.NewPlcBYTE(value), nil
+	case dataProtocolId == "IEC61131_WORD": // WORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint16("value", 16)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
-	case dataProtocolId == "IEC61131_DWORD": // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((32)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		return values.NewPlcWORD(value), nil
+	case dataProtocolId == "IEC61131_DWORD": // DWORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint32("value", 32)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
-	case dataProtocolId == "IEC61131_LWORD": // List
-		// Array Field (value)
-		var value []api.PlcValue
-		for i := 0; i < int((64)); i++ {
-			_item, _itemErr := readBuffer.ReadBit("value")
-			if _itemErr != nil {
-				return nil, errors.Wrap(_itemErr, "Error parsing 'value' field")
-			}
-			value = append(value, values.NewPlcBOOL(_item))
+		return values.NewPlcDWORD(value), nil
+	case dataProtocolId == "IEC61131_LWORD": // LWORD
+		// Simple Field (value)
+		value, _valueErr := readBuffer.ReadUint64("value", 64)
+		if _valueErr != nil {
+			return nil, errors.Wrap(_valueErr, "Error parsing 'value' field")
 		}
 		readBuffer.CloseContext("DataItem")
-		return values.NewPlcList(value), nil
+		return values.NewPlcLWORD(value), nil
 	case dataProtocolId == "IEC61131_SINT": // SINT
 		// Simple Field (value)
 		value, _valueErr := readBuffer.ReadInt8("value", 8)
@@ -314,37 +298,25 @@ func DataItemSerialize(writeBuffer utils.WriteBuffer, value api.PlcValue, dataPr
 		if _err := writeBuffer.WriteBit("value", value.GetBool()); _err != nil {
 			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
-	case dataProtocolId == "IEC61131_BYTE": // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((8)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
-		}
-	case dataProtocolId == "IEC61131_WORD": // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((16)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
-		}
-	case dataProtocolId == "IEC61131_DWORD": // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((32)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
-		}
-	case dataProtocolId == "IEC61131_LWORD": // List
-		// Array Field (value)
-		for i := uint32(0); i < uint32((64)); i++ {
-			_itemErr := writeBuffer.WriteBit("", value.GetIndex(i).GetBool())
-			if _itemErr != nil {
-				return errors.Wrap(_itemErr, "Error serializing 'value' field")
-			}
+	case dataProtocolId == "IEC61131_BYTE": // BYTE
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint8("value", 8, value.GetUint8()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
+		}
+	case dataProtocolId == "IEC61131_WORD": // WORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint16("value", 16, value.GetUint16()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
+		}
+	case dataProtocolId == "IEC61131_DWORD": // DWORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint32("value", 32, value.GetUint32()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
+		}
+	case dataProtocolId == "IEC61131_LWORD": // LWORD
+		// Simple Field (value)
+		if _err := writeBuffer.WriteUint64("value", 64, value.GetUint64()); _err != nil {
+			return errors.Wrap(_err, "Error serializing 'value' field")
 		}
 	case dataProtocolId == "IEC61131_SINT": // SINT
 		// Simple Field (value)
diff --git a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java
index 3beb89099..35691b976 100644
--- a/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java
+++ b/plc4j/drivers/ads/src/test/java/org/apache/plc4x/protocol/ads/ManualAdsDriverTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.plc4x.protocol.ads;
 
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.spi.values.*;
 import org.apache.plc4x.test.manual.ManualTest;
 
@@ -25,6 +26,8 @@ import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.util.HashMap;
+import java.util.Map;
 
 public class ManualAdsDriverTest extends ManualTest {
 
@@ -106,6 +109,30 @@ public class ManualAdsDriverTest extends ManualTest {
         test.addTestCase("MAIN.hurz_TIME_OF_DAY", new PlcTIME_OF_DAY(LocalTime.parse("15:36:30.123")));
         test.addTestCase("MAIN.hurz_DATE_AND_TIME", new PlcDATE_AND_TIME(LocalDateTime.parse("1996-05-06T15:36:30")));
         //test.addTestCase("MAIN.hurz_DT", new PlcDT("1972-03-29T00:00"));
+        Map<String, PlcValue> children = new HashMap<>();
+        children.put("hurz_BOOL", new PlcBOOL(true));
+        children.put("hurz_BYTE", new PlcBitString(new boolean[]{false, false, false, false, false, false, false, true}));
+        children.put("hurz_WORD", new PlcBitString(new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false}));
+        children.put("hurz_DWORD", new PlcBitString(new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true}));
+        children.put("hurz_LDWORD", new PlcBitString(new boolean[]{false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, [...]
+        children.put("hurz_SINT", new PlcSINT(5));
+        children.put("hurz_USINT", new PlcUSINT(6));
+        children.put("hurz_INT", new PlcINT(7));
+        children.put("hurz_UINT", new PlcUINT(8));
+        children.put("hurz_DINT", new PlcDINT(9));
+        children.put("hurz_UDINT", new PlcUDINT(10));
+        children.put("hurz_LINT", new PlcLINT(11));
+        children.put("hurz_ULINT", new PlcULINT(12));
+        children.put("hurz_REAL", new PlcREAL(13.0));
+        children.put("hurz_LREAL", new PlcLREAL(14.0));
+        children.put("hurz_STRING", new PlcSTRING("hurz"));
+        children.put("hurz_WSTRING", new PlcWSTRING("wolf"));
+        children.put("hurz_TIME", new PlcTIME(Duration.parse("PT1.234S")));
+        children.put("hurz_LTIME", new PlcLTIME(Duration.parse("PT24015H23M12.034002044S")));
+        children.put("hurz_DATE", new PlcDATE(LocalDate.parse("1978-03-28")));
+        children.put("hurz_TIME_OF_DAY", new PlcTIME_OF_DAY(LocalTime.parse("15:36:30.123")));
+        children.put("hurz_DATE_AND_TIME", new PlcDATE_AND_TIME(LocalDateTime.parse("1996-05-06T15:36:30")));
+        test.addTestCase("MAIN.hurz_Struct", new PlcStruct(children));
         test.run();
     }
 
diff --git a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxDatapoint.cs b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxDatapoint.cs
index 353d74aae..3eb010994 100644
--- a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxDatapoint.cs
+++ b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxDatapoint.cs
@@ -50,7 +50,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 var value = readBuffer.ReadBit("");
 
                 return new PlcBOOL(value);
-            } else if( datapointType == KnxDatapointType.BYTE ) { // BitString
+            } else if( datapointType == KnxDatapointType.BYTE ) { // BYTE
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
                 {
@@ -63,8 +63,8 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 // Simple Field (value)
                 var value = readBuffer.ReadByte("", 8);
 
-                return new PlcBitString(value);
-            } else if( datapointType == KnxDatapointType.WORD ) { // BitString
+                return new PlcBYTE(value);
+            } else if( datapointType == KnxDatapointType.WORD ) { // WORD
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
                 {
@@ -77,8 +77,8 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 // Simple Field (value)
                 var value = readBuffer.ReadUshort("", 16);
 
-                return new PlcBitString(value);
-            } else if( datapointType == KnxDatapointType.DWORD ) { // BitString
+                return new PlcWORD(value);
+            } else if( datapointType == KnxDatapointType.DWORD ) { // DWORD
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
                 {
@@ -91,8 +91,8 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 // Simple Field (value)
                 var value = readBuffer.ReadUint("", 32);
 
-                return new PlcBitString(value);
-            } else if( datapointType == KnxDatapointType.LWORD ) { // BitString
+                return new PlcDWORD(value);
+            } else if( datapointType == KnxDatapointType.LWORD ) { // LWORD
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
                 {
@@ -105,7 +105,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 // Simple Field (value)
                 var value = readBuffer.ReadUlong("", 64);
 
-                return new PlcBitString(value);
+                return new PlcLWORD(value);
             } else if( datapointType == KnxDatapointType.USINT ) { // USINT
 
                 // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
@@ -6541,7 +6541,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 var value = (bool) _value.GetBool();
                 writeBuffer.WriteBit("", (value));
             return writeBuffer;
-        } else if( datapointType == KnxDatapointType.BYTE ) { // BitString
+        } else if( datapointType == KnxDatapointType.BYTE ) { // BYTE
                 var writeBuffer = new WriteBuffer();
 
                 // Reserved Field
@@ -6550,7 +6550,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 var value = (byte) _value.GetByte();
                 writeBuffer.WriteByte("", 8, (byte) (value));
             return writeBuffer;
-        } else if( datapointType == KnxDatapointType.WORD ) { // BitString
+        } else if( datapointType == KnxDatapointType.WORD ) { // WORD
                 var writeBuffer = new WriteBuffer();
 
                 // Reserved Field
@@ -6559,7 +6559,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 var value = (ushort) _value.GetUshort();
                 writeBuffer.WriteUshort("", 16, (ushort) (value));
             return writeBuffer;
-        } else if( datapointType == KnxDatapointType.DWORD ) { // BitString
+        } else if( datapointType == KnxDatapointType.DWORD ) { // DWORD
                 var writeBuffer = new WriteBuffer();
 
                 // Reserved Field
@@ -6568,7 +6568,7 @@ if( datapointType == KnxDatapointType.BOOL ) { // BOOL
                 var value = (uint) _value.GetUint();
                 writeBuffer.WriteUint("", 32, (uint) (value));
             return writeBuffer;
-        } else if( datapointType == KnxDatapointType.LWORD ) { // BitString
+        } else if( datapointType == KnxDatapointType.LWORD ) { // LWORD
                 var writeBuffer = new WriteBuffer();
 
                 // Reserved Field
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index e3f458cf6..08e6e0171 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -397,19 +397,19 @@
         // Bit-strings
         // -----------------------------------------
         // 1 byte
-        ['BYTE' BitString
+        ['BYTE' BYTE
             [simple uint 8 value]
         ]
         // 2 byte (16 bit)
-        ['WORD' BitString
+        ['WORD' WORD
             [simple uint 16 value]
         ]
         // 4 byte (32 bit)
-        ['DWORD' BitString
+        ['DWORD' DWORD
             [simple uint 32 value]
         ]
         // 8 byte (64 bit)
-        ['LWORD' BitString
+        ['LWORD' LWORD
             [simple uint 64 value]
         ]
 
diff --git a/protocols/knxnetip/src/main/xslt/knx-types.xsl b/protocols/knxnetip/src/main/xslt/knx-types.xsl
index 6aa3a7007..8d25cb111 100644
--- a/protocols/knxnetip/src/main/xslt/knx-types.xsl
+++ b/protocols/knxnetip/src/main/xslt/knx-types.xsl
@@ -119,19 +119,19 @@
             [reserved uint 7 '0x00']
             [simple   bit    value]
         ]
-        ['BYTE' BitString
+        ['BYTE' BYTE
             [reserved uint 8    '0x00']
             [simple   uint 8    value ]
         ]
-        ['WORD' BitString
+        ['WORD' WORD
             [reserved uint 8    '0x00']
             [simple   uint 16    value]
         ]
-        ['DWORD' BitString
+        ['DWORD' DWORD
             [reserved uint 8    '0x00']
             [simple   uint 32    value]
         ]
-        ['LWORD' BitString
+        ['LWORD' LWORD
             [reserved uint 8    '0x00']
             [simple   uint 64    value]
         ]
diff --git a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
index 2ff7f748d..4fc3e8b6d 100644
--- a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
+++ b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
@@ -319,26 +319,26 @@
             // TODO: Handle adding some reserved bits at the end to fill up the last word.
             [array    bit     value count 'numberOfValues'     ]
         ]
-        ['BYTE','1'  List
+        ['BYTE','1'  BYTE
             [reserved uint 8 '0x00']
-            [array    bit     value count '8'                  ]
+            [simple uint 8 value]
         ]
         ['BYTE' List
             // TODO: If the number of values is odd, add a reserved byte
             [array    bit     value count 'numberOfValues * 8' ]
         ]
-        ['WORD'      List
-            [array    bit     value count 'numberOfValues * 16']
+        ['WORD'      WORD
+            [simple   uint 16 value]
         ]
-        ['DWORD'     List
-            [array    bit     value count 'numberOfValues * 32']
+        ['DWORD'     DWORD
+            [simple   uint 32 value]
         ]
-        ['LWORD' List
-            [array    bit     value count 'numberOfValues * 64']
+        ['LWORD'     LWORD
+            [simple   uint 64 value]
         ]
         ['SINT','1' SINT
-            [reserved uint 8 '0x00']
-            [simple   int 8  value ]
+            [reserved uint 8  '0x00']
+            [simple   int 8   value ]
         ]
         ['SINT' List
             [array int 8 value count 'numberOfValues']
diff --git a/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec b/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec
index 37592e4d3..ec4cf5e98 100644
--- a/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec
+++ b/protocols/plc4x/src/main/resources/protocols/plc4x/v0/plc4x.mspec
@@ -119,17 +119,17 @@
             [reserved uint 7                     '0x00'                          ]
             [simple   bit                        value                           ]
         ]
-        ['BYTE'          List
-            [array    bit                        value     count '8'             ]
+        ['BYTE'          BYTE
+            [simple   uint 8                     value                           ]
         ]
-        ['WORD'          List
-            [array    bit                        value     count '16'            ]
+        ['WORD'          WORD
+            [simple   uint 16                    value                           ]
         ]
-        ['DWORD'         List
-            [array    bit                        value     count '32'            ]
+        ['DWORD'         DWORD
+            [simple   uint 32                    value                           ]
         ]
-        ['LWORD'         List
-            [array    bit                        value     count '64'            ]
+        ['LWORD'         LWORD
+            [simple   uint 64                    value                           ]
         ]
 
         // Unsigned Integers
diff --git a/protocols/plc4x/src/test/resources/protocols/plc4x/ParserSerializerTestsuite.xml b/protocols/plc4x/src/test/resources/protocols/plc4x/ParserSerializerTestsuite.xml
index fd792f23e..b1393e72c 100644
--- a/protocols/plc4x/src/test/resources/protocols/plc4x/ParserSerializerTestsuite.xml
+++ b/protocols/plc4x/src/test/resources/protocols/plc4x/ParserSerializerTestsuite.xml
@@ -380,14 +380,7 @@
                 <Plc4xValueType dataType="uint" bitLength="8" stringRepresentation="BYTE">2</Plc4xValueType>
               </valueType>
               <value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
+                <value dataType="uint" bitLength="8">191</value>
               </value>
             </Plc4xFieldValueResponse>
             <Plc4xFieldValueResponse>
@@ -406,22 +399,7 @@
                 <Plc4xValueType dataType="uint" bitLength="8" stringRepresentation="WORD">3</Plc4xValueType>
               </valueType>
               <value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
+                <value dataType="uint" bitLength="16">10527</value>
               </value>
             </Plc4xFieldValueResponse>
             <Plc4xFieldValueResponse>
@@ -440,38 +418,7 @@
                 <Plc4xValueType dataType="uint" bitLength="8" stringRepresentation="DWORD">4</Plc4xValueType>
               </valueType>
               <value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">true</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">false</value>
-                <value dataType="bit" bitLength="1">true</value>
+                <value dataType="uint" bitLength="32">2015598905</value>
               </value>
             </Plc4xFieldValueResponse>
             <Plc4xFieldValueResponse>
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 0a04787bd..28d6555a0 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -535,20 +535,20 @@
         // Bit-strings
         // -----------------------------------------
         // 1 byte
-        ['"IEC61131_BYTE"' List
-            [array bit value count '8']
+        ['"IEC61131_BYTE"' BYTE
+            [simple uint 8 value]
         ]
         // 2 byte (16 bit)
-        ['"IEC61131_WORD"' List
-            [array bit value count '16']
+        ['"IEC61131_WORD"' WORD
+            [simple uint 16 value]
         ]
         // 4 byte (32 bit)
-        ['"IEC61131_DWORD"' List
-            [array bit value count '32']
+        ['"IEC61131_DWORD"' DWORD
+            [simple uint 32 value]
         ]
         // 8 byte (64 bit)
-        ['"IEC61131_LWORD"' List
-            [array bit value count '64']
+        ['"IEC61131_LWORD"' LWORD
+            [simple uint 64 value]
         ]
 
         // -----------------------------------------