You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by hu...@apache.org on 2020/10/30 09:02:55 UTC

[plc4x] branch feature/plc4go updated: OPC UA Client write fix, static of Add passthrough in valueHandler for OPCUA client as it doesn't specify a data type. changed of to static method in ValueHandler

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

hutcheb pushed a commit to branch feature/plc4go
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/plc4go by this push:
     new 6583eb2  OPC UA Client write fix, static of Add passthrough in valueHandler for OPCUA client as it doesn't specify a data type. changed of to static method in ValueHandler
6583eb2 is described below

commit 6583eb24fb8ac75c7a631638e50444eb44abb237
Author: hutcheb <be...@gmail.com>
AuthorDate: Fri Oct 30 04:55:32 2020 -0400

    OPC UA Client write fix, static of
    Add passthrough in valueHandler for OPCUA client as it doesn't specify a
    data type.
    changed of to static method in ValueHandler
---
 .../resources/templates/java/data-io-template.ftlh |  2 +-
 .../plc4x/java/api/value/PlcValueHandler.java      |  6 ++-
 .../java/abeth/protocol/AbEthProtocolLogic.java    | 14 +++---
 .../java/abeth/protocol/Plc4xAbEthProtocol.java    | 14 +++---
 .../plc4x/java/ads/protocol/AdsProtocolLogic.java  |  2 +-
 .../plc4x/java/mock/field/MockValueHandler.java    | 15 +++++-
 .../apache/plc4x/java/modbus/ModbusEncodeTest.java | 30 ++++++------
 .../s7/readwrite/protocol/S7ProtocolLogic.java     |  2 +-
 .../java/simulated/connection/SimulatedDevice.java | 16 +++----
 .../java/spi/messages/DefaultPlcWriteRequest.java  |  2 +-
 .../java/spi/values/IEC61131ValueHandler.java      | 35 ++++++++------
 .../java/opm/PlcEntityManagerComplexTest.java      | 54 +++++++++++++---------
 .../bacnetip/protocol/BacNetIpProtocolLogic.java   |  8 ++--
 13 files changed, 115 insertions(+), 85 deletions(-)

diff --git a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
index 218393a..358e587 100644
--- a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
@@ -217,7 +217,7 @@ public class ${type.name}IO {
             <#if case.name == "Struct">
             Map<String, PlcValue> _map = new HashMap<>();
                 <#list case.fields as field>
-            _map.put("${field.name}", IEC61131ValueHandler.newPlcValue(${field.name}));
+            _map.put("${field.name}", IEC61131ValueHandler.of(${field.name}));
                 </#list>
             </#if>
             <#if !skipReturn>
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java
index a5f5893..67d6055 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueHandler.java
@@ -38,7 +38,9 @@ import java.util.Set;
 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "className")
 public interface PlcValueHandler {
 
-    public PlcValue of(Object value);
-    public PlcValue of(Object[] values);
+    public PlcValue newPlcValue(Object value);
+    public PlcValue newPlcValue(Object[] values);
+    public PlcValue newPlcValue(PlcField field, Object value);
+    public PlcValue newPlcValue(PlcField field, Object[] values);
 
 }
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
index d57fcfb..eca3a23 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/AbEthProtocolLogic.java
@@ -157,7 +157,7 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                                 if(data.length == 1) {
                                     plcValue = new PlcINT(data[0]);
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue(data);
+                                    plcValue = IEC61131ValueHandler.of(data);
                                 }
                             }
                             break;
@@ -166,9 +166,9 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (((data[1]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[1] << 8) + data[0]);  // positive number
+                                    plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]);  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
@@ -177,9 +177,9 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (((data[3]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
+                                    plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
@@ -188,9 +188,9 @@ public class AbEthProtocolLogic extends Plc4xProtocolBase<CIPEncapsulationPacket
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (field.getBitNumber() < 8) {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
+                                    plcValue = IEC61131ValueHandler.of((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
+                                    plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
                                 }
                             }
                             break;
diff --git a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
index de60b11..75dfacb 100644
--- a/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
+++ b/plc4j/drivers/ab-eth/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
@@ -180,7 +180,7 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                                 if(data.length == 1) {
                                     plcValue = new PlcINT(data[0]);
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue(data);
+                                    plcValue = IEC61131ValueHandler.of(data);
                                 }
                             }
                             break;
@@ -189,9 +189,9 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (((data[1]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[1] << 8) + data[0]);  // positive number
+                                    plcValue = IEC61131ValueHandler.of((data[1] << 8) + data[0]);  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data[1] & 0b01111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
@@ -200,9 +200,9 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (((data[3]>> 7) & 1) == 0)  {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
+                                    plcValue = IEC61131ValueHandler.of((data[3] << 24) + (data[2] << 16) + (data[1] << 8) + data[0]);  // positive number
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
+                                    plcValue = IEC61131ValueHandler.of((((~data[3] & 0b01111111) << 24) + ((~(data[2]-1) & 0b11111111) << 16)+ ((~(data[1]-1) & 0b11111111) << 8) + (~(data[0]-1) & 0b11111111))  * -1);  // negative number
                                 }
                             }
                             break;
@@ -211,9 +211,9 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
                                 if (field.getBitNumber() < 8) {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
+                                    plcValue = IEC61131ValueHandler.of((data[0] & (1 <<  field.getBitNumber())) != 0);         // read from first byte
                                 } else {
-                                    plcValue = IEC61131ValueHandler.newPlcValue((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
+                                    plcValue = IEC61131ValueHandler.of((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
                                 }
                             }
                             break;
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index 21215cd..45e6b24 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -313,7 +313,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
                     }
                     return null;
                 }).toArray(PlcValue[]::new);
-                return new ResponseItem<>(PlcResponseCode.OK, IEC61131ValueHandler.newPlcValue(resultItems));
+                return new ResponseItem<>(PlcResponseCode.OK, IEC61131ValueHandler.of(resultItems));
             }
         } catch (Exception e) {
             LOGGER.warn(String.format("Error parsing field item of type: '%s'", field.getAdsDataType()), e);
diff --git a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockValueHandler.java b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockValueHandler.java
index fc47f33..adaeb2d 100644
--- a/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockValueHandler.java
+++ b/plc4j/drivers/mock/src/main/java/org/apache/plc4x/java/mock/field/MockValueHandler.java
@@ -19,18 +19,29 @@ under the License.
 package org.apache.plc4x.java.mock.field;
 
 import org.apache.plc4x.java.api.value.PlcValue;
+import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.api.value.PlcValueHandler;
 
 public class MockValueHandler implements PlcValueHandler {
 
     @Override
-    public PlcValue of(Object value) {
+    public PlcValue newPlcValue(Object value) {
         return new MockPlcValue(value);
     }
 
     @Override
-    public PlcValue of(Object[] values) {
+    public PlcValue newPlcValue(Object[] values) {
         return new MockPlcValue(values);
     }
 
+    @Override
+    public PlcValue newPlcValue(PlcField field, Object value) {
+        return newPlcValue(value);
+    }
+
+    @Override
+    public PlcValue newPlcValue(PlcField field, Object[] values) {
+        return newPlcValue(values);
+    }
+
 }
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusEncodeTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusEncodeTest.java
index 59ee99c..db56f31 100644
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusEncodeTest.java
+++ b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusEncodeTest.java
@@ -33,7 +33,7 @@ public class ModbusEncodeTest {
     public void testEncodeBooleanBOOL() {
         Boolean[] object = {true,false,true,false,true,false,true,true,false};
         ModbusFieldCoil coils = ModbusFieldCoil.of("coil:8:BOOL");
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(coils, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(coils, object);
         Assertions.assertEquals("[true,false,true,false,true,false,true,true,false]", list.toString());
     }
 
@@ -42,7 +42,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,-1,127,-128,5,6,7,8};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:8:SINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,-1,127,-128,5,6,7,8]", list.toString());
     }
 
@@ -51,7 +51,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,255,0,4,5,6,7,8};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:8:USINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,255,0,4,5,6,7,8]", list.toString());
     }
 
@@ -60,7 +60,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,255,0,4,5,6,7,8};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:8:BYTE");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,255,0,4,5,6,7,8]", list.toString());
     }
 
@@ -69,7 +69,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,-1,32000,-32000,5,6,7};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:INT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,-1,32000,-32000,5,6,7]", list.toString());
     }
 
@@ -78,7 +78,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,65535,10,55000,5,6,7};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:UINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,65535,10,55000,5,6,7]", list.toString());
     }
 
@@ -87,7 +87,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,65535,10,55000,5,6,7};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:WORD");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,65535,10,55000,5,6,7]", list.toString());
     }
 
@@ -96,7 +96,7 @@ public class ModbusEncodeTest {
         Integer[] object = {1,655354775,-2147483648,2147483647,5,6,7};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:DINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,-2147483648,2147483647,5,6,7]", list.toString());
     }
 
@@ -105,7 +105,7 @@ public class ModbusEncodeTest {
         Long[] object = {1L,655354775L,0L,4294967295L,5L,6L,7L};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:UDINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,0,4294967295,5,6,7]", list.toString());
     }
 
@@ -114,7 +114,7 @@ public class ModbusEncodeTest {
         Long[] object = {1L,655354775L,0L,4294967295L,5L,6L,7L};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:DWORD");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,0,4294967295,5,6,7]", list.toString());
     }
 
@@ -123,7 +123,7 @@ public class ModbusEncodeTest {
         Long[] object = {1L,655354775L,-9223372036854775808L,9223372036854775807L,5L,6L,7L};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:LINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,-9223372036854775808,9223372036854775807,5,6,7]", list.toString());
     }
 
@@ -132,7 +132,7 @@ public class ModbusEncodeTest {
         BigInteger[] object = {BigInteger.valueOf(1L),BigInteger.valueOf(655354775L),BigInteger.valueOf(0),new BigInteger("18446744073709551615"),BigInteger.valueOf(5L),BigInteger.valueOf(6L),BigInteger.valueOf(7L)};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:ULINT");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,0,18446744073709551615,5,6,7]", list.toString());
     }
 
@@ -141,7 +141,7 @@ public class ModbusEncodeTest {
         BigInteger[] object = {BigInteger.valueOf(1L),BigInteger.valueOf(655354775L),BigInteger.valueOf(0),new BigInteger("18446744073709551615"),BigInteger.valueOf(5L),BigInteger.valueOf(6L),BigInteger.valueOf(7L)};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:LWORD");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1,655354775,0,18446744073709551615,5,6,7]", list.toString());
     }
 
@@ -150,7 +150,7 @@ public class ModbusEncodeTest {
         Float[] object = {1.1f,1000.1f,100000.1f,3.4028232E38f,-3.4028232E38f,-1f,10384759934840.0f};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:REAL");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1.1,1000.1,100000.1,3.4028233E38,-3.4028233E38,-1.0,1.03847601E13]", list.toString());
     }
 
@@ -159,7 +159,7 @@ public class ModbusEncodeTest {
         Double[] object = {1.1,1000.1,100000.1,1.7E308,-1.7E308,-1d,10384759934840.0};
         ModbusFieldHoldingRegister holdingregister = ModbusFieldHoldingRegister.of("holding-register:7:LREAL");
         ModbusFieldHandler handler = new ModbusFieldHandler();
-        PlcList list = (PlcList) IEC61131ValueHandler.newPlcValue(holdingregister, object);
+        PlcList list = (PlcList) IEC61131ValueHandler.of(holdingregister, object);
         Assertions.assertEquals("[1.1,1000.1,100000.1,1.7E308,-1.7E308,-1.0,1.038475993484E13]", list.toString());
     }
 
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
index d0c4683..ee19b08 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
@@ -525,7 +525,7 @@ public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
                     }
                     return null;
                 }).toArray(PlcValue[]::new);
-                return IEC61131ValueHandler.newPlcValue(resultItems);
+                return IEC61131ValueHandler.of(resultItems);
             }
         } catch (ParseException e) {
             LOGGER.warn(String.format("Error parsing field item of type: '%s'", field.getDataType().name()), e);
diff --git a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedDevice.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedDevice.java
index a8ed034..4d2ccda 100644
--- a/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedDevice.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedDevice.java
@@ -95,31 +95,31 @@ public class SimulatedDevice {
         Object result = null;
 
         if (type.equals(Byte.class)) {
-            return IEC61131ValueHandler.newPlcValue((byte) random.nextInt(1 << 8));
+            return IEC61131ValueHandler.of((byte) random.nextInt(1 << 8));
         }
 
         if (type.equals(Short.class)) {
-            return IEC61131ValueHandler.newPlcValue((short) random.nextInt(1 << 16));
+            return IEC61131ValueHandler.of((short) random.nextInt(1 << 16));
         }
 
         if (type.equals(Integer.class)) {
-            return IEC61131ValueHandler.newPlcValue(random.nextInt());
+            return IEC61131ValueHandler.of(random.nextInt());
         }
 
         if (type.equals(Long.class)) {
-            return IEC61131ValueHandler.newPlcValue(random.nextLong());
+            return IEC61131ValueHandler.of(random.nextLong());
         }
 
         if (type.equals(Float.class)) {
-            return IEC61131ValueHandler.newPlcValue(random.nextFloat());
+            return IEC61131ValueHandler.of(random.nextFloat());
         }
 
         if (type.equals(Double.class)) {
-            return IEC61131ValueHandler.newPlcValue(random.nextDouble());
+            return IEC61131ValueHandler.of(random.nextDouble());
         }
 
         if (type.equals(Boolean.class)) {
-            return IEC61131ValueHandler.newPlcValue(random.nextBoolean());
+            return IEC61131ValueHandler.of(random.nextBoolean());
         }
 
         if (type.equals(String.class)) {
@@ -129,7 +129,7 @@ public class SimulatedDevice {
                 char c = (char) ('a' + random.nextInt(26));
                 sb.append(c);
             }
-            return IEC61131ValueHandler.newPlcValue(sb.toString());
+            return IEC61131ValueHandler.of(sb.toString());
         }
 
         return null;
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
index cbe4bf2..34b7ac7 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/messages/DefaultPlcWriteRequest.java
@@ -173,7 +173,7 @@ public class DefaultPlcWriteRequest implements PlcWriteRequest, XmlSerializable
                 String fieldQuery = fieldValues.getLeft();
                 PlcField field = fieldHandler.createField(fieldQuery);
                 Object[] value = fieldValues.getRight();
-                PlcValue plcValue = valueHandler.of(value);
+                PlcValue plcValue = valueHandler.newPlcValue(field, value);
                 parsedFields.put(name, new FieldValueItem(field, plcValue));
             });
             return new DefaultPlcWriteRequest(writer, parsedFields);
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/IEC61131ValueHandler.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/IEC61131ValueHandler.java
index c8c9e3b..278f79e 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/IEC61131ValueHandler.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/values/IEC61131ValueHandler.java
@@ -33,19 +33,27 @@ import java.time.LocalTime;
 public class IEC61131ValueHandler implements PlcValueHandler {
 
 
-    public PlcValue of(Object value) {
-        return newPlcValue(new Object[] {value});
+    public PlcValue newPlcValue(Object value) {
+        return of(new Object[] {value});
     }
 
-    public PlcValue of(Object[] values) {
-        return newPlcValue(values);
+    public PlcValue newPlcValue(Object[] values) {
+        return of(values);
     }
 
-    public static PlcValue newPlcValue(Object value) {
-        return newPlcValue(new Object[] {value});
+    public PlcValue newPlcValue(PlcField field, Object value) {
+        return of(field, new Object[] {value});
     }
 
-    public static PlcValue newPlcValue(Object[] values) {
+    public PlcValue newPlcValue(PlcField field, Object[] values) {
+        return of(field, values);
+    }
+
+    public static PlcValue of(Object value) {
+        return of(new Object[] {value});
+    }
+
+    public static PlcValue of(Object[] values) {
         if (values.length == 1) {
             Object value = values[0];
             if (value instanceof Boolean) {
@@ -81,19 +89,19 @@ public class IEC61131ValueHandler implements PlcValueHandler {
         } else {
             PlcList list = new PlcList();
             for (Object value : values) {
-                list.add(newPlcValue(new Object[] {value}));
+                list.add(of(new Object[] {value}));
             }
             return list;
         }
     }
 
 
-    public static PlcValue newPlcValue(PlcField field, Object value) {
-        return newPlcValue(field, new Object[] {value});
+    public static PlcValue of(PlcField field, Object value) {
+        return of(field, new Object[] {value});
     }
 
 
-    public static PlcValue newPlcValue(PlcField field, Object[] values) {
+    public static PlcValue of(PlcField field, Object[] values) {
         if(values.length == 1) {
             Object value = values[0];
             switch (field.getPlcDataType().toUpperCase()) {
@@ -158,14 +166,13 @@ public class IEC61131ValueHandler implements PlcValueHandler {
         } else {
             PlcList list = new PlcList();
             for (Object value : values) {
-                list.add(newPlcValue(field, new Object[] {value}));
+                list.add(of(field, new Object[] {value}));
             }
             return list;
         }
     }
 
     public static PlcValue customDataType(PlcField field, Object[] values) {
-        throw new PlcUnsupportedDataTypeException("Data Type " + field.getPlcDataType()
-            + "Is not supported");
+        return of(values);
     }
 }
diff --git a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
index 5957380..4a16732 100644
--- a/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
+++ b/plc4j/tools/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerComplexTest.java
@@ -128,26 +128,26 @@ public class PlcEntityManagerComplexTest implements WithAssertions {
     private PlcEntityManager getInitializedEntityManager() throws PlcConnectionException {
         Map<String, PlcValue> map = new HashMap<>();
         String prefix = ConnectedEntity.class.getName() + ".";
-        map.put(prefix + "boolVar", IEC61131ValueHandler.newPlcValue(true));
-        map.put(prefix + "byteVar", IEC61131ValueHandler.newPlcValue((byte) 1));
-        map.put(prefix + "shortVar", IEC61131ValueHandler.newPlcValue((short) 1));
-        map.put(prefix + "intVar", IEC61131ValueHandler.newPlcValue(1));
-        map.put(prefix + "longVar", IEC61131ValueHandler.newPlcValue(1L));
-        map.put(prefix + "boxedBoolVar", IEC61131ValueHandler.newPlcValue(1L));
-        map.put(prefix + "boxedByteVar", IEC61131ValueHandler.newPlcValue((byte) 1));
-        map.put(prefix + "boxedShortVar", IEC61131ValueHandler.newPlcValue((short) 1));
-        map.put(prefix + "boxedIntegerVar", IEC61131ValueHandler.newPlcValue(1));
-        map.put(prefix + "boxedLongVar", IEC61131ValueHandler.newPlcValue(1L));
-        map.put(prefix + "bigIntegerVar", IEC61131ValueHandler.newPlcValue(BigInteger.ONE));
-        map.put(prefix + "floatVar", IEC61131ValueHandler.newPlcValue(1f));
-        map.put(prefix + "doubleVar", IEC61131ValueHandler.newPlcValue(1d));
-        map.put(prefix + "bigDecimalVar", IEC61131ValueHandler.newPlcValue(BigDecimal.ONE));
-        map.put(prefix + "localTimeVar", IEC61131ValueHandler.newPlcValue(LocalTime.of(1, 1)));
-        map.put(prefix + "localDateVar", IEC61131ValueHandler.newPlcValue(LocalDate.of(1, 1, 1)));
-        map.put(prefix + "localDateTimeVar", IEC61131ValueHandler.newPlcValue(LocalDateTime.of(1, 1, 1, 1, 1)));
-        map.put(prefix + "byteArrayVar", IEC61131ValueHandler.newPlcValue(new Byte[]{0x0, 0x1}));
-        map.put(prefix + "bigByteArrayVar", IEC61131ValueHandler.newPlcValue(new Byte[]{0x0, 0x1}));
-        map.put(prefix + "stringVar", IEC61131ValueHandler.newPlcValue("Hallo"));
+        map.put(prefix + "boolVar", IEC61131ValueHandler.of(true));
+        map.put(prefix + "byteVar", IEC61131ValueHandler.of((byte) 1));
+        map.put(prefix + "shortVar", IEC61131ValueHandler.of((short) 1));
+        map.put(prefix + "intVar", IEC61131ValueHandler.of(1));
+        map.put(prefix + "longVar", IEC61131ValueHandler.of(1L));
+        map.put(prefix + "boxedBoolVar", IEC61131ValueHandler.of(1L));
+        map.put(prefix + "boxedByteVar", IEC61131ValueHandler.of((byte) 1));
+        map.put(prefix + "boxedShortVar", IEC61131ValueHandler.of((short) 1));
+        map.put(prefix + "boxedIntegerVar", IEC61131ValueHandler.of(1));
+        map.put(prefix + "boxedLongVar", IEC61131ValueHandler.of(1L));
+        map.put(prefix + "bigIntegerVar", IEC61131ValueHandler.of(BigInteger.ONE));
+        map.put(prefix + "floatVar", IEC61131ValueHandler.of(1f));
+        map.put(prefix + "doubleVar", IEC61131ValueHandler.of(1d));
+        map.put(prefix + "bigDecimalVar", IEC61131ValueHandler.of(BigDecimal.ONE));
+        map.put(prefix + "localTimeVar", IEC61131ValueHandler.of(LocalTime.of(1, 1)));
+        map.put(prefix + "localDateVar", IEC61131ValueHandler.of(LocalDate.of(1, 1, 1)));
+        map.put(prefix + "localDateTimeVar", IEC61131ValueHandler.of(LocalDateTime.of(1, 1, 1, 1, 1)));
+        map.put(prefix + "byteArrayVar", IEC61131ValueHandler.of(new Byte[]{0x0, 0x1}));
+        map.put(prefix + "bigByteArrayVar", IEC61131ValueHandler.of(new Byte[]{0x0, 0x1}));
+        map.put(prefix + "stringVar", IEC61131ValueHandler.of("Hallo"));
         return getPlcEntityManager(map);
     }
 
@@ -260,12 +260,22 @@ public class PlcEntityManagerComplexTest implements WithAssertions {
 
     private static class NoOpPlcValueHandler implements PlcValueHandler {
         @Override
-        public PlcValue of(Object value) {
+        public PlcValue newPlcValue(Object value) {
             throw new RuntimeException("Data Type " + value.getClass().getSimpleName() + "Is not supported");
         }
 
         @Override
-        public PlcValue of(Object[] values) {
+        public PlcValue newPlcValue(Object[] values) {
+            throw new RuntimeException("Data Type " + values.getClass().getSimpleName() + "Is not supported");
+        }
+
+        @Override
+        public PlcValue newPlcValue(org.apache.plc4x.java.api.model.PlcField field, Object value) {
+            throw new RuntimeException("Data Type " + value.getClass().getSimpleName() + "Is not supported");
+        }
+
+        @Override
+        public PlcValue newPlcValue(org.apache.plc4x.java.api.model.PlcField field, Object[] values) {
             throw new RuntimeException("Data Type " + values.getClass().getSimpleName() + "Is not supported");
         }
     }
diff --git a/sandbox/test-java-bacnetip-driver/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java b/sandbox/test-java-bacnetip-driver/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
index 5284d9d..cc7da50 100644
--- a/sandbox/test-java-bacnetip-driver/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
+++ b/sandbox/test-java-bacnetip-driver/src/main/java/org/apache/plc4x/java/bacnetip/protocol/BacNetIpProtocolLogic.java
@@ -144,15 +144,15 @@ public class BacNetIpProtocolLogic extends Plc4xProtocolBase<BVLC> implements Ha
                             enrichedPlcValue.put("address", new PlcSTRING(toString(curField)));
 
                             // From the original BACNet tag
-                            enrichedPlcValue.put("typeOrTagNumber", IEC61131ValueHandler.newPlcValue(baCnetTag.getTypeOrTagNumber()));
-                            enrichedPlcValue.put("lengthValueType", IEC61131ValueHandler.newPlcValue(baCnetTag.getLengthValueType()));
+                            enrichedPlcValue.put("typeOrTagNumber", IEC61131ValueHandler.of(baCnetTag.getTypeOrTagNumber()));
+                            enrichedPlcValue.put("lengthValueType", IEC61131ValueHandler.of(baCnetTag.getLengthValueType()));
                             if(baCnetTag.getExtTagNumber() != null) {
-                                enrichedPlcValue.put("extTagNumber", IEC61131ValueHandler.newPlcValue(baCnetTag.getExtTagNumber()));
+                                enrichedPlcValue.put("extTagNumber", IEC61131ValueHandler.of(baCnetTag.getExtTagNumber()));
                             } else {
                                 enrichedPlcValue.put("extTagNumber", new PlcNull());
                             }
                             if(baCnetTag.getExtLength() != null) {
-                                enrichedPlcValue.put("extLength", IEC61131ValueHandler.newPlcValue(baCnetTag.getExtLength()));
+                                enrichedPlcValue.put("extLength", IEC61131ValueHandler.of(baCnetTag.getExtLength()));
                             } else {
                                 enrichedPlcValue.put("extLength", new PlcNull());
                             }