You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2019/12/16 08:11:48 UTC

[plc4x] branch develop updated: PLC4X-45 Add float support to Modbus protocol

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

jfeinauer pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new bcdea4f  PLC4X-45 Add float support to Modbus protocol
bcdea4f is described below

commit bcdea4fcddccb254e533d737f6c41cd2ecc72d95
Author: Alvaro del Castillo San Felix <ad...@thingso2.com>
AuthorDate: Thu Dec 12 09:30:10 2019 +0100

    PLC4X-45 Add float support to Modbus protocol
---
 .../items/DefaultModbusByteArrayFieldItem.java     | 46 ++++++++++++++++++++--
 .../items/DefaultModbusByteArrayFieldItemTest.java | 36 ++++++++++++++++-
 2 files changed, 77 insertions(+), 5 deletions(-)

diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItem.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItem.java
index 4b3002f..1c959dd 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItem.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItem.java
@@ -34,6 +34,7 @@ public class DefaultModbusByteArrayFieldItem extends DefaultByteArrayFieldItem {
 
     private static final int SHORT_BYTES = 2;
     private static final int INTEGER_BYTES = 4;
+    private static final int FLOAT_BYTES = 4;
     private static final int LONG_BYTES = 8;
     private static final ByteOrder DEFAULT_ENDIANNESS = ByteOrder.BIG_ENDIAN;
 
@@ -116,7 +117,7 @@ public class DefaultModbusByteArrayFieldItem extends DefaultByteArrayFieldItem {
      *
      * @param index     index in relation to the requested data-type (here Integer), see comment of regarding index-transformation
      * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting short value if valid data is given, null otherwise
+     * @return resulting int value if valid data is given, null otherwise
      */
     public Integer getInteger(int index, ByteOrder byteOrder) {
         if (!isValidInteger(index)) {
@@ -154,7 +155,7 @@ public class DefaultModbusByteArrayFieldItem extends DefaultByteArrayFieldItem {
      *
      * @param index     index in relation to the requested data-type (here Long), see comment of regarding index-transformation
      * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting short value if valid data is given, null otherwise
+     * @return resulting long value if valid data is given, null otherwise
      */
     public Long getLong(int index, ByteOrder byteOrder) {
         if (!isValidLong(index)) {
@@ -177,6 +178,44 @@ public class DefaultModbusByteArrayFieldItem extends DefaultByteArrayFieldItem {
         return longIndex * LONG_BYTES;
     }
 
+    @Override
+    public boolean isValidFloat(int index) {
+        return this.completeByteArray.length >= floatIndexToByteIndex(index) + FLOAT_BYTES;
+    }
+
+    @Override
+    public Float getFloat(int index) {
+        return getFloat(index, this.byteOrder);
+    }
+
+    /**
+     * returns the float result for the given index with explicit chose of ByteOrder
+     *
+     * @param index     index in relation to the requested data-type (here Float), see comment of regarding index-transformation
+     * @param byteOrder byte-order used for decoding of byte-array
+     * @return resulting float value if valid data is given, null otherwise
+     */
+    public Float getFloat(int index, ByteOrder byteOrder) {
+        if (!isValidFloat(index)) {
+            return null;
+        }
+        return ByteBuffer
+            .wrap(ArrayUtils.toPrimitive(getByteArrayFromIndex(floatIndexToByteIndex(index))))
+            .order(byteOrder)
+            .getFloat();
+    }
+
+    /**
+     * converts the starting index of an float array to source type Byte
+     * e.g. user wants to request the 4th float value --&gt; index=3 --&gt; byteIndex=12
+     *
+     * @param floatIndex index from users view
+     * @return resulting byteArrayIndex
+     */
+    private static int floatIndexToByteIndex(int floatIndex) {
+        return floatIndex * FLOAT_BYTES;
+    }
+
     /**
      * returns a subarray with the wanted index first
      *
@@ -212,9 +251,8 @@ public class DefaultModbusByteArrayFieldItem extends DefaultByteArrayFieldItem {
         return result;
     }
 
-    //ToDo: Implement conversion for Float and Unsigned-Datatypes
+    //ToDo: Implement conversion for Unsigned-Datatypes
 
     //ToDo: Add exceptions to avoid unwanted states --> e.g. neg indexes
 
 }
-
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
index beedcbf..7a0f619 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayFieldItemTest.java
@@ -133,4 +133,38 @@ public class DefaultModbusByteArrayFieldItemTest {
 
         return new DefaultModbusByteArrayFieldItem(byteArray);
     }
-}
\ No newline at end of file
+
+    @Test
+    public void convertByteArrayToFloatTest() {
+        BaseDefaultFieldItem fieldItem = getFieldItemForFloatArray();
+
+        Float itemFloat = fieldItem.getFloat(1);
+        assertEquals(456.456f, itemFloat, 0);
+    }
+
+    @Test
+    public void convertByteArrayToFloatTestReturnsNull() {
+        BaseDefaultFieldItem fieldItem = getFieldItemForFloatArray();
+
+        Float itemFloat = fieldItem.getFloat(17);
+        assertNull(itemFloat);
+    }
+
+    private static BaseDefaultFieldItem getFieldItemForFloatArray() {
+        int sizeFloatByteBuffer = 12;
+        ByteBuffer byteBuffer = ByteBuffer.allocate(sizeFloatByteBuffer);
+        byteBuffer.order(ByteOrder.BIG_ENDIAN);
+        byteBuffer.putFloat(0,123.123f);
+        byteBuffer.putFloat(4,456.456f);
+        byteBuffer.putFloat(8,789.789f);
+        Byte[][] byteArray = new Byte[sizeFloatByteBuffer / 2][2];
+        int cntByteBuffer = 0;
+        for (byte b : byteBuffer.array()) {
+            int shortIndex=cntByteBuffer / 2;
+            byteArray[shortIndex][cntByteBuffer % 2] = b;
+            cntByteBuffer++;
+        }
+
+        return new DefaultModbusByteArrayFieldItem(byteArray);
+    }
+}