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: