You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2018/09/26 10:59:04 UTC
[incubator-plc4x] branch master updated: [Modbus] added example to
read an int from 2 registers [General] changed byte[] to Byte[] to avoid
recurring boxing problems
This is an automated email from the ASF dual-hosted git repository.
sruehl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/master by this push:
new 34bac1f [Modbus] added example to read an int from 2 registers [General] changed byte[] to Byte[] to avoid recurring boxing problems
34bac1f is described below
commit 34bac1fc9684eb7d88b935962fea46d097e28e5c
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Wed Sep 26 12:58:57 2018 +0200
[Modbus] added example to read an int from 2 registers
[General] changed byte[] to Byte[] to avoid recurring boxing problems
---
.../plc4x/java/api/messages/PlcReadResponse.java | 6 ++---
.../java/base/messages/DefaultPlcReadResponse.java | 8 +++---
.../base/messages/DefaultPlcSubscriptionEvent.java | 10 ++++----
.../messages/items/DefaultByteArrayFieldItem.java | 8 +++---
.../plc4x/java/base/messages/items/FieldItem.java | 2 +-
.../org/apache/plc4x/java/base/util/HexUtil.java | 5 ++++
.../java/modbus/netty/Plc4XModbusProtocol.java | 6 ++---
.../java/modbus/util/ModbusPlcFieldHandler.java | 8 +++---
.../plc4x/java/modbus/ManualPlc4XModbusTest.java | 29 ++++++++++++++++++++++
.../apache/plc4x/java/test/TestFieldHandler.java | 5 ++--
10 files changed, 60 insertions(+), 27 deletions(-)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
index 101a6ad..bf5900b 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
@@ -172,10 +172,10 @@ public interface PlcReadResponse<T extends PlcReadRequest> extends PlcFieldRespo
boolean isValidByteArray(String name, int index);
- byte[] getByteArray(String name);
+ Byte[] getByteArray(String name);
- byte[] getByteArray(String name, int index);
+ Byte[] getByteArray(String name, int index);
- Collection<byte[]> getAllByteArrays(String name);
+ Collection<Byte[]> getAllByteArrays(String name);
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
index 5cbaf0c..cd2dc47 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcReadResponse.java
@@ -660,7 +660,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
}
@Override
- public byte[] getByteArray(String name) {
+ public Byte[] getByteArray(String name) {
FieldItem fieldInternal = getFieldInternal(name);
if (fieldInternal != null) {
return fieldInternal.getByteArray(0);
@@ -669,7 +669,7 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
}
@Override
- public byte[] getByteArray(String name, int index) {
+ public Byte[] getByteArray(String name, int index) {
FieldItem fieldInternal = getFieldInternal(name);
if (fieldInternal != null) {
return fieldInternal.getByteArray(index);
@@ -678,11 +678,11 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
}
@Override
- public Collection<byte[]> getAllByteArrays(String name) {
+ public Collection<Byte[]> getAllByteArrays(String name) {
FieldItem fieldInternal = getFieldInternal(name);
if (fieldInternal != null) {
int num = fieldInternal.getNumberOfValues();
- List<byte[]> values = new ArrayList<>(num);
+ List<Byte[]> values = new ArrayList<>(num);
for (int i = 0; i < num; i++) {
values.add(fieldInternal.getByteArray(i));
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
index beb0ef9..7451e00 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/DefaultPlcSubscriptionEvent.java
@@ -394,17 +394,17 @@ public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent
}
@Override
- public byte[] getByteArray(String name) {
- return new byte[0];
+ public Byte[] getByteArray(String name) {
+ return new Byte[0];
}
@Override
- public byte[] getByteArray(String name, int index) {
- return new byte[0];
+ public Byte[] getByteArray(String name, int index) {
+ return new Byte[0];
}
@Override
- public Collection<byte[]> getAllByteArrays(String name) {
+ public Collection<Byte[]> getAllByteArrays(String name) {
return null;
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
index 936b32f..4663e46 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
@@ -18,9 +18,9 @@ under the License.
*/
package org.apache.plc4x.java.base.messages.items;
-public class DefaultByteArrayFieldItem extends FieldItem<byte[]> {
+public class DefaultByteArrayFieldItem extends FieldItem<Byte[]> {
- public DefaultByteArrayFieldItem(byte[]... values) {
+ public DefaultByteArrayFieldItem(Byte[]... values) {
super(values);
}
@@ -30,11 +30,11 @@ public class DefaultByteArrayFieldItem extends FieldItem<byte[]> {
}
public boolean isValidByteArray(int index) {
- byte[] value = getValue(index);
+ Byte[] value = getValue(index);
return value != null;
}
- public byte[] getByteArray(int index) {
+ public Byte[] getByteArray(int index) {
return getValue(index);
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
index e21cd11..2a4acca 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
@@ -147,7 +147,7 @@ public abstract class FieldItem<T> {
return false;
}
- public byte[] getByteArray(int index) {
+ public Byte[] getByteArray(int index) {
return null;
}
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java
index c145565..40e5680 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/HexUtil.java
@@ -20,6 +20,7 @@
package org.apache.plc4x.java.base.util;
import org.apache.commons.io.HexDump;
+import org.apache.commons.lang3.ArrayUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@@ -32,6 +33,10 @@ public class HexUtil {
* @param bytes to be displayed.
* @return hexed string.
*/
+ public static String toHex(Byte[] bytes) {
+ return toHex(ArrayUtils.toPrimitive(bytes));
+ }
+
public static String toHex(byte[] bytes) {
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
HexDump.dump(bytes, 0, byteArrayOutputStream, 0);
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
index 774368a..ce6be0d 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -515,12 +515,12 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
if (readableBytes % 2 != 0) {
throw new PlcProtocolException("Readables bytes should even: " + readableBytes);
}
- List<byte[]> data = new LinkedList<>();
+ List<Byte[]> data = new LinkedList<>();
while (byteBuf.readableBytes() > 0) {
byte[] register = new byte[2];
byteBuf.readBytes(register);
- data.add(register);
+ data.add(ArrayUtils.toObject(register));
}
- return new DefaultByteArrayFieldItem(data.toArray(new byte[0][0]));
+ return new DefaultByteArrayFieldItem(data.toArray(new Byte[0][0]));
}
}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
index 00b653f..f3fb19d 100644
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
+++ b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
@@ -95,20 +95,20 @@ public class ModbusPlcFieldHandler extends DefaultPlcFieldHandler {
@Override
public FieldItem encodeByteArray(PlcField field, Object[] values) {
ModbusField modbusField = (ModbusField) field;
- List<byte[]> byteArrays = new LinkedList<>();
+ List<Byte[]> byteArrays = new LinkedList<>();
for (Object value : values) {
if (value instanceof byte[]) {
byte[] byteArray = (byte[]) value;
- byteArrays.add(byteArray);
+ byteArrays.add(ArrayUtils.toObject(byteArray));
} else if (value instanceof Byte[]) {
Byte[] byteArray = (Byte[]) value;
- byteArrays.add(ArrayUtils.toPrimitive(byteArray));
+ byteArrays.add(byteArray);
} else {
throw new IllegalArgumentException(
"Value of type " + value.getClass().getName() +
" is not assignable to " + modbusField + " fields.");
}
}
- return new DefaultByteArrayFieldItem(byteArrays.toArray(new byte[0][0]));
+ return new DefaultByteArrayFieldItem(byteArrays.toArray(new Byte[0][0]));
}
}
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
index 6c2fab3..21ef508 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.plc4x.java.modbus;
+import org.apache.commons.lang3.ArrayUtils;
import org.apache.plc4x.java.PlcDriverManager;
import org.apache.plc4x.java.api.connection.PlcConnection;
import org.apache.plc4x.java.api.connection.PlcReader;
@@ -26,6 +27,11 @@ import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
import org.apache.plc4x.java.base.util.HexUtil;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+import java.util.Collection;
+
public class ManualPlc4XModbusTest {
public static void main(String... args) {
@@ -52,6 +58,29 @@ public class ManualPlc4XModbusTest {
}
{
+ // Read an int from 2 registers
+ PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found"));
+
+ // Just dump the actual values
+ PlcReadResponse<?> readResponse = reader.read(builder -> builder.addItem("randomRegister", "register:3[2]")).get();
+ System.out.println("Response " + readResponse);
+ Collection<Byte[]> randomRegisters = readResponse.getAllByteArrays("randomRegister");
+ randomRegisters.stream()
+ .map(HexUtil::toHex)
+ .map(hex -> "Register Value: " + hex)
+ .forEach(System.out::println);
+
+ // Read an actual int
+ Byte[] registerBytes = randomRegisters.stream()
+ .flatMap(Arrays::stream)
+ .toArray(Byte[]::new);
+ int readInt = ByteBuffer.wrap(ArrayUtils.toPrimitive(registerBytes))
+ .order(ByteOrder.BIG_ENDIAN)
+ .getInt();
+ System.out.println("Read int " + readInt + " from register");
+ }
+
+ {
PlcReader reader = plcConnection.getReader().orElseThrow(() -> new RuntimeException("No Reader found"));
PlcReadResponse<?> readResponse = reader.read(builder -> builder.addItem("randomCoil", "coil:1[9]")).get();
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
index be76172..045912c 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
@@ -19,7 +19,6 @@
package org.apache.plc4x.java.test;
-import org.apache.commons.lang3.ArrayUtils;
import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.model.PlcField;
@@ -164,10 +163,10 @@ public class TestFieldHandler implements PlcFieldHandler {
public FieldItem encodeByteArray(PlcField field, Object[] values) {
TestField testField = (TestField) field;
if (testField.getDataType() == byte[].class) {
- return new DefaultByteArrayFieldItem(ArrayUtils.toPrimitive((Byte[]) values));
+ return new DefaultByteArrayFieldItem(Arrays.stream(values).map(Byte.class::cast).toArray(Byte[]::new));
}
if (testField.getDataType() == Byte[].class) {
- return new DefaultByteArrayFieldItem(ArrayUtils.toPrimitive((Byte[]) values));
+ return new DefaultByteArrayFieldItem((Byte[]) values);
}
throw new PlcRuntimeException("Invalid encoder for type " + testField.getDataType().getName());
}