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());
+    }
+
+}