You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2020/02/06 21:03:03 UTC

[plc4x] branch rel/0.6 updated: [PLC4X-168] Shorter S7 Field Syntax

This is an automated email from the ASF dual-hosted git repository.

jfeinauer pushed a commit to branch rel/0.6
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/rel/0.6 by this push:
     new e20671c  [PLC4X-168] Shorter S7 Field Syntax
e20671c is described below

commit e20671c3e45f7ddd88ba0b836654ae159a23ac57
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Sun Jan 19 17:02:57 2020 +0100

    [PLC4X-168] Shorter S7 Field Syntax
---
 .../org/apache/plc4x/java/s7/model/S7Field.java    | 32 ++++++++++++++++++++--
 .../apache/plc4x/java/s7/model/S7FieldTests.java   |  8 ++++--
 2 files changed, 36 insertions(+), 4 deletions(-)

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 0462084..8733ffa 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
@@ -40,6 +40,9 @@ public class S7Field implements PlcField {
     private static final Pattern DATA_BLOCK_ADDRESS_PATTERN =
         Pattern.compile("^%DB(?<blockNumber>\\d{1,5}).DB(?<transferSizeCode>[XBWD]?)(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
 
+    private static final Pattern DATA_BLOCK_SHORT_PATTERN =
+        Pattern.compile("^%DB(?<blockNumber>\\d{1,5}):(?<byteOffset>\\d{1,7})(.(?<bitOffset>[0-7]))?:(?<dataType>[a-zA-Z_]+)(\\[(?<numElements>\\d+)])?");
+
     private static final String DATA_TYPE = "dataType";
     private static final String TRANSFER_SIZE_CODE = "transferSizeCode";
     private static final String BLOCK_NUMBER = "blockNumber";
@@ -90,7 +93,8 @@ public class S7Field implements PlcField {
 
     public static boolean matches(String fieldString) {
         return DATA_BLOCK_ADDRESS_PATTERN.matcher(fieldString).matches() ||
-            ADDRESS_PATTERN.matcher(fieldString).matches();
+            ADDRESS_PATTERN.matcher(fieldString).matches() ||
+            DATA_BLOCK_SHORT_PATTERN.matcher(fieldString).matches();
     }
 
     /**
@@ -156,7 +160,7 @@ public class S7Field implements PlcField {
                     "' doesn't match specified data type '" + dataType.name() + "'");
             }
             return new S7Field(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
-        } else {
+        } else if (ADDRESS_PATTERN.matcher(fieldString).matches()) {
             matcher = ADDRESS_PATTERN.matcher(fieldString);
             if (matcher.matches()) {
                 TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
@@ -182,6 +186,30 @@ public class S7Field implements PlcField {
                 }
                 return new S7Field(dataType, memoryArea, (short) 0, byteOffset, bitOffset, numElements);
             }
+        } else if (DATA_BLOCK_SHORT_PATTERN.matcher(fieldString).matches()) {
+            matcher = DATA_BLOCK_SHORT_PATTERN.matcher(fieldString);
+
+            assert matcher.matches();
+
+            TransportSize dataType = TransportSize.valueOf(matcher.group(DATA_TYPE));
+            MemoryArea memoryArea = MemoryArea.DATA_BLOCKS;
+
+            int blockNumber = checkDatablockNumber(Integer.parseInt(matcher.group(BLOCK_NUMBER)));
+
+            int byteOffset = checkByteOffset(Integer.parseInt(matcher.group(BYTE_OFFSET)));
+
+            short bitOffset = 0;
+            if(matcher.group(BIT_OFFSET) != null) {
+                bitOffset = Short.parseShort(matcher.group(BIT_OFFSET));
+            } else if(dataType == TransportSize.BOOL) {
+                throw new PlcInvalidFieldException("Expected bit offset for BOOL parameters.");
+            }
+            int numElements = 1;
+            if(matcher.group(NUM_ELEMENTS) != null) {
+                numElements = Integer.parseInt(matcher.group(NUM_ELEMENTS));
+            }
+            numElements = calcNumberOfElementsForIndividualTypes(numElements,dataType);
+            return new S7Field(dataType, memoryArea, blockNumber, byteOffset, bitOffset, numElements);
         }
         throw new PlcInvalidFieldException("Unable to parse address: " + fieldString);
     }
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
index fc82956..eaed224 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
@@ -44,7 +44,10 @@ class S7FieldTests {
             Arguments.of("%ID64:REAL",          TransportSize.REAL,  MemoryArea.INPUTS,      0,  64, 0),
             Arguments.of("%Q0.4:BOOL",          TransportSize.BOOL,  MemoryArea.OUTPUTS,     0,  0,  4),
             Arguments.of("%M9.0:BOOL",          TransportSize.BOOL,  MemoryArea.FLAGS_MARKERS,     0,  9,  0),
-            Arguments.of("%DB1.DBX38.1:BOOL",   TransportSize.BOOL,  MemoryArea.DATA_BLOCKS, 1,  38, 1)/*,
+            Arguments.of("%DB1.DBX38.1:BOOL",   TransportSize.BOOL,  MemoryArea.DATA_BLOCKS, 1,  38, 1),
+            Arguments.of("%DB1:38.1:BOOL",   TransportSize.BOOL,  MemoryArea.DATA_BLOCKS, 1,  38, 1),
+            Arguments.of("%DB1:8.0:REAL",   TransportSize.REAL,  MemoryArea.DATA_BLOCKS, 1,  8, 0),
+            Arguments.of("%DB400:8.0:REAL",   TransportSize.REAL,  MemoryArea.DATA_BLOCKS, 400,  8, 0)/*,
             // Not quite sure about how Data Block addresses look like, in my TIA portal they all have the prefix "DB".
             Arguments.of("%DB3.DX4.1:BOOL",     S7DataType.BOOL,  MemoryArea.DATA_BLOCKS, 3,  4,  1),
             Arguments.of("%DB3.DB4:INT",        S7DataType.INT,   MemoryArea.DATA_BLOCKS, 3,  4,  0),
@@ -57,7 +60,8 @@ class S7FieldTests {
         return Stream.of(
             Arguments.of("%I0:BOOL"),
             Arguments.of("%IW64:REAL"),
-            Arguments.of("%DB1.DBX38:BOOL")
+            Arguments.of("%DB1.DBX38:BOOL"),
+            Arguments.of("%DB1:100")
         );
     }