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 2018/09/14 16:49:58 UTC

[incubator-plc4x] branch feature/api-redesign-chris-c updated: - Replaced the old TransportSize with the originally named S7DataType class

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

cdutz pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/feature/api-redesign-chris-c by this push:
     new 01373d9  - Replaced the old TransportSize with the originally named S7DataType class
01373d9 is described below

commit 01373d962da8902b11524dc137922762ab85cc14
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Sep 14 18:49:54 2018 +0200

    - Replaced the old TransportSize with the originally named S7DataType class
---
 .../s7/messages/items/S7BigIntegerFieldItem.java   |   6 +-
 .../java/s7/messages/items/S7BooleanFieldItem.java |   6 +-
 .../messages/items/S7FloatingPointFieldItem.java   |   6 +-
 .../java/s7/messages/items/S7IntegerFieldItem.java |   6 +-
 .../java/s7/messages/items/S7StringFieldItem.java  |   6 +-
 .../java/s7/messages/items/S7TimeFieldItem.java    |   6 +-
 .../org/apache/plc4x/java/s7/model/S7Field.java    |  16 +-
 .../org/apache/plc4x/java/s7/netty/S7Protocol.java |   4 +-
 .../model/params/items/S7AnyVarParameterItem.java  |   9 +-
 .../s7/netty/model/types/DataTransportSize.java    |  30 ---
 .../java/s7/netty/model/types/TransportSize.java   | 223 ++++++++++++++++-----
 .../strategies/DefaultS7MessageProcessor.java      |   4 +-
 .../java/s7/netty/util/S7PlcFieldHandler.java      |  42 ++--
 .../s7/netty/util/S7ResponseSizeEstimator.java     |   4 +-
 .../org/apache/plc4x/java/s7/types/S7DataType.java | 198 ------------------
 .../apache/plc4x/java/s7/model/S7FieldTests.java   |  13 +-
 .../s7/netty/model/messages/S7MessageTests.java    |   6 +-
 .../s7/netty/model/params/S7ParameterTests.java    |   4 +-
 .../java/s7/netty/model/types/S7TypeTests.java     |   2 +-
 .../strategies/DefaultS7MessageProcessorTest.java  | 126 ++++++------
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  |  10 +-
 .../plc4x/java/s7/netty/util/S7SizeHelperTest.java |  18 +-
 22 files changed, 319 insertions(+), 426 deletions(-)

diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
index 02cdcda..b2aa122 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
@@ -19,15 +19,15 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultBigIntegerFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.math.BigInteger;
 
 public class S7BigIntegerFieldItem extends DefaultBigIntegerFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7BigIntegerFieldItem(S7DataType naturalDataType, BigInteger... values) {
+    public S7BigIntegerFieldItem(TransportSize naturalDataType, BigInteger... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
index dc887c4..feab70c 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
@@ -19,13 +19,13 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultBooleanFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 public class S7BooleanFieldItem extends DefaultBooleanFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7BooleanFieldItem(S7DataType naturalDataType, Boolean... values) {
+    public S7BooleanFieldItem(TransportSize naturalDataType, Boolean... values) {
         super(values);
         this.naturalDataType = naturalDataType;
    }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
index 9a412ef..f2024d3 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
@@ -19,13 +19,13 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultFloatingPointFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 public class S7FloatingPointFieldItem extends DefaultFloatingPointFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7FloatingPointFieldItem(S7DataType naturalDataType, Double... values) {
+    public S7FloatingPointFieldItem(TransportSize naturalDataType, Double... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
index 35e4b56..a9c6ee6 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
@@ -19,13 +19,13 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 public class S7IntegerFieldItem extends DefaultIntegerFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7IntegerFieldItem(S7DataType naturalDataType, Long... values) {
+    public S7IntegerFieldItem(TransportSize naturalDataType, Long... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
index 507cad1..b852016 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
@@ -19,13 +19,13 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultStringFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 public class S7StringFieldItem extends DefaultStringFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7StringFieldItem(S7DataType naturalDataType, String... values) {
+    public S7StringFieldItem(TransportSize naturalDataType, String... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
index 3ab5507..6d7821e 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
@@ -19,15 +19,15 @@
 package org.apache.plc4x.java.s7.messages.items;
 
 import org.apache.plc4x.java.base.messages.items.DefaultTimeFieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.time.LocalDateTime;
 
 public class S7TimeFieldItem extends DefaultTimeFieldItem {
 
-    private final S7DataType naturalDataType;
+    private final TransportSize naturalDataType;
 
-    public S7TimeFieldItem(S7DataType naturalDataType, LocalDateTime... values) {
+    public S7TimeFieldItem(TransportSize naturalDataType, LocalDateTime... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
index e428e9e..8d48c78 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
@@ -21,7 +21,7 @@ package org.apache.plc4x.java.s7.model;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -41,7 +41,7 @@ public class S7Field implements PlcField {
     public static S7Field of(String fieldString) throws PlcInvalidFieldException {
         Matcher matcher = DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString);
         if(matcher.matches()) {
-            S7DataType dataType = S7DataType.valueOf(matcher.group("dataType"));
+            TransportSize dataType = TransportSize.valueOf(matcher.group("dataType"));
             MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
             String transferSizeCode = matcher.group("transferSizeCode");
             short blockNumber = Short.parseShort(matcher.group("blockNumber"));
@@ -49,7 +49,7 @@ public class S7Field implements PlcField {
             short bitOffset = 0;
             if(matcher.group("bitOffset") != null) {
                 bitOffset = Short.parseShort(matcher.group("bitOffset"));
-            } else if(dataType == S7DataType.BOOL) {
+            } else if(dataType == TransportSize.BOOL) {
                 throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
             }
             int numElements = 1;
@@ -64,14 +64,14 @@ public class S7Field implements PlcField {
         } else {
             matcher = ADDRESS_PATTERN.matcher(fieldString);
             if (matcher.matches()) {
-                S7DataType dataType = S7DataType.valueOf(matcher.group("dataType"));
+                TransportSize dataType = TransportSize.valueOf(matcher.group("dataType"));
                 MemoryArea memoryArea = MemoryArea.valueOfShortName(matcher.group("memoryArea"));
                 String transferSizeCode = matcher.group("transferSizeCode");
                 short byteOffset = Short.parseShort(matcher.group("byteOffset"));
                 short bitOffset = 0;
                 if(matcher.group("bitOffset") != null) {
                     bitOffset = Short.parseShort(matcher.group("bitOffset"));
-                } else if(dataType == S7DataType.BOOL) {
+                } else if(dataType == TransportSize.BOOL) {
                     throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
                 }
                 int numElements = 1;
@@ -88,14 +88,14 @@ public class S7Field implements PlcField {
         throw new PlcInvalidFieldException("Unable to parse address: " + fieldString);
     }
 
-    private final S7DataType dataType;
+    private final TransportSize dataType;
     private final MemoryArea memoryArea;
     private final short blockNumber;
     private final short byteOffset;
     private final short bitOffset;
     private final int numElements;
 
-    private S7Field(S7DataType dataType, MemoryArea memoryArea, short blockNumber, short byteOffset, short bitOffset, int numElements) {
+    private S7Field(TransportSize dataType, MemoryArea memoryArea, short blockNumber, short byteOffset, short bitOffset, int numElements) {
         this.dataType = dataType;
         this.memoryArea = memoryArea;
         this.blockNumber = blockNumber;
@@ -104,7 +104,7 @@ public class S7Field implements PlcField {
         this.numElements = numElements;
     }
 
-    public S7DataType getDataType() {
+    public TransportSize getDataType() {
         return dataType;
     }
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
index d191d03..d40f953 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
@@ -47,7 +47,7 @@ import org.apache.plc4x.java.s7.netty.strategies.DefaultS7MessageProcessor;
 import org.apache.plc4x.java.s7.netty.strategies.S7MessageProcessor;
 import org.apache.plc4x.java.s7.netty.util.S7SizeHelper;
 import org.apache.plc4x.java.s7.types.S7ControllerType;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -713,7 +713,7 @@ public class S7Protocol extends ChannelDuplexHandler {
             }
             VariableAddressingMode variableAddressingMode = VariableAddressingMode.valueOf(in.readByte());
             if (variableAddressingMode == VariableAddressingMode.S7ANY) {
-                S7DataType dataType = S7DataType.valueOf(in.readByte());
+                TransportSize dataType = TransportSize.valueOf(in.readByte());
                 short length = in.readShort();
                 short dbNumber = in.readShort();
                 MemoryArea memoryArea = MemoryArea.valueOf(in.readByte());
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/S7AnyVarParameterItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/S7AnyVarParameterItem.java
index 5c0461a..b1849f8 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/S7AnyVarParameterItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/S7AnyVarParameterItem.java
@@ -20,9 +20,8 @@ package org.apache.plc4x.java.s7.netty.model.params.items;
 
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
 import org.apache.plc4x.java.s7.netty.model.types.SpecificationType;
-import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.apache.plc4x.java.s7.netty.model.types.VariableAddressingMode;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 /**
  * "Low-level" description of S7 Address range and the necessary size for transportation of values.
@@ -43,13 +42,13 @@ public class S7AnyVarParameterItem implements VarParameterItem {
 
     private final SpecificationType specificationType;
     private final MemoryArea memoryArea;
-    private final S7DataType dataType;
+    private final TransportSize dataType;
     private final int numElements;
     private final short dataBlockNumber;
     private final short byteOffset;
     private final byte bitOffset;
 
-    public S7AnyVarParameterItem(SpecificationType specificationType, MemoryArea memoryArea, S7DataType dataType, int numElements, short dataBlockNumber, short byteOffset, byte bitOffset) {
+    public S7AnyVarParameterItem(SpecificationType specificationType, MemoryArea memoryArea, TransportSize dataType, int numElements, short dataBlockNumber, short byteOffset, byte bitOffset) {
         this.specificationType = specificationType;
         this.memoryArea = memoryArea;
         this.dataType = dataType;
@@ -72,7 +71,7 @@ public class S7AnyVarParameterItem implements VarParameterItem {
         return memoryArea;
     }
 
-    public S7DataType getDataType() {
+    public TransportSize getDataType() {
         return dataType;
     }
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
index 9f29cf9..c0c35a7 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
@@ -70,34 +70,4 @@ public enum DataTransportSize {
         return map.get(code);
     }
 
-    public static DataTransportSize getForTransportSize(TransportSize transportSize) {
-        switch (transportSize) {
-            case BIT:
-                return BIT;
-            case INT:
-                return INTEGER;
-            case DINT:
-                return DINTEGER;
-            case BYTE:
-            case WORD:
-            case DWORD:
-                return BYTE_WORD_DWORD;
-            case CHAR:
-                return OCTET_STRING;
-            case REAL:
-                return REAL;
-            case TIME:
-            case TOD:
-            case TIMER:
-            case S5TIME:
-            case COUNTER:
-            case IEC_TIMER:
-            case HS_COUNTER:
-            case IEC_COUNTER:
-            case DATE_AND_TIME:
-            default:
-                return null;
-        }
-    }
-
 }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/TransportSize.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/TransportSize.java
index d6f57e1..f203789 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/TransportSize.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/TransportSize.java
@@ -1,70 +1,193 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.plc4x.java.s7.netty.model.types;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
 
-import java.util.HashMap;
-import java.util.Map;
+     http://www.apache.org/licenses/LICENSE-2.0
 
-/**
- * (Values determined by evaluating generated ".pcapng" files)
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
  */
+package org.apache.plc4x.java.s7.netty.model.types;
+
+import org.apache.plc4x.java.s7.types.S7ControllerType;
+
+import java.util.*;
+
 public enum TransportSize {
-    BIT((byte) 0x01, 1),
-    BYTE((byte) 0x02, 1),
-    CHAR((byte) 0x03, 1),
-    WORD((byte) 0x04, 2),
-    INT((byte) 0x05, 2),
-    DWORD((byte) 0x06, 4),
-    DINT((byte) 0x07, 4),
-    REAL((byte) 0x08, 4),
-    TOD((byte) 0x0A, 4),
-    TIME((byte) 0x0B, 4),
-    S5TIME((byte) 0x0C, 2),
-    DATE_AND_TIME((byte) 0x0F, 4),
-    COUNTER((byte) 0x1C, -1),
-    TIMER((byte) 0x1D, -1),
-    IEC_TIMER((byte) 0x1E, -1),
-    IEC_COUNTER((byte) 0x1F, -1),
-    HS_COUNTER((byte) 0x20, -1);
-
-    private final byte code;
-    private final int sizeInBytes;
-
-    TransportSize(byte code, int sizeInBytes) {
-        this.code = code;
+
+    /**
+     * TODO: For the types with code 0x00 we need to put some additional effort in reverse engineering the codes for these types.
+     */
+    // -----------------------------------------
+    // Single bit
+    // -----------------------------------------
+    BOOL(0x01, "X", 1, null, DataTransportSize.BIT, S7ControllerType.S7_ANY),
+
+    // -----------------------------------------
+    // Bit strings
+    // -----------------------------------------
+    BYTE(0x02, "B", 1, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    WORD(0x04, "W", 2, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    DWORD(0x06, "D", 4, WORD, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    // Only got a basic TIA license (S7-1500 needed to find this out)
+    // TODO: Find the code
+    LWORD(0x00, "X", 8, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+
+    // -----------------------------------------
+    // Integers
+    // -----------------------------------------
+    // Signed Int
+    INT(0x05, "W", 2, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    // Unsigned Int
+    UINT(0x05, "W", 2, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+    // (Signed) Small Int
+    SINT(0x02, "B", 1, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+    // Unsigned Small Int
+    USINT(0x02, "B", 1, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+    // Double Precision Int
+    DINT(0x07, "D", 4, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    // Unsigned Double Precision Int
+    UDINT(0x07, "D", 4, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+    // Only got a basic TIA license (S7-1500 needed to find this out)
+    // TODO: Find the code
+    LINT(0x00, "X", 8, INT, null, S7ControllerType.S7_1500),
+    // Only got a basic TIA license (S7-1500 needed to find this out)
+    // TODO: Find the code
+    ULINT(0x00, "X", 16, INT, null, S7ControllerType.S7_1500),
+
+    // -----------------------------------------
+    // Reals
+    // -----------------------------------------
+    REAL(0x08, "D", 4, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    // TODO: Find the code
+    LREAL(0x00, "X", 8, REAL, null, S7ControllerType.S7_1200, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+
+    // -----------------------------------------
+    // Durations
+    // -----------------------------------------
+    // IEC time
+    TIME(0x0B, "X", 4, null, null, S7ControllerType.S7_ANY),
+    // TODO: Find the code
+    LTIME(0x00, "X", 8, TIME, null, S7ControllerType.S7_1500),
+
+    // -----------------------------------------
+    // Date
+    // -----------------------------------------
+    // IEC date (yyyy-m-d)
+    // TODO: Find the code
+    DATE(0x00, "X", 2, null, null, S7ControllerType.S7_ANY),
+
+    // -----------------------------------------
+    // Time of day
+    // -----------------------------------------
+    // Time (hh:mm:ss.S)
+    TIME_OF_DAY(0x0A, "X", 4, null, null, S7ControllerType.S7_ANY),
+
+    // -----------------------------------------
+    // Date and time of day
+    // -----------------------------------------
+    DATE_AND_TIME(0x0F, "X", 8, null, null, S7ControllerType.S7_ANY),
+
+    // -----------------------------------------
+    // ASCII Strings
+    // -----------------------------------------
+    // Single-byte character
+    CHAR(0x03, "B", 1, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
+    // Double-byte character
+    WCHAR(0x13, "X", 2, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
+    // Variable-length single-byte character string
+    // TODO: Find the code (Eventually 0x03)
+    STRING(0x00, "X", -1, null, null, S7ControllerType.S7_ANY),
+    // Variable-length double-byte character string
+    // TODO: Find the code (Eventually 0x13)
+    WSTRING(0x00, "X", -1, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500);
+
+    /* TO BE CONTINUED */
+
+    // Codes and their types:
+    // 0x1C: Counter
+    // 0x1D: Timer
+    // 0x1E: IEC Timer
+    // 0x1F: IEC Counter
+    // 0x20: HS Counter
+    //
+
+    private final byte typeCode;
+    private final String sizeCode;
+    private int sizeInBytes;
+    private final Set<S7ControllerType> supportedControllerTypes;
+    private final TransportSize baseType;
+    private final DataTransportSize dataTransportSize;
+
+    TransportSize(int typeCode, String sizeCode, int sizeInBytes, TransportSize baseType, DataTransportSize dataTransportSize,
+                  S7ControllerType... supportedControllerTypes) {
+        this.typeCode = (byte) typeCode;
+        this.sizeCode = sizeCode;
         this.sizeInBytes = sizeInBytes;
+        this.supportedControllerTypes = new HashSet<>(Arrays.asList(supportedControllerTypes));
+        this.baseType = baseType;
+        this.dataTransportSize = dataTransportSize;
+    }
+
+    public byte getTypeCode() {
+        return typeCode;
     }
 
-    public byte getCode() {
-        return code;
+    public String getSizeCode() {
+        return sizeCode;
     }
 
     public int getSizeInBytes() {
         return sizeInBytes;
     }
 
+    public boolean isBaseType() {
+        return baseType == null;
+    }
+
+    TransportSize getBaseType() {
+        // If this is a base-type itself, the baseType is null, in all
+        // other cases it is set.
+        if (baseType == null) {
+            return this;
+        } else {
+            return baseType;
+        }
+    }
+
+    TransportSize getSubType(String sizeCode) {
+        // Try to find a sub-type with this base type for which the size code matches.
+        for (TransportSize value : values()) {
+            if ((value.baseType == this) && (value.sizeCode != null) && (value.sizeCode.equals(sizeCode))) {
+                return value;
+            }
+        }
+        return null;
+    }
+
+    public DataTransportSize getDataTransportSize() {
+        return dataTransportSize;
+    }
+
+    boolean isControllerTypeSupported(S7ControllerType controllerType) {
+        return supportedControllerTypes.contains(controllerType);
+    }
+
     private final static Map<Byte, TransportSize> map;
 
     static {
         map = new HashMap<>();
-        for (TransportSize transportSize : TransportSize.values()) {
-            map.put(transportSize.code, transportSize);
+        for (TransportSize dataType : TransportSize.values()) {
+            map.put(dataType.typeCode, dataType);
         }
     }
 
@@ -72,4 +195,4 @@ public enum TransportSize {
         return map.get(code);
     }
 
-}
+}
\ No newline at end of file
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessor.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessor.java
index d6238a6..5701953 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessor.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessor.java
@@ -35,7 +35,7 @@ import org.apache.plc4x.java.s7.netty.model.types.MessageType;
 import org.apache.plc4x.java.s7.netty.model.types.ParameterType;
 import org.apache.plc4x.java.s7.netty.util.S7RequestSizeCalculator;
 import org.apache.plc4x.java.s7.netty.util.S7ResponseSizeEstimator;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -168,7 +168,7 @@ public class DefaultS7MessageProcessor implements S7MessageProcessor {
                     if (varParameterItem instanceof S7AnyVarParameterItem) {
                         S7AnyVarParameterItem s7AnyVarParameterItem = (S7AnyVarParameterItem) varParameterItem;
                         short byteOffset = s7AnyVarParameterItem.getByteOffset();
-                        if (s7AnyVarParameterItem.getDataType() == S7DataType.BOOL) {
+                        if (s7AnyVarParameterItem.getDataType() == TransportSize.BOOL) {
                             byte bitOffset = 0;
                             for (int i = 0; i < s7AnyVarParameterItem.getNumElements(); i++) {
                                 // Create a new message with only one single value item in the var parameter.
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
index fd8ad5d..6e9b36d 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
@@ -27,7 +27,7 @@ import org.apache.plc4x.java.base.messages.items.DefaultTimeFieldItem;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.math.BigInteger;
 import java.nio.charset.Charset;
@@ -49,9 +49,9 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     public FieldItem encodeBoolean(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
         // All of these types are declared as Bit or Bit-String types.
-        if ((s7Field.getDataType() == S7DataType.BOOL) || (s7Field.getDataType() == S7DataType.BYTE) ||
-            (s7Field.getDataType() == S7DataType.WORD) || (s7Field.getDataType() == S7DataType.DWORD) ||
-            (s7Field.getDataType() == S7DataType.LWORD)) {
+        if ((s7Field.getDataType() == TransportSize.BOOL) || (s7Field.getDataType() == TransportSize.BYTE) ||
+            (s7Field.getDataType() == TransportSize.WORD) || (s7Field.getDataType() == TransportSize.DWORD) ||
+            (s7Field.getDataType() == TransportSize.LWORD)) {
             return internalEncodeBoolean(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -60,8 +60,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeByte(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.BYTE) || (s7Field.getDataType() == S7DataType.SINT) ||
-            (s7Field.getDataType() == S7DataType.USINT) || (s7Field.getDataType() == S7DataType.CHAR)) {
+        if ((s7Field.getDataType() == TransportSize.BYTE) || (s7Field.getDataType() == TransportSize.SINT) ||
+            (s7Field.getDataType() == TransportSize.USINT) || (s7Field.getDataType() == TransportSize.CHAR)) {
             return internalEncodeInteger(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -70,8 +70,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeShort(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.WORD) || (s7Field.getDataType() == S7DataType.INT) ||
-            (s7Field.getDataType() == S7DataType.UINT)) {
+        if ((s7Field.getDataType() == TransportSize.WORD) || (s7Field.getDataType() == TransportSize.INT) ||
+            (s7Field.getDataType() == TransportSize.UINT)) {
             return internalEncodeInteger(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -80,8 +80,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.DWORD) || (s7Field.getDataType() == S7DataType.DINT) ||
-            (s7Field.getDataType() == S7DataType.UDINT)) {
+        if ((s7Field.getDataType() == TransportSize.DWORD) || (s7Field.getDataType() == TransportSize.DINT) ||
+            (s7Field.getDataType() == TransportSize.UDINT)) {
             return internalEncodeInteger(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -90,8 +90,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeBigInteger(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.DWORD) || (s7Field.getDataType() == S7DataType.DINT) ||
-            (s7Field.getDataType() == S7DataType.UDINT)) {
+        if ((s7Field.getDataType() == TransportSize.DWORD) || (s7Field.getDataType() == TransportSize.DINT) ||
+            (s7Field.getDataType() == TransportSize.UDINT)) {
             return internalEncodeInteger(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -100,8 +100,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeLong(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.LWORD) || (s7Field.getDataType() == S7DataType.LINT) ||
-            (s7Field.getDataType() == S7DataType.ULINT)) {
+        if ((s7Field.getDataType() == TransportSize.LWORD) || (s7Field.getDataType() == TransportSize.LINT) ||
+            (s7Field.getDataType() == TransportSize.ULINT)) {
             return internalEncodeInteger(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -110,7 +110,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeFloat(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if (s7Field.getDataType() == S7DataType.REAL) {
+        if (s7Field.getDataType() == TransportSize.REAL) {
             return internalEncodeFloatingPoint(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -119,7 +119,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDouble(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if (s7Field.getDataType() == S7DataType.LREAL) {
+        if (s7Field.getDataType() == TransportSize.LREAL) {
             return internalEncodeFloatingPoint(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -128,8 +128,8 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeString(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if ((s7Field.getDataType() == S7DataType.CHAR) || (s7Field.getDataType() == S7DataType.WCHAR) ||
-            (s7Field.getDataType() == S7DataType.STRING) || (s7Field.getDataType() == S7DataType.WSTRING)) {
+        if ((s7Field.getDataType() == TransportSize.CHAR) || (s7Field.getDataType() == TransportSize.WCHAR) ||
+            (s7Field.getDataType() == TransportSize.STRING) || (s7Field.getDataType() == TransportSize.WSTRING)) {
             return internalEncodeString(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -138,7 +138,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if (s7Field.getDataType() == S7DataType.TIME) {
+        if (s7Field.getDataType() == TransportSize.TIME) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -147,7 +147,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDate(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if (s7Field.getDataType() == S7DataType.DATE) {
+        if (s7Field.getDataType() == TransportSize.DATE) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
@@ -156,7 +156,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
     @Override
     public FieldItem encodeDateTime(PlcField field, Object[] values) {
         S7Field s7Field = (S7Field) field;
-        if (s7Field.getDataType() == S7DataType.DATE_AND_TIME) {
+        if (s7Field.getDataType() == TransportSize.DATE_AND_TIME) {
             return internalEncodeTemporal(field, values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + s7Field.getDataType().name());
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java
index c030483..a0e66b8 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java
@@ -25,7 +25,7 @@ import org.apache.plc4x.java.s7.netty.model.params.VarParameter;
 import org.apache.plc4x.java.s7.netty.model.params.items.S7AnyVarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.params.items.VarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
 import java.util.List;
 
@@ -157,7 +157,7 @@ public class S7ResponseSizeEstimator {
         length +=
             s7AnyVarParameterItem.getNumElements() * s7AnyVarParameterItem.getDataType().getSizeInBytes();
         // It seems that bit payloads need a additional separating 0x00 byte.
-        if(s7AnyVarParameterItem.getDataType() == S7DataType.BOOL) {
+        if(s7AnyVarParameterItem.getDataType() == TransportSize.BOOL) {
             length += 1;
         }
         return length;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/types/S7DataType.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/types/S7DataType.java
deleted file mode 100644
index e325ffa..0000000
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/types/S7DataType.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-package org.apache.plc4x.java.s7.types;
-
-import org.apache.plc4x.java.s7.netty.model.types.DataTransportSize;
-
-import java.util.*;
-
-public enum S7DataType {
-
-    /**
-     * TODO: For the types with code 0x00 we need to put some additional effort in reverse engineering the codes for these types.
-     */
-    // -----------------------------------------
-    // Single bit
-    // -----------------------------------------
-    BOOL(0x01, "X", 1, null, DataTransportSize.BIT, S7ControllerType.S7_ANY),
-
-    // -----------------------------------------
-    // Bit strings
-    // -----------------------------------------
-    BYTE(0x02, "B", 1, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    WORD(0x04, "W", 2, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    DWORD(0x06, "D", 4, WORD, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    // Only got a basic TIA license (S7-1500 needed to find this out)
-    // TODO: Find the code
-    LWORD(0x00, "X", 8, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-
-    // -----------------------------------------
-    // Integers
-    // -----------------------------------------
-    // Signed Int
-    INT(0x05, "W", 2, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    // Unsigned Int
-    UINT(0x05, "W", 2, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-    // (Signed) Small Int
-    SINT(0x02, "B", 1, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-    // Unsigned Small Int
-    USINT(0x02, "B", 1, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-    // Double Precision Int
-    DINT(0x07, "D", 4, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    // Unsigned Double Precision Int
-    UDINT(0x07, "D", 4, INT, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-    // Only got a basic TIA license (S7-1500 needed to find this out)
-    // TODO: Find the code
-    LINT(0x00, "X", 8, INT, null, S7ControllerType.S7_1500),
-    // Only got a basic TIA license (S7-1500 needed to find this out)
-    // TODO: Find the code
-    ULINT(0x00, "X", 16, INT, null, S7ControllerType.S7_1500),
-
-    // -----------------------------------------
-    // Reals
-    // -----------------------------------------
-    REAL(0x08, "D", 4, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    // TODO: Find the code
-    LREAL(0x00, "X", 8, REAL, null, S7ControllerType.S7_1200, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-
-    // -----------------------------------------
-    // Durations
-    // -----------------------------------------
-    // IEC time
-    TIME(0x0B, "X", 4, null, null, S7ControllerType.S7_ANY),
-    // TODO: Find the code
-    LTIME(0x00, "X", 8, TIME, null, S7ControllerType.S7_1500),
-
-    // -----------------------------------------
-    // Date
-    // -----------------------------------------
-    // IEC date (yyyy-m-d)
-    // TODO: Find the code
-    DATE(0x00, "X", 2, null, null, S7ControllerType.S7_ANY),
-
-    // -----------------------------------------
-    // Time of day
-    // -----------------------------------------
-    // Time (hh:mm:ss.S)
-    TIME_OF_DAY(0x0A, "X", 4, null, null, S7ControllerType.S7_ANY),
-
-    // -----------------------------------------
-    // Date and time of day
-    // -----------------------------------------
-    DATE_AND_TIME(0x0F, "X", 8, null, null, S7ControllerType.S7_ANY),
-
-    // -----------------------------------------
-    // ASCII Strings
-    // -----------------------------------------
-    // Single-byte character
-    CHAR(0x03, "B", 1, null, DataTransportSize.BYTE_WORD_DWORD, S7ControllerType.S7_ANY),
-    // Double-byte character
-    WCHAR(0x13, "X", 2, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500),
-    // Variable-length single-byte character string
-    // TODO: Find the code (Eventually 0x03)
-    STRING(0x00, "X", -1, null, null, S7ControllerType.S7_ANY),
-    // Variable-length double-byte character string
-    // TODO: Find the code (Eventually 0x13)
-    WSTRING(0x00, "X", -1, null, null, S7ControllerType.S7_1200, S7ControllerType.S7_1500);
-
-    /* TO BE CONTINUED */
-
-    // Codes and their types:
-    // 0x1C: Counter
-    // 0x1D: Timer
-    // 0x1E: IEC Timer
-    // 0x1F: IEC Counter
-    // 0x20: HS Counter
-    //
-
-    private final byte typeCode;
-    private final String sizeCode;
-    private int sizeInBytes;
-    private final Set<S7ControllerType> supportedControllerTypes;
-    private final S7DataType baseType;
-    private final DataTransportSize dataTransportSize;
-
-    S7DataType(int typeCode, String sizeCode, int sizeInBytes, S7DataType baseType, DataTransportSize dataTransportSize,
-               S7ControllerType... supportedControllerTypes) {
-        this.typeCode = (byte) typeCode;
-        this.sizeCode = sizeCode;
-        this.sizeInBytes = sizeInBytes;
-        this.supportedControllerTypes = new HashSet<>(Arrays.asList(supportedControllerTypes));
-        this.baseType = baseType;
-        this.dataTransportSize = dataTransportSize;
-    }
-
-    public byte getTypeCode() {
-        return typeCode;
-    }
-
-    public String getSizeCode() {
-        return sizeCode;
-    }
-
-    public int getSizeInBytes() {
-        return sizeInBytes;
-    }
-
-    public boolean isBaseType() {
-        return baseType == null;
-    }
-
-    S7DataType getBaseType() {
-        // If this is a base-type itself, the baseType is null, in all
-        // other cases it is set.
-        if (baseType == null) {
-            return this;
-        } else {
-            return baseType;
-        }
-    }
-
-    S7DataType getSubType(String sizeCode) {
-        // Try to find a sub-type with this base type for which the size code matches.
-        for (S7DataType value : values()) {
-            if ((value.baseType == this) && (value.sizeCode != null) && (value.sizeCode.equals(sizeCode))) {
-                return value;
-            }
-        }
-        return null;
-    }
-
-    public DataTransportSize getDataTransportSize() {
-        return dataTransportSize;
-    }
-
-    boolean isControllerTypeSupported(S7ControllerType controllerType) {
-        return supportedControllerTypes.contains(controllerType);
-    }
-
-    private final static Map<Byte, S7DataType> map;
-
-    static {
-        map = new HashMap<>();
-        for (S7DataType dataType : S7DataType.values()) {
-            map.put(dataType.typeCode, dataType);
-        }
-    }
-
-    public static S7DataType valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
index abab817..d6c11d9 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
@@ -19,10 +19,9 @@ under the License.
 
 package org.apache.plc4x.java.s7.model;
 
-import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.apache.plc4x.test.FastTests;
 import org.junit.experimental.categories.Category;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -40,10 +39,10 @@ class S7FieldTests {
 
     private static Stream<Arguments> validFieldQueries() {
         return Stream.of(
-            Arguments.of("%I0.1:BOOL",          S7DataType.BOOL,  MemoryArea.INPUTS,      0,  0,  1),
-            Arguments.of("%ID64:REAL",          S7DataType.REAL,  MemoryArea.INPUTS,      0,  64, 0),
-            Arguments.of("%Q0.4:BOOL",          S7DataType.BOOL,  MemoryArea.OUTPUTS,     0,  0,  4),
-            Arguments.of("%DB1.DBX38.1:BOOL",   S7DataType.BOOL,  MemoryArea.DATA_BLOCKS, 1,  38, 1)/*,
+            Arguments.of("%I0.1:BOOL",          TransportSize.BOOL,  MemoryArea.INPUTS,      0,  0,  1),
+            Arguments.of("%ID64:REAL",          TransportSize.REAL,  MemoryArea.INPUTS,      0,  64, 0),
+            Arguments.of("%Q0.4:BOOL",          TransportSize.BOOL,  MemoryArea.OUTPUTS,     0,  0,  4),
+            Arguments.of("%DB1.DBX38.1:BOOL",   TransportSize.BOOL,  MemoryArea.DATA_BLOCKS, 1,  38, 1)/*,
             // Not quite sure about how Data Block addresses look like, in my TIA portal they all have the prefix "DB".
             Arguments.of("%DB3.DX4.1:BOOL",     S7DataType.BOOL,  MemoryArea.DATA_BLOCKS, 3,  4,  1),
             Arguments.of("%DB3.DB4:INT",        S7DataType.INT,   MemoryArea.DATA_BLOCKS, 3,  4,  0),
@@ -63,7 +62,7 @@ class S7FieldTests {
     @ParameterizedTest
     @Category(FastTests.class)
     @MethodSource("validFieldQueries")
-    void testValidFieldQueryParsing(String fieldQuery, S7DataType expectedClientType, MemoryArea expectedMemoryArea,
+    void testValidFieldQueryParsing(String fieldQuery, TransportSize expectedClientType, MemoryArea expectedMemoryArea,
                                     int expectedMemoryBlockNumber, int expectedByteOffset, int expectedBitOffset) {
         S7Field field = S7Field.of(fieldQuery);
         assertThat(field, notNullValue());
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/messages/S7MessageTests.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/messages/S7MessageTests.java
index a5afb8e..0d5ba10 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/messages/S7MessageTests.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/messages/S7MessageTests.java
@@ -28,7 +28,7 @@ import org.apache.plc4x.java.s7.netty.model.payloads.S7Payload;
 import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload;
 import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
 import org.apache.plc4x.java.s7.netty.model.types.*;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.apache.plc4x.test.FastTests;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -106,7 +106,7 @@ public class S7MessageTests {
         List<VarParameterItem> parameterItems = new ArrayList<>();
         SpecificationType specificationType = SpecificationType.VARIABLE_SPECIFICATION;
         MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
-        S7DataType dataType = S7DataType.INT;
+        TransportSize dataType = TransportSize.INT;
         short numElements = 1;
         byte dataBlock = (byte) 0x1;
         byte byteOffset = (byte) 0x10;
@@ -170,7 +170,7 @@ public class S7MessageTests {
         List<VarParameterItem> parameterItems = new ArrayList<>();
         SpecificationType specificationType = SpecificationType.VARIABLE_SPECIFICATION;
         MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
-        S7DataType dataType = S7DataType.INT;
+        TransportSize dataType = TransportSize.INT;
         int numElements = 1;
         byte dataBlock = (byte) 0x1;
         byte byteOffset = (byte) 0x10;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/params/S7ParameterTests.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/params/S7ParameterTests.java
index 413185e..43d9c85 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/params/S7ParameterTests.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/params/S7ParameterTests.java
@@ -22,7 +22,7 @@ package org.apache.plc4x.java.s7.netty.model.params;
 import org.apache.plc4x.java.s7.netty.model.params.items.S7AnyVarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.params.items.VarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.types.*;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.apache.plc4x.test.FastTests;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -42,7 +42,7 @@ public class S7ParameterTests {
         ArrayList<VarParameterItem> parameterItems = new ArrayList<>();
         SpecificationType specificationType = SpecificationType.VARIABLE_SPECIFICATION;
         MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
-        S7DataType dataType = S7DataType.INT;
+        TransportSize dataType = TransportSize.INT;
         short numElements = 1;
         byte dataBlock = (byte) 0x1;
         byte byteOffset = (byte) 0x10;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/types/S7TypeTests.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/types/S7TypeTests.java
index 21b5357..bf0c7c0 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/types/S7TypeTests.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/types/S7TypeTests.java
@@ -120,7 +120,7 @@ public class S7TypeTests {
         TransportSize transportSize = TransportSize.TIME;
 
         assertThat("0x0B incorrectly mapped", TransportSize.valueOf((byte) 0x0B), equalTo(TransportSize.TIME));
-        assertThat("code is not 0x0B", transportSize.getCode(), equalTo((byte) 0x0B));
+        assertThat("code is not 0x0B", transportSize.getTypeCode(), equalTo((byte) 0x0B));
     }
 
     @Test
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessorTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessorTest.java
index 296732c..c5d5233 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessorTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessorTest.java
@@ -27,7 +27,7 @@ import org.apache.plc4x.java.s7.netty.model.params.items.VarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload;
 import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
 import org.apache.plc4x.java.s7.netty.model.types.*;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.hamcrest.core.IsCollectionContaining;
 import org.junit.Before;
 import org.junit.Test;
@@ -61,7 +61,7 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createReadMessage(
             Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0)));
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0)));
         Collection<? extends S7RequestMessage> processedRequests = SUT.processRequest(request, 250);
 
         assertThat(processedRequests, notNullValue());
@@ -84,9 +84,9 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createReadMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0)));
+                    TransportSize.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0)));
         Collection<? extends S7RequestMessage> processedRequests = SUT.processRequest(request, 250);
 
         assertThat(processedRequests, notNullValue());
@@ -109,43 +109,43 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createReadMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 3, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 3, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 4, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 4, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 5, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 5, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 6, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 6, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 7, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 7, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 8, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 8, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 9, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 9, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 10, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 10, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 11, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 11, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 12, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 12, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 13, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 13, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 14, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 14, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 15, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 15, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 16, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 16, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 17, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 17, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 18, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 18, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 19, (short) 0, (byte) 0)));
+                    TransportSize.BYTE, (short) 1, (short) 19, (short) 0, (byte) 0)));
         Collection<? extends S7RequestMessage> processedRequests = SUT.processRequest(request, 250);
 
         assertThat(processedRequests, notNullValue());
@@ -169,45 +169,45 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createReadMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 2, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 3, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 3, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 4, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 4, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 5, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 5, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 6, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 6, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 7, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 7, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 8, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 8, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 9, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 9, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 10, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 10, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 11, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 11, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 12, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 12, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 13, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 13, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 14, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 14, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 15, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 15, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 16, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 16, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 17, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 17, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 18, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 18, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 19, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 19, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 20, (short) 0, (byte) 0)));
+                    TransportSize.BYTE, (short) 1, (short) 20, (short) 0, (byte) 0)));
         Collection<? extends S7RequestMessage> processedRequests = SUT.processRequest(request, 250);
 
         assertThat(processedRequests, notNullValue());
@@ -240,9 +240,9 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createReadMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 200, (short) 1, (short) 0, (byte) 0),
+                    TransportSize.BYTE, (short) 200, (short) 1, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 200, (short) 2, (short) 0, (byte) 0)));
+                    TransportSize.BYTE, (short) 200, (short) 2, (short) 0, (byte) 0)));
         Collection<? extends S7RequestMessage> processedRequests = SUT.processRequest(request, 256);
 
         assertThat(processedRequests, notNullValue());
@@ -266,7 +266,7 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0)),
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 0, (byte) 0)),
             Collections.singletonList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {0x00}))
             );
@@ -301,7 +301,7 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BOOL, (short) 10, (short) 1, (short) 0, (byte) 0)),
+                    TransportSize.BOOL, (short) 10, (short) 1, (short) 0, (byte) 0)),
             Collections.singletonList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[] {
                     (byte) 0xAA, (byte) 0x02}))
@@ -333,7 +333,7 @@ public class DefaultS7MessageProcessorTest {
             assertThat(parameterItem.getAddressingMode(), is(VariableAddressingMode.S7ANY));
             S7AnyVarParameterItem s7AnyParameterItem = (S7AnyVarParameterItem) parameterItem;
             assertThat(s7AnyParameterItem.getMemoryArea(), is(MemoryArea.DATA_BLOCKS));
-            assertThat(s7AnyParameterItem.getDataType(), is(S7DataType.BOOL));
+            assertThat(s7AnyParameterItem.getDataType(), is(TransportSize.BOOL));
             assertThat(s7AnyParameterItem.getNumElements(), is(1));
             String fieldString = Short.toString(
                 s7AnyParameterItem.getByteOffset()) + "/" + Byte.toString(s7AnyParameterItem.getBitOffset());
@@ -365,7 +365,7 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 10, (short) 1, (short) 0, (byte) 0)),
+                    TransportSize.BYTE, (short) 10, (short) 1, (short) 0, (byte) 0)),
             Collections.singletonList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {
                     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A}))
@@ -397,7 +397,7 @@ public class DefaultS7MessageProcessorTest {
             assertThat(parameterItem.getAddressingMode(), is(VariableAddressingMode.S7ANY));
             S7AnyVarParameterItem s7AnyParameterItem = (S7AnyVarParameterItem) parameterItem;
             assertThat(s7AnyParameterItem.getMemoryArea(), is(MemoryArea.DATA_BLOCKS));
-            assertThat(s7AnyParameterItem.getDataType(), is(S7DataType.BYTE));
+            assertThat(s7AnyParameterItem.getDataType(), is(TransportSize.BYTE));
             assertThat(s7AnyParameterItem.getNumElements(), is(1));
             // Check the field is in the expected range and hasn't been used yet.
             assertThat(expectedFields.contains(s7AnyParameterItem.getByteOffset()), is(true));
@@ -428,7 +428,7 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.DWORD, (short) 10, (short) 1, (short) 0, (byte) 0)),
+                    TransportSize.DWORD, (short) 10, (short) 1, (short) 0, (byte) 0)),
             Collections.singletonList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {
                     0x00, 0x00, 0x00, 0x01,
@@ -468,7 +468,7 @@ public class DefaultS7MessageProcessorTest {
             assertThat(parameterItem.getAddressingMode(), is(VariableAddressingMode.S7ANY));
             S7AnyVarParameterItem s7AnyParameterItem = (S7AnyVarParameterItem) parameterItem;
             assertThat(s7AnyParameterItem.getMemoryArea(), is(MemoryArea.DATA_BLOCKS));
-            assertThat(s7AnyParameterItem.getDataType(), is(S7DataType.DWORD));
+            assertThat(s7AnyParameterItem.getDataType(), is(TransportSize.DWORD));
             assertThat(s7AnyParameterItem.getNumElements(), is(1));
             // Check the field is in the expected range and hasn't been used yet.
             assertThat(expectedFields.contains(s7AnyParameterItem.getByteOffset()), is(true));
@@ -499,15 +499,15 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BOOL, (short) 1, (short) 1, (short) 0, (byte) 0),
+                    TransportSize.BOOL, (short) 1, (short) 1, (short) 0, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 1, (short) 1, (byte) 0),
+                    TransportSize.BYTE, (short) 1, (short) 1, (short) 1, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.DWORD, (short) 1, (short) 1, (short) 2, (byte) 0),
+                    TransportSize.DWORD, (short) 1, (short) 1, (short) 2, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.REAL, (short) 1, (short) 1, (short) 5, (byte) 0),
+                    TransportSize.REAL, (short) 1, (short) 1, (short) 5, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.INT, (short) 1, (short) 1, (short) 9, (byte) 0)),
+                    TransportSize.INT, (short) 1, (short) 1, (short) 9, (byte) 0)),
             Arrays.asList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BIT, new byte[] {0x01}),
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {0x02}),
@@ -547,9 +547,9 @@ public class DefaultS7MessageProcessorTest {
         S7RequestMessage request = createWriteMessage(
             Arrays.asList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 2, (short) 1, (short) 1, (byte) 0),
+                    TransportSize.BYTE, (short) 2, (short) 1, (short) 1, (byte) 0),
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.DWORD, (short) 2, (short) 1, (short) 2, (byte) 0)),
+                    TransportSize.DWORD, (short) 2, (short) 1, (short) 2, (byte) 0)),
             Arrays.asList(
                 new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[] {
                     0x01, 0x02}),
@@ -618,7 +618,7 @@ public class DefaultS7MessageProcessorTest {
             Collections.singletonList(
                 new VarParameter(ParameterType.READ_VAR, new LinkedList<>(Collections.singletonList(
                     new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                        S7DataType.BYTE, (short) 1, (short) 1, (short) 2, (byte) 0))))),
+                        TransportSize.BYTE, (short) 1, (short) 1, (short) 2, (byte) 0))))),
             Collections.singletonList(
                 new VarPayload(ParameterType.READ_VAR, new LinkedList<>(Collections.singletonList(
                     new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[]{0x42}))))),
@@ -633,7 +633,7 @@ public class DefaultS7MessageProcessorTest {
             Collections.singletonList(
                 new VarParameter(ParameterType.READ_VAR, new LinkedList<>(Collections.singletonList(
                     new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                        S7DataType.BYTE, (short) 1, (short) 3, (short) 4, (byte) 0))))),
+                        TransportSize.BYTE, (short) 1, (short) 3, (short) 4, (byte) 0))))),
             Collections.singletonList(
                 new VarPayload(ParameterType.READ_VAR, new LinkedList<>(Collections.singletonList(
                     new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[]{0x23}))))),
@@ -682,7 +682,7 @@ public class DefaultS7MessageProcessorTest {
             Collections.singletonList(
                 new VarParameter(ParameterType.WRITE_VAR, new LinkedList<>(Collections.singletonList(
                     new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                        S7DataType.BYTE, (short) 1, (short) 1, (short) 2, (byte) 0))))),
+                        TransportSize.BYTE, (short) 1, (short) 1, (short) 2, (byte) 0))))),
             Collections.singletonList(
                 new VarPayload(ParameterType.WRITE_VAR, new LinkedList<>(Collections.singletonList(
                     new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[]{0x42}))))),
@@ -697,7 +697,7 @@ public class DefaultS7MessageProcessorTest {
             Collections.singletonList(
                 new VarParameter(ParameterType.WRITE_VAR, new LinkedList<>(Collections.singletonList(
                     new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                        S7DataType.BYTE, (short) 1, (short) 3, (short) 4, (byte) 0))))),
+                        TransportSize.BYTE, (short) 1, (short) 3, (short) 4, (byte) 0))))),
             Collections.singletonList(
                 new VarPayload(ParameterType.WRITE_VAR, new LinkedList<>(Collections.singletonList(
                     new VarPayloadItem(DataTransportErrorCode.OK, DataTransportSize.BYTE_WORD_DWORD, new byte[]{0x23}))))),
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
index e273c4a..d938fc0 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
@@ -23,7 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
@@ -257,11 +257,11 @@ class S7PlcFieldHandlerTest {
 
     private static Stream<Arguments> createInputArrays() {
         // Generate valid fields for each s7 type.
-        Map<S7DataType, PlcField> fields = new HashMap<>();
-        for (S7DataType s7Type : S7DataType.values()) {
+        Map<TransportSize, PlcField> fields = new HashMap<>();
+        for (TransportSize s7Type : TransportSize.values()) {
             String sizeCode = (s7Type.getSizeCode() != null) ? s7Type.getSizeCode() : "X";
             String fieldQuery = "%DB1.DB" + sizeCode + "1";
-            if(s7Type == S7DataType.BOOL) {
+            if(s7Type == TransportSize.BOOL) {
                 fieldQuery += ".0";
             }
             fieldQuery += ":" + s7Type.name();
@@ -269,7 +269,7 @@ class S7PlcFieldHandlerTest {
         }
         // Generate output for each combination of S7 and Java type.
         Stream<Arguments> values = null;
-        for (S7DataType s7Type : S7DataType.values()) {
+        for (TransportSize s7Type : TransportSize.values()) {
             PlcField field = fields.get(s7Type);
             for (JavaTypes javaType : JavaTypes.values()) {
                 Object[] testValues = javaType.values;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelperTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelperTest.java
index b48c99f..b52f393 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelperTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelperTest.java
@@ -29,7 +29,7 @@ import org.apache.plc4x.java.s7.netty.model.params.items.S7AnyVarParameterItem;
 import org.apache.plc4x.java.s7.netty.model.payloads.VarPayload;
 import org.apache.plc4x.java.s7.netty.model.payloads.items.VarPayloadItem;
 import org.apache.plc4x.java.s7.netty.model.types.*;
-import org.apache.plc4x.java.s7.types.S7DataType;
+import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -45,7 +45,7 @@ public class S7SizeHelperTest {
             new SetupCommunicationParameter((short) 8, (short)8, (short)250),
             new VarParameter(ParameterType.READ_VAR, Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0))))), is((short) 22));
+                    TransportSize.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0))))), is((short) 22));
     }
 
     @Test
@@ -70,28 +70,28 @@ public class S7SizeHelperTest {
         assertThat(S7SizeHelper.getParameterLength(
             new VarParameter(ParameterType.READ_VAR, Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)))), is((short) 14));
+                    TransportSize.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)))), is((short) 14));
         assertThat(S7SizeHelper.getParameterLength(
             new VarParameter(ParameterType.WRITE_VAR, Collections.emptyList())), is((short) 2));
         assertThat(S7SizeHelper.getParameterLength(
             new VarParameter(ParameterType.WRITE_VAR, Collections.singletonList(
                 new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-                    S7DataType.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)))), is((short) 14));
+                    TransportSize.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)))), is((short) 14));
     }
 
     @Test
     public void getPayloadLengthFromParameterTest() {
         // One bit is transferred inside one byte (4 byte header and one payload)
         assertThat(S7SizeHelper.getPayloadLength(new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-            S7DataType.BOOL, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 5));
+            TransportSize.BOOL, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 5));
         assertThat(S7SizeHelper.getPayloadLength(new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-            S7DataType.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 5));
+            TransportSize.BYTE, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 5));
         assertThat(S7SizeHelper.getPayloadLength(new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-            S7DataType.BYTE, (short) 42, (short) 0, (short) 0, (byte) 0)), is((short) 46));
+            TransportSize.BYTE, (short) 42, (short) 0, (short) 0, (byte) 0)), is((short) 46));
         assertThat(S7SizeHelper.getPayloadLength(new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-            S7DataType.DWORD, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 8));
+            TransportSize.DWORD, (short) 1, (short) 0, (short) 0, (byte) 0)), is((short) 8));
         assertThat(S7SizeHelper.getPayloadLength(new S7AnyVarParameterItem(SpecificationType.VARIABLE_SPECIFICATION, MemoryArea.DATA_BLOCKS,
-            S7DataType.DWORD, (short) 42, (short) 0, (short) 0, (byte) 0)), is((short) 172));
+            TransportSize.DWORD, (short) 42, (short) 0, (short) 0, (byte) 0)), is((short) 172));
     }
 
     @Test