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")
);
}