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 2019/08/29 13:12:14 UTC

[plc4x] 02/02: Addition of single bit read from Integer files

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

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

commit 99a13534a6917dd189b0072ad8dcff4b31586f4a
Author: v.emmert <v....@pragmaticminds.de>
AuthorDate: Wed Aug 28 16:19:39 2019 +0200

    Addition of single bit read from Integer files
---
 .../apache/plc4x/java/abeth/model/AbEthField.java   | 21 ++++++++++++---------
 .../plc4x/java/abeth/model/types/FileType.java      |  2 +-
 .../java/abeth/protocol/Plc4xAbEthProtocol.java     | 20 ++++++++++++++++----
 3 files changed, 29 insertions(+), 14 deletions(-)

diff --git a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/AbEthField.java b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/AbEthField.java
index 82d7844..7c592a2 100644
--- a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/AbEthField.java
+++ b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/AbEthField.java
@@ -28,11 +28,14 @@ import java.util.regex.Pattern;
 public class AbEthField implements PlcField {
 
     private static final Pattern ADDRESS_PATTERN =
-        Pattern.compile("^N(?<fileNumber>\\d{1,7}):(?<elementNumber>\\d{1,7})/(?<subElementNumber>\\d{1,7}):(?<dataType>[a-zA-Z_]+)(\\[(?<size>\\d+)])?");
+//        Pattern.compile("^N(?<fileNumber>\\d{1,7}):(?<elementNumber>\\d{1,7})/(?<bitNumber>\\d{1,7}):(?<dataType>[a-zA-Z_]+)(\\[(?<size>\\d+)])?");
+        Pattern.compile("^N(?<fileNumber>\\d{1,7}):(?<elementNumber>\\d{1,7})(/(?<bitNumber>\\d{1,7}))?:(?<dataType>[a-zA-Z_]+)(\\[(?<size>\\d+)])?");
+
 
     private static final String FILE_NUMBER = "fileNumber";
     private static final String ELEMENT_NUMBER = "elementNumber";
-    private static final String SUB_ELEMENT_NUMBER = "subElementNumber";
+//    private static final String SUB_ELEMENT_NUMBER = "subElementNumber";
+    private static final String BIT_NUMBER = "bitNumber";
     private static final String DATA_TYPE = "dataType";
     private static final String SIZE = "size";
 
@@ -40,14 +43,14 @@ public class AbEthField implements PlcField {
     private final short fileNumber;
     private final FileType fileType;
     private final short elementNumber;
-    private final short subElementNumber;
+    private final short bitNumber;
 
-    public AbEthField(short byteSize, short fileNumber, FileType fileType, short elementNumber, short subElementNumber) {
+    public AbEthField(short byteSize, short fileNumber, FileType fileType, short elementNumber, short bitNumber) {
         this.byteSize = byteSize;
         this.fileNumber = fileNumber;
         this.fileType = fileType;
         this.elementNumber = elementNumber;
-        this.subElementNumber = subElementNumber;
+        this.bitNumber = bitNumber;
     }
 
     public short getByteSize() {
@@ -66,8 +69,8 @@ public class AbEthField implements PlcField {
         return elementNumber;
     }
 
-    public short getSubElementNumber() {
-        return subElementNumber;
+    public short getBitNumber() {
+        return bitNumber;
     }
 
     public static boolean matches(String fieldString) {
@@ -79,10 +82,10 @@ public class AbEthField implements PlcField {
         if(matcher.matches()) {
             short fileNumber = Short.parseShort(matcher.group(FILE_NUMBER));
             short elementNumber = Short.parseShort(matcher.group(ELEMENT_NUMBER));
-            short subElementNumber = Short.parseShort(matcher.group(SUB_ELEMENT_NUMBER));
+            short bitNumber = (matcher.group(BIT_NUMBER) != null) ? Short.parseShort(matcher.group(BIT_NUMBER)) : 0;  //Short.parseShort(matcher.group(BIT_NUMBER));
             FileType fileType = FileType.valueOf(matcher.group(DATA_TYPE).toUpperCase());
             short byteSize = Short.parseShort(matcher.group(SIZE));
-            return new AbEthField(byteSize, fileNumber, fileType,elementNumber, subElementNumber);
+            return new AbEthField(byteSize, fileNumber, fileType,elementNumber, bitNumber);
         }
         throw new PlcInvalidFieldException("Unable to parse address: " + fieldString);
     }
diff --git a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/types/FileType.java b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/types/FileType.java
index 22f41f6..45728f8 100644
--- a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/types/FileType.java
+++ b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/model/types/FileType.java
@@ -36,7 +36,7 @@ public enum FileType {
     STRING((short) 0x8D),
     ASCII((short) 0x8E),
     BCD((short) 0x8F),
-    INTBIT((short) 0x89); // reads single bit from Integer file, no official AB type
+    SINGLEBIT((short) 0x89); // reads single bit from Integer file, no official AB type
 
     private final short typeCode;
 
diff --git a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
index 4096fa5..85eee25 100644
--- a/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
+++ b/sandbox/test-java-ab-eth-driver/src/main/java/org/apache/plc4x/java/abeth/protocol/Plc4xAbEthProtocol.java
@@ -39,6 +39,7 @@ import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
 import org.apache.plc4x.java.base.messages.InternalPlcReadRequest;
 import org.apache.plc4x.java.base.messages.PlcRequestContainer;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
+import org.apache.plc4x.java.base.messages.items.DefaultBooleanFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultShortFieldItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -85,6 +86,12 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
     @Override
     protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, List<Object> out) throws Exception {
         PlcRequest request = msg.getRequest();
+
+        // reset counter since two byte values are possible in DF1
+        if (transactionCounterGenerator.get() > 65000) {
+            transactionCounterGenerator.set(10);
+        }
+
         if (request instanceof PlcReadRequest) {
             PlcReadRequest readRequest = (PlcReadRequest) msg.getRequest();
 
@@ -97,7 +104,8 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
 
                 DF1RequestProtectedTypedLogicalRead logicalRead = new DF1RequestProtectedTypedLogicalRead(
                     abEthField.getByteSize(), abEthField.getFileNumber(), abEthField.getFileType().getTypeCode(),
-                    abEthField.getElementNumber(), abEthField.getSubElementNumber());
+                    abEthField.getElementNumber(), (short) 0); // Subelementnumber default to zero
+                // TODO: make target and origin address changeable
                 DF1RequestMessage requestMessage = new DF1CommandRequestMessage(
                     (short) 8, (short) 5, (short) 0, transactionCounterGenerator.incrementAndGet(), logicalRead);
                 CIPEncapsulationReadRequest read = new CIPEncapsulationReadRequest(
@@ -167,7 +175,7 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
             if (responseCode == PlcResponseCode.OK) {
                 try {
                     switch (field.getFileType()) {
-                        case INTEGER: //HURZ
+                        case INTEGER: // output as single bytes
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
@@ -178,11 +186,15 @@ public class Plc4xAbEthProtocol extends PlcMessageToMessageCodec<CIPEncapsulatio
                                 fieldItem = new DefaultShortFieldItem(convData);
                             }
                             break;
-                        case INTBIT:
+                        case SINGLEBIT:
                             if(plcReadResponse.getResponse() instanceof DF1CommandResponseMessageProtectedTypedLogicalRead) {
                                 DF1CommandResponseMessageProtectedTypedLogicalRead df1PTLR = (DF1CommandResponseMessageProtectedTypedLogicalRead) plcReadResponse.getResponse();
                                 short[] data = df1PTLR.getData();
-
+                                if (field.getBitNumber() < 8) {
+                                    fieldItem = new DefaultBooleanFieldItem((data[0] & (1 <<  field.getBitNumber())) != 0);          // read from first byte
+                                } else {
+                                    fieldItem = new DefaultBooleanFieldItem((data[1] & (1 << (field.getBitNumber() - 8) )) != 0);   // read from second byte
+                                }
                             }
                             break;
                         default: