You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/09/17 13:42:54 UTC

[incubator-plc4x] branch master updated: [General] added remaining datatypes for FieldItem

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

sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git


The following commit(s) were added to refs/heads/master by this push:
     new 21f5386  [General] added remaining datatypes for FieldItem
21f5386 is described below

commit 21f53861c06b219a5829f78ecf43456c89f1e75b
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Sep 17 15:42:41 2018 +0200

    [General] added remaining datatypes for FieldItem
---
 .../plc4x/edgent/PlcConnectionAdapterTest.java     |   6 +-
 .../plc4x/java/api/messages/PlcReadResponse.java   |  11 ++
 .../apache/plc4x/java/ads/model/AdsDataType.java   |   4 +
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   |  30 +++---
 .../ads/protocol/util/LittleEndianDecoder.java     | 118 ++++++++++-----------
 .../ads/protocol/util/LittleEndianEncoder.java     |  21 ++--
 .../java/base/messages/DefaultPlcReadResponse.java |  43 ++++++++
 .../base/messages/DefaultPlcSubscriptionEvent.java |  26 +++++
 ...ldItem.java => DefaultBigDecimalFieldItem.java} |  56 +++++++---
 .../messages/items/DefaultBigIntegerFieldItem.java |   8 ++
 .../messages/items/DefaultBooleanFieldItem.java    |   5 +-
 ...gerFieldItem.java => DefaultByteFieldItem.java} |  35 +++---
 ...tFieldItem.java => DefaultDoubleFieldItem.java} |  13 ++-
 ...ntFieldItem.java => DefaultFloatFieldItem.java} |  29 +++--
 .../messages/items/DefaultIntegerFieldItem.java    |  31 ++++--
 ...gerFieldItem.java => DefaultLongFieldItem.java} |  13 ++-
 ...erFieldItem.java => DefaultShortFieldItem.java} |  32 +++---
 .../plc4x/java/base/messages/items/FieldItem.java  |   9 ++
 .../ethernetip/netty/Plc4XEtherNetIpProtocol.java  |   4 +-
 .../messages/items/S7FloatingPointFieldItem.java   |   4 +-
 ...7IntegerFieldItem.java => S7LongFieldItem.java} |   6 +-
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |  12 +--
 .../java/s7/netty/util/S7PlcFieldHandler.java      |  28 ++---
 .../apache/plc4x/java/test/TestFieldHandler.java   |  14 +--
 .../org/apache/plc4x/java/test/TestDeviceTest.java |   4 +-
 25 files changed, 372 insertions(+), 190 deletions(-)

diff --git a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
index 2368bea..bb9c2af 100644
--- a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
+++ b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/PlcConnectionAdapterTest.java
@@ -31,7 +31,7 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.apache.plc4x.test.FastTests;
 import org.hamcrest.core.IsInstanceOf;
 import org.junit.Test;
@@ -88,7 +88,7 @@ public class PlcConnectionAdapterTest {
         // will help identify problems in the adapter/supplier/consumer
         PlcField plcField = request.getFields().get(0);
         // TODO: smart value conversion
-        connection.setFieldItem(plcField, new DefaultIntegerFieldItem(0L));
+        connection.setFieldItem(plcField, new DefaultLongFieldItem(0L));
 
         CompletableFuture<PlcReadResponse<?>> cf = connection.read(request);
 
@@ -103,7 +103,7 @@ public class PlcConnectionAdapterTest {
         // this is really a tests of our mock tooling but knowing it's behaving as expected
         // will help identify problems in the adapter/supplier/consumer
         PlcField plcField = request.getFields().get(0);
-        connection.setFieldItem(plcField, new DefaultIntegerFieldItem(0L));
+        connection.setFieldItem(plcField, new DefaultLongFieldItem(0L));
 
         CompletableFuture<PlcWriteResponse<?>> cf = connection.write(request);
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
index 666fdfa..c52de88 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.api.messages;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -119,6 +120,16 @@ public interface PlcReadResponse<T extends PlcReadRequest> extends PlcFieldRespo
 
     Collection<Double> getAllDoubles(String name);
 
+    boolean isValidBigDecimal(String name);
+
+    boolean isValidBigDecimal(String name, int index);
+
+    BigDecimal getBigDecimal(String name);
+
+    BigDecimal getBigDecimal(String name, int index);
+
+    Collection<BigDecimal> getAllBigDecimals(String name);
+
     boolean isValidString(String name);
 
     boolean isValidString(String name, int index);
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
index 72da37f..b9859f5 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
@@ -529,4 +529,8 @@ public enum AdsDataType {
     public int getTargetByteSize() {
         return targetByteSize;
     }
+
+    public boolean withinBounds(double other) {
+        return other >= lowerBound && other <= upperBound;
+    }
 }
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
index 11dc8c8..424efdb 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsPlcFieldHandler.java
@@ -717,49 +717,49 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
         Class<? extends FieldItem> fieldType;
         switch (adsField.getAdsDataType()) {
             case BYTE:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case WORD:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case DWORD:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case SINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case USINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case INT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case UINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case DINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case UDINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case LINT:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case ULINT:
                 fieldType = DefaultBigIntegerFieldItem.class;
                 break;
             case INT32:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             case INT64:
-                fieldType = DefaultIntegerFieldItem.class;
+                fieldType = DefaultLongFieldItem.class;
                 break;
             default:
                 throw new IllegalArgumentException(
                     "Cannot assign integer values to " + adsField.getAdsDataType().name() + " fields.");
         }
-        if (fieldType == DefaultIntegerFieldItem.class) {
+        if (fieldType == DefaultLongFieldItem.class) {
             Long[] longValues = new Long[values.length];
             for (int i = 0; i < values.length; i++) {
                 if (!((values[i] instanceof Byte) || (values[i] instanceof Short) ||
@@ -781,7 +781,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                 }
                 longValues[i] = value.longValue();
             }
-            return new DefaultIntegerFieldItem(longValues);
+            return new DefaultLongFieldItem(longValues);
         } else {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
@@ -848,7 +848,7 @@ public class AdsPlcFieldHandler implements PlcFieldHandler {
                         + adsField.getAdsDataType().name() + " (max " + maxValue.toString() + ")");
             }
         }
-        return new DefaultFloatingPointFieldItem(floatingPointValues);
+        return new DefaultDoubleFieldItem(floatingPointValues);
     }
 
     private FieldItem internalEncodeString(PlcField field, Object[] values) {
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
index 2c689a3..8d37edb 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianDecoder.java
@@ -62,20 +62,20 @@ public class LittleEndianDecoder {
                 return new DefaultBooleanFieldItem(values.toArray(new Boolean[0]));
             }
             case BITARR8: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     short aByte = wrappedBuffer.readUnsignedByte();
-                    values.offer((long) aByte);
+                    values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case BITARR16: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readUnsignedShortLE();
+                    int aLong = wrappedBuffer.readUnsignedShortLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case BITARR32: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -83,31 +83,31 @@ public class LittleEndianDecoder {
                     long aLong = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case INT8: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Byte> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readByte();
+                    byte aLong = wrappedBuffer.readByte();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultByteFieldItem(values.toArray(new Byte[0]));
             }
             case INT16: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readShortLE();
+                    short aLong = wrappedBuffer.readShortLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case INT32: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readIntLE();
+                    int aLong = wrappedBuffer.readIntLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case INT64: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -118,23 +118,23 @@ public class LittleEndianDecoder {
                     // TODO: potential dataloss here.
                     values.offer(bigInteger.longValue());
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case UINT8: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readUnsignedByte();
+                    short aLong = wrappedBuffer.readUnsignedByte();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case UINT16: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aLong = wrappedBuffer.readUnsignedShortLE();
+                    int aLong = wrappedBuffer.readUnsignedShortLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case UINT32: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -142,7 +142,7 @@ public class LittleEndianDecoder {
                     long aLong = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aLong);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case UINT64: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -153,15 +153,15 @@ public class LittleEndianDecoder {
                     // TODO: potential dataloss here.
                     values.offer(bigInteger.longValue());
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case FLOAT: {
-                LinkedList<Double> values = new LinkedList<>();
+                LinkedList<Float> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    double aLong = wrappedBuffer.readFloatLE();
+                    float aLong = wrappedBuffer.readFloatLE();
                     values.offer(aLong);
                 }
-                return new DefaultFloatingPointFieldItem(values.toArray(new Double[0]));
+                return new DefaultFloatFieldItem(values.toArray(new Float[0]));
             }
             case DOUBLE: {
                 LinkedList<Double> values = new LinkedList<>();
@@ -169,7 +169,7 @@ public class LittleEndianDecoder {
                     double aLong = wrappedBuffer.readDoubleLE();
                     values.offer(aLong);
                 }
-                return new DefaultFloatingPointFieldItem(values.toArray(new Double[0]));
+                return new DefaultDoubleFieldItem(values.toArray(new Double[0]));
             }
             case BOOL: {
                 LinkedList<Boolean> values = new LinkedList<>();
@@ -180,20 +180,20 @@ public class LittleEndianDecoder {
                 return new DefaultBooleanFieldItem(values.toArray(new Boolean[0]));
             }
             case BYTE: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readUnsignedByte();
+                    short aByte = wrappedBuffer.readUnsignedByte();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case WORD: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readUnsignedShortLE();
+                    int aByte = wrappedBuffer.readUnsignedShortLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case DWORD: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -201,47 +201,47 @@ public class LittleEndianDecoder {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case SINT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Byte> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readByte();
+                    byte aByte = wrappedBuffer.readByte();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultByteFieldItem(values.toArray(new Byte[0]));
             }
             case USINT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readUnsignedByte();
+                    short aByte = wrappedBuffer.readUnsignedByte();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case INT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Short> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readShortLE();
+                    short aByte = wrappedBuffer.readShortLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultShortFieldItem(values.toArray(new Short[0]));
             }
             case UINT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readUnsignedShortLE();
+                    int aByte = wrappedBuffer.readUnsignedShortLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case DINT: {
-                LinkedList<Long> values = new LinkedList<>();
+                LinkedList<Integer> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    long aByte = wrappedBuffer.readIntLE();
+                    int aByte = wrappedBuffer.readIntLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultIntegerFieldItem(values.toArray(new Integer[0]));
             }
             case UDINT: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -249,7 +249,7 @@ public class LittleEndianDecoder {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case LINT: {
                 LinkedList<Long> values = new LinkedList<>();
@@ -257,7 +257,7 @@ public class LittleEndianDecoder {
                     long aByte = wrappedBuffer.readLongLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case ULINT: {
                 LinkedList<BigInteger> values = new LinkedList<>();
@@ -270,12 +270,12 @@ public class LittleEndianDecoder {
                 return new DefaultBigIntegerFieldItem(values.toArray(new BigInteger[0]));
             }
             case REAL: {
-                LinkedList<Double> values = new LinkedList<>();
+                LinkedList<Float> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
-                    double aByte = wrappedBuffer.readFloatLE();
+                    float aByte = wrappedBuffer.readFloatLE();
                     values.offer(aByte);
                 }
-                return new DefaultFloatingPointFieldItem(values.toArray(new Double[0]));
+                return new DefaultFloatFieldItem(values.toArray(new Float[0]));
             }
             case LREAL: {
                 LinkedList<Double> values = new LinkedList<>();
@@ -283,13 +283,13 @@ public class LittleEndianDecoder {
                     double aByte = wrappedBuffer.readDoubleLE();
                     values.offer(aByte);
                 }
-                return new DefaultFloatingPointFieldItem(values.toArray(new Double[0]));
+                return new DefaultDoubleFieldItem(values.toArray(new Double[0]));
             }
             case STRING: {
                 LinkedList<String> values = new LinkedList<>();
                 while (wrappedBuffer.isReadable()) {
                     ByteArrayOutputStream os = new ByteArrayOutputStream();
-                    Byte aByte;
+                    byte aByte;
                     while ((aByte = wrappedBuffer.readByte()) != 0x0) {
                         os.write(aByte);
                     }
@@ -303,7 +303,7 @@ public class LittleEndianDecoder {
                     long aByte = wrappedBuffer.readUnsignedIntLE();
                     values.offer(aByte);
                 }
-                return new DefaultIntegerFieldItem(values.toArray(new Long[0]));
+                return new DefaultLongFieldItem(values.toArray(new Long[0]));
             }
             case TIME_OF_DAY: {
                 LinkedList<LocalTime> values = new LinkedList<>();
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianEncoder.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianEncoder.java
index 11828c8..a039766 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianEncoder.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/protocol/util/LittleEndianEncoder.java
@@ -41,7 +41,6 @@ public class LittleEndianEncoder {
         // Utility class
     }
 
-    // TODO: add bound checking
     public static byte[] encodeData(AdsDataType adsDataType, Object... values) throws PlcProtocolException {
         if (values.length == 0) {
             return new byte[]{};
@@ -114,8 +113,8 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeFloat(AdsDataType adsDataType, Stream<Float> floatStream) {
-        // TODO: add boundchecks and add optional extension
         return floatStream
+            .peek(value -> checkBound(adsDataType, value))
             // TODO: check how ads expects this data
             .map(Float::floatToIntBits)
             .map(intValue -> new byte[]{
@@ -127,8 +126,8 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeDouble(AdsDataType adsDataType, Stream<Double> doubleStream) {
-        // TODO: add boundchecks and add optional extension
         return doubleStream
+            .peek(value -> checkBound(adsDataType, value))
             // TODO: check how ads expects this data
             .map(Double::doubleToLongBits)
             .map(longValue -> new byte[]{
@@ -144,8 +143,8 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeInteger(AdsDataType adsDataType, Stream<Integer> integerStream) {
-        // TODO: add boundchecks and add optional extension
         return integerStream
+            .peek(value -> checkBound(adsDataType, value))
             .map(intValue -> new byte[]{
                 (byte) (intValue & 0x000000ff),
                 (byte) ((intValue & 0x0000ff00) >> 8),
@@ -155,8 +154,8 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeLong(AdsDataType adsDataType, Stream<Long> integerStream) {
-        // TODO: add boundchecks and add optional extension
         return integerStream
+            .peek(value -> checkBound(adsDataType, value))
             .map(longValue -> new byte[]{
                 (byte) (longValue & 0x00000000_000000ffL),
                 (byte) ((longValue & 0x00000000_0000ff00L) >> 8),
@@ -186,7 +185,6 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeCalendar(AdsDataType adsDataType, Stream<Calendar> calendarStream) {
-        // TODO: add boundchecks and add optional extension
         return calendarStream
             .map(Calendar.class::cast)
             .map(Calendar::getTime)
@@ -194,6 +192,7 @@ public class LittleEndianEncoder {
             .map(BigInteger::valueOf)
             .map(TimeStamp::javaToWinTime)
             .map(BigInteger::longValue)
+            .peek(value -> checkBound(adsDataType, value))
             .map(time -> new byte[]{
                 (byte) (time & 0x00000000_000000ffL),
                 (byte) ((time & 0x00000000_0000ff00L) >> 8),
@@ -209,8 +208,8 @@ public class LittleEndianEncoder {
 
 
     private static Stream<byte[]> encodeShort(AdsDataType adsDataType, Stream<Short> shortStream) {
-        // TODO: add boundchecks and add optional extension
         return shortStream
+            .peek(value -> checkBound(adsDataType, value))
             .map(shortValue -> new byte[]{
                 (byte) (shortValue & 0x00ff),
                 (byte) ((shortValue & 0xff00) >> 8),
@@ -218,8 +217,8 @@ public class LittleEndianEncoder {
     }
 
     private static Stream<byte[]> encodeByte(AdsDataType adsDataType, Stream<Byte> byteStream) {
-        // TODO: add boundchecks and add optional extension
         return byteStream
+            .peek(value -> checkBound(adsDataType, value))
             .map(aByte -> new byte[]{aByte});
     }
 
@@ -228,4 +227,10 @@ public class LittleEndianEncoder {
         return booleanStream
             .map(booleanValue -> new byte[]{booleanValue ? (byte) 0x01 : (byte) 0x00});
     }
+
+    private static void checkBound(AdsDataType adsDataType, double other) {
+        if (!adsDataType.withinBounds(other)) {
+            throw new PlcRuntimeException(other + " not within bounds of " + adsDataType);
+        }
+    }
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
index 1d37858..7bd028d 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -445,6 +446,48 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
     }
 
     @Override
+    public boolean isValidBigDecimal(String name) {
+        return isValidBigDecimal(name, 0);
+    }
+
+    @Override
+    public boolean isValidBigDecimal(String name, int index) {
+        FieldItem fieldInternal = getFieldInternal(name);
+        if (fieldInternal != null) {
+            return fieldInternal.isValidBigDecimal(index);
+        }
+        return false;
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name) {
+        return getBigDecimal(name, 0);
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name, int index) {
+        FieldItem fieldInternal = getFieldInternal(name);
+        if (fieldInternal != null) {
+            return fieldInternal.getBigDecimal(index);
+        }
+        return null;
+    }
+
+    @Override
+    public Collection<BigDecimal> getAllBigDecimals(String name) {
+        FieldItem fieldInternal = getFieldInternal(name);
+        if (fieldInternal != null) {
+            int num = fieldInternal.getNumberOfValues();
+            List<BigDecimal> values = new ArrayList<>(num);
+            for (int i = 0; i < num; i++) {
+                values.add(fieldInternal.getBigDecimal(i));
+            }
+            return values;
+        }
+        return null;
+    }
+
+    @Override
     public boolean isValidString(String name) {
         return isValidString(name, 0);
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
index 349bf4f..a188811 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -263,6 +264,31 @@ public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent
     }
 
     @Override
+    public boolean isValidBigDecimal(String name) {
+        return false;
+    }
+
+    @Override
+    public boolean isValidBigDecimal(String name, int index) {
+        return false;
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name) {
+        return null;
+    }
+
+    @Override
+    public BigDecimal getBigDecimal(String name, int index) {
+        return null;
+    }
+
+    @Override
+    public Collection<BigDecimal> getAllBigDecimals(String name) {
+        return null;
+    }
+
+    @Override
     public boolean isValidString(String name) {
         return false;
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
similarity index 57%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
index f3bc8ed..17a5ed7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
+public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
-    public DefaultFloatingPointFieldItem(Double... values) {
+    public DefaultBigDecimalFieldItem(BigDecimal... values) {
         super(values);
     }
 
@@ -39,15 +40,17 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
     @Override
     public Boolean getBoolean(int index) {
         if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+            return getValue(index).compareTo(BigDecimal.ZERO) != 0;
         }
         return null;
     }
 
     @Override
     public boolean isValidByte(int index) {
-        Double value = getValue(index);
-        return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Byte.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Byte.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
@@ -60,8 +63,10 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidShort(int index) {
-        Double value = getValue(index);
-        return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Short.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Short.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
@@ -74,8 +79,10 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidInteger(int index) {
-        Double value = getValue(index);
-        return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Integer.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Integer.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
@@ -87,21 +94,23 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
     }
 
     public boolean isValidBigInteger(int index) {
-        Double value = getValue(index);
+        BigDecimal value = getValue(index);
         return value != null;
     }
 
     public BigInteger getBigInteger(int index) {
         if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index).longValue());
+            return getValue(index).toBigInteger();
         }
         return null;
     }
 
     @Override
     public boolean isValidLong(int index) {
-        Double value = getValue(index);
-        return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Long.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Long.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
@@ -114,8 +123,10 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidFloat(int index) {
-        Double value = getValue(index);
-        return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Float.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Float.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
@@ -128,17 +139,28 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidDouble(int index) {
-        return (getValue(index) != null);
+        BigDecimal value = getValue(index);
+        BigDecimal min = BigDecimal.valueOf(Double.MIN_VALUE);
+        BigDecimal max = BigDecimal.valueOf(Double.MAX_VALUE);
+        return (value != null) && (value.compareTo(min) < 0) && (value.compareTo(max) > 0);
     }
 
     @Override
     public Double getDouble(int index) {
         if (isValidDouble(index)) {
-            return getValue(index);
+            return getValue(index).doubleValue();
         }
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return getValue(index);
+    }
+
 }
 
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
index 33903b3..9e30774 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
@@ -157,5 +157,13 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
index 239c478..abb02b4 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
@@ -38,7 +38,7 @@ public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if(isValidBoolean(index)) {
+        if (isValidBoolean(index)) {
             return getValue(index);
         }
         return null;
@@ -59,11 +59,12 @@ public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
             i++;
         }
         byte[] bytes = bitSet.toByteArray();
-        if(bytes.length < index) {
+        if (bytes.length < index) {
             return null;
         }
         return bytes[index];
     }
 
+    // TODO: implement other methods according to getByte
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
similarity index 81%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
index e6e65ca..eec3ad7 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultIntegerFieldItem extends FieldItem<Long> {
+public class DefaultByteFieldItem extends FieldItem<Byte> {
 
-    public DefaultIntegerFieldItem(Long... values) {
+    public DefaultByteFieldItem(Byte... values) {
         super(values);
     }
 
@@ -46,22 +47,22 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidByte(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
+        Byte value = getValue(index);
+        return (value != null);
     }
 
     @Override
     public Byte getByte(int index) {
         if (isValidByte(index)) {
-            return getValue(index).byteValue();
+            return getValue(index);
         }
         return null;
     }
 
     @Override
     public boolean isValidShort(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
+        Byte value = getValue(index);
+        return (value != null);
     }
 
     @Override
@@ -74,8 +75,8 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidInteger(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+        Byte value = getValue(index);
+        return (value != null);
     }
 
     @Override
@@ -87,7 +88,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
     }
 
     public boolean isValidBigInteger(int index) {
-        Long value = getValue(index);
+        Byte value = getValue(index);
         return value != null;
     }
 
@@ -106,14 +107,14 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
     @Override
     public Long getLong(int index) {
         if (isValidFloat(index)) {
-            return getValue(index);
+            return getValue(index).longValue();
         }
         return null;
     }
 
     @Override
     public boolean isValidFloat(int index) {
-        Long value = getValue(index);
+        Byte value = getValue(index);
         return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
     }
 
@@ -127,7 +128,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidDouble(int index) {
-        Long value = getValue(index);
+        Byte value = getValue(index);
         return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
     }
 
@@ -139,5 +140,13 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
similarity index 91%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
index f3bc8ed..5019ca9 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
+public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
-    public DefaultFloatingPointFieldItem(Double... values) {
+    public DefaultDoubleFieldItem(Double... values) {
         super(values);
     }
 
@@ -139,6 +140,14 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
similarity index 84%
rename from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
rename to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
index f3bc8ed..53f94e6 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
+public class DefaultFloatFieldItem extends FieldItem<Float> {
 
-    public DefaultFloatingPointFieldItem(Double... values) {
+    public DefaultFloatFieldItem(Float... values) {
         super(values);
     }
 
@@ -46,7 +47,7 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidByte(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
     }
 
@@ -60,7 +61,7 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidShort(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
     }
 
@@ -74,7 +75,7 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidInteger(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
     }
 
@@ -87,7 +88,7 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
     }
 
     public boolean isValidBigInteger(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return value != null;
     }
 
@@ -100,7 +101,7 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidLong(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
     }
 
@@ -114,14 +115,14 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
 
     @Override
     public boolean isValidFloat(int index) {
-        Double value = getValue(index);
+        Float value = getValue(index);
         return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
     }
 
     @Override
     public Float getFloat(int index) {
         if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+            return getValue(index);
         }
         return null;
     }
@@ -134,11 +135,19 @@ public class DefaultFloatingPointFieldItem extends FieldItem<Double> {
     @Override
     public Double getDouble(int index) {
         if (isValidDouble(index)) {
-            return getValue(index);
+            return getValue(index).doubleValue();
         }
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
index e6e65ca..3f2de70 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultIntegerFieldItem extends FieldItem<Long> {
+public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
-    public DefaultIntegerFieldItem(Long... values) {
+    public DefaultIntegerFieldItem(Integer... values) {
         super(values);
     }
 
@@ -46,7 +47,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidByte(int index) {
-        Long value = getValue(index);
+        Integer value = getValue(index);
         return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
     }
 
@@ -60,7 +61,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidShort(int index) {
-        Long value = getValue(index);
+        Integer value = getValue(index);
         return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
     }
 
@@ -74,20 +75,20 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidInteger(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+        Integer value = getValue(index);
+        return (value != null);
     }
 
     @Override
     public Integer getInteger(int index) {
         if (isValidInteger(index)) {
-            return getValue(index).intValue();
+            return getValue(index);
         }
         return null;
     }
 
     public boolean isValidBigInteger(int index) {
-        Long value = getValue(index);
+        Integer value = getValue(index);
         return value != null;
     }
 
@@ -106,14 +107,14 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
     @Override
     public Long getLong(int index) {
         if (isValidFloat(index)) {
-            return getValue(index);
+            return getValue(index).longValue();
         }
         return null;
     }
 
     @Override
     public boolean isValidFloat(int index) {
-        Long value = getValue(index);
+        Integer value = getValue(index);
         return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
     }
 
@@ -127,7 +128,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidDouble(int index) {
-        Long value = getValue(index);
+        Integer value = getValue(index);
         return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
     }
 
@@ -139,5 +140,13 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
similarity index 91%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
index e6e65ca..2fb238c 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultIntegerFieldItem extends FieldItem<Long> {
+public class DefaultLongFieldItem extends FieldItem<Long> {
 
-    public DefaultIntegerFieldItem(Long... values) {
+    public DefaultLongFieldItem(Long... values) {
         super(values);
     }
 
@@ -139,5 +140,13 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
+
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
similarity index 82%
copy from plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
copy to plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
index e6e65ca..a8e9d4e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
@@ -18,11 +18,12 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 
-public class DefaultIntegerFieldItem extends FieldItem<Long> {
+public class DefaultShortFieldItem extends FieldItem<Short> {
 
-    public DefaultIntegerFieldItem(Long... values) {
+    public DefaultShortFieldItem(Short... values) {
         super(values);
     }
 
@@ -46,7 +47,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidByte(int index) {
-        Long value = getValue(index);
+        Short value = getValue(index);
         return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
     }
 
@@ -60,22 +61,22 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidShort(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
+        Short value = getValue(index);
+        return (value != null);
     }
 
     @Override
     public Short getShort(int index) {
         if (isValidShort(index)) {
-            return getValue(index).shortValue();
+            return getValue(index);
         }
         return null;
     }
 
     @Override
     public boolean isValidInteger(int index) {
-        Long value = getValue(index);
-        return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+        Short value = getValue(index);
+        return (value != null);
     }
 
     @Override
@@ -87,7 +88,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
     }
 
     public boolean isValidBigInteger(int index) {
-        Long value = getValue(index);
+        Short value = getValue(index);
         return value != null;
     }
 
@@ -106,14 +107,14 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
     @Override
     public Long getLong(int index) {
         if (isValidFloat(index)) {
-            return getValue(index);
+            return getValue(index).longValue();
         }
         return null;
     }
 
     @Override
     public boolean isValidFloat(int index) {
-        Long value = getValue(index);
+        Short value = getValue(index);
         return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
     }
 
@@ -127,7 +128,7 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
 
     @Override
     public boolean isValidDouble(int index) {
-        Long value = getValue(index);
+        Short value = getValue(index);
         return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
     }
 
@@ -139,5 +140,12 @@ public class DefaultIntegerFieldItem extends FieldItem<Long> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return getValue(index) != null;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return new BigDecimal(getValue(index));
+    }
 }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
index bb9d7db..f6bf7bb 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
@@ -18,6 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -102,6 +103,14 @@ public abstract class FieldItem<T> {
         return null;
     }
 
+    public boolean isValidBigDecimal(int index) {
+        return false;
+    }
+
+    public BigDecimal getBigDecimal(int index) {
+        return null;
+    }
+
     public boolean isValidString(int index) {
         return false;
     }
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
index f3472b8..98df8d0 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
+++ b/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
@@ -38,7 +38,7 @@ import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.base.events.ConnectEvent;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.ethernetip.model.EtherNetIpField;
 import org.slf4j.Logger;
@@ -479,7 +479,7 @@ public class Plc4XEtherNetIpProtocol extends MessageToMessageCodec<EnipPacket, P
                 } else {
                     value = -1;
                 }
-                DefaultIntegerFieldItem fieldItem = new DefaultIntegerFieldItem((long) value);
+                DefaultLongFieldItem fieldItem = new DefaultLongFieldItem((long) value);
                 values.put(fieldName, new ImmutablePair<>(responseCode, fieldItem));
             }
             InternalPlcReadResponse response = new DefaultPlcReadResponse(request, values);
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 f2024d3..0cca4f7 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
@@ -18,10 +18,10 @@
  */
 package org.apache.plc4x.java.s7.messages.items;
 
-import org.apache.plc4x.java.base.messages.items.DefaultFloatingPointFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultDoubleFieldItem;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
-public class S7FloatingPointFieldItem extends DefaultFloatingPointFieldItem {
+public class S7FloatingPointFieldItem extends DefaultDoubleFieldItem {
 
     private final TransportSize 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/S7LongFieldItem.java
similarity index 87%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
rename to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7LongFieldItem.java
index a9c6ee6..6db08c8 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/S7LongFieldItem.java
@@ -18,14 +18,14 @@
  */
 package org.apache.plc4x.java.s7.messages.items;
 
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
 
-public class S7IntegerFieldItem extends DefaultIntegerFieldItem {
+public class S7LongFieldItem extends DefaultLongFieldItem {
 
     private final TransportSize naturalDataType;
 
-    public S7IntegerFieldItem(TransportSize naturalDataType, Long... values) {
+    public S7LongFieldItem(TransportSize naturalDataType, Long... values) {
         super(values);
         this.naturalDataType = naturalDataType;
     }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index 6db3b37..83b7f3b 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -475,34 +475,34 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // 8 bit:
                     case SINT: {
                         Long longValue = (long) data.readByte();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case USINT: {
                         Long longValue = (long) data.readUnsignedByte();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     // 16 bit:
                     case INT: {
                         Long longValue = (long) data.readShort();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case UINT: {
                         Long longValue = (long) data.readUnsignedShort();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     // 32 bit:
                     case DINT: {
                         Long longValue = (long) data.readInt();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case UDINT: {
                         Long longValue = data.readUnsignedInt();
-                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
+                        fieldItem = new S7LongFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     // 64 bit:
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 d1612ac..fbaf4b7 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
@@ -22,7 +22,7 @@ import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.connection.PlcFieldHandler;
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLocalDateTimeFieldItem;
 import org.apache.plc4x.java.base.messages.items.FieldItem;
 import org.apache.plc4x.java.s7.messages.items.*;
@@ -222,57 +222,57 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
             case BYTE:
                 minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case WORD:
                 minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case DWORD:
                 minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case LWORD:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case SINT:
                 minValue = BigInteger.valueOf((long) Byte.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case USINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf((long) Byte.MAX_VALUE * 2);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case INT:
                 minValue = BigInteger.valueOf((long) Short.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Short.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case UINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf(((long) Short.MAX_VALUE) * 2);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case DINT:
                 minValue = BigInteger.valueOf((long) Integer.MIN_VALUE);
                 maxValue = BigInteger.valueOf((long) Integer.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case UDINT:
                 minValue = BigInteger.valueOf((long) 0);
                 maxValue = BigInteger.valueOf(((long) Integer.MAX_VALUE) * 2);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case LINT:
                 minValue = BigInteger.valueOf(Long.MIN_VALUE);
                 maxValue = BigInteger.valueOf(Long.MAX_VALUE);
-                fieldType = S7IntegerFieldItem.class;
+                fieldType = S7LongFieldItem.class;
                 break;
             case ULINT:
                 minValue = BigInteger.valueOf((long) 0);
@@ -283,7 +283,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 throw new IllegalArgumentException(
                     "Cannot assign integer values to " + s7Field.getDataType().name() + " fields.");
         }
-        if (fieldType == DefaultIntegerFieldItem.class) {
+        if (fieldType == DefaultLongFieldItem.class) {
             Long[] longValues = new Long[values.length];
             for (int i = 0; i < values.length; i++) {
                 if (!((values[i] instanceof Byte) || (values[i] instanceof Short) ||
@@ -305,7 +305,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 }
                 longValues[i] = value.longValue();
             }
-            return new S7IntegerFieldItem(s7Field.getDataType(), longValues);
+            return new S7LongFieldItem(s7Field.getDataType(), longValues);
         } else {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
index 36325f4..7e65770 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
@@ -54,7 +54,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeByte(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Byte.class) {
-            return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Byte) x)).toArray(Long[]::new));
+            return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Byte) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -63,7 +63,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeShort(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Short.class) {
-            return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Short) x)).toArray(Long[]::new));
+            return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Short) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -72,7 +72,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeInteger(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Integer.class) {
-            return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> new Long((Integer) x)).toArray(Long[]::new));
+            return new DefaultLongFieldItem(Arrays.stream(values).map(x -> new Long((Integer) x)).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -81,7 +81,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeBigInteger(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == BigInteger.class) {
-            return new DefaultIntegerFieldItem(Arrays.stream(values).map(x -> ((BigInteger) x).longValue()).toArray(Long[]::new));
+            return new DefaultLongFieldItem(Arrays.stream(values).map(x -> ((BigInteger) x).longValue()).toArray(Long[]::new));
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -90,7 +90,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeLong(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Long.class) {
-            return new DefaultIntegerFieldItem((Long[]) values);
+            return new DefaultLongFieldItem((Long[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -99,7 +99,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeFloat(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Float.class) {
-            return new DefaultFloatingPointFieldItem((Double[]) values);
+            return new DefaultDoubleFieldItem((Double[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
@@ -108,7 +108,7 @@ public class TestFieldHandler implements PlcFieldHandler {
     public FieldItem encodeDouble(PlcField field, Object[] values) {
         TestField testField = (TestField) field;
         if (testField.getDataType() == Double.class) {
-            return new DefaultFloatingPointFieldItem((Double[]) values);
+            return new DefaultDoubleFieldItem((Double[]) values);
         }
         throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
     }
diff --git a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
index fa817cf..53df1c7 100644
--- a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
+++ b/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
@@ -19,7 +19,7 @@
 package org.apache.plc4x.java.test;
 
 import org.apache.plc4x.java.base.messages.items.FieldItem;
-import org.apache.plc4x.java.base.messages.items.DefaultIntegerFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
 import org.junit.Test;
 
 import java.util.Optional;
@@ -48,7 +48,7 @@ public class TestDeviceTest {
         Optional<FieldItem> value = device.get(field);
         assertFalse(value.isPresent());
 
-        device.set(field, new DefaultIntegerFieldItem((long) 42));
+        device.set(field, new DefaultLongFieldItem((long) 42));
         value = device.get(field);
         assertTrue(value.isPresent());
         FieldItem fieldItem = value.get();