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/14 10:08:26 UTC
[incubator-plc4x] branch feature/api-redesign-chris-c updated: -
Disabled the ADS module till the site problems are fixed - Fixed some
problems in decoding split up requests - Fixed a problem in the parsing of
S7 addresses - It seems bit-stream datatypes all need an extra byte at the
end
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 88d1776 - Disabled the ADS module till the site problems are fixed - Fixed some problems in decoding split up requests - Fixed a problem in the parsing of S7 addresses - It seems bit-stream datatypes all need an extra byte at the end
88d1776 is described below
commit 88d17764b14cd8b68db56588ec279265a5731f0b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Sep 14 12:08:21 2018 +0200
- Disabled the ADS module till the site problems are fixed
- Fixed some problems in decoding split up requests
- Fixed a problem in the parsing of S7 addresses
- It seems bit-stream datatypes all need an extra byte at the end
---
.../plc4x/java/api/types/PlcResponseCode.java | 1 +
.../apache/plc4x/java/ads/model/AdsDataType.java | 4 +-
.../java/base/connection/TestChannelFactory.java | 9 +++-
plc4j/protocols/pom.xml | 2 +-
.../org/apache/plc4x/java/s7/model/S7Field.java | 6 +--
.../plc4x/java/s7/netty/Plc4XS7Protocol.java | 16 ++++---
.../org/apache/plc4x/java/s7/netty/S7Protocol.java | 3 +-
.../netty/model/types/DataTransportErrorCode.java | 1 +
.../s7/netty/model/types/DataTransportSize.java | 22 ++++++----
.../apache/plc4x/java/s7/issues/PLC4X47Test.java | 51 ++++++++++++++++++++++
10 files changed, 92 insertions(+), 23 deletions(-)
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
index 2539a0b..6ddcbdd 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
@@ -22,6 +22,7 @@ public enum PlcResponseCode {
OK,
NOT_FOUND,
INVALID_ADDRESS,
+ INVALID_DATATYPE,
INTERNAL_ERROR,
RESPONSE_PENDING
}
diff --git a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
index 7dbc293..9b968c1 100644
--- a/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
+++ b/plc4j/protocols/ads/src/main/java/org/apache/plc4x/java/ads/model/AdsDataType.java
@@ -23,8 +23,8 @@ import java.time.Duration;
/**
* Documentation can be found here:
*
- * @link https://infosys.beckhoff.com/english.php?content=../content/1033/tcsystemmanager/basics/TcSysMgr_DatatypeComparison.htm&id=
- * @link https://infosys.beckhoff.com/english.php?content=../content/1033/tcplccontrol/html/tcplcctrl_plc_data_types_overview.htm&id
+ * https://infosys.beckhoff.com/english.php?content=../content/1033/tcsystemmanager/basics/TcSysMgr_DatatypeComparison.htm&id=
+ * https://infosys.beckhoff.com/english.php?content=../content/1033/tcplccontrol/html/tcplcctrl_plc_data_types_overview.htm&id
*/
public enum AdsDataType {
// TODO: maybe this are just types for the plc ide and can be removed
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
index 9d8adf5..be58968 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
+++ b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
@@ -24,9 +24,16 @@ import io.netty.channel.embedded.EmbeddedChannel;
public class TestChannelFactory implements ChannelFactory {
+ private EmbeddedChannel channel;
+
@Override
public Channel createChannel(ChannelHandler channelHandler) {
- return new EmbeddedChannel(channelHandler);
+ channel = new EmbeddedChannel(channelHandler);
+ return channel;
+ }
+
+ public EmbeddedChannel getChannel() {
+ return channel;
}
}
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index b94d5b2..734c3e6 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/pom.xml
@@ -37,7 +37,7 @@
<modules>
<module>driver-bases</module>
- <module>ads</module>
+ <!--module>ads</module-->
<module>ethernetip</module>
<!--module>modbus</module-->
<module>s7</module>
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
index f06760f..e428e9e 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
@@ -29,9 +29,9 @@ import java.util.regex.Pattern;
public class S7Field implements PlcField {
private static final Pattern ADDRESS_PATTERN =
- Pattern.compile("^%(?<memoryArea>.)(?<transferSizeCode>.?)(?<byteOffset>\\d{1,4})(.(?<bitOffset>[0-7]))?:(?<dataType>.+)(\\[(?<numElements>\\d)])?");
+ Pattern.compile("^%(?<memoryArea>.)(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,4})(.(?<bitOffset>[0-7]))?:(?<dataType>.+)(\\[(?<numElements>\\d)])?");
private static final Pattern DATA_BLOCK_ADDRESS_PATTERN =
- Pattern.compile("^%DB(?<blockNumber>\\d{1,4}).DB(?<transferSizeCode>.?)(?<byteOffset>\\d{1,4})(.(?<bitOffset>[0-7]))?:(?<dataType>.+)(\\[(?<numElements>\\d)])?");
+ Pattern.compile("^%DB(?<blockNumber>\\d{1,4}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,4})(.(?<bitOffset>[0-7]))?:(?<dataType>.+)(\\[(?<numElements>\\d)])?");
public static boolean matches(String fieldString) {
return DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString).matches() ||
@@ -52,7 +52,7 @@ public class S7Field implements PlcField {
} else if(dataType == S7DataType.BOOL) {
throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
}
- int numElements = 0;
+ int numElements = 1;
if(matcher.group("numElements") != null) {
numElements = Integer.parseInt(matcher.group("numElements"));
}
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 bee925e..3c34ee6 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
@@ -474,35 +474,35 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
// -----------------------------------------
// 8 bit:
case SINT: {
- Long longValue = (long) data.readShort();
+ Long longValue = (long) data.readByte();
fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case USINT: {
- Long longValue = (long) data.readUnsignedShort();
+ Long longValue = (long) data.readUnsignedByte();
fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
// 16 bit:
case INT: {
- Long longValue = (long) data.readInt();
+ Long longValue = (long) data.readShort();
fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case UINT: {
- Long longValue = data.readUnsignedInt();
+ Long longValue = (long) data.readUnsignedShort();
fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
// 32 bit:
case DINT: {
- Long longValue = data.readLong();
+ Long longValue = (long) data.readInt();
fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
case UDINT: {
- BigInteger bigIntegerValue = readUnsignedLong(data);
- fieldItem = new S7BigIntegerFieldItem(field.getDataType(), bigIntegerValue);
+ Long longValue = data.readUnsignedInt();
+ fieldItem = new S7IntegerFieldItem(field.getDataType(), longValue);
break;
}
// 64 bit:
@@ -618,6 +618,8 @@ public class Plc4XS7Protocol extends PlcMessageToMessageCodec<S7Message, PlcRequ
return PlcResponseCode.NOT_FOUND;
case INVALID_ADDRESS:
return PlcResponseCode.INVALID_ADDRESS;
+ case DATA_TYPE_NOT_SUPPORTED:
+ return PlcResponseCode.INVALID_DATATYPE;
default:
return PlcResponseCode.INTERNAL_ERROR;
}
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 e763b19..d191d03 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
@@ -578,7 +578,8 @@ public class S7Protocol extends ChannelDuplexHandler {
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)) {
+
+ if(dataTransportSize.isHasBlankByte() && (userData.readableBytes() > 0)) {
userData.readByte();
i++;
}
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportErrorCode.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportErrorCode.java
index 8299f79..4feb387 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportErrorCode.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportErrorCode.java
@@ -28,6 +28,7 @@ public enum DataTransportErrorCode {
RESERVED((byte) 0x00),
ACCESS_DENIED((byte) 0x03),
INVALID_ADDRESS((byte) 0x05),
+ DATA_TYPE_NOT_SUPPORTED((byte) 0x06),
NOT_FOUND((byte) 0x0A),
OK((byte) 0xFF);
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
index 6a9e46e..9f29cf9 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
@@ -27,20 +27,22 @@ import java.util.Map;
* TODO: Double chcek the sizeInBits values ... looks fishy to me ...
*/
public enum DataTransportSize {
- NULL((byte) 0x00, false),
- BIT((byte) 0x03, true),
- BYTE_WORD_DWORD((byte) 0x04, true),
- INTEGER((byte) 0x05, true),
- DINTEGER((byte) 0x06, false),
- REAL((byte) 0x07, false),
- OCTET_STRING((byte) 0x09, false);
+ NULL((byte) 0x00, false, false),
+ BIT((byte) 0x03, true, true),
+ BYTE_WORD_DWORD((byte) 0x04, true, true),
+ INTEGER((byte) 0x05, true, false),
+ DINTEGER((byte) 0x06, false, false),
+ REAL((byte) 0x07, false, false),
+ OCTET_STRING((byte) 0x09, false, true);
private final byte code;
private final boolean sizeInBits;
+ private final boolean hasBlankByte;
- DataTransportSize(byte code, boolean sizeInBits) {
+ DataTransportSize(byte code, boolean sizeInBits, boolean hasBlankByte) {
this.code = code;
this.sizeInBits = sizeInBits;
+ this.hasBlankByte = hasBlankByte;
}
public byte getCode() {
@@ -51,6 +53,10 @@ public enum DataTransportSize {
return sizeInBits;
}
+ public boolean isHasBlankByte() {
+ return hasBlankByte;
+ }
+
private final static Map<Byte, DataTransportSize> map;
static {
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java
new file mode 100644
index 0000000..a667b66
--- /dev/null
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java
@@ -0,0 +1,51 @@
+/*
+ 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.issues;
+
+import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.api.messages.PlcReadRequest;
+import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.s7.connection.S7PlcConnection;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+
+
+public class PLC4X47Test {
+
+ @Test
+ @Disabled
+ public void testLargeRequest() throws Exception {
+ /*TestChannelFactory channelFactory = new TestChannelFactory();
+ S7PlcConnection connection = new S7PlcConnection( channelFactory, 1, 1, "");
+ connection.connect();
+ EmbeddedChannel channel = channelFactory.getChannel();*/
+ S7PlcConnection connection = (S7PlcConnection) new PlcDriverManager().getConnection("s7://10.10.64.20/1/1");
+
+ PlcReadRequest.Builder builder = connection.readRequestBuilder();
+ for (int i = 1; i <= 30; i++) {
+ // just the first byte of each db
+ builder.addItem("field-" + i, "%DB3.DB" + i + ":INT");
+ }
+ PlcReadRequest readRequest = builder.build();
+ PlcReadResponse<?> readResponse = connection.read(readRequest).get();
+ System.out.println(readResponse.getFieldNames().size());
+ }
+
+}