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/07 13:59:55 UTC

[incubator-plc4x] branch feature/api-redesign-chris-c updated: - Finished refactoring the read part of the S7 driver (Still todo's in the write part) - Optimized the example - Added a getObject() method to the FieldItem class - Added a set of S7FieldItems that return the nearest matching type to the one in the address in getObject()

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 df806f8  - Finished refactoring the read part of the S7 driver (Still todo's in the write part) - Optimized the example - Added a getObject() method to the FieldItem class - Added a set of S7FieldItems that return the nearest matching type to the one in the address in getObject()
df806f8 is described below

commit df806f895d9a5601b7122b6759c2aaa64eef133d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Sep 7 15:59:48 2018 +0200

    - Finished refactoring the read part of the S7 driver (Still todo's in the write part)
    - Optimized the example
    - Added a getObject() method to the FieldItem class
    - Added a set of S7FieldItems that return the nearest matching type to the one in the address in getObject()
---
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 34 +++++++++--
 .../plc4x/java/api/messages/PlcReadResponse.java   |  4 --
 .../java/base/messages/DefaultPlcReadResponse.java | 16 ++---
 .../base/messages/DefaultPlcSubscriptionEvent.java | 10 ----
 .../base/messages/items/BigIntegerFieldItem.java   |  5 ++
 .../java/base/messages/items/BooleanFieldItem.java |  5 ++
 .../plc4x/java/base/messages/items/FieldItem.java  |  2 +
 .../messages/items/FloatingPointFieldItem.java     |  5 ++
 .../java/base/messages/items/IntegerFieldItem.java |  5 ++
 .../java/base/messages/items/StringFieldItem.java  |  5 ++
 .../java/base/messages/items/TimeFieldItem.java    |  5 ++
 .../s7/messages/items/S7BigIntegerFieldItem.java}  | 21 +++++--
 .../java/s7/messages/items/S7BooleanFieldItem.java | 52 ++++++++++++++++
 .../messages/items/S7FloatingPointFieldItem.java}  | 25 ++++++--
 .../java/s7/messages/items/S7IntegerFieldItem.java | 53 +++++++++++++++++
 .../java/s7/messages/items/S7StringFieldItem.java} | 25 ++++++--
 .../java/s7/messages/items/S7TimeFieldItem.java}   | 27 +++++++--
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 69 ++++++++++++++--------
 .../org/apache/plc4x/java/s7/netty/S7Protocol.java |  5 ++
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 12 ++--
 .../org/apache/plc4x/java/test/TestFieldItem.java  |  5 +-
 21 files changed, 305 insertions(+), 85 deletions(-)

diff --git a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
index d7cb937..bbf7c1b 100644
--- a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
+++ b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,11 +39,10 @@ public class HelloPlc4x {
      *
      * @param args ignored.
      */
-    @SuppressWarnings("unchecked")
     public static void main(String[] args) {
         if (args.length < 2) {
             System.out.println("Usage: HelloPlc4x {connection-string} {address-string}+");
-            System.out.println("Example: HelloPlc4x s7://10.10.64.30/1/1 %I0.0:BOOLEAN %DB1.DBX38:BYTE");
+            System.out.println("Example: HelloPlc4x s7://10.10.64.20/1/1 %Q0.0:BOOL %Q0:BYTE");
             return;
         }
 
@@ -67,21 +67,43 @@ public class HelloPlc4x {
                 // Read synchronously ...
                 // NOTICE: the ".get()" immediately lets this thread pause till
                 // the response is processed and available.
+                System.out.println("\nSynchronous request ...");
                 PlcReadResponse<?> syncResponse = plcReader.read(plcReadRequest).get();
                 // Simply iterating over the field names returned in the response.
                 for (String fieldName : syncResponse.getFieldNames()) {
-                    System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+                    if(syncResponse.getResponseCode(fieldName) == PlcResponseCode.OK) {
+                        int numValues = syncResponse.getNumberOfValues(fieldName);
+                        // If it's just one element, output just one single line.
+                        if(numValues == 1) {
+                            System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+                        }
+                        // If it's more than one element, output each in a single row.
+                        else {
+                            System.out.println("Value[" + fieldName + "]:");
+                            for(int i = 0; i < numValues; i++) {
+                                System.out.println(" - " + syncResponse.getObject(fieldName, i));
+                            }
+                        }
+                    }
+                    // Something went wrong, to output an error message instead.
+                    else {
+                        System.out.println("Error[" + fieldName + "]: " + syncResponse.getResponseCode(fieldName).name());
+                    }
                 }
 
                 //////////////////////////////////////////////////////////
                 // Read asynchronously ...
                 // Register a callback executed as soon as a response arives.
+                System.out.println("\n\nAsynchronous request ...");
                 CompletableFuture<PlcReadResponse<?>> asyncResponse = plcReader.read(plcReadRequest);
                 asyncResponse.whenComplete((readResponse, throwable) -> {
                     if (readResponse != null) {
-                        // Directly asking for fields by name.
-                        for (int i = 1; i < args.length; i++) {
-                            System.out.println("Value[value-" + i + "]: " + syncResponse.getObject("value-" + i));
+                        for (String fieldName : syncResponse.getFieldNames()) {
+                            if (syncResponse.getResponseCode(fieldName) == PlcResponseCode.OK) {
+                                System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+                            } else {
+                                System.out.println("Error[" + fieldName + "]: " + syncResponse.getResponseCode(fieldName).name());
+                            }
                         }
                     } else {
                         logger.error("An error occurred", throwable);
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 acdee7e..b202927 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
@@ -30,10 +30,6 @@ public interface PlcReadResponse<T extends PlcReadRequest> extends PlcFieldRespo
 
     int getNumberOfValues(String name);
 
-    boolean isValidObject(String name);
-
-    boolean isValidObject(String name, int index);
-
     Object getObject(String name);
 
     Object getObject(String name, int index);
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 1971d84..38c1eb3 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
@@ -74,24 +74,16 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
     }
 
     @Override
-    public boolean isValidObject(String name) {
-        return isValidObject(name, 0);
-    }
-
-    @Override
-    public boolean isValidObject(String name, int index) {
-        // TODO: Implement this ...
-        return false;
-    }
-
-    @Override
     public Object getObject(String name) {
         return getObject(name, 0);
     }
 
     @Override
     public Object getObject(String name, int index) {
-        // TODO: Implement this ...
+        FieldItem fieldInternal = getFieldInternal(name);
+        if (fieldInternal != null) {
+            return fieldInternal.getObject(index);
+        }
         return null;
     }
 
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 8f31665..ce5790f 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
@@ -36,16 +36,6 @@ public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent
     }
 
     @Override
-    public boolean isValidObject(String name) {
-        return false;
-    }
-
-    @Override
-    public boolean isValidObject(String name, int index) {
-        return false;
-    }
-
-    @Override
     public Object getObject(String name) {
         return null;
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
index 46de6b6..8ba7971 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
@@ -28,6 +28,11 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getLong(index);
+    }
+
+    @Override
     public boolean isValidBoolean(int index) {
         return (getValue(index) != null);
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
index 183583b..d9a28da 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
@@ -25,6 +25,11 @@ public class BooleanFieldItem extends FieldItem<Boolean> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getBoolean(index);
+    }
+
+    @Override
     public boolean isValidBoolean(int index) {
         return (getValue(index) != null);
     }
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 1ce4134..0324250 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
@@ -34,6 +34,8 @@ public abstract class FieldItem<T> {
         return values.length;
     }
 
+    public abstract Object getObject(int index);
+
     public boolean isValidBoolean(int index) {
         return false;
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
index f2e4dc4..c3ffe4e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
@@ -25,6 +25,11 @@ public class FloatingPointFieldItem extends FieldItem<Double> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getDouble(index);
+    }
+
+    @Override
     public boolean isValidBoolean(int index) {
         return (getValue(index) != null);
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
index 05290a5..f8c57f6 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
@@ -25,6 +25,11 @@ public class IntegerFieldItem extends FieldItem<Long> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getLong(index);
+    }
+
+    @Override
     public boolean isValidBoolean(int index) {
         return (getValue(index) != null);
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
index a2f650e..a7fd5ea 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
@@ -25,6 +25,11 @@ public class StringFieldItem extends FieldItem<String> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getString(index);
+    }
+
+    @Override
     public boolean isValidString(int index) {
         return (getValue(index) != null);
     }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
index 5b01127..53b2150 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
@@ -29,6 +29,11 @@ public class TimeFieldItem extends FieldItem<LocalDateTime> {
     }
 
     @Override
+    public Object getObject(int index) {
+        return getDateTime(index);
+    }
+
+    @Override
     public boolean isValidTime(int index) {
         return (getValue(index) != null);
     }
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
similarity index 58%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
index bce7a95..da76032 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
@@ -16,17 +16,28 @@
  specific language governing permissions and limitations
  under the License.
  */
+package org.apache.plc4x.java.s7.messages.items;
 
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.BigIntegerFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import java.math.BigInteger;
 
-public class TestFieldItem<T> extends FieldItem<T> {
+public class S7BigIntegerFieldItem extends BigIntegerFieldItem {
 
-    public TestFieldItem(T[] values) {
+    private final S7DataType naturalDataType;
+
+    public S7BigIntegerFieldItem(S7DataType naturalDataType, BigInteger... values) {
         super(values);
+        this.naturalDataType = naturalDataType;
     }
 
-
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+        }
+        return getLong(index);
+    }
 
 }
+
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
new file mode 100644
index 0000000..2b73361
--- /dev/null
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
@@ -0,0 +1,52 @@
+/*
+ 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.messages.items;
+
+import org.apache.plc4x.java.base.messages.items.BooleanFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
+
+public class S7BooleanFieldItem extends BooleanFieldItem {
+
+    private final S7DataType naturalDataType;
+
+    public S7BooleanFieldItem(S7DataType naturalDataType, Boolean... values) {
+        super(values);
+        this.naturalDataType = naturalDataType;
+   }
+
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+            case BOOL:
+                return getBoolean(index);
+            case BYTE:
+                return getBoolean(index);
+            case WORD:
+                return getBoolean(index);
+            case DWORD:
+                return getBoolean(index);
+            case LWORD:
+                return getBoolean(index);
+            default:
+                return null;
+        }
+    }
+
+}
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
similarity index 53%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
index bce7a95..23dacfc 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
@@ -16,17 +16,32 @@
  specific language governing permissions and limitations
  under the License.
  */
+package org.apache.plc4x.java.s7.messages.items;
 
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.FloatingPointFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+public class S7FloatingPointFieldItem extends FloatingPointFieldItem {
 
-public class TestFieldItem<T> extends FieldItem<T> {
+    private final S7DataType naturalDataType;
 
-    public TestFieldItem(T[] values) {
+    public S7FloatingPointFieldItem(S7DataType naturalDataType, Double... values) {
         super(values);
+        this.naturalDataType = naturalDataType;
     }
 
-
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+            case REAL:
+                return getFloat(index);
+            case LREAL:
+                return getDouble(index);
+            default:
+                return null;
+        }
+    }
 
 }
+
+
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
new file mode 100644
index 0000000..1c04ef0
--- /dev/null
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
@@ -0,0 +1,53 @@
+/*
+ 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.messages.items;
+
+import org.apache.plc4x.java.base.messages.items.IntegerFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
+
+public class S7IntegerFieldItem extends IntegerFieldItem {
+
+    private final S7DataType naturalDataType;
+
+    public S7IntegerFieldItem(S7DataType naturalDataType, Long... values) {
+        super(values);
+        this.naturalDataType = naturalDataType;
+    }
+
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+            case SINT:
+                return getByte(index);
+            case USINT:
+            case INT:
+                return getShort(index);
+            case UINT:
+            case DINT:
+                return getInteger(index);
+            case UDINT:
+            case LINT:
+                return getLong(index);
+            default:
+                return null;
+        }
+    }
+
+}
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
similarity index 54%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
index bce7a95..8863727 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
@@ -16,17 +16,32 @@
  specific language governing permissions and limitations
  under the License.
  */
+package org.apache.plc4x.java.s7.messages.items;
 
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.StringFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+public class S7StringFieldItem extends StringFieldItem {
 
-public class TestFieldItem<T> extends FieldItem<T> {
+    private final S7DataType naturalDataType;
 
-    public TestFieldItem(T[] values) {
+    public S7StringFieldItem(S7DataType naturalDataType, String... values) {
         super(values);
+        this.naturalDataType = naturalDataType;
     }
 
-
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+            case CHAR:
+            case WCHAR:
+            case STRING:
+            case WSTRING:
+                return getString(index);
+            default:
+                return null;
+        }
+    }
 
 }
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
similarity index 52%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
index bce7a95..065c22d 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
@@ -16,17 +16,34 @@
  specific language governing permissions and limitations
  under the License.
  */
+package org.apache.plc4x.java.s7.messages.items;
 
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.TimeFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
 
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import java.time.LocalDateTime;
 
-public class TestFieldItem<T> extends FieldItem<T> {
+public class S7TimeFieldItem extends TimeFieldItem {
 
-    public TestFieldItem(T[] values) {
+    private final S7DataType naturalDataType;
+
+    public S7TimeFieldItem(S7DataType naturalDataType, LocalDateTime... values) {
         super(values);
+        this.naturalDataType = naturalDataType;
     }
 
-
+    @Override
+    public Object getObject(int index) {
+        switch (naturalDataType) {
+            case TIME:
+            case TIME_OF_DAY:
+            case DATE:
+            case DATE_AND_TIME:
+                return getTime(index);
+            default:
+                return null;
+        }
+    }
 
 }
+
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 a0c5a26..f8e952e 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
@@ -37,6 +37,7 @@ import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.base.messages.items.*;
+import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.netty.events.S7ConnectedEvent;
 import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
@@ -201,13 +202,12 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
             DataTransportSize dataTransportSize = s7Field.getDataType().getDataTransportSize();
 
             // TODO: Checkout if the payload items are sort of a flatMap of all request items.
-            byte[] byteData;
-            /*switch(s7Field.getDataType()) {
+            /*byte[] byteData;
+            switch(s7Field.getDataType()) {
                 // -----------------------------------------
                 // Bit
                 // -----------------------------------------
                 case BOOL: {
-                    if()
                     byte byteValue = data.readByte();
                     fieldItem = new BooleanFieldItem(byteValue != 0x00);
                     break;
@@ -419,30 +419,47 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // -----------------------------------------
                     case BOOL: {
                         byte byteValue = data.readByte();
-                        fieldItem = new BooleanFieldItem(byteValue != 0x00);
+                        fieldItem = new S7BooleanFieldItem(field.getDataType(),byteValue != 0x00);
                         break;
                     }
                     // -----------------------------------------
                     // Bit-strings
                     // -----------------------------------------
                     case BYTE: { // 1 byte
-                        Long longValue = (long) data.readByte();
-                        // TODO: Implement this ...
+                        BitSet bitSet = BitSet.valueOf(new byte[]{data.readByte()});
+                        Boolean[] booleanValues = new Boolean[8];
+                        for(int i = 0; i < 8; i++) {
+                            booleanValues[i] = bitSet.get(i);
+                        }
+                        fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
                         break;
                     }
                     case WORD: { // 2 byte (16 bit)
-                        Long longValue = (long) data.readShort();
-                        // TODO: Implement this ...
+                        BitSet bitSet = BitSet.valueOf(new byte[]{data.readByte(), data.readByte()});
+                        Boolean[] booleanValues = new Boolean[8];
+                        for(int i = 0; i < 16; i++) {
+                            booleanValues[i] = bitSet.get(i);
+                        }
+                        fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
                         break;
                     }
                     case DWORD: { // 4 byte (32 bit)
-                        Long longValue = (long) data.readInt();
-                        // TODO: Implement this ...
+                        BitSet bitSet = BitSet.valueOf(new byte[]{
+                            data.readByte(), data.readByte(), data.readByte(), data.readByte()});
+                        Boolean[] booleanValues = new Boolean[8];
+                        for(int i = 0; i < 32; i++) {
+                            booleanValues[i] = bitSet.get(i);
+                        }
+                        fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
                         break;
                     }
                     case LWORD: { // 8 byte (64 bit)
-                        Long longValue = data.readLong();
-                        // TODO: Implement this ...
+                        BitSet bitSet = BitSet.valueOf(new long[]{data.readLong()});
+                        Boolean[] booleanValues = new Boolean[8];
+                        for(int i = 0; i < 64; i++) {
+                            booleanValues[i] = bitSet.get(i);
+                        }
+                        fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
                         break;
                     }
                     // -----------------------------------------
@@ -451,45 +468,45 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // 8 bit:
                     case SINT: {
                         Long longValue = (long) data.readShort();
-                        fieldItem = new IntegerFieldItem(longValue);
+                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case USINT: {
                         Long longValue = (long) data.readUnsignedShort();
-                        fieldItem = new IntegerFieldItem(longValue);
+                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     // 16 bit:
                     case INT: {
                         Long longValue = (long) data.readInt();
-                        fieldItem = new IntegerFieldItem(longValue);
+                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case UINT: {
                         Long longValue = data.readUnsignedInt();
-                        fieldItem = new IntegerFieldItem(longValue);
+                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     // 32 bit:
                     case DINT: {
                         Long longValue = data.readLong();
-                        fieldItem = new IntegerFieldItem(longValue);
+                        fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
                         break;
                     }
                     case UDINT: {
                         BigInteger bigIntegerValue = readUnsignedLong(data);
-                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+                        fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
                         break;
                     }
                     // 64 bit:
                     case LINT: {
                         BigInteger bigIntegerValue = readSigned64BitInteger(data);
-                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+                        fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
                         break;
                     }
                     case ULINT: {
                         BigInteger bigIntegerValue = readUnsigned64BitInteger(data);
-                        fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+                        fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
                         break;
                     }
                     // -----------------------------------------
@@ -497,12 +514,12 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     // -----------------------------------------
                     case REAL: {
                         double doubleValue = data.readFloat();
-                        fieldItem = new FloatingPointFieldItem(doubleValue);
+                        fieldItem = new S7FloatingPointFieldItem(field.getDataType(), doubleValue);
                         break;
                     }
                     case LREAL: {
                         double doubleValue = data.readDouble();
-                        fieldItem = new FloatingPointFieldItem(doubleValue);
+                        fieldItem = new S7FloatingPointFieldItem(field.getDataType(), doubleValue);
                         break;
                     }
                     // -----------------------------------------
@@ -511,13 +528,13 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                     case CHAR: { // 1 byte (8 bit)
                         // TODO: Double check, if this is ok?
                         String stringValue = data.readCharSequence(1, Charset.forName("UTF-8")).toString();
-                        fieldItem = new StringFieldItem(stringValue);
+                        fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
                         break;
                     }
                     case WCHAR: { // 2 byte
                         // TODO: Double check, if this is ok?
                         String stringValue = data.readCharSequence(2, Charset.forName("UTF-16")).toString();
-                        fieldItem = new StringFieldItem(stringValue);
+                        fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
                         break;
                     }
                     case STRING: {
@@ -526,7 +543,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                         byte actualLength = data.readByte();
                         // TODO: Double check, if this is ok?
                         String stringValue = data.readCharSequence(actualLength, Charset.forName("UTF-8")).toString();
-                        fieldItem = new StringFieldItem(stringValue);
+                        fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
                         break;
                     }
                     case WSTRING: {
@@ -536,7 +553,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
                         // TODO: Double check, if this is ok?
                         String stringValue = data.readCharSequence(
                             actualLength * 2, Charset.forName("UTF-16")).toString();
-                        fieldItem = new StringFieldItem(stringValue);
+                        fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
                         break;
                     }
                     default:
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 870e804..e763b19 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
@@ -577,6 +577,11 @@ public class S7Protocol extends ChannelDuplexHandler {
                 VarPayloadItem payload = new VarPayloadItem(dataTransportErrorCode, dataTransportSize, data);
                 payloadItems.add(payload);
                 i += S7SizeHelper.getPayloadLength(payload);
+                // It seems that datatype BIT reads an additional byte, if it's not the last.
+                if((dataTransportSize == DataTransportSize.BIT) && (userData.readableBytes() > 0)) {
+                    userData.readByte();
+                    i++;
+                }
             }
         }
 
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 d8dc40e..4cb91d7 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
@@ -23,6 +23,7 @@ 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.*;
+import org.apache.plc4x.java.s7.messages.items.*;
 import org.apache.plc4x.java.s7.model.S7Field;
 import org.apache.plc4x.java.s7.types.S7DataType;
 
@@ -197,7 +198,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
         }
-        return new BooleanFieldItem(booleanValues.toArray(new Boolean[0]));
+        return new S7BooleanFieldItem(s7Field.getDataType(), booleanValues.toArray(new Boolean[0]));
     }
 
     private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
@@ -292,7 +293,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 }
                 longValues[i] = value.longValue();
             }
-            return new IntegerFieldItem(longValues);
+            return new S7IntegerFieldItem(s7Field.getDataType(), longValues);
         } else {
             BigInteger[] bigIntegerValues = new BigInteger[values.length];
             for (int i = 0; i < values.length; i++) {
@@ -319,7 +320,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 }
                 bigIntegerValues[i] = value;
             }
-            return new BigIntegerFieldItem(bigIntegerValues);
+            return new S7BigIntegerFieldItem(s7Field.getDataType(), bigIntegerValues);
         }
     }
 
@@ -364,7 +365,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                         + s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
             }
         }
-        return new FloatingPointFieldItem(floatingPointValues);
+        return new S7FloatingPointFieldItem(s7Field.getDataType(), floatingPointValues);
     }
 
     private FieldItem internalEncodeString(PlcField field, Object[] values) {
@@ -392,7 +393,6 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                 throw new IllegalArgumentException(
                     "Cannot assign string values to " + s7Field.getDataType().name() + " fields.");
         }
-
         List<String> stringValues = new LinkedList<>();
         for (Object value : values) {
             if(value instanceof String) {
@@ -461,7 +461,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
                         " is not assignable to " + s7Field.getDataType().name() + " fields.");
             }
         }
-        return new StringFieldItem(stringValues.toArray(new String[0]));
+        return new S7StringFieldItem(s7Field.getDataType(), stringValues.toArray(new String[0]));
     }
 
     private FieldItem internalEncodeTemporal(PlcField field, Object[] values) {
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
index bce7a95..1c93a94 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
@@ -27,6 +27,9 @@ public class TestFieldItem<T> extends FieldItem<T> {
         super(values);
     }
 
-
+    @Override
+    public Object getObject(int index) {
+        return getValue(index);
+    }
 
 }