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/07 13:59:55 UTC
[incubator-plc4x] branch feature/api-redesign-chris-c updated: -
Finished refactoring the read part of the S7 driver (Still todo's in the
write part) - Optimized the example - Added a getObject() method to the
FieldItem class - Added a set of S7FieldItems that return the nearest
matching type to the one in the address in getObject()
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 df806f8 - Finished refactoring the read part of the S7 driver (Still todo's in the write part) - Optimized the example - Added a getObject() method to the FieldItem class - Added a set of S7FieldItems that return the nearest matching type to the one in the address in getObject()
df806f8 is described below
commit df806f895d9a5601b7122b6759c2aaa64eef133d
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Sep 7 15:59:48 2018 +0200
- Finished refactoring the read part of the S7 driver (Still todo's in the write part)
- Optimized the example
- Added a getObject() method to the FieldItem class
- Added a set of S7FieldItems that return the nearest matching type to the one in the address in getObject()
---
.../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 34 +++++++++--
.../plc4x/java/api/messages/PlcReadResponse.java | 4 --
.../java/base/messages/DefaultPlcReadResponse.java | 16 ++---
.../base/messages/DefaultPlcSubscriptionEvent.java | 10 ----
.../base/messages/items/BigIntegerFieldItem.java | 5 ++
.../java/base/messages/items/BooleanFieldItem.java | 5 ++
.../plc4x/java/base/messages/items/FieldItem.java | 2 +
.../messages/items/FloatingPointFieldItem.java | 5 ++
.../java/base/messages/items/IntegerFieldItem.java | 5 ++
.../java/base/messages/items/StringFieldItem.java | 5 ++
.../java/base/messages/items/TimeFieldItem.java | 5 ++
.../s7/messages/items/S7BigIntegerFieldItem.java} | 21 +++++--
.../java/s7/messages/items/S7BooleanFieldItem.java | 52 ++++++++++++++++
.../messages/items/S7FloatingPointFieldItem.java} | 25 ++++++--
.../java/s7/messages/items/S7IntegerFieldItem.java | 53 +++++++++++++++++
.../java/s7/messages/items/S7StringFieldItem.java} | 25 ++++++--
.../java/s7/messages/items/S7TimeFieldItem.java} | 27 +++++++--
.../plc4x/java/s7/netty/Plc4XS7Protocol.java | 69 ++++++++++++++--------
.../org/apache/plc4x/java/s7/netty/S7Protocol.java | 5 ++
.../java/s7/netty/util/S7PlcFieldHandler.java | 12 ++--
.../org/apache/plc4x/java/test/TestFieldItem.java | 5 +-
21 files changed, 305 insertions(+), 85 deletions(-)
diff --git a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
index d7cb937..bbf7c1b 100644
--- a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
+++ b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.connection.PlcConnection;
import org.apache.plc4x.java.api.connection.PlcReader;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,11 +39,10 @@ public class HelloPlc4x {
*
* @param args ignored.
*/
- @SuppressWarnings("unchecked")
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: HelloPlc4x {connection-string} {address-string}+");
- System.out.println("Example: HelloPlc4x s7://10.10.64.30/1/1 %I0.0:BOOLEAN %DB1.DBX38:BYTE");
+ System.out.println("Example: HelloPlc4x s7://10.10.64.20/1/1 %Q0.0:BOOL %Q0:BYTE");
return;
}
@@ -67,21 +67,43 @@ public class HelloPlc4x {
// Read synchronously ...
// NOTICE: the ".get()" immediately lets this thread pause till
// the response is processed and available.
+ System.out.println("\nSynchronous request ...");
PlcReadResponse<?> syncResponse = plcReader.read(plcReadRequest).get();
// Simply iterating over the field names returned in the response.
for (String fieldName : syncResponse.getFieldNames()) {
- System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+ if(syncResponse.getResponseCode(fieldName) == PlcResponseCode.OK) {
+ int numValues = syncResponse.getNumberOfValues(fieldName);
+ // If it's just one element, output just one single line.
+ if(numValues == 1) {
+ System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+ }
+ // If it's more than one element, output each in a single row.
+ else {
+ System.out.println("Value[" + fieldName + "]:");
+ for(int i = 0; i < numValues; i++) {
+ System.out.println(" - " + syncResponse.getObject(fieldName, i));
+ }
+ }
+ }
+ // Something went wrong, to output an error message instead.
+ else {
+ System.out.println("Error[" + fieldName + "]: " + syncResponse.getResponseCode(fieldName).name());
+ }
}
//////////////////////////////////////////////////////////
// Read asynchronously ...
// Register a callback executed as soon as a response arives.
+ System.out.println("\n\nAsynchronous request ...");
CompletableFuture<PlcReadResponse<?>> asyncResponse = plcReader.read(plcReadRequest);
asyncResponse.whenComplete((readResponse, throwable) -> {
if (readResponse != null) {
- // Directly asking for fields by name.
- for (int i = 1; i < args.length; i++) {
- System.out.println("Value[value-" + i + "]: " + syncResponse.getObject("value-" + i));
+ for (String fieldName : syncResponse.getFieldNames()) {
+ if (syncResponse.getResponseCode(fieldName) == PlcResponseCode.OK) {
+ System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
+ } else {
+ System.out.println("Error[" + fieldName + "]: " + syncResponse.getResponseCode(fieldName).name());
+ }
}
} else {
logger.error("An error occurred", throwable);
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 acdee7e..b202927 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
@@ -30,10 +30,6 @@ public interface PlcReadResponse<T extends PlcReadRequest> extends PlcFieldRespo
int getNumberOfValues(String name);
- boolean isValidObject(String name);
-
- boolean isValidObject(String name, int index);
-
Object getObject(String name);
Object getObject(String name, int index);
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 1971d84..38c1eb3 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
@@ -74,24 +74,16 @@ public class DefaultPlcReadResponse implements InternalPlcReadResponse {
}
@Override
- public boolean isValidObject(String name) {
- return isValidObject(name, 0);
- }
-
- @Override
- public boolean isValidObject(String name, int index) {
- // TODO: Implement this ...
- return false;
- }
-
- @Override
public Object getObject(String name) {
return getObject(name, 0);
}
@Override
public Object getObject(String name, int index) {
- // TODO: Implement this ...
+ FieldItem fieldInternal = getFieldInternal(name);
+ if (fieldInternal != null) {
+ return fieldInternal.getObject(index);
+ }
return null;
}
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 8f31665..ce5790f 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
@@ -36,16 +36,6 @@ public class DefaultPlcSubscriptionEvent implements InternalPlcSubscriptionEvent
}
@Override
- public boolean isValidObject(String name) {
- return false;
- }
-
- @Override
- public boolean isValidObject(String name, int index) {
- return false;
- }
-
- @Override
public Object getObject(String name) {
return null;
}
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 46de6b6..8ba7971 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
@@ -28,6 +28,11 @@ public class BigIntegerFieldItem extends FieldItem<BigInteger> {
}
@Override
+ public Object getObject(int index) {
+ return getLong(index);
+ }
+
+ @Override
public boolean isValidBoolean(int index) {
return (getValue(index) != null);
}
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 183583b..d9a28da 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
@@ -25,6 +25,11 @@ public class BooleanFieldItem extends FieldItem<Boolean> {
}
@Override
+ public Object getObject(int index) {
+ return getBoolean(index);
+ }
+
+ @Override
public boolean isValidBoolean(int index) {
return (getValue(index) != null);
}
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 1ce4134..0324250 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
@@ -34,6 +34,8 @@ public abstract class FieldItem<T> {
return values.length;
}
+ public abstract Object getObject(int index);
+
public boolean isValidBoolean(int index) {
return false;
}
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 f2e4dc4..c3ffe4e 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
@@ -25,6 +25,11 @@ public class FloatingPointFieldItem extends FieldItem<Double> {
}
@Override
+ public Object getObject(int index) {
+ return getDouble(index);
+ }
+
+ @Override
public boolean isValidBoolean(int index) {
return (getValue(index) != null);
}
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 05290a5..f8c57f6 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
@@ -25,6 +25,11 @@ public class IntegerFieldItem extends FieldItem<Long> {
}
@Override
+ public Object getObject(int index) {
+ return getLong(index);
+ }
+
+ @Override
public boolean isValidBoolean(int index) {
return (getValue(index) != null);
}
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 a2f650e..a7fd5ea 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
@@ -25,6 +25,11 @@ public class StringFieldItem extends FieldItem<String> {
}
@Override
+ public Object getObject(int index) {
+ return getString(index);
+ }
+
+ @Override
public boolean isValidString(int index) {
return (getValue(index) != null);
}
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 5b01127..53b2150 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
@@ -29,6 +29,11 @@ public class TimeFieldItem extends FieldItem<LocalDateTime> {
}
@Override
+ public Object getObject(int index) {
+ return getDateTime(index);
+ }
+
+ @Override
public boolean isValidTime(int index) {
return (getValue(index) != null);
}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
similarity index 58%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
index bce7a95..da76032 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BigIntegerFieldItem.java
@@ -16,17 +16,28 @@
specific language governing permissions and limitations
under the License.
*/
+package org.apache.plc4x.java.s7.messages.items;
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.BigIntegerFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import java.math.BigInteger;
-public class TestFieldItem<T> extends FieldItem<T> {
+public class S7BigIntegerFieldItem extends BigIntegerFieldItem {
- public TestFieldItem(T[] values) {
+ private final S7DataType naturalDataType;
+
+ public S7BigIntegerFieldItem(S7DataType naturalDataType, BigInteger... values) {
super(values);
+ this.naturalDataType = naturalDataType;
}
-
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ }
+ return getLong(index);
+ }
}
+
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
new file mode 100644
index 0000000..2b73361
--- /dev/null
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7BooleanFieldItem.java
@@ -0,0 +1,52 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+package org.apache.plc4x.java.s7.messages.items;
+
+import org.apache.plc4x.java.base.messages.items.BooleanFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
+
+public class S7BooleanFieldItem extends BooleanFieldItem {
+
+ private final S7DataType naturalDataType;
+
+ public S7BooleanFieldItem(S7DataType naturalDataType, Boolean... values) {
+ super(values);
+ this.naturalDataType = naturalDataType;
+ }
+
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ case BOOL:
+ return getBoolean(index);
+ case BYTE:
+ return getBoolean(index);
+ case WORD:
+ return getBoolean(index);
+ case DWORD:
+ return getBoolean(index);
+ case LWORD:
+ return getBoolean(index);
+ default:
+ return null;
+ }
+ }
+
+}
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
similarity index 53%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
index bce7a95..23dacfc 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7FloatingPointFieldItem.java
@@ -16,17 +16,32 @@
specific language governing permissions and limitations
under the License.
*/
+package org.apache.plc4x.java.s7.messages.items;
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.FloatingPointFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+public class S7FloatingPointFieldItem extends FloatingPointFieldItem {
-public class TestFieldItem<T> extends FieldItem<T> {
+ private final S7DataType naturalDataType;
- public TestFieldItem(T[] values) {
+ public S7FloatingPointFieldItem(S7DataType naturalDataType, Double... values) {
super(values);
+ this.naturalDataType = naturalDataType;
}
-
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ case REAL:
+ return getFloat(index);
+ case LREAL:
+ return getDouble(index);
+ default:
+ return null;
+ }
+ }
}
+
+
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
new file mode 100644
index 0000000..1c04ef0
--- /dev/null
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7IntegerFieldItem.java
@@ -0,0 +1,53 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+package org.apache.plc4x.java.s7.messages.items;
+
+import org.apache.plc4x.java.base.messages.items.IntegerFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
+
+public class S7IntegerFieldItem extends IntegerFieldItem {
+
+ private final S7DataType naturalDataType;
+
+ public S7IntegerFieldItem(S7DataType naturalDataType, Long... values) {
+ super(values);
+ this.naturalDataType = naturalDataType;
+ }
+
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ case SINT:
+ return getByte(index);
+ case USINT:
+ case INT:
+ return getShort(index);
+ case UINT:
+ case DINT:
+ return getInteger(index);
+ case UDINT:
+ case LINT:
+ return getLong(index);
+ default:
+ return null;
+ }
+ }
+
+}
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
similarity index 54%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
index bce7a95..8863727 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7StringFieldItem.java
@@ -16,17 +16,32 @@
specific language governing permissions and limitations
under the License.
*/
+package org.apache.plc4x.java.s7.messages.items;
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.StringFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+public class S7StringFieldItem extends StringFieldItem {
-public class TestFieldItem<T> extends FieldItem<T> {
+ private final S7DataType naturalDataType;
- public TestFieldItem(T[] values) {
+ public S7StringFieldItem(S7DataType naturalDataType, String... values) {
super(values);
+ this.naturalDataType = naturalDataType;
}
-
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ case CHAR:
+ case WCHAR:
+ case STRING:
+ case WSTRING:
+ return getString(index);
+ default:
+ return null;
+ }
+ }
}
+
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
similarity index 52%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
copy to plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
index bce7a95..065c22d 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/messages/items/S7TimeFieldItem.java
@@ -16,17 +16,34 @@
specific language governing permissions and limitations
under the License.
*/
+package org.apache.plc4x.java.s7.messages.items;
-package org.apache.plc4x.java.test;
+import org.apache.plc4x.java.base.messages.items.TimeFieldItem;
+import org.apache.plc4x.java.s7.types.S7DataType;
-import org.apache.plc4x.java.base.messages.items.FieldItem;
+import java.time.LocalDateTime;
-public class TestFieldItem<T> extends FieldItem<T> {
+public class S7TimeFieldItem extends TimeFieldItem {
- public TestFieldItem(T[] values) {
+ private final S7DataType naturalDataType;
+
+ public S7TimeFieldItem(S7DataType naturalDataType, LocalDateTime... values) {
super(values);
+ this.naturalDataType = naturalDataType;
}
-
+ @Override
+ public Object getObject(int index) {
+ switch (naturalDataType) {
+ case TIME:
+ case TIME_OF_DAY:
+ case DATE:
+ case DATE_AND_TIME:
+ return getTime(index);
+ default:
+ return null;
+ }
+ }
}
+
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 a0c5a26..f8e952e 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
@@ -37,6 +37,7 @@ import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
import org.apache.plc4x.java.base.events.ConnectedEvent;
import org.apache.plc4x.java.base.messages.*;
import org.apache.plc4x.java.base.messages.items.*;
+import org.apache.plc4x.java.s7.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;
@@ -201,13 +202,12 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
DataTransportSize dataTransportSize = s7Field.getDataType().getDataTransportSize();
// TODO: Checkout if the payload items are sort of a flatMap of all request items.
- byte[] byteData;
- /*switch(s7Field.getDataType()) {
+ /*byte[] byteData;
+ switch(s7Field.getDataType()) {
// -----------------------------------------
// Bit
// -----------------------------------------
case BOOL: {
- if()
byte byteValue = data.readByte();
fieldItem = new BooleanFieldItem(byteValue != 0x00);
break;
@@ -419,30 +419,47 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// -----------------------------------------
case BOOL: {
byte byteValue = data.readByte();
- fieldItem = new BooleanFieldItem(byteValue != 0x00);
+ fieldItem = new S7BooleanFieldItem(field.getDataType(),byteValue != 0x00);
break;
}
// -----------------------------------------
// Bit-strings
// -----------------------------------------
case BYTE: { // 1 byte
- Long longValue = (long) data.readByte();
- // TODO: Implement this ...
+ BitSet bitSet = BitSet.valueOf(new byte[]{data.readByte()});
+ Boolean[] booleanValues = new Boolean[8];
+ for(int i = 0; i < 8; i++) {
+ booleanValues[i] = bitSet.get(i);
+ }
+ fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
break;
}
case WORD: { // 2 byte (16 bit)
- Long longValue = (long) data.readShort();
- // TODO: Implement this ...
+ BitSet bitSet = BitSet.valueOf(new byte[]{data.readByte(), data.readByte()});
+ Boolean[] booleanValues = new Boolean[8];
+ for(int i = 0; i < 16; i++) {
+ booleanValues[i] = bitSet.get(i);
+ }
+ fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
break;
}
case DWORD: { // 4 byte (32 bit)
- Long longValue = (long) data.readInt();
- // TODO: Implement this ...
+ BitSet bitSet = BitSet.valueOf(new byte[]{
+ data.readByte(), data.readByte(), data.readByte(), data.readByte()});
+ Boolean[] booleanValues = new Boolean[8];
+ for(int i = 0; i < 32; i++) {
+ booleanValues[i] = bitSet.get(i);
+ }
+ fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
break;
}
case LWORD: { // 8 byte (64 bit)
- Long longValue = data.readLong();
- // TODO: Implement this ...
+ BitSet bitSet = BitSet.valueOf(new long[]{data.readLong()});
+ Boolean[] booleanValues = new Boolean[8];
+ for(int i = 0; i < 64; i++) {
+ booleanValues[i] = bitSet.get(i);
+ }
+ fieldItem = new S7BooleanFieldItem(field.getDataType(),booleanValues);
break;
}
// -----------------------------------------
@@ -451,45 +468,45 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// 8 bit:
case SINT: {
Long longValue = (long) data.readShort();
- fieldItem = new IntegerFieldItem(longValue);
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case USINT: {
Long longValue = (long) data.readUnsignedShort();
- fieldItem = new IntegerFieldItem(longValue);
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
// 16 bit:
case INT: {
Long longValue = (long) data.readInt();
- fieldItem = new IntegerFieldItem(longValue);
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case UINT: {
Long longValue = data.readUnsignedInt();
- fieldItem = new IntegerFieldItem(longValue);
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
// 32 bit:
case DINT: {
Long longValue = data.readLong();
- fieldItem = new IntegerFieldItem(longValue);
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case UDINT: {
BigInteger bigIntegerValue = readUnsignedLong(data);
- fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+ fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
break;
}
// 64 bit:
case LINT: {
BigInteger bigIntegerValue = readSigned64BitInteger(data);
- fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+ fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
break;
}
case ULINT: {
BigInteger bigIntegerValue = readUnsigned64BitInteger(data);
- fieldItem = new BigIntegerFieldItem(bigIntegerValue);
+ fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
break;
}
// -----------------------------------------
@@ -497,12 +514,12 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// -----------------------------------------
case REAL: {
double doubleValue = data.readFloat();
- fieldItem = new FloatingPointFieldItem(doubleValue);
+ fieldItem = new S7FloatingPointFieldItem(field.getDataType(), doubleValue);
break;
}
case LREAL: {
double doubleValue = data.readDouble();
- fieldItem = new FloatingPointFieldItem(doubleValue);
+ fieldItem = new S7FloatingPointFieldItem(field.getDataType(), doubleValue);
break;
}
// -----------------------------------------
@@ -511,13 +528,13 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
case CHAR: { // 1 byte (8 bit)
// TODO: Double check, if this is ok?
String stringValue = data.readCharSequence(1, Charset.forName("UTF-8")).toString();
- fieldItem = new StringFieldItem(stringValue);
+ fieldItem = new S7StringFieldItem(field.getDataType(), 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);
+ fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
break;
}
case STRING: {
@@ -526,7 +543,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
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);
+ fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
break;
}
case WSTRING: {
@@ -536,7 +553,7 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// TODO: Double check, if this is ok?
String stringValue = data.readCharSequence(
actualLength * 2, Charset.forName("UTF-16")).toString();
- fieldItem = new StringFieldItem(stringValue);
+ fieldItem = new S7StringFieldItem(field.getDataType(), stringValue);
break;
}
default:
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
index 870e804..e763b19 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
@@ -577,6 +577,11 @@ public class S7Protocol extends ChannelDuplexHandler {
VarPayloadItem payload = new VarPayloadItem(dataTransportErrorCode, dataTransportSize, data);
payloadItems.add(payload);
i += S7SizeHelper.getPayloadLength(payload);
+ // It seems that datatype BIT reads an additional byte, if it's not the last.
+ if((dataTransportSize == DataTransportSize.BIT) && (userData.readableBytes() > 0)) {
+ userData.readByte();
+ i++;
+ }
}
}
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
index d8dc40e..4cb91d7 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
@@ -23,6 +23,7 @@ import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.model.PlcField;
import org.apache.plc4x.java.base.connection.PlcFieldHandler;
import org.apache.plc4x.java.base.messages.items.*;
+import org.apache.plc4x.java.s7.messages.items.*;
import org.apache.plc4x.java.s7.model.S7Field;
import org.apache.plc4x.java.s7.types.S7DataType;
@@ -197,7 +198,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
" is not assignable to " + s7Field.getDataType().name() + " fields.");
}
}
- return new BooleanFieldItem(booleanValues.toArray(new Boolean[0]));
+ return new S7BooleanFieldItem(s7Field.getDataType(), booleanValues.toArray(new Boolean[0]));
}
private FieldItem internalEncodeInteger(PlcField field, Object[] values) {
@@ -292,7 +293,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
}
longValues[i] = value.longValue();
}
- return new IntegerFieldItem(longValues);
+ return new S7IntegerFieldItem(s7Field.getDataType(), longValues);
} else {
BigInteger[] bigIntegerValues = new BigInteger[values.length];
for (int i = 0; i < values.length; i++) {
@@ -319,7 +320,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
}
bigIntegerValues[i] = value;
}
- return new BigIntegerFieldItem(bigIntegerValues);
+ return new S7BigIntegerFieldItem(s7Field.getDataType(), bigIntegerValues);
}
}
@@ -364,7 +365,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
+ s7Field.getDataType().name() + " (max " + maxValue.toString() + ")");
}
}
- return new FloatingPointFieldItem(floatingPointValues);
+ return new S7FloatingPointFieldItem(s7Field.getDataType(), floatingPointValues);
}
private FieldItem internalEncodeString(PlcField field, Object[] values) {
@@ -392,7 +393,6 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
throw new IllegalArgumentException(
"Cannot assign string values to " + s7Field.getDataType().name() + " fields.");
}
-
List<String> stringValues = new LinkedList<>();
for (Object value : values) {
if(value instanceof String) {
@@ -461,7 +461,7 @@ public class S7PlcFieldHandler implements PlcFieldHandler {
" is not assignable to " + s7Field.getDataType().name() + " fields.");
}
}
- return new StringFieldItem(stringValues.toArray(new String[0]));
+ return new S7StringFieldItem(s7Field.getDataType(), stringValues.toArray(new String[0]));
}
private FieldItem internalEncodeTemporal(PlcField field, Object[] values) {
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
index bce7a95..1c93a94 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
@@ -27,6 +27,9 @@ public class TestFieldItem<T> extends FieldItem<T> {
super(values);
}
-
+ @Override
+ public Object getObject(int index) {
+ return getValue(index);
+ }
}