You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2018/09/04 11:30:20 UTC
[incubator-plc4x] branch feature/api-redesign-chris-c updated: -
Finished refactoring the reading of values in s7
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/api-redesign-chris-c
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git
The following commit(s) were added to refs/heads/feature/api-redesign-chris-c by this push:
new 8f9e9d8 - Finished refactoring the reading of values in s7
8f9e9d8 is described below
commit 8f9e9d86446aa870b99740f55211a846e7523a4a
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Sep 4 13:30:17 2018 +0200
- Finished refactoring the reading of values in s7
---
.../plc4x/java/api/messages/PlcFieldResponse.java | 1 -
.../base/messages/items/BigIntegerFieldItem.java | 55 +++++++++++++++-------
.../java/base/messages/items/BooleanFieldItem.java | 2 +-
.../plc4x/java/base/messages/items/FieldItem.java | 6 +--
.../messages/items/FloatingPointFieldItem.java | 2 +-
.../java/base/messages/items/IntegerFieldItem.java | 7 ++-
.../java/base/messages/items/StringFieldItem.java | 2 +-
.../java/base/messages/items/TimeFieldItem.java | 2 +-
.../java/modbus/netty/Plc4XModbusProtocol.java | 6 +--
.../plc4x/java/s7/netty/Plc4XS7Protocol.java | 55 ++++++++++++++++++----
10 files changed, 100 insertions(+), 38 deletions(-)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
index 76cad3b..b4fc2e0 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
@@ -22,7 +22,6 @@ import org.apache.plc4x.java.api.model.PlcField;
import org.apache.plc4x.java.api.types.PlcResponseCode;
import java.util.Collection;
-import java.util.Map;
/**
* Base type for all response messages sent as response for a prior request
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
index b66e122..46de6b6 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BigIntegerFieldItem.java
@@ -18,11 +18,12 @@ under the License.
*/
package org.apache.plc4x.java.base.messages.items;
+import java.math.BigDecimal;
import java.math.BigInteger;
public class BigIntegerFieldItem extends FieldItem<BigInteger> {
- public BigIntegerFieldItem(BigInteger[] values) {
+ public BigIntegerFieldItem(BigInteger... values) {
super(values);
}
@@ -34,15 +35,16 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
@Override
public Boolean getBoolean(int index) {
if (isValidBoolean(index)) {
- return getValue(index) != 0L;
+ return getValue(index).compareTo(BigInteger.ZERO) == 0;
}
return null;
}
@Override
public boolean isValidByte(int index) {
- Long value = getValue(index);
- return (value != null) && (value <= Byte.MAX_VALUE) && (value >= Byte.MIN_VALUE);
+ BigInteger value = getValue(index);
+ return (value != null) && (value.compareTo(BigInteger.valueOf(Byte.MAX_VALUE)) < 0) &&
+ (value.compareTo(BigInteger.valueOf(Byte.MIN_VALUE)) > 0);
}
@Override
@@ -55,8 +57,9 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
@Override
public boolean isValidShort(int index) {
- Long value = getValue(index);
- return (value != null) && (value <= Short.MAX_VALUE) && (value >= Short.MIN_VALUE);
+ BigInteger value = getValue(index);
+ return (value != null) && (value.compareTo(BigInteger.valueOf(Short.MAX_VALUE)) < 0) &&
+ (value.compareTo(BigInteger.valueOf(Short.MIN_VALUE)) > 0);
}
@Override
@@ -69,32 +72,45 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
@Override
public boolean isValidInteger(int index) {
- Long value = getValue(index);
- return (value != null) && (value <= Integer.MAX_VALUE) && (value >= Integer.MIN_VALUE);
+ BigInteger value = getValue(index);
+ return (value != null) && (value.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) &&
+ (value.compareTo(BigInteger.valueOf(Integer.MIN_VALUE)) > 0);
}
@Override
public Integer getInteger(int index) {
- return super.getInteger(index);
+ if(isValidInteger(index)) {
+ BigInteger value = getValue(index);
+ return value.intValue();
+ }
+ return null;
}
@Override
public boolean isValidLong(int index) {
- return (getValue(index) != null);
+ BigInteger value = getValue(index);
+ return (value != null) && (value.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) < 0) &&
+ (value.compareTo(BigInteger.valueOf(Long.MIN_VALUE)) > 0);
}
@Override
public Long getLong(int index) {
- if(isValidFloat(index)) {
- return getValue(index);
+ if(isValidLong(index)) {
+ BigInteger value = getValue(index);
+ return value.longValue();
}
return null;
}
@Override
public boolean isValidFloat(int index) {
- Long value = getValue(index);
- return (value != null) && (value <= Float.MAX_VALUE) && (value >= Float.MIN_VALUE);
+ BigInteger value = getValue(index);
+ if (value == null) {
+ return false;
+ }
+ BigDecimal decimalValue = new BigDecimal(value);
+ return (decimalValue.compareTo(BigDecimal.valueOf(Float.MAX_VALUE)) < 0) &&
+ (decimalValue.compareTo(BigDecimal.valueOf(Float.MIN_VALUE)) > 0);
}
@Override
@@ -107,12 +123,17 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
@Override
public boolean isValidDouble(int index) {
- Long value = getValue(index);
- return (value != null) && (value <= Double.MAX_VALUE) && (value >= Double.MIN_VALUE);
+ BigInteger value = getValue(index);
+ if (value == null) {
+ return false;
+ }
+ BigDecimal decimalValue = new BigDecimal(value);
+ return (decimalValue.compareTo(BigDecimal.valueOf(Double.MAX_VALUE)) < 0) &&
+ (decimalValue.compareTo(BigDecimal.valueOf(Double.MIN_VALUE)) > 0);
}
@Override
- public BigInteger getDouble(int index) {
+ public Double getDouble(int index) {
if(isValidDouble(index)) {
return getValue(index).doubleValue();
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
index db67c0d..183583b 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/BooleanFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
public class BooleanFieldItem extends FieldItem<Boolean> {
- public BooleanFieldItem(Boolean[] values) {
+ public BooleanFieldItem(Boolean... values) {
super(values);
}
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 cdbdc4e..30b5364 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
@@ -116,10 +116,10 @@ public abstract class FieldItem<T> {
}
protected T getValue(int index) {
- if(values.length < index) {
- return values[index];
+ if (index < 0 || (index >= values.length)) {
+ return null;
}
- return null;
+ return values[index];
}
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
index 57607fc..f2e4dc4 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FloatingPointFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
public class FloatingPointFieldItem extends FieldItem<Double> {
- public FloatingPointFieldItem(Double[] values) {
+ public FloatingPointFieldItem(Double... values) {
super(values);
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
index 13e15f0..05290a5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/IntegerFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
public class IntegerFieldItem extends FieldItem<Long> {
- public IntegerFieldItem(Long[] values) {
+ public IntegerFieldItem(Long... values) {
super(values);
}
@@ -73,7 +73,10 @@ public class IntegerFieldItem extends FieldItem<Long> {
@Override
public Integer getInteger(int index) {
- return super.getInteger(index);
+ if(isValidInteger(index)) {
+ return getValue(index).intValue();
+ }
+ return null;
}
@Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
index e695e3d..a2f650e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/StringFieldItem.java
@@ -20,7 +20,7 @@ package org.apache.plc4x.java.base.messages.items;
public class StringFieldItem extends FieldItem<String> {
- public StringFieldItem(String[] values) {
+ public StringFieldItem(String... values) {
super(values);
}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
index 4e88126..5b01127 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/TimeFieldItem.java
@@ -24,7 +24,7 @@ import java.time.LocalTime;
public class TimeFieldItem extends FieldItem<LocalDateTime> {
- public TimeFieldItem(LocalDateTime[] values) {
+ public TimeFieldItem(LocalDateTime... values) {
super(values);
}
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 86550e0..0c650ea 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
@@ -73,7 +73,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
// TODO: support multiple requests
if(request.getFieldNames().size() != 1) {
- throw new PlcNotImplementedException("Only single message supported for now")
+ throw new PlcNotImplementedException("Only single message supported for now");
}
// TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
// TODO: for higher data types float, double etc we might need to split the bytes into chunks
@@ -158,7 +158,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
PlcReadRequest request = (PlcReadRequest) msg.getRequest();
// TODO: support multiple requests
if(request.getFieldNames().size() != 1) {
- throw new PlcNotImplementedException("Only single message supported for now")
+ throw new PlcNotImplementedException("Only single message supported for now");
}
// TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
// TODO: for higher data types float, double etc we might need to split the bytes into chunks
@@ -209,7 +209,7 @@ public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload,
PlcRequest request = plcRequestContainer.getRequest();
// TODO: support multiple requests (Shouldn't be needed as the request wouldn't have been sent)
if(request.getFieldNames().size() != 1) {
- throw new PlcNotImplementedException("Only single message supported for now")
+ throw new PlcNotImplementedException("Only single message supported for now");
}
ModbusPdu modbusPdu = msg.getModbusPdu();
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
index af62a65..50cdf83 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
@@ -32,9 +32,7 @@ import org.apache.plc4x.java.base.events.ConnectedEvent;
import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
import org.apache.plc4x.java.base.messages.DefaultPlcWriteResponse;
import org.apache.plc4x.java.base.messages.PlcRequestContainer;
-import org.apache.plc4x.java.base.messages.items.BooleanFieldItem;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
-import org.apache.plc4x.java.base.messages.items.FloatingPointFieldItem;
+import org.apache.plc4x.java.base.messages.items.*;
import org.apache.plc4x.java.s7.model.S7Field;
import org.apache.plc4x.java.s7.netty.events.S7ConnectedEvent;
import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
@@ -49,6 +47,7 @@ import org.apache.plc4x.java.s7.netty.model.types.*;
import java.io.IOException;
import java.math.BigInteger;
+import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -283,8 +282,8 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// Bit
// -----------------------------------------
case BOOL: {
- // TODO: Multiple boolean are encoded in one byte ...
- fieldItem = new BooleanFieldItem();
+ byte byteValue = data.readByte();
+ fieldItem = new BooleanFieldItem(byteValue != 0x00);
break;
}
// -----------------------------------------
@@ -292,18 +291,22 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// -----------------------------------------
case BYTE: { // 1 byte
Long longValue = (long) data.readByte();
+ // TODO: Implement this ...
break;
}
case WORD: { // 2 byte (16 bit)
Long longValue = (long) data.readShort();
+ // TODO: Implement this ...
break;
}
case DWORD: { // 4 byte (32 bit)
Long longValue = (long) data.readInt();
+ // TODO: Implement this ...
break;
}
case LWORD: { // 8 byte (64 bit)
Long longValue = data.readLong();
+ // TODO: Implement this ...
break;
}
// -----------------------------------------
@@ -312,56 +315,92 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// 8 bit:
case SINT: {
Long longValue = (long) data.readShort();
-
+ fieldItem = new IntegerFieldItem(longValue);
break;
}
case USINT: {
Long longValue = (long) data.readUnsignedShort();
+ fieldItem = new IntegerFieldItem(longValue);
break;
}
// 16 bit:
case INT: {
Long longValue = (long) data.readInt();
+ fieldItem = new IntegerFieldItem(longValue);
break;
}
case UINT: {
Long longValue = data.readUnsignedInt();
+ fieldItem = new IntegerFieldItem(longValue);
break;
}
// 32 bit:
case DINT: {
Long longValue = data.readLong();
+ fieldItem = new IntegerFieldItem(longValue);
break;
}
case UDINT: {
BigInteger bigIntegerValue = readUnsignedLong(data);
+ fieldItem = new BigIntegerFieldItem(bigIntegerValue);
break;
}
// 64 bit:
case LINT: {
BigInteger bigIntegerValue = readSigned64BitInteger(data);
+ fieldItem = new BigIntegerFieldItem(bigIntegerValue);
break;
}
case ULINT: {
BigInteger bigIntegerValue = readUnsigned64BitInteger(data);
+ fieldItem = new BigIntegerFieldItem(bigIntegerValue);
break;
}
// -----------------------------------------
// Floating point values
// -----------------------------------------
case REAL: {
- float floatValue = data.readFloat();
+ double doubleValue = data.readFloat();
+ fieldItem = new FloatingPointFieldItem(doubleValue);
break;
}
case LREAL: {
double doubleValue = data.readDouble();
+ fieldItem = new FloatingPointFieldItem(doubleValue);
break;
}
// -----------------------------------------
// Characters & Strings
// -----------------------------------------
case CHAR: { // 1 byte (8 bit)
- Long longValue = (long) data.readChar();
+ // TODO: Double check, if this is ok?
+ String stringValue = data.readCharSequence(1, Charset.forName("UTF-8")).toString();
+ fieldItem = new StringFieldItem(stringValue);
+ break;
+ }
+ case WCHAR: { // 2 byte
+ // TODO: Double check, if this is ok?
+ String stringValue = data.readCharSequence(2, Charset.forName("UTF-16")).toString();
+ fieldItem = new StringFieldItem(stringValue);
+ break;
+ }
+ case STRING: {
+ // Max length ... ignored.
+ data.readByte();
+ byte actualLength = data.readByte();
+ // TODO: Double check, if this is ok?
+ String stringValue = data.readCharSequence(actualLength, Charset.forName("UTF-8")).toString();
+ fieldItem = new StringFieldItem(stringValue);
+ break;
+ }
+ case WSTRING: {
+ // Max length ... ignored.
+ data.readByte();
+ byte actualLength = data.readByte();
+ // TODO: Double check, if this is ok?
+ String stringValue = data.readCharSequence(
+ actualLength * 2, Charset.forName("UTF-16")).toString();
+ fieldItem = new StringFieldItem(stringValue);
break;
}
default: