You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cg...@apache.org on 2024/12/20 15:45:49 UTC

(plc4x-extras) branch feature/merlot updated: Add S7 PV types and test support.

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

cgarcia pushed a commit to branch feature/merlot
in repository https://gitbox.apache.org/repos/asf/plc4x-extras.git


The following commit(s) were added to refs/heads/feature/merlot by this push:
     new c99baab  Add S7 PV types and test support.
c99baab is described below

commit c99baab640e0b411702e39372d9bd8e40c949b6b
Author: César García <ce...@ceos.com.ve>
AuthorDate: Fri Dec 20 11:45:31 2024 -0400

    Add S7 PV types and test support.
---
 .../org/apache/plc4x/merlot/db/api/DBRecord.java   |   2 +-
 .../plc4x/merlot/db/core/DBBooleanFactory.java     |   2 +-
 .../apache/plc4x/merlot/db/core/DBByteFactory.java |   2 +-
 .../plc4x/merlot/db/core/DBDoubleFactory.java      |   2 +-
 .../plc4x/merlot/db/core/DBFloatFactory.java       |   2 +-
 .../apache/plc4x/merlot/db/core/DBIntFactory.java  |   2 +-
 .../apache/plc4x/merlot/db/core/DBLongFactory.java |   2 +-
 .../plc4x/merlot/db/core/DBShortFactory.java       |   2 +-
 .../plc4x/merlot/db/core/DBStringFactory.java      |   2 +-
 .../plc4x/merlot/db/core/DBUByteFactory.java       |   2 +-
 .../apache/plc4x/merlot/db/core/DBUIntFactory.java |   2 +-
 .../plc4x/merlot/db/core/DBULongFactory.java       |   2 +-
 .../plc4x/merlot/db/core/DBUShortFactory.java      |   2 +-
 .../plc4x/merlot/db/impl/DBWriterHandlerImpl.java  |   5 +-
 .../merlot/org.apache.plc4x.merlot.drv.s7/pom.xml  |  18 ++
 .../plc4x/merlot/drv/s7/core/S7DBAiFactory.java    | 140 +++++++---
 .../plc4x/merlot/drv/s7/core/S7DBAoFactory.java    |   5 +-
 .../merlot/drv/s7/core/S7DBCounterFactory.java     |   2 +-
 .../merlot/drv/s7/core/S7DBDateAndTimeFactory.java |   2 +-
 .../plc4x/merlot/drv/s7/core/S7DBDateFactory.java  |   2 +-
 .../plc4x/merlot/drv/s7/core/S7DBDiFactory.java    |   6 +-
 .../plc4x/merlot/drv/s7/core/S7DBDoFactory.java    |   6 +-
 .../plc4x/merlot/drv/s7/core/S7DBMotorFactory.java |   8 +-
 .../merlot/drv/s7/core/S7DBS5TimeFactory.java      |   2 +-
 .../merlot/drv/s7/core/S7DBStringFactory.java      |   2 +-
 .../plc4x/merlot/drv/s7/core/S7DBTimeFactory.java  |   2 +-
 .../merlot/drv/s7/core/S7DBTimeOfDayFactory.java   |   2 +-
 .../plc4x/merlot/drv/s7/core/S7DBValveFactory.java |  11 +-
 .../plc4x/merlot/drv/s7/core/S7DBAiTest.java       | 285 +++++++++++++++++++++
 .../plc4x/merlot/drv/s7/core/S7TestSupport.java    |  25 ++
 30 files changed, 488 insertions(+), 61 deletions(-)

diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
index b126166..b524538 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/api/DBRecord.java
@@ -115,7 +115,7 @@ public class DBRecord extends PVRecord   implements PlcItemListener {
         return MONITOR_VALUE_FIELD;
     };
     
-    public void getOffset(String strOffset){
+    public void ParseOffset(String strOffset){
         Matcher matcher;
         if ((matcher = BYTE_OFFSET_PATTERN.matcher(strOffset)).matches()){
             byteOffset = Integer.parseInt(matcher.group(BYTE_OFFSET ));
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
index da8d981..03a23f6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBBooleanFactory.java
@@ -127,7 +127,7 @@ public class DBBooleanFactory extends DBBaseFactory {
         public void atach(PlcItem plcItem) {
             try {
                 this.plcItem = plcItem;
-                getOffset( this.getPVStructure().getStringField("offset").get());
+                ParseOffset( this.getPVStructure().getStringField("offset").get());
                 innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);                
             } catch (Exception ex) {
                 LOGGER.error(this.getClass().getName() + " : " + ex.getMessage());
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
index c1522b8..e495edd 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBByteFactory.java
@@ -121,7 +121,7 @@ public class DBByteFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
index 0a355ef..e297c61 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBDoubleFactory.java
@@ -120,7 +120,7 @@ public class DBDoubleFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
index 26f25a1..6bb3d27 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBFloatFactory.java
@@ -120,7 +120,7 @@ public class DBFloatFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem; 
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
index dd42340..0dc155e 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBIntFactory.java
@@ -117,7 +117,7 @@ public class DBIntFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem; 
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
index 369cde7..f11e400 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBLongFactory.java
@@ -117,7 +117,7 @@ public class DBLongFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
index 398b065..63fc2d5 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBShortFactory.java
@@ -122,7 +122,7 @@ public class DBShortFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
index 081db47..5295acc 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBStringFactory.java
@@ -114,7 +114,7 @@ public class DBStringFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = Unpooled.wrappedBuffer(plcItem.getInnerBuffer(), 0, offset);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
index af55c85..ca8ba28 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUByteFactory.java
@@ -117,7 +117,7 @@ public class DBUByteFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;             
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
index 1a7e609..9a14587 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUIntFactory.java
@@ -117,7 +117,7 @@ public class DBUIntFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());
+            ParseOffset( this.getPVStructure().getStringField("offset").get());
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
index c49dc47..f35ba5d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBULongFactory.java
@@ -119,7 +119,7 @@ public class DBULongFactory extends DBBaseFactory {
         @Override
         public void atach(PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
index aaed46e..8a04662 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/core/DBUShortFactory.java
@@ -119,7 +119,7 @@ public class DBUShortFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
index 7043b3f..5ee1386 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.db/src/main/java/org/apache/plc4x/merlot/db/impl/DBWriterHandlerImpl.java
@@ -71,7 +71,10 @@ import org.slf4j.LoggerFactory;
 * the associated PlcItem.
 */
 public class DBWriterHandlerImpl implements DBWriterHandler {
-
+/*
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
+ * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template
+ */
     private static final Logger LOGGER = LoggerFactory.getLogger(DBWriterHandlerImpl.class);
     private  CreateRequest createRequest = CreateRequest.create();
     private Map<Monitor, DBRecord> recordMonitors = new HashMap<>();
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
index 8c282ad..48cdafa 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/pom.xml
@@ -84,5 +84,23 @@
             <artifactId>org.apache.plc4x.merlot.db</artifactId>
             <version>0.13.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>5.10.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <version>5.10.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <version>5.10.3</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java
index 3980876..0bee31c 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiFactory.java
@@ -19,6 +19,7 @@
 package org.apache.plc4x.merlot.drv.s7.core;
 
 import io.netty.buffer.Unpooled;
+import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.plc4x.merlot.api.PlcItem;
 import org.apache.plc4x.merlot.api.PlcItemListener;
 import org.apache.plc4x.merlot.db.api.DBRecord;
@@ -34,6 +35,7 @@ import org.epics.pvdata.pv.PVFloat;
 import org.epics.pvdata.pv.PVShort;
 import org.epics.pvdata.pv.PVStructure;
 import org.epics.pvdata.pv.ScalarType;
+import org.epics.pvdata.pv.Structure;
 
 
 public class S7DBAiFactory extends DBBaseFactory {
@@ -45,7 +47,7 @@ public class S7DBAiFactory extends DBBaseFactory {
         NTScalarBuilder ntScalarBuilder = NTScalar.createBuilder();
         FieldBuilder fb = fieldCreate.createFieldBuilder();
         
-        Field cmd = fb.addNestedStructure("cmd").
+        Field cmd = fb.setId("cmd_t").
                 add("iMode", fieldCreate.createScalar(ScalarType.pvShort)).
                 add("iErrorCode", fieldCreate.createScalar(ScalarType.pvShort)).                
                 add("iStatus", fieldCreate.createScalar(ScalarType.pvShort)). 
@@ -54,33 +56,45 @@ public class S7DBAiFactory extends DBBaseFactory {
                 add("rManualValue", fieldCreate.createScalar(ScalarType.pvFloat)).                 
                 add("bPB_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)).                                 
                 add("bPBEN_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)).    
-                add("bError", fieldCreate.createScalar(ScalarType.pvBoolean)).                 
+                add("bError", fieldCreate.createScalar(ScalarType.pvBoolean)).
                 createStructure();
         
-        Field sts = fb.addNestedStructure("sts").                
+        Field sts = fb.setId("sts_t").              
                 add("bLowLowAlarm", fieldCreate.createScalar(ScalarType.pvBoolean)).                                 
                 add("bHighHighAlarm", fieldCreate.createScalar(ScalarType.pvBoolean)).    
-                add("bInvalid", fieldCreate.createScalar(ScalarType.pvBoolean)).                 
+                add("bInvalid", fieldCreate.createScalar(ScalarType.pvBoolean)).  
                 createStructure();
 
-        Field out =  fb.setId("output_t").   
+        Field par =  fb.setId("par_t"). 
                 add("iMode", fieldCreate.createScalar(ScalarType.pvShort)).
                 add("rManualValue", fieldCreate.createScalar(ScalarType.pvFloat)).                 
-                add("bPB_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)). 
+                add("bPB_ResetError", fieldCreate.createScalar(ScalarType.pvBoolean)).
+                
+                add("iSensorType", fieldCreate.createScalar(ScalarType.pvShort)).
+                add("rInEngUnitsMin", fieldCreate.createScalar(ScalarType.pvFloat)).
+                add("rInEngUnitsMax", fieldCreate.createScalar(ScalarType.pvFloat)).
+                add("rInLowLow", fieldCreate.createScalar(ScalarType.pvFloat)).                
+                add("rInLow", fieldCreate.createScalar(ScalarType.pvFloat)). 
+                add("rInHigh", fieldCreate.createScalar(ScalarType.pvFloat)). 
+                add("rInHighHigh", fieldCreate.createScalar(ScalarType.pvFloat)).
+                add("rInLowLowDeadband", fieldCreate.createScalar(ScalarType.pvFloat)). 
+                add("rInLowDeadband", fieldCreate.createScalar(ScalarType.pvFloat)).
+                add("rInHighDeadband", fieldCreate.createScalar(ScalarType.pvFloat)). 
+                add("rInHighHighDeadband", fieldCreate.createScalar(ScalarType.pvFloat)). 
                 createStructure();
         
         PVStructure pvStructure = ntScalarBuilder.
             value(ScalarType.pvShort).
-            addDescriptor().
-            add("cmd", cmd).
-            add("sts", sts).   
-            add("out", out).       
+            addDescriptor().     
             add("id", fieldCreate.createScalar(ScalarType.pvString)).  
             add("offset", fieldCreate.createScalar(ScalarType.pvString)).                 
             add("scan_time", fieldCreate.createScalar(ScalarType.pvString)).
             add("scan_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).
             add("write_enable", fieldCreate.createScalar(ScalarType.pvBoolean)).  
-            add("write_value", fieldCreate.createScalar(ScalarType.pvShort)).                 
+            add("write_value", fieldCreate.createScalar(ScalarType.pvShort)). 
+            add("cmd", cmd).
+            add("sts", sts).   
+            add("par", par).  
             addAlarm().
             addTimeStamp().
             addDisplay().
@@ -93,8 +107,13 @@ public class S7DBAiFactory extends DBBaseFactory {
            
     class DBS7DiRecord extends DBRecord implements PlcItemListener {   
     
-        private int BUFFER_SIZE = 20;
-        private static final String MONITOR_TF_FIELDS = "field(write_enable, out{iMode, rManualValue, bPB_ResetError})";         
+        private int BUFFER_SIZE = 64;
+        private static final String MONITOR_TF_FIELDS = "field(write_enable, "
+                + "out{iMode, rManualValue, bPB_ResetError,"
+                + "iSensorType, rInEngUnitsMin, rInEngUnitsMax,"
+                + "rInLowLow, rInLow, rInHigh,"
+                + "rInHighHigh, rInLowLowDeadband, rInLowDeadband,"
+                + "rInHighDeadband, rInHighHighDeadband})";         
    
     
         private PVShort value; 
@@ -119,16 +138,30 @@ public class S7DBAiFactory extends DBBaseFactory {
         
         private PVShort out_iMode;         
         private PVFloat out_rManualValue;         
-        private PVBoolean out_bPB_ResetError;        
+        private PVBoolean out_bPB_ResetError; 
+        
+        private PVShort iSensorType;
+        private PVFloat rInEngUnitsMin;
+        private PVFloat rInEngUnitsMax;  
+        private PVFloat rInLowLow; 
+        private PVFloat rInLow;
+        private PVFloat rInHigh;        
+        private PVFloat rInHighHigh; 
+        private PVFloat rInLowLowDeadband;         
+        private PVFloat rInLowDeadband; 
+        private PVFloat rInHighDeadband;
+        private PVFloat rInHighHighDeadband;         
         
         byte byTemp;
     
         public DBS7DiRecord(String recordName,PVStructure pvStructure) {
             super(recordName, pvStructure);
-            value = pvStructure.getShortField("value");
+            fieldOffsets.clear();      
+            value = pvStructure.getShortField("value"); 
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");              
             iMode = pvStructureCmd.getShortField("iMode");
             iErrorCode = pvStructureCmd.getShortField("iErrorCode");
@@ -140,16 +173,47 @@ public class S7DBAiFactory extends DBBaseFactory {
             bPBEN_ResetError = pvStructureCmd.getBooleanField("bPBEN_ResetError");
             bError = pvStructureCmd.getBooleanField("bError");               
 
+            //Read status values
             PVStructure pvStructureSts = pvStructure.getStructureField("sts");
-            bLowLowAlarm =  pvStructureSts.getBooleanField("bLowLowAlar");
+            bLowLowAlarm =  pvStructureSts.getBooleanField("bLowLowAlarm");
             bHighHighAlarm =  pvStructureSts.getBooleanField("bHighHighAlarm");
             bInvalid =  pvStructureSts.getBooleanField("bInvalid");
             
-            PVStructure pvStructureOut = pvStructure.getStructureField("out");
-            out_iMode = pvStructureOut.getShortField("iMode");     
-            out_rManualValue = pvStructureOut.getFloatField("rManualValue");  
-            out_bPB_ResetError = pvStructureOut.getBooleanField("bPB_ResetError");  
-
+            //Write command and parameters values
+            PVStructure pvStructurePar = pvStructure.getStructureField("par");
+            out_iMode = pvStructurePar.getShortField("iMode");     
+            out_rManualValue = pvStructurePar.getFloatField("rManualValue");  
+            out_bPB_ResetError = pvStructurePar.getBooleanField("bPB_ResetError");
+            
+            iSensorType = pvStructurePar.getShortField("iSensorType");
+            rInEngUnitsMin = pvStructurePar.getFloatField("rInEngUnitsMin");
+            rInEngUnitsMax = pvStructurePar.getFloatField("rInEngUnitsMax");  
+            rInLowLow = pvStructurePar.getFloatField("rInLowLow"); 
+            rInLow = pvStructurePar.getFloatField("rInLow");
+            rInHigh = pvStructurePar.getFloatField("rInHigh");       
+            rInHighHigh = pvStructurePar.getFloatField("rInHighHigh");
+            rInLowLowDeadband = pvStructurePar.getFloatField("rInLowLowDeadband");        
+            rInLowDeadband = pvStructurePar.getFloatField("rInLowDeadband"); 
+            rInHighDeadband = pvStructurePar.getFloatField("rInHighDeadband");
+            rInHighHighDeadband = pvStructurePar.getFloatField("rInHighHighDeadband");            
+            
+            fieldOffsets.add(0, null); 
+            fieldOffsets.add(1, null);
+            fieldOffsets.add(2, null);
+            fieldOffsets.add(3, new ImmutablePair(0,  (byte) -1));   //iMode
+            fieldOffsets.add(4, new ImmutablePair(14, (byte) -1));  //rManualValue
+            fieldOffsets.add(5, new ImmutablePair(18, (byte) 0));   //bPB_ResetError  
+            fieldOffsets.add(6, new ImmutablePair(22, (byte) -1));  //iSensorType   
+            fieldOffsets.add(7, new ImmutablePair(24, (byte) -1));  //rInEngUnitsMin 
+            fieldOffsets.add(8, new ImmutablePair(28, (byte) -1));  //rInEngUnitsMax 
+            fieldOffsets.add(9, new ImmutablePair(32, (byte) -1));  //rInLowLow
+            fieldOffsets.add(10, new ImmutablePair(36,(byte) -1)); //rInLow
+            fieldOffsets.add(11, new ImmutablePair(40,(byte) -1)); //rInHigh 
+            fieldOffsets.add(12, new ImmutablePair(44,(byte) -1)); //rInHighHigh
+            fieldOffsets.add(13, new ImmutablePair(48,(byte) -1)); //rInLowLowDeadband 
+            fieldOffsets.add(14, new ImmutablePair(52,(byte) -1)); //rInLowDeadband 
+            fieldOffsets.add(15, new ImmutablePair(56,(byte) -1)); //rInHighDeadband  
+            fieldOffsets.add(16, new ImmutablePair(60,(byte) -1)); //rInHighHighDeadband             
         }    
 
         /**
@@ -170,7 +234,7 @@ public class S7DBAiFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem; 
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
@@ -184,23 +248,41 @@ public class S7DBAiFactory extends DBBaseFactory {
         public void update() {    
             if (null != plcItem) {
                 innerBuffer.resetReaderIndex();
-                iMode.put(innerBuffer.readShort());
-                iErrorCode.put(innerBuffer.readShort());  
-                iStatus.put(innerBuffer.readShort()); 
+                iMode.put(innerBuffer.getShort(0));
+                iErrorCode.put(innerBuffer.getShort(2));  
+                iStatus.put(innerBuffer.getShort(4)); 
+                
+                rActiveValue.put(innerBuffer.getFloat(6)); 
+                rInputValue.put(innerBuffer.getFloat(10)); 
                 
-                rActiveValue.put(innerBuffer.readFloat()); 
-                rInputValue.put(innerBuffer.readFloat());                 
+                if (bFirtsRun) {
+                    rManualValue.put(innerBuffer.getFloat(14));
+                }
                 
-                byTemp = innerBuffer.readByte();                
+                byTemp = innerBuffer.getByte(18);
                 bPB_ResetError.put(isBitSet(byTemp, 0));
                 bPBEN_ResetError.put(isBitSet(byTemp, 1));                
                 bError.put(isBitSet(byTemp, 2));  
                 
-                byTemp = innerBuffer.readByte();                 
+                byTemp = innerBuffer.getByte(20);                 
                 bLowLowAlarm.put(isBitSet(byTemp, 0));                  
                 bHighHighAlarm.put(isBitSet(byTemp, 1));
                 bInvalid.put(isBitSet(byTemp, 2)); 
                 
+                if (bFirtsRun) {
+                    iSensorType.put(innerBuffer.getShort(22));
+                    rInEngUnitsMin.put(innerBuffer.getFloat(24));
+                    rInEngUnitsMax.put(innerBuffer.getFloat(28));
+                    rInLowLow.put(innerBuffer.getFloat(32)); 
+                    rInLow.put(innerBuffer.getFloat(36));
+                    rInHigh.put(innerBuffer.getFloat(40));
+                    rInHighHigh.put(innerBuffer.getFloat(44));
+                    rInLowLowDeadband.put(innerBuffer.getFloat(48)); 
+                    rInLowDeadband.put(innerBuffer.getFloat(52));
+                    rInHighDeadband.put(innerBuffer.getFloat(56)); 
+                    rInHighHighDeadband.put(innerBuffer.getFloat(60));                     
+                }
+                
             }
         }
         
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java
index fe95834..7b0e8d6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAoFactory.java
@@ -133,6 +133,7 @@ public class S7DBAoFactory extends DBBaseFactory {
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");              
             iMode = pvStructureCmd.getShortField("iMode");
             iErrorCode = pvStructureCmd.getShortField("iErrorCode");             
@@ -146,10 +147,12 @@ public class S7DBAoFactory extends DBBaseFactory {
             bInterlock = pvStructureCmd.getBooleanField("bInterlock");             
             iEstopFunction =  pvStructureCmd.getIntField("iEstopFunction");
             
+            //Read status values            
             PVStructure pvStructureSts = pvStructure.getStructureField("sts");            
             bOutOfRange =  pvStructureSts.getBooleanField("sts/iEstopFunction");
             bConfiguratonError =  pvStructureSts.getBooleanField("sts/ConfiguratonError");
 
+            //Write command values            
             PVStructure pvStructureOut = pvStructure.getStructureField("out");
             out_iMode = pvStructureOut.getShortField("iMode");
             out_rManualValue = pvStructureOut.getFloatField("rManualValue");
@@ -177,7 +180,7 @@ public class S7DBAoFactory extends DBBaseFactory {
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
             //offset = this.getPVStructure().getIntField("offset").get() * Short.BYTES;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBCounterFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBCounterFactory.java
index f55e5ee..c547a53 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBCounterFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBCounterFactory.java
@@ -130,7 +130,7 @@ public class S7DBCounterFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateAndTimeFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateAndTimeFactory.java
index 2d076ba..ff4c0be 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateAndTimeFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateAndTimeFactory.java
@@ -148,7 +148,7 @@ public class S7DBDateAndTimeFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateFactory.java
index a38bf82..1bc7511 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDateFactory.java
@@ -148,7 +148,7 @@ public class S7DBDateFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java
index b948781..9a4d291 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDiFactory.java
@@ -114,6 +114,7 @@ public class S7DBDiFactory extends DBBaseFactory {
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");                        
             iMode = pvStructureCmd.getShortField("iMode");            
             bOn = pvStructureCmd.getBooleanField("bOn");            
@@ -123,6 +124,9 @@ public class S7DBDiFactory extends DBBaseFactory {
             bPBEN_On = pvStructureCmd.getBooleanField("bPBEN_On");
             bPBEN_Off = pvStructureCmd.getBooleanField("bPBEN_Off");
             
+            //Read status values
+
+            //Write command values            
             PVStructure pvStructureOut = pvStructure.getStructureField("out");             
             out_iMode = pvStructureOut.getShortField("iMode");
             out_bPB_On = pvStructureOut.getBooleanField("bPB_On");
@@ -150,7 +154,7 @@ public class S7DBDiFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java
index 54c63c8..62d4cdd 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBDoFactory.java
@@ -114,6 +114,7 @@ public class S7DBDoFactory extends DBBaseFactory {
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");              
             iMode = pvStructureCmd.getShortField("iMode");            
             bOn = pvStructureCmd.getBooleanField("bOn");            
@@ -123,6 +124,9 @@ public class S7DBDoFactory extends DBBaseFactory {
             bPBEN_On = pvStructureCmd.getBooleanField("bPBEN_On");
             bPBEN_Off = pvStructureCmd.getBooleanField("bPBEN_Off");
             
+            //Read status values
+            
+            //Write command values            
             PVStructure pvStructureOut = pvStructure.getStructureField("out");             
             out_iMode = pvStructureOut.getShortField("iMode");
             out_bPB_On = pvStructureOut.getBooleanField("bPB_On");
@@ -149,7 +153,7 @@ public class S7DBDoFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java
index ef8ef1e..5e674c2 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBMotorFactory.java
@@ -171,11 +171,11 @@ public class S7DBMotorFactory extends DBBaseFactory {
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");            
             iMode = pvStructureCmd.getShortField("iMode");
             iErrorCode = pvStructureCmd.getShortField("iErrorCode");            
-            iStatus = pvStructureCmd.getShortField("iStatus");
-          
+            iStatus = pvStructureCmd.getShortField("iStatus");          
             bPB_ResetError = pvStructureCmd.getBooleanField("bPB_ResetError");            
             bPB_Forward = pvStructureCmd.getBooleanField("bPB_Forward");
             bPB_Reverse = pvStructureCmd.getBooleanField("bPB_Reverse");            
@@ -191,6 +191,7 @@ public class S7DBMotorFactory extends DBBaseFactory {
             bError = pvStructureCmd.getBooleanField("bError");
             bInterlock = pvStructureCmd.getBooleanField("bInterlock"); 
             
+            //Read status values            
             PVStructure pvStructureSts = pvStructure.getStructureField("sts");
             bMotorProtectorTripped = pvStructureSts.getBooleanField("bMotorProtectorTripped");
             bLocalDisconnectOff = pvStructureSts.getBooleanField("bLocalDisconnectOff"); 
@@ -199,6 +200,7 @@ public class S7DBMotorFactory extends DBBaseFactory {
             bNoSignalReverse = pvStructureSts.getBooleanField("bNoSignalReverse");
             bMotorNotStopped = pvStructureSts.getBooleanField("bMotorNotStopped"); 
             
+            //Write command values            
             PVStructure pvStructureOut = pvStructure.getStructureField("out"); 
             out_iMode = pvStructureOut.getShortField("iMode");
             out_bPB_ResetError = pvStructureOut.getBooleanField("bPB_ResetError"); 
@@ -230,7 +232,7 @@ public class S7DBMotorFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBS5TimeFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBS5TimeFactory.java
index a14edaa..8c4a4dc 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBS5TimeFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBS5TimeFactory.java
@@ -147,7 +147,7 @@ public class S7DBS5TimeFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBStringFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBStringFactory.java
index e627c84..2b47c6d 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBStringFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBStringFactory.java
@@ -164,7 +164,7 @@ public class S7DBStringFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get()); 
+            ParseOffset( this.getPVStructure().getStringField("offset").get()); 
             k = plcItem.getItemByteBuf().getByte(byteOffset);
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset + 1, k + 1);
             innerWriteBuffer = Unpooled.buffer(k + 1);
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeFactory.java
index 8d63bda..43dc56a 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeFactory.java
@@ -147,7 +147,7 @@ public class S7DBTimeFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeOfDayFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeOfDayFactory.java
index ec57114..e0a42d1 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeOfDayFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBTimeOfDayFactory.java
@@ -147,7 +147,7 @@ public class S7DBTimeOfDayFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;  
-            getOffset( this.getPVStructure().getStringField("offset").get());            
+            ParseOffset( this.getPVStructure().getStringField("offset").get());            
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
         }
 
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveFactory.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveFactory.java
index c085df5..0619ad6 100644
--- a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveFactory.java
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/main/java/org/apache/plc4x/merlot/drv/s7/core/S7DBValveFactory.java
@@ -162,19 +162,18 @@ public class S7DBValveFactory extends DBBaseFactory {
             write_value = pvStructure.getShortField("write_value");
             write_enable = pvStructure.getBooleanField("write_enable");
             
+            //Read command values
             PVStructure pvStructureCmd = pvStructure.getStructureField("cmd");             
             iMode = pvStructureCmd.getShortField("iMode");
             iErrorCode = pvStructureCmd.getShortField("iErrorCode");            
-            iStatus = pvStructureCmd.getShortField("iStatus");
-                                              
+            iStatus = pvStructureCmd.getShortField("iStatus");                                              
             bPB_ResetError = pvStructureCmd.getBooleanField("bPB_ResetError");
             bPB_Home = pvStructureCmd.getBooleanField("bPB_Home");
             bPB_Work = pvStructureCmd.getBooleanField("bPB_Work");
             bPBEN_ResetError = pvStructureCmd.getBooleanField("bPBEN_ResetError");
             bPBEN_Home = pvStructureCmd.getBooleanField("bPBEN_Home");            
             bPBEN_Work = pvStructureCmd.getBooleanField("bPBEN_Work");
-            bPBEN_Stop = pvStructureCmd.getBooleanField("bPBEN_Stop");
-            
+            bPBEN_Stop = pvStructureCmd.getBooleanField("bPBEN_Stop");            
             bHomeOn = pvStructureCmd.getBooleanField("bHomeOn");            
             bWorkOn = pvStructureCmd.getBooleanField("bWorkOn");
             bSignalHome = pvStructureCmd.getBooleanField("bSignalHome");            
@@ -182,12 +181,14 @@ public class S7DBValveFactory extends DBBaseFactory {
             bError = pvStructureCmd.getBooleanField("bError");
             bInterlock = pvStructureCmd.getBooleanField("bInterlock");
             
+            //Read status values            
             PVStructure pvStructureSts = pvStructure.getStructureField("sts");            
             bNoHomeFeedback = pvStructureSts.getBooleanField("bNoHomeFeedback");
             bNoWorkFeedback = pvStructureSts.getBooleanField("bNoWorkFeedback");
             bHomeFeedbackStillActive = pvStructureSts.getBooleanField("bHomeFeedbackStillActive");  
             bWorkFeedbackStillActive = pvStructureSts.getBooleanField("bWorkFeedbackStillActive"); 
 
+            //Write command values            
             PVStructure pvStructureOut = pvStructure.getStructureField("out");
             out_iMode = pvStructureOut.getShortField("iMode");
             out_bPB_ResetError = pvStructureOut.getBooleanField("bPB_ResetError"); 
@@ -217,7 +218,7 @@ public class S7DBValveFactory extends DBBaseFactory {
         @Override
         public void atach(final PlcItem plcItem) {
             this.plcItem = plcItem;
-            getOffset( this.getPVStructure().getStringField("offset").get());             
+            ParseOffset( this.getPVStructure().getStringField("offset").get());             
             innerBuffer = plcItem.getItemByteBuf().slice(byteOffset, BUFFER_SIZE);
             innerWriteBuffer = Unpooled.copiedBuffer(innerBuffer);
         }
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiTest.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiTest.java
new file mode 100644
index 0000000..5e06265
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7DBAiTest.java
@@ -0,0 +1,285 @@
+/*
+ * 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.merlot.drv.s7.core;
+
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.ByteBufUtil;
+import static io.netty.buffer.Unpooled.buffer;
+import java.util.ArrayList;
+import java.util.Optional;
+import java.util.UUID;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.spi.values.PlcBYTE;
+import org.apache.plc4x.java.spi.values.PlcList;
+import org.apache.plc4x.java.spi.values.PlcRawByteArray;
+import org.apache.plc4x.merlot.api.PlcItem;
+import org.apache.plc4x.merlot.api.impl.PlcItemImpl;
+import org.apache.plc4x.merlot.api.impl.PlcItemImpl.PlcItemBuilder;
+import org.apache.plc4x.merlot.db.api.DBRecord;
+import org.apache.plc4x.merlot.db.core.DBBaseFactory;
+import org.epics.pvdata.pv.PVBoolean;
+import org.epics.pvdata.pv.PVFloat;
+import org.epics.pvdata.pv.PVShort;
+import org.epics.pvdata.pv.PVString;
+import org.epics.pvdata.pv.PVStructure;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+
+
+public class S7DBAiTest {
+    
+    
+    
+        private PVShort value; 
+        private PVShort write_value;
+        private PVBoolean write_enable; 
+        
+        private PVShort iMode; 
+        private PVShort iErrorCode;
+        private PVShort iStatus; 
+        
+        private PVFloat rActiveValue;
+        private PVFloat rInputValue; 
+        private PVFloat rManualValue;         
+        
+        private PVBoolean bPB_ResetError;
+        private PVBoolean bPBEN_ResetError;                
+        private PVBoolean bError; 
+        
+        private PVBoolean bLowLowAlarm;   
+        private PVBoolean bHighHighAlarm;
+        private PVBoolean bInvalid; 
+        
+        private PVShort out_iMode;         
+        private PVFloat out_rManualValue;         
+        private PVBoolean out_bPB_ResetError; 
+        
+        private PVShort iSensorType;
+        private PVFloat rInEngUnitsMin;
+        private PVFloat rInEngUnitsMax;  
+        private PVFloat rInLowLow; 
+        private PVFloat rInLow;
+        private PVFloat rInHigh;        
+        private PVFloat rInHighHigh; 
+        private PVFloat rInLowLowDeadband;         
+        private PVFloat rInLowDeadband; 
+        private PVFloat rInHighDeadband;
+        private PVFloat rInHighHighDeadband;      
+    
+    
+    
+    public S7DBAiTest() {
+    }
+    
+    @BeforeAll
+    public static void setUpClass() {
+    }
+    
+    @AfterAll
+    public static void tearDownClass() {
+    }
+    
+    @BeforeEach
+    public void setUp() {
+    }
+    
+    @AfterEach
+    public void tearDown() {
+    }
+    
+     @Test
+     public void FieldOffsetTest() { 
+        DBBaseFactory  AIFactory = new S7DBAiFactory();
+        DBRecord AI = AIFactory.create("AI_00");         
+        ArrayList<ImmutablePair<Integer, Byte>> fieldOffsets = AI.getFieldOffsets();
+        
+        assertNull(fieldOffsets.get(0));
+        assertNull(fieldOffsets.get(1));
+        assertNull(fieldOffsets.get(2));
+
+        assertEquals(fieldOffsets.get(3).left, 0); assertEquals(fieldOffsets.get(3).right, (byte) -1);
+        assertEquals(fieldOffsets.get(4).left, 14); assertEquals(fieldOffsets.get(4).right, (byte) -1);        
+        assertEquals(fieldOffsets.get(5).left, 18); assertEquals(fieldOffsets.get(5).right, (byte) 0); 
+        assertEquals(fieldOffsets.get(6).left, 22); assertEquals(fieldOffsets.get(6).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(7).left, 24); assertEquals(fieldOffsets.get(7).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(8).left, 28); assertEquals(fieldOffsets.get(8).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(9).left, 32); assertEquals(fieldOffsets.get(9).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(10).left, 36); assertEquals(fieldOffsets.get(10).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(11).left, 40); assertEquals(fieldOffsets.get(11).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(12).left, 44); assertEquals(fieldOffsets.get(12).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(13).left, 48); assertEquals(fieldOffsets.get(13).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(14).left, 52); assertEquals(fieldOffsets.get(14).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(15).left, 56); assertEquals(fieldOffsets.get(15).right, (byte) -1); 
+        assertEquals(fieldOffsets.get(16).left, 60); assertEquals(fieldOffsets.get(16).right, (byte) -1); 
+        
+        PVString pvStrOffset = AI.getPVRecordStructure().getPVStructure().getStringField("offset");
+        pvStrOffset.put("1255");
+
+        AI.ParseOffset("1255");
+        
+        assertEquals(AI.getBiteOffset(), -1);
+        assertEquals(AI.getByteOffset(), 1255); 
+        
+        AI.ParseOffset("255.7");        
+        assertEquals(AI.getBiteOffset(), 7);
+        assertEquals(AI.getByteOffset(), 255);         
+        
+     }    
+
+    // TODO add test methods here.
+    // The methods must be annotated with annotation @Test. For example:
+    //
+     @Test
+     public void DBRecordTest() {    
+         ByteBuf byteBuf = buffer(512);
+         //Create PLCList for the items
+         PlcValue plcValue = new PlcRawByteArray(byteBuf.array());
+         
+        
+         //Create the Item 
+        String uuid = UUID.randomUUID().toString();
+        PlcItem plcItem =new PlcItemImpl.PlcItemBuilder("ITEM_DB42").
+                                    setItemDescription("SIM DB42 S7").
+                                    setItemId(uuid).
+                                    setItemUid(UUID.fromString(uuid)).                                   
+                                    build();  
+        
+        
+        ByteBuf bufItem = plcItem.getItemByteBuf();
+        
+        byteBuf.setShort(0,1234);               //iMOde
+        byteBuf.setShort(2,4321);               //iErrorCode
+        byteBuf.setShort(4,1010);               //iStatus
+        byteBuf.setFloat(6, 3.1416F);           //iActiveValue
+        byteBuf.setFloat(10, 3.1416F * 2);      //rInputValue
+        byteBuf.setFloat(14, 3.1416F * 4);      //rManualValue
+        byteBuf.setShort(22, 123);              //iSensorType
+        byteBuf.setFloat(24, 3.1416F * 8);      //rInEngUnitsMin
+        byteBuf.setFloat(28, 3.1416F * 10);     //rInEngUnitsMax         
+        byteBuf.setFloat(32, 3.1416F * 12);     //rInLowLow         
+        byteBuf.setFloat(36, 3.1416F * 14);     //rInLow
+        byteBuf.setFloat(40, 3.1416F * 16);     //rInHigh
+        byteBuf.setFloat(44, 3.1416F * 18);     //rInHighHigh
+        byteBuf.setFloat(48, 3.1416F * 20);     //rInLowLowDeadband
+        byteBuf.setFloat(52, 3.1416F * 22);     //rInLowDeadband
+        byteBuf.setFloat(56, 3.1416F * 24);     //rInHighDeadband
+        byteBuf.setFloat(60, 3.1416F * 28);     //rInHighHighDeadband        
+        
+        byteBuf.setByte(511, 123);
+        
+        
+        S7DBAiFactory AIFactory = new S7DBAiFactory();
+        DBRecord AI_00 = AIFactory.create("AI_00"); 
+        PVString pvStrOffset = AI_00.getPVRecordStructure().getPVStructure().getStringField("offset");
+        pvStrOffset.put("0");
+
+        AI_00.atach(plcItem);
+        
+        plcItem.addItemListener(AI_00); 
+        plcItem.setPlcValue(plcValue);        
+        
+        PVStructure pvStructureCmd = AI_00.getPVRecordStructure().getPVStructure().getStructureField("cmd"); 
+        PVStructure pvStructureSts = AI_00.getPVRecordStructure().getPVStructure().getStructureField("sts");         
+        PVStructure pvStructurePar = AI_00.getPVRecordStructure().getPVStructure().getStructureField("par");
+        
+        value = AI_00.getPVRecordStructure().getPVStructure().getShortField("value"); 
+        write_value = AI_00.getPVRecordStructure().getPVStructure().getShortField("write_value");
+        write_enable = AI_00.getPVRecordStructure().getPVStructure().getBooleanField("write_enable");
+
+        //Read command values            
+        iMode = pvStructureCmd.getShortField("iMode");
+        iErrorCode = pvStructureCmd.getShortField("iErrorCode");
+        iStatus = pvStructureCmd.getShortField("iStatus");              
+        rActiveValue = pvStructureCmd.getFloatField("rActiveValue"); 
+        rInputValue = pvStructureCmd.getFloatField("rInputValue");                         
+        rManualValue = pvStructureCmd.getFloatField("rManualValue");
+        bPB_ResetError = pvStructureCmd.getBooleanField("bPB_ResetError");
+        bPBEN_ResetError = pvStructureCmd.getBooleanField("bPBEN_ResetError");
+        bError = pvStructureCmd.getBooleanField("bError");               
+
+        //Read status values
+        bLowLowAlarm =  pvStructureSts.getBooleanField("bLowLowAlarm");
+        bHighHighAlarm =  pvStructureSts.getBooleanField("bHighHighAlarm");
+        bInvalid =  pvStructureSts.getBooleanField("bInvalid");
+
+        //Write command and parameters values
+        out_iMode = pvStructurePar.getShortField("iMode");     
+        out_rManualValue = pvStructurePar.getFloatField("rManualValue");  
+        out_bPB_ResetError = pvStructurePar.getBooleanField("bPB_ResetError");
+
+        iSensorType = pvStructurePar.getShortField("iSensorType");
+        rInEngUnitsMin = pvStructurePar.getFloatField("rInEngUnitsMin");
+        rInEngUnitsMax = pvStructurePar.getFloatField("rInEngUnitsMax");  
+        rInLowLow = pvStructurePar.getFloatField("rInLowLow"); 
+        rInLow = pvStructurePar.getFloatField("rInLow");
+        rInHigh = pvStructurePar.getFloatField("rInHigh");       
+        rInHighHigh = pvStructurePar.getFloatField("rInHighHigh");
+        rInLowLowDeadband = pvStructurePar.getFloatField("rInLowLowDeadband");        
+        rInLowDeadband = pvStructurePar.getFloatField("rInLowDeadband"); 
+        rInHighDeadband = pvStructurePar.getFloatField("rInHighDeadband");
+        rInHighHighDeadband = pvStructurePar.getFloatField("rInHighHighDeadband");          
+        
+                    
+        assertEquals(iMode.get(), 1234);
+        assertEquals(iErrorCode.get(), 4321);
+        assertEquals(iStatus.get(), 1010);        
+        assertEquals(rActiveValue.get(), 3.1416F);
+        assertEquals(rInputValue.get(), 3.1416F * 2);        
+        assertEquals(rManualValue.get(), 3.1416F * 4); 
+        assertEquals(iSensorType.get(), 123);         
+        assertEquals(rInEngUnitsMin.get(), 3.1416F * 8);         
+        assertEquals(rInEngUnitsMax.get(), 3.1416F * 10);
+        assertEquals(rInLowLow.get(), 3.1416F * 12);
+        assertEquals(rInLow.get(), 3.1416F * 14);         
+        assertEquals(rInHigh.get(), 3.1416F * 16);
+        assertEquals(rInHighHigh.get(), 3.1416F * 18); 
+        assertEquals(rInLowLowDeadband.get(), 3.1416F * 20); 
+        assertEquals(rInLowDeadband.get(), 3.1416F * 22); 
+        assertEquals(rInHighDeadband.get(), 3.1416F * 24); 
+        assertEquals(rInHighHighDeadband.get(), 3.1416F * 28);  
+        
+        //Test bits        
+        byteBuf.setByte(18,0x07);               //bPB_resetError = bPBEN_ResetError = bError = true;
+        byteBuf.setByte(20,0x07);               //LowLowAlarm = HighHighAlarm=Invalid
+        plcItem.setPlcValue(plcValue); 
+        
+        assertEquals(bPB_ResetError.get(), true);
+        assertEquals(bPBEN_ResetError.get(), true); 
+        assertEquals(bError.get(), true);  
+        assertEquals(bLowLowAlarm.get(), true);
+        assertEquals(bHighHighAlarm.get(), true); 
+        assertEquals(bInvalid.get(), true); 
+        
+        byteBuf.setByte(18,0x05);               //bPB_resetError =  bError = true; bPBEN_ResetError = false;
+        byteBuf.setByte(20,0x05);               //LowLowAlarm = Invalid; HighHighAlarm= = false;
+        plcItem.setPlcValue(plcValue); 
+
+        assertEquals(bPB_ResetError.get(), true);
+        assertEquals(bPBEN_ResetError.get(), false); 
+        assertEquals(bError.get(), true);  
+        assertEquals(bLowLowAlarm.get(), true);
+        assertEquals(bHighHighAlarm.get(), false); 
+        assertEquals(bInvalid.get(), true);         
+        
+     }
+}
diff --git a/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7TestSupport.java b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7TestSupport.java
new file mode 100644
index 0000000..7f3c67d
--- /dev/null
+++ b/plc4j/tools/merlot/org.apache.plc4x.merlot.drv.s7/src/test/java/org/apache/plc4x/merlot/drv/s7/core/S7TestSupport.java
@@ -0,0 +1,25 @@
+/*
+ * 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.merlot.drv.s7.core;
+
+/**
+ *
+ * @author cgarcia
+ */
+public class S7TestSupport {
+    
+}