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 --> index=3 --> 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);
+ }
+}