Solves the S7 driver problems for handling cyclic subscriptions. Make the corrections in the Hop integration for the correct handling of Actions and Transforms.
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
index 4783b3b..31e7dab 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/Alarm8MessageQueryType.java
@@ -88,7 +88,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Alarm8MessageQueryType");
// Simple Field (functionId)
@@ -173,8 +172,6 @@
public static Alarm8MessageQueryType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Alarm8MessageQueryType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java
index 579333c..342589e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckObjectPushType.java
@@ -95,7 +95,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageAckObjectPushType");
// Const Field (variableSpec)
@@ -172,8 +171,6 @@
throws ParseException {
readBuffer.pullContext("AlarmMessageAckObjectPushType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short variableSpec =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.java
index 6aeaf27..48491b9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckPushType.java
@@ -74,7 +74,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageAckPushType");
// Simple Field (TimeStamp)
@@ -133,8 +132,6 @@
public static AlarmMessageAckPushType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AlarmMessageAckPushType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DateAndTime TimeStamp =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java
index 7d93a28..e588b6c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckResponseType.java
@@ -65,7 +65,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageAckResponseType");
// Simple Field (functionId)
@@ -115,8 +114,6 @@
throws ParseException {
readBuffer.pullContext("AlarmMessageAckResponseType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java
index 0cb1b92..bea2571 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageAckType.java
@@ -65,7 +65,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageAckType");
// Simple Field (functionId)
@@ -118,8 +117,6 @@
public static AlarmMessageAckType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AlarmMessageAckType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java
index bbbfc21..fc3ff16 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectAckType.java
@@ -93,7 +93,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageObjectAckType");
// Const Field (variableSpec)
@@ -169,8 +168,6 @@
public static AlarmMessageObjectAckType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AlarmMessageObjectAckType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short variableSpec =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java
index 7680db5..4277709 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectPushType.java
@@ -116,7 +116,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageObjectPushType");
// Const Field (variableSpec)
@@ -217,8 +216,6 @@
throws ParseException {
readBuffer.pullContext("AlarmMessageObjectPushType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short variableSpec =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java
index 49f8d6f..7d93107 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageObjectQueryType.java
@@ -109,7 +109,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageObjectQueryType");
// Simple Field (lengthDataset)
@@ -199,8 +198,6 @@
throws ParseException {
readBuffer.pullContext("AlarmMessageObjectQueryType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short lengthDataset = readSimpleField("lengthDataset", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.java
index a34b68b..a6b578a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessagePushType.java
@@ -74,7 +74,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessagePushType");
// Simple Field (TimeStamp)
@@ -133,8 +132,6 @@
public static AlarmMessagePushType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AlarmMessagePushType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DateAndTime TimeStamp =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.java
index 4174c08..53eddc5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmMessageQueryType.java
@@ -88,7 +88,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AlarmMessageQueryType");
// Simple Field (functionId)
@@ -173,8 +172,6 @@
public static AlarmMessageQueryType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AlarmMessageQueryType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java
index 10f555f..5a03889 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmStateType.java
@@ -39,7 +39,7 @@
}
}
- private short value;
+ private final short value;
AlarmStateType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java
index a11a660..3693907 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AlarmType.java
@@ -36,7 +36,7 @@
}
}
- private short value;
+ private final short value;
AlarmType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
index 035fc29..9f7a355 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedQueryValueType.java
@@ -74,7 +74,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AssociatedQueryValueType");
// Simple Field (returnCode)
@@ -143,8 +142,6 @@
public static AssociatedQueryValueType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AssociatedQueryValueType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
index 8b09036..d3807cd 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/AssociatedValueType.java
@@ -74,7 +74,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("AssociatedValueType");
// Simple Field (returnCode)
@@ -148,8 +147,6 @@
public static AssociatedValueType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("AssociatedValueType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java
index afe5079..f5c7bb1 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionRequest.java
@@ -75,7 +75,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketConnectionRequest");
// Simple Field (destinationReference)
@@ -125,8 +124,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketConnectionRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int destinationReference =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java
index 5fb6eb6..1d64fa5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketConnectionResponse.java
@@ -75,7 +75,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketConnectionResponse");
// Simple Field (destinationReference)
@@ -125,8 +124,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketConnectionResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int destinationReference =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java
index 3b56645..d02dc78 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketData.java
@@ -65,7 +65,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketData");
// Simple Field (eot)
@@ -101,8 +100,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketData");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
boolean eot = readSimpleField("eot", readBoolean(readBuffer));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java
index 7a30250..8c1ef73 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectRequest.java
@@ -75,7 +75,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketDisconnectRequest");
// Simple Field (destinationReference)
@@ -125,8 +124,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketDisconnectRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int destinationReference =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java
index cf4df50..90bae29 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketDisconnectResponse.java
@@ -68,7 +68,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketDisconnectResponse");
// Simple Field (destinationReference)
@@ -105,8 +104,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketDisconnectResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int destinationReference =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java
index 1cfaf8c..bb6c4ed 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPPacketTpduError.java
@@ -68,7 +68,6 @@
protected void serializeCOTPPacketChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPPacketTpduError");
// Simple Field (destinationReference)
@@ -105,8 +104,6 @@
ReadBuffer readBuffer, Integer cotpLen) throws ParseException {
readBuffer.pullContext("COTPPacketTpduError");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int destinationReference =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java
index 76a3a88..d056c5f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameter.java
@@ -50,7 +50,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameter");
// Discriminator Field (parameterType) (Used as input to a switch field)
@@ -113,8 +112,6 @@
public static COTPParameter staticParse(ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameter");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short parameterType = readDiscriminatorField("parameterType", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java
index 2a9f41a..154495f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCalledTsap.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameterCalledTsap");
// Simple Field (tsapId)
@@ -89,8 +88,6 @@
ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameterCalledTsap");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int tsapId = readSimpleField("tsapId", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java
index bcbaf50..b61845a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterCallingTsap.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameterCallingTsap");
// Simple Field (tsapId)
@@ -89,8 +88,6 @@
ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameterCallingTsap");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int tsapId = readSimpleField("tsapId", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java
index 23e0cef..bfa89f0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterChecksum.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameterChecksum");
// Simple Field (crc)
@@ -89,8 +88,6 @@
ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameterChecksum");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short crc = readSimpleField("crc", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java
index b4a61e8..9846b05 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterDisconnectAdditionalInformation.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameterDisconnectAdditionalInformation");
// Array Field (data)
@@ -91,8 +90,6 @@
ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameterDisconnectAdditionalInformation");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
byte[] data = readBuffer.readByteArray("data", Math.toIntExact(rest));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java
index 4cb45b9..be74062 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPParameterTpduSize.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("COTPParameterTpduSize");
// Simple Field (tpduSize)
@@ -94,8 +93,6 @@
ReadBuffer readBuffer, Short rest) throws ParseException {
readBuffer.pullContext("COTPParameterTpduSize");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
COTPTpduSize tpduSize =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java
index fd6ab7e..0171572 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPProtocolClass.java
@@ -38,7 +38,7 @@
}
}
- private short value;
+ private final short value;
COTPProtocolClass(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java
index f428cfe..9f7df71 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/COTPTpduSize.java
@@ -42,8 +42,8 @@
}
}
- private short value;
- private int sizeInBytes;
+ private final short value;
+ private final int sizeInBytes;
COTPTpduSize(short value, int sizeInBytes) {
this.value = value;
@@ -68,7 +68,7 @@
}
public static List<COTPTpduSize> enumsForFieldSizeInBytes(int fieldValue) {
- List<COTPTpduSize> _values = new ArrayList();
+ List<COTPTpduSize> _values = new ArrayList<>();
for (COTPTpduSize _val : COTPTpduSize.values()) {
if (_val.getSizeInBytes() == fieldValue) {
_values.add(_val);
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java
index b9cb3f0..10be0b9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CpuSubscribeEvents.java
@@ -37,7 +37,7 @@
}
}
- private short value;
+ private final short value;
CpuSubscribeEvents(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
index 82cfa39..d93c31c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemAnyType.java
@@ -87,16 +87,15 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("CycServiceItemAnyType");
- // Simple Field (transportSize)
- writeSimpleEnumField(
+ // Enum field (transportSize)
+ writeEnumField(
"transportSize",
"TransportSize",
transportSize,
new DataWriterEnumDefault<>(
- TransportSize::getValue, TransportSize::name, writeUnsignedShort(writeBuffer, 8)));
+ TransportSize::getCode, TransportSize::name, writeUnsignedShort(writeBuffer, 8)));
// Simple Field (length)
writeSimpleField("length", length, writeUnsignedInt(writeBuffer, 16));
@@ -129,7 +128,7 @@
CycServiceItemAnyType _value = this;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- // Simple field (transportSize)
+ // Enum Field (transportSize)
lengthInBits += 8;
// Simple field (length)
@@ -151,16 +150,13 @@
ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("CycServiceItemAnyType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
TransportSize transportSize =
readEnumField(
"transportSize",
"TransportSize",
- new DataReaderEnumDefault<>(
- TransportSize::enumForValue, readUnsignedShort(readBuffer, 8)));
+ readEnum(TransportSize::firstEnumForFieldCode, readUnsignedShort(readBuffer, 8)));
int length = readSimpleField("length", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
index c2ca696..7336375 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemDbReadType.java
@@ -63,7 +63,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("CycServiceItemDbReadType");
// Simple Field (numberOfAreas)
@@ -105,8 +104,6 @@
ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("CycServiceItemDbReadType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numberOfAreas = readSimpleField("numberOfAreas", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
index c7c6af1..9dca1f7 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/CycServiceItemType.java
@@ -70,7 +70,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("CycServiceItemType");
// Const Field (functionId)
@@ -122,8 +121,6 @@
public static CycServiceItemType staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("CycServiceItemType");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java
index 160a36c..72da9d7 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportErrorCode.java
@@ -39,7 +39,7 @@
}
}
- private short value;
+ private final short value;
DataTransportErrorCode(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java
index 130f5f0..bc667c5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DataTransportSize.java
@@ -42,8 +42,8 @@
}
}
- private short value;
- private boolean sizeInBits;
+ private final short value;
+ private final boolean sizeInBits;
DataTransportSize(short value, boolean sizeInBits) {
this.value = value;
@@ -68,7 +68,7 @@
}
public static List<DataTransportSize> enumsForFieldSizeInBits(boolean fieldValue) {
- List<DataTransportSize> _values = new ArrayList();
+ List<DataTransportSize> _values = new ArrayList<>();
for (DataTransportSize _val : DataTransportSize.values()) {
if (_val.getSizeInBits() == fieldValue) {
_values.add(_val);
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java
index 26fa8d9..fa0b0e1 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DateAndTime.java
@@ -102,7 +102,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("DateAndTime");
// Manual Field (year)
@@ -200,8 +199,6 @@
public static DateAndTime staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("DateAndTime");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short year =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java
index 4fb8727..6386830 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/DeviceGroup.java
@@ -36,7 +36,7 @@
}
}
- private short value;
+ private final short value;
DeviceGroup(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
index 1d9931c..b80be90 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/EventType.java
@@ -38,7 +38,7 @@
}
}
- private short value;
+ private final short value;
EventType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java
index 0a244f9..16146f7 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/MemoryArea.java
@@ -44,8 +44,8 @@
}
}
- private short value;
- private String shortName;
+ private final short value;
+ private final String shortName;
MemoryArea(short value, String shortName) {
this.value = value;
@@ -70,7 +70,7 @@
}
public static List<MemoryArea> enumsForFieldShortName(String fieldValue) {
- List<MemoryArea> _values = new ArrayList();
+ List<MemoryArea> _values = new ArrayList<>();
for (MemoryArea _val : MemoryArea.values()) {
if (_val.getShortName().equals(fieldValue)) {
_values.add(_val);
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java
index f31562b..affc7cc 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/ModeTransitionType.java
@@ -42,7 +42,7 @@
}
}
- private short value;
+ private final short value;
ModeTransitionType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
index 7a6eaf3..6a09863 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/QueryType.java
@@ -37,7 +37,7 @@
}
}
- private short value;
+ private final short value;
QueryType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
index 4e3b3ac..3fdb19b 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
@@ -50,7 +50,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7Address");
// Discriminator Field (addressType) (Used as input to a switch field)
@@ -89,8 +88,6 @@
public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7Address");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java
index 5fc9b8f..b9e124e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7AddressAny.java
@@ -94,7 +94,6 @@
protected void serializeS7AddressChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7AddressAny");
// Enum field (transportSize)
@@ -170,8 +169,6 @@
throws ParseException {
readBuffer.pullContext("S7AddressAny");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
TransportSize transportSize =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.java
index d8109b7..92e453c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7DataAlarmMessage.java
@@ -62,7 +62,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7DataAlarmMessage");
// Const Field (functionId)
@@ -123,8 +122,6 @@
throws ParseException {
readBuffer.pullContext("S7DataAlarmMessage");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java
index 4fc347c..19cf023 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Message.java
@@ -77,7 +77,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7Message");
// Const Field (protocolId)
@@ -167,8 +166,6 @@
public static S7Message staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7Message");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short protocolId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java
index 4c85600..fcdf0b4 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectRequest.java
@@ -83,7 +83,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageObjectRequest");
// Const Field (variableSpec)
@@ -164,8 +163,6 @@
ReadBuffer readBuffer, Byte cpuFunctionType) throws ParseException {
readBuffer.pullContext("S7MessageObjectRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short variableSpec =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java
index 36bf1ce..812a27a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageObjectResponse.java
@@ -66,7 +66,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageObjectResponse");
// Simple Field (returnCode)
@@ -122,8 +121,6 @@
ReadBuffer readBuffer, Byte cpuFunctionType) throws ParseException {
readBuffer.pullContext("S7MessageObjectResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java
index a4b7750..d7f5553 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageRequest.java
@@ -50,7 +50,6 @@
protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageRequest");
writeBuffer.popContext("S7MessageRequest");
@@ -74,8 +73,6 @@
throws ParseException {
readBuffer.pullContext("S7MessageRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7MessageRequest");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java
index 722f168..c32725f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponse.java
@@ -69,7 +69,6 @@
protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageResponse");
// Simple Field (errorClass)
@@ -105,8 +104,6 @@
throws ParseException {
readBuffer.pullContext("S7MessageResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short errorClass = readSimpleField("errorClass", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java
index e41e0e2..a4e957d 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageResponseData.java
@@ -69,7 +69,6 @@
protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageResponseData");
// Simple Field (errorClass)
@@ -105,8 +104,6 @@
throws ParseException {
readBuffer.pullContext("S7MessageResponseData");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short errorClass = readSimpleField("errorClass", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java
index f9a557b..93c3801 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7MessageUserData.java
@@ -50,7 +50,6 @@
protected void serializeS7MessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7MessageUserData");
writeBuffer.popContext("S7MessageUserData");
@@ -74,8 +73,6 @@
throws ParseException {
readBuffer.pullContext("S7MessageUserData");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7MessageUserData");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java
index 051ebd2..d02b952 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Parameter.java
@@ -52,7 +52,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7Parameter");
// Discriminator Field (parameterType) (Used as input to a switch field)
@@ -108,8 +107,6 @@
throws ParseException {
readBuffer.pullContext("S7Parameter");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short parameterType = readDiscriminatorField("parameterType", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java
index b65cb58..8858e89 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterModeTransition.java
@@ -91,7 +91,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterModeTransition");
// Reserved Field (reserved)
@@ -159,8 +158,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterModeTransition");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Integer reservedField0 =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarRequest.java
index 4ca7832..1cd784f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarRequest.java
@@ -62,7 +62,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterReadVarRequest");
// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly
@@ -106,8 +105,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterReadVarRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numItems = readImplicitField("numItems", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarResponse.java
index 18f8428..c79fc96 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterReadVarResponse.java
@@ -62,7 +62,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterReadVarResponse");
// Simple Field (numItems)
@@ -92,8 +91,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterReadVarResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numItems = readSimpleField("numItems", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java
index 4e12e06..c9d4cf0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterSetupCommunication.java
@@ -74,7 +74,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterSetupCommunication");
// Reserved Field (reserved)
@@ -122,8 +121,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterSetupCommunication");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Short reservedField0 =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserData.java
index aa681aa..a0013a3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserData.java
@@ -62,7 +62,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterUserData");
// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly
@@ -106,8 +105,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterUserData");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numItems = readImplicitField("numItems", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
index 4f9ec54..b041ad3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
@@ -50,7 +50,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterUserDataItem");
// Discriminator Field (itemType) (Used as input to a switch field)
@@ -90,8 +89,6 @@
public static S7ParameterUserDataItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7ParameterUserDataItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short itemType = readDiscriminatorField("itemType", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
index 03c8baf..7f330b5 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItemCPUFunctions.java
@@ -110,7 +110,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterUserDataItemCPUFunctions");
// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly
@@ -197,8 +196,6 @@
ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7ParameterUserDataItemCPUFunctions");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short itemLength = readImplicitField("itemLength", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarRequest.java
index 88985ee..b70182a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarRequest.java
@@ -62,7 +62,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterWriteVarRequest");
// Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly
@@ -106,8 +105,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterWriteVarRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numItems = readImplicitField("numItems", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarResponse.java
index 157e0db..58fb344 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterWriteVarResponse.java
@@ -62,7 +62,6 @@
protected void serializeS7ParameterChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7ParameterWriteVarResponse");
// Simple Field (numItems)
@@ -92,8 +91,6 @@
ReadBuffer readBuffer, Short messageType) throws ParseException {
readBuffer.pullContext("S7ParameterWriteVarResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short numItems = readSimpleField("numItems", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java
index 8f9b7d1..27068e8 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java
@@ -52,7 +52,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7Payload");
// Switch field (Serialize the sub-type)
@@ -108,8 +107,6 @@
ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
readBuffer.pullContext("S7Payload");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
index d7369d0..8642ab9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarm8.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadAlarm8");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadAlarm8");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
index 1d0300f..15880f9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmAckInd.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadAlarmAckInd");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadAlarmAckInd");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessageAckPushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
index e589cd9..24a994f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmS.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadAlarmS");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadAlarmS");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
index a37b06e..e1ca33f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSC.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadAlarmSC");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadAlarmSC");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
index e69cd51..d944a03 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadAlarmSQ");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadAlarmSQ");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
index b939287..f22947b 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadDiagnosticMessage.java
@@ -113,7 +113,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadDiagnosticMessage");
// Simple Field (EventId)
@@ -180,8 +179,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadDiagnosticMessage");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int EventId = readSimpleField("EventId", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
index 7bcdc3e..f6bf523 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadNotify");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadNotify");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
index 43960bb..1c7542a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadNotify8.java
@@ -71,7 +71,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadNotify8");
// Simple Field (alarmMessage)
@@ -102,8 +101,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadNotify8");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
AlarmMessagePushType alarmMessage =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
index ced89ad..4520e99 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadReadVarResponse.java
@@ -62,7 +62,6 @@
protected void serializeS7PayloadChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadReadVarResponse");
// Array Field (items)
@@ -98,8 +97,6 @@
ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
readBuffer.pullContext("S7PayloadReadVarResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
List<S7VarPayloadDataItem> items =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
index 39b3de7..4665136 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserData.java
@@ -62,7 +62,6 @@
protected void serializeS7PayloadChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserData");
// Array Field (items)
@@ -98,8 +97,6 @@
ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
readBuffer.pullContext("S7PayloadUserData");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
List<S7PayloadUserDataItem> items =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
index b66f981..89e58d0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItem.java
@@ -75,7 +75,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItem");
// Simple Field (returnCode)
@@ -177,8 +176,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
index dfb5a9e..1d3d682 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse.java
@@ -61,7 +61,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
@@ -86,8 +85,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionAlarmAckErrorResponse");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
index 77d23ed..c74ec90 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckRequest.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
// Const Field (functionId)
@@ -130,8 +129,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
index c56ff8b..3be0eb0 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmAckResponse.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmAckResponse");
// Simple Field (functionId)
@@ -126,8 +125,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmAckResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId = readSimpleField("functionId", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
index 67f0ed0..86ef192 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryRequest.java
@@ -108,7 +108,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
// Const Field (functionId)
@@ -202,8 +201,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQueryRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short functionId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
index 1bff09b..8cf96d3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionAlarmQueryResponse.java
@@ -72,7 +72,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
// Array Field (items)
@@ -109,8 +108,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionAlarmQueryResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
byte[] items = readBuffer.readByteArray("items", Math.toIntExact(dataLength));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
index b3456d5..642c00f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse.java
@@ -100,7 +100,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse");
// Simple Field (result)
@@ -160,8 +159,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionAlarmResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short result = readSimpleField("result", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
index ad21923..c75ceaf 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest.java
@@ -93,7 +93,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
// Simple Field (Subscription)
@@ -158,8 +157,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short Subscription = readSimpleField("Subscription", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
index 3077876..e63f6c4 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse.java
@@ -61,7 +61,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
@@ -86,8 +85,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionResponse");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
index b4af396..d8f5fac 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse");
// Simple Field (result)
@@ -116,8 +115,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionMsgSubscriptionSysResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short result = readSimpleField("result", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
index 2ef1caa..947c57f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest.java
@@ -61,7 +61,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
writeBuffer.popContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
@@ -86,8 +85,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7PayloadUserDataItemCpuFunctionReadSzlNoDataRequest");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
index a7ca1d2..31c17cd 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlRequest.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
// Simple Field (szlId)
@@ -116,8 +115,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
SzlId szlId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
index 53d665b..59cd4a3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCpuFunctionReadSzlResponse.java
@@ -72,7 +72,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
// Array Field (items)
@@ -109,8 +108,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCpuFunctionReadSzlResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
byte[] items = readBuffer.readByteArray("items", Math.toIntExact(dataLength));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
index 5befaca..c1ea18e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenPush.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
// Simple Field (itemsCount)
@@ -122,8 +121,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesChangeDrivenPush");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
index 8653ab2..38bc3d3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
// Simple Field (itemsCount)
@@ -122,8 +121,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
index e6638a7..f9613dc 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesErrorResponse.java
@@ -61,7 +61,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
@@ -86,8 +85,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesErrorResponse");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
index 0231b5d..c2341a4 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesPush.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesPush");
// Simple Field (itemsCount)
@@ -122,8 +121,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesPush");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java
index fb33e91..7376db3 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeRequest.java
@@ -93,7 +93,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
// Simple Field (itemsCount)
@@ -153,8 +152,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesSubscribeRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
index bc9aae2..fbef37a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesSubscribeResponse.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
// Simple Field (itemsCount)
@@ -122,8 +121,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesSubscribeResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemsCount = readSimpleField("itemsCount", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
index b1b484f..eadbcbb 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeRequest.java
@@ -79,7 +79,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
// Simple Field (function)
@@ -116,8 +115,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesUnsubscribeRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short function = readSimpleField("function", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
index 4760831..9e3e74c 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadUserDataItemCyclicServicesUnsubscribeResponse.java
@@ -61,7 +61,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
writeBuffer.popContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
@@ -86,8 +85,6 @@
throws ParseException {
readBuffer.pullContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
readBuffer.closeContext("S7PayloadUserDataItemCyclicServicesUnsubscribeResponse");
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java
index 48d4a5a..5c31abe 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarRequest.java
@@ -62,7 +62,6 @@
protected void serializeS7PayloadChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadWriteVarRequest");
// Array Field (items)
@@ -98,8 +97,6 @@
ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
readBuffer.pullContext("S7PayloadWriteVarRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
List<S7VarPayloadDataItem> items =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java
index 1f6e13c..fca9a9f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7PayloadWriteVarResponse.java
@@ -62,7 +62,6 @@
protected void serializeS7PayloadChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7PayloadWriteVarResponse");
// Array Field (items)
@@ -98,8 +97,6 @@
ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
readBuffer.pullContext("S7PayloadWriteVarResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
List<S7VarPayloadStatusItem> items =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
index 4483814..813eb42 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadDataItem.java
@@ -65,7 +65,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7VarPayloadDataItem");
// Simple Field (returnCode)
@@ -154,8 +153,6 @@
public static S7VarPayloadDataItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7VarPayloadDataItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadStatusItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadStatusItem.java
index aec0f0e..718ce59 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadStatusItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarPayloadStatusItem.java
@@ -52,7 +52,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7VarPayloadStatusItem");
// Simple Field (returnCode)
@@ -94,8 +93,6 @@
public static S7VarPayloadStatusItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7VarPayloadStatusItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
DataTransportErrorCode returnCode =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItem.java
index 2623497..a6bf222 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItem.java
@@ -50,7 +50,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7VarRequestParameterItem");
// Discriminator Field (itemType) (Used as input to a switch field)
@@ -90,8 +89,6 @@
public static S7VarRequestParameterItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7VarRequestParameterItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short itemType = readDiscriminatorField("itemType", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItemAddress.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItemAddress.java
index 18cb81b..2acc460 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItemAddress.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7VarRequestParameterItemAddress.java
@@ -59,7 +59,6 @@
throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("S7VarRequestParameterItemAddress");
// Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly
@@ -97,8 +96,6 @@
ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("S7VarRequestParameterItemAddress");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short itemLength = readImplicitField("itemLength", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/State.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/State.java
index 82d8fb4..488cc8d 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/State.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/State.java
@@ -102,7 +102,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("State");
// Simple Field (SIG_8)
@@ -178,8 +177,6 @@
public static State staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("State");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
boolean SIG_8 = readSimpleField("SIG_8", readBoolean(readBuffer));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
index ef70ef5..620086f 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SubItem.java
@@ -64,7 +64,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("SubItem");
// Simple Field (bytesToRead)
@@ -110,8 +109,6 @@
public static SubItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("SubItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short bytesToRead = readSimpleField("bytesToRead", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SyntaxIdType.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SyntaxIdType.java
index 3dd2c85..f0795fe 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SyntaxIdType.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SyntaxIdType.java
@@ -46,7 +46,7 @@
}
}
- private short value;
+ private final short value;
SyntaxIdType(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlDataTreeItem.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlDataTreeItem.java
index de5e20b..e656a46 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlDataTreeItem.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlDataTreeItem.java
@@ -76,7 +76,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("SzlDataTreeItem");
// Simple Field (itemIndex)
@@ -137,8 +136,6 @@
public static SzlDataTreeItem staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("SzlDataTreeItem");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int itemIndex = readSimpleField("itemIndex", readUnsignedInt(readBuffer, 16));
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlId.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlId.java
index 8f46b99..69c2b8d 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlId.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlId.java
@@ -64,7 +64,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("SzlId");
// Simple Field (typeClass)
@@ -122,8 +121,6 @@
public static SzlId staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("SzlId");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
SzlModuleTypeClass typeClass =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlModuleTypeClass.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlModuleTypeClass.java
index 4f93cc8..18ffefb 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlModuleTypeClass.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlModuleTypeClass.java
@@ -37,7 +37,7 @@
}
}
- private byte value;
+ private final byte value;
SzlModuleTypeClass(byte value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
index 36bb532..3659cf9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/SzlSublist.java
@@ -59,7 +59,7 @@
}
}
- private short value;
+ private final short value;
SzlSublist(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java
index 10351a8..10eab0e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TPKTPacket.java
@@ -59,7 +59,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("TPKTPacket");
// Const Field (protocolId)
@@ -130,8 +129,6 @@
public static TPKTPacket staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("TPKTPacket");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short protocolId =
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
index 2552f37..573645a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TimeBase.java
@@ -36,7 +36,7 @@
}
}
- private short value;
+ private final short value;
TimeBase(short value) {
this.value = value;
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
index 4b70936..d99705e 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
+++ b/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/TransportSize.java
@@ -373,18 +373,18 @@
}
}
- private short value;
- private boolean supported_S7_300;
- private boolean supported_LOGO;
- private short code;
- private short sizeInBytes;
- private boolean supported_S7_400;
- private boolean supported_S7_1200;
- private short shortName;
- private boolean supported_S7_1500;
- private DataTransportSize dataTransportSize;
- private String dataProtocolId;
- private TransportSize baseType;
+ private final short value;
+ private final boolean supported_S7_300;
+ private final boolean supported_LOGO;
+ private final short code;
+ private final short sizeInBytes;
+ private final boolean supported_S7_400;
+ private final boolean supported_S7_1200;
+ private final short shortName;
+ private final boolean supported_S7_1500;
+ private final DataTransportSize dataTransportSize;
+ private final String dataProtocolId;
+ private final TransportSize baseType;
TransportSize(
short value,
@@ -431,7 +431,7 @@
}
public static List<TransportSize> enumsForFieldSupported_S7_300(boolean fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSupported_S7_300() == fieldValue) {
_values.add(_val);
@@ -454,7 +454,7 @@
}
public static List<TransportSize> enumsForFieldSupported_LOGO(boolean fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSupported_LOGO() == fieldValue) {
_values.add(_val);
@@ -477,7 +477,7 @@
}
public static List<TransportSize> enumsForFieldCode(short fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getCode() == fieldValue) {
_values.add(_val);
@@ -500,7 +500,7 @@
}
public static List<TransportSize> enumsForFieldSizeInBytes(short fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSizeInBytes() == fieldValue) {
_values.add(_val);
@@ -523,7 +523,7 @@
}
public static List<TransportSize> enumsForFieldSupported_S7_400(boolean fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSupported_S7_400() == fieldValue) {
_values.add(_val);
@@ -546,7 +546,7 @@
}
public static List<TransportSize> enumsForFieldSupported_S7_1200(boolean fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSupported_S7_1200() == fieldValue) {
_values.add(_val);
@@ -569,7 +569,7 @@
}
public static List<TransportSize> enumsForFieldShortName(short fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getShortName() == fieldValue) {
_values.add(_val);
@@ -592,7 +592,7 @@
}
public static List<TransportSize> enumsForFieldSupported_S7_1500(boolean fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getSupported_S7_1500() == fieldValue) {
_values.add(_val);
@@ -615,7 +615,7 @@
}
public static List<TransportSize> enumsForFieldDataTransportSize(DataTransportSize fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getDataTransportSize() == fieldValue) {
_values.add(_val);
@@ -638,7 +638,7 @@
}
public static List<TransportSize> enumsForFieldDataProtocolId(String fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getDataProtocolId().equals(fieldValue)) {
_values.add(_val);
@@ -661,7 +661,7 @@
}
public static List<TransportSize> enumsForFieldBaseType(TransportSize fieldValue) {
- List<TransportSize> _values = new ArrayList();
+ List<TransportSize> _values = new ArrayList<>();
for (TransportSize _val : TransportSize.values()) {
if (_val.getBaseType() == fieldValue) {
_values.add(_val);
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java
index 9ca081a..1010e3e 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7CyclicEvent.java
@@ -23,6 +23,7 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
+import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
@@ -44,6 +45,7 @@
import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse;
import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesPush;
import org.apache.plc4x.java.s7.readwrite.S7PayloadUserDataItemCyclicServicesSubscribeResponse;
+import org.apache.plc4x.java.s7.readwrite.utils.StaticHelper;
/**
*
@@ -73,13 +75,15 @@
public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesPush event) {
this.map = new HashMap();
this.timeStamp = Instant.now();
- this.request = request;
+ this.request = request;
map.put(Fields.TYPE.name(), "CYCEVENT");
map.put(Fields.TIMESTAMP.name(),this.timeStamp);
map.put(Fields.JOBID.name(), jobid);
- map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
- for (int i=0; i<event.getItemsCount(); i++){
- //map.put(Fields.RETURNCODE_.name()+i, event.getItems()[i].getReturnCode().getValue());
+ map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
+ int[] n = new int[1];
+ n[0] = 0;
+ request.getTagNames().forEach(tagname -> {
+ int i = n[0];
map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
byte[] buffer = new byte[event.getItems().get(i).getData().size()];
@@ -88,8 +92,23 @@
buffer[j] = s.byteValue();
j ++;
});
- map.put(Fields.DATA_.name()+i, buffer);
- }
+ map.put(tagname, buffer);
+ n[0]++;
+ });
+
+
+// for (int i=0; i<event.getItemsCount(); i++){
+// //map.put(Fields.RETURNCODE_.name()+i, event.getItems()[i].getReturnCode().getValue());
+// map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+// map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+// byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+// j = 0;
+// event.getItems().get(i).getData().forEach(s->{
+// buffer[j] = s.byteValue();
+// j ++;
+// });
+// map.put(Fields.DATA_.name()+i, buffer);
+// }
}
public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesChangeDrivenPush event) {
@@ -99,8 +118,11 @@
map.put(Fields.TYPE.name(), "CYCEVENT");
map.put(Fields.TIMESTAMP.name(),this.timeStamp);
map.put(Fields.JOBID.name(), jobid);
- map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
- for (int i=0; i<event.getItemsCount(); i++){
+ map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
+ int[] n = new int[1];
+ n[0] = 0;
+ request.getTagNames().forEach(tagname -> {
+ int i = n[0];
map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
byte[] buffer = new byte[event.getItems().get(i).getData().size()];
@@ -109,8 +131,20 @@
buffer[j] = s.byteValue();
j ++;
});
- map.put(Fields.DATA_.name()+i, buffer);
- }
+ map.put(tagname, buffer);
+ n[0]++;
+ });
+// for (int i=0; i<event.getItemsCount(); i++){
+// map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+// map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+// byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+// j = 0;
+// event.getItems().get(i).getData().forEach(s->{
+// buffer[j] = s.byteValue();
+// j ++;
+// });
+// map.put(Fields.DATA_.name()+i, buffer);
+// }
}
public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesSubscribeResponse event) {
@@ -121,7 +155,10 @@
map.put(Fields.TIMESTAMP.name(),this.timeStamp);
map.put(Fields.JOBID.name(), jobid);
map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
- for (int i=0; i<event.getItemsCount(); i++){
+ int[] n = new int[1];
+ n[0] = 0;
+ request.getTagNames().forEach(tagname -> {
+ int i = n[0];
map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
byte[] buffer = new byte[event.getItems().get(i).getData().size()];
@@ -130,8 +167,20 @@
buffer[j] = s.byteValue();
j ++;
});
- map.put(Fields.DATA_.name()+i, buffer);
- }
+ map.put(tagname, buffer);
+ n[0]++;
+ });
+// for (int i=0; i<event.getItemsCount(); i++){
+// map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+// map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+// byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+// j = 0;
+// event.getItems().get(i).getData().forEach(s->{
+// buffer[j] = s.byteValue();
+// j ++;
+// });
+// map.put(Fields.DATA_.name()+i, buffer);
+// }
}
public S7CyclicEvent(PlcSubscriptionRequest request, short jobid, S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse event) {
@@ -142,7 +191,10 @@
map.put(Fields.TIMESTAMP.name(),this.timeStamp);
map.put(Fields.JOBID.name(), jobid);
map.put(Fields.ITEMSCOUNT.name(), event.getItemsCount());
- for (int i=0; i<event.getItemsCount(); i++){
+ int[] n = new int[1];
+ n[0] = 0;
+ request.getTagNames().forEach(tagname -> {
+ int i = n[0];
map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
byte[] buffer = new byte[event.getItems().get(i).getData().size()];
@@ -151,8 +203,20 @@
buffer[j] = s.byteValue();
j ++;
});
- map.put(Fields.DATA_.name()+i, buffer);
- }
+ map.put(tagname, buffer);
+ n[0]++;
+ });
+// for (int i=0; i<event.getItemsCount(); i++){
+// map.put(Fields.RETURNCODE_.name()+i, event.getItems().get(i).getReturnCode().getValue());
+// map.put(Fields.TRANSPORTSIZE_.name()+i, event.getItems().get(i).getTransportSize().getValue());
+// byte[] buffer = new byte[event.getItems().get(i).getData().size()];
+// j = 0;
+// event.getItems().get(i).getData().forEach(s->{
+// buffer[j] = s.byteValue();
+// j ++;
+// });
+// map.put(Fields.DATA_.name()+i, buffer);
+// }
}
@Override
@@ -167,22 +231,22 @@
@Override
public PlcReadRequest getRequest() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcValue getAsPlcValue() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcValue getPlcValue(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public int getNumberOfValues(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@@ -193,54 +257,66 @@
@Override
public Object getObject(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<Object> getAllObjects(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidBoolean(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidBoolean(name, 0);
}
@Override
public boolean isValidBoolean(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ boolean dummy = getBoolean(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Boolean getBoolean(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getBoolean(name, 0);
}
@Override
public Boolean getBoolean(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int pos = index * 1;
+ return byteBuf.getBoolean(pos);
}
@Override
public Collection<Boolean> getAllBooleans(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidByte(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidByte(name, 0);
}
@Override
public boolean isValidByte(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ byte dummy = getByte(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Byte getByte(String name) {
- if (!(map.get(name) instanceof Byte))
- throw new UnsupportedOperationException("Field is not a Byte. Required Byte type.");
- return (byte) map.get(name);
+ return getByte(name, 0);
}
@Override
@@ -248,7 +324,7 @@
if (!(map.get(name) instanceof byte[]))
throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
- int pos = index*Byte.BYTES;
+ int pos = index * Byte.BYTES;
return byteBuf.getByte(pos);
}
@@ -266,18 +342,22 @@
@Override
public boolean isValidShort(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidShort(name, 0);
}
@Override
public boolean isValidShort(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ short dummy = getShort(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Short getShort(String name) {
- if (!(map.get(name) instanceof Short)) return null;
- return (short) map.get(name);
+ return getShort(name, 0);
}
@Override
@@ -285,8 +365,8 @@
if (!(map.get(name) instanceof byte[]))
throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
- int pos = index*Short.BYTES;
- return byteBuf.getShort(index);
+ int pos = index * Short.BYTES;
+ return byteBuf.getShort(pos);
}
@Override
@@ -301,17 +381,22 @@
@Override
public boolean isValidInteger(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidInteger(name, 0);
}
@Override
public boolean isValidInteger(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ int dummy = getInteger(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Integer getInteger(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getInteger(name, 0);
}
@Override
@@ -319,7 +404,7 @@
if (!(map.get(name) instanceof byte[]))
throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
- int pos = index*Integer.BYTES;
+ int pos = index * Integer.BYTES;
return byteBuf.getInt(pos);
}
@@ -335,42 +420,47 @@
@Override
public boolean isValidBigInteger(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidBigInteger(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public BigInteger getBigInteger(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public BigInteger getBigInteger(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<BigInteger> getAllBigIntegers(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidLong(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidLong(name, 0);
}
@Override
public boolean isValidLong(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ long dummy = getLong(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Long getLong(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getLong(name, 0);
}
@Override
@@ -394,17 +484,22 @@
@Override
public boolean isValidFloat(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidFloat(name, 0);
}
@Override
public boolean isValidFloat(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ float dummy = getFloat(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Float getFloat(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getFloat(name, 0);
}
@Override
@@ -428,17 +523,22 @@
@Override
public boolean isValidDouble(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidDouble(name, 0);
}
@Override
public boolean isValidDouble(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ double dummy = getDouble(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public Double getDouble(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getDouble(name, 0);
}
@Override
@@ -462,37 +562,42 @@
@Override
public boolean isValidBigDecimal(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidBigDecimal(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public BigDecimal getBigDecimal(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public BigDecimal getBigDecimal(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<BigDecimal> getAllBigDecimals(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidString(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidString(name, 0);
}
@Override
public boolean isValidString(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ String dummy = getString(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
@@ -505,102 +610,175 @@
@Override
public String getString(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Collection<String> getAllStrings(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public boolean isValidTime(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidTime(name, 0);
}
@Override
public boolean isValidTime(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ LocalTime dummy = getTime(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public LocalTime getTime(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getTime(name, 0);
}
+ /*
+ * In S7, data type TIME occupies one double word.
+ * The value is in milliseconds (ms).
+ */
@Override
public LocalTime getTime(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int pos = index * Integer.BYTES;
+ int value = byteBuf.getInt(pos);
+ Duration dr = StaticHelper.S7TimeToDuration(value);
+ LocalTime time = LocalTime.of((int) dr.toHoursPart(), (int) dr.toMinutesPart(), (int) dr.toSecondsPart(), (int) dr.toNanosPart());
+ return time;
}
@Override
public Collection<LocalTime> getAllTimes(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int nitems = (byteBuf.capacity() / Integer.BYTES);
+
+ List<LocalTime> items = new ArrayList();
+
+ for (int i = 0; i < nitems; i++) {
+ items.add(getTime(name, i));
+ }
+
+ return items;
}
@Override
public boolean isValidDate(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidDate(name, 0);
}
@Override
public boolean isValidDate(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ LocalDate dummy = getDate(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public LocalDate getDate(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getDate(name, 0);
}
@Override
public LocalDate getDate(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int pos = index * Short.BYTES;
+ short value = byteBuf.getShort(pos);
+ LocalDate date = StaticHelper.S7DateToLocalDate(value);
+
+ return date;
}
@Override
public Collection<LocalDate> getAllDates(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int nitems = (byteBuf.capacity() / Short.BYTES);
+
+ List<LocalDate> items = new ArrayList();
+
+ for (int i = 0; i < nitems; i++) {
+ items.add(getDate(name, i));
+ }
+
+ return items;
}
@Override
public boolean isValidDateTime(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return isValidDateTime(name, 0);
}
@Override
public boolean isValidDateTime(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ try {
+ LocalDateTime dummy = getDateTime(name, index);
+ return true;
+ } catch (Exception ex) {
+ return false;
+ }
}
@Override
public LocalDateTime getDateTime(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return getDateTime(name, 0);
}
@Override
public LocalDateTime getDateTime(String name, int index) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int pos = index * Long.BYTES;
+
+ LocalDateTime datetime = StaticHelper.S7DateTimeToLocalDateTime(byteBuf.slice(pos, Long.BYTES));
+
+ return datetime;
}
@Override
public Collection<LocalDateTime> getAllDateTimes(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ if (!(map.get(name) instanceof byte[]))
+ throw new UnsupportedOperationException("Field is not a buffer of bytes. Required byte[] type.");
+ ByteBuf byteBuf = Unpooled.wrappedBuffer((byte[]) map.get(name));
+ int nitems = (byteBuf.capacity() / Long.BYTES);
+
+ List<LocalDateTime> items = new ArrayList();
+
+ for (int i = 0; i < nitems; i++) {
+ items.add(getDateTime(name, i));
+ }
+
+ return items;
}
@Override
public Collection<String> getTagNames() {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcTag getTag(String name) {
- throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public PlcResponseCode getResponseCode(String name) {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ throw new UnsupportedOperationException("Not supported yet.");
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7ModeEvent.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7ModeEvent.java
index aeb1923..d84122a 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7ModeEvent.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/events/S7ModeEvent.java
@@ -56,6 +56,7 @@
map.put(Fields.CURRENT_MODE.name(), parameter.getCurrentMode());
this.timeStamp = Instant.now();
map.put(Fields.TIMESTAMP .name(), this.timeStamp );
+ map.put(Fields.MAP.name(), map);
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
index 8a931a3..89906f6 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
@@ -136,5 +136,7 @@
public S7Tag prepareTag(String tagAddress){
return S7Tag.of(tagAddress);
}
+
+
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
index 039e91b..466f0e8 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
@@ -76,20 +76,20 @@
public String controllerType;
@ConfigurationParameter("read-timeout")
- @IntDefaultValue(8)
- public int readTimeout = 8;
+ @IntDefaultValue(0)
+ public int readTimeout = 0;
@ConfigurationParameter("ping")
@BooleanDefaultValue(false)
public boolean ping = false;
@ConfigurationParameter("ping-time")
- @IntDefaultValue(-1)
- public int pingTime = -1;
+ @IntDefaultValue(0)
+ public int pingTime = 0;
@ConfigurationParameter("retry-time")
- @IntDefaultValue(4)
- public int retryTime = 4;
+ @IntDefaultValue(0)
+ public int retryTime = 0;
public int getLocalRack() {
@@ -213,7 +213,7 @@
}
public int getRetryTime() {
- return pingTime;
+ return retryTime;
}
public void setRetryTime(int retryTime) {
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
index b4ccec1..40e6806 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/context/S7DriverContext.java
@@ -84,7 +84,8 @@
this.readTimeout = configuration.readTimeout;
this.ping = configuration.ping;
- this.pingTime = configuration.pingTime;
+ this.pingTime = (configuration.pingTime == 0)?10:configuration.pingTime;
+ this.retryTime = configuration.retryTime;
}
public boolean isPassiveMode() {
@@ -184,7 +185,7 @@
}
public int getRetryTime() {
- return pingTime;
+ return retryTime;
}
public void setRetryTime(int retryTime) {
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
index d33ca43..0572fb9 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7Optimizer.java
@@ -50,9 +50,9 @@
new S7AddressAny(TransportSize.INT, 1, 1, MemoryArea.DATA_BLOCKS, 1, (byte) 0).getLengthInBytes();
@Override
- protected List<PlcRequest> processReadRequest(PlcReadRequest readRequest, DriverContext driverContext) {
+ protected List<PlcReadRequest> processReadRequest(PlcReadRequest readRequest, DriverContext driverContext) {
S7DriverContext s7DriverContext = (S7DriverContext) driverContext;
- List<PlcRequest> processedRequests = new LinkedList<>();
+ List<PlcReadRequest> processedRequests = new LinkedList<>();
// This calculates the size of the header for the request and response.
int curRequestSize = EMPTY_READ_REQUEST_SIZE;
@@ -116,10 +116,11 @@
return processedRequests;
}
+
@Override
- protected List<PlcRequest> processWriteRequest(PlcWriteRequest writeRequest, DriverContext driverContext) {
+ protected List<PlcWriteRequest> processWriteRequest(PlcWriteRequest writeRequest, DriverContext driverContext) {
S7DriverContext s7DriverContext = (S7DriverContext) driverContext;
- List<PlcRequest> processedRequests = new LinkedList<>();
+ List<PlcWriteRequest> processedRequests = new LinkedList<>();
// This calculates the size of the header for the request and response.
int curRequestSize = EMPTY_WRITE_REQUEST_SIZE;
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java
index f8e91e6..bb700ae 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HGeneratedDriverBase.java
@@ -149,7 +149,7 @@
awaitDiscoverComplete = Boolean.parseBoolean(System.getProperty(PROPERTY_PLC4X_FORCE_AWAIT_DISCOVER_COMPLETE));
}
- return new S7HDefaultNettyPlcConnection(
+ return new S7HPlcConnection(
canRead(), canWrite(), canSubscribe(), canBrowse(),
getTagHandler(),
getValueHandler(),
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java
index a7b68c3..9697d6d 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMux.java
@@ -25,5 +25,6 @@
public void setEmbededhannel(Channel embeded_channel);
public void setPrimaryChannel(Channel primary_channel);
public void setSecondaryChannel(Channel secondary_channel);
+public Channel getTCPChannel();
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java
index 58b9969..b0c02e7 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HMuxImpl.java
@@ -30,8 +30,11 @@
import io.netty.util.AttributeKey;
import java.time.LocalTime;
import java.util.List;
+import java.util.concurrent.TimeUnit;
import org.apache.plc4x.java.spi.events.ConnectEvent;
+import org.apache.plc4x.java.spi.events.ConnectedEvent;
import org.apache.plc4x.java.spi.events.DisconnectEvent;
+import org.apache.plc4x.java.spi.events.DisconnectedEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -61,6 +64,15 @@
final static AttributeKey<Boolean> IS_CONNECTED = AttributeKey.valueOf("IS_CONNECTED");
/*
+ * This attribute indicates to the other handlers that the channel is connected
+ * or disconnected because a switch is being made between TCP channels or
+ * both TCP channels are disconnected.
+ * Default value: false
+ */
+ final static AttributeKey<Boolean> WAS_CONNECTED = AttributeKey.valueOf("WAS_CONNECTED");
+
+
+ /*
* This attribute indicates to the other handlers which channel is being used,
* this allows the request to be properly prepared.
* For example, in the case of a CPU with two CPs, you should change
@@ -118,7 +130,6 @@
*/
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf outbb, List<Object> list) throws Exception {
- //System.out.println("Llego aqui: " + ByteBufUtil.hexDump(outbb));
if ((embed_ctx == null) && (ctx.channel() instanceof EmbeddedChannel)) embed_ctx = ctx;
if ((tcp_channel != null) && (embed_ctx == ctx)){
tcp_channel.writeAndFlush(outbb.copy());
@@ -133,7 +144,7 @@
* the pipeline of the channel "embeded_channel"
*/
@Override
- protected void decode(ChannelHandlerContext ctx, ByteBuf inbb, List<Object> list) throws Exception {
+ protected void decode(ChannelHandlerContext ctx, ByteBuf inbb, List<Object> list) throws Exception {
embed_ctx.fireChannelRead(inbb.copy());
}
@@ -157,28 +168,31 @@
/*
* The events detected here flow from the S7ProtocolLogic object.
- * Upon receiving the "ConnectEvent" event, we must safely add the watchdog
+ * Upon receiving the "ConnectedEvent" event, we must safely add the watchdog
* to the pipeline of the "tcp_channel" connection.
* The supervision time can be defined in the connection URL,
- * the default value being 8 secs, this value being defined experimentally.
+ * the default value being 0 secs disabling this function.
+ * This value being defined experimentally, a typical value is 8 seconds.
*/
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
super.userEventTriggered(ctx, evt);
logger.info(LocalTime.now().toString() + " userEventTriggered: " + ctx.name() + " Event: " + evt);
- if (evt instanceof ConnectEvent) {
+ if (evt instanceof ConnectedEvent) {
try {
tcp_channel.pipeline().remove("watchdog");
} catch (Exception ex){
logger.info(ex.toString());
}
try {
- tcp_channel.pipeline().addFirst("watchdog", new ReadTimeoutHandler(30));
+ if (embeded_channel.attr(READ_TIME_OUT).get() > 0)
+ tcp_channel.pipeline().addFirst("watchdog",
+ new ReadTimeoutHandler(embeded_channel.attr(READ_TIME_OUT).get()));
if (tcp_channel.isActive()) {
- embeded_channel.attr(IS_CONNECTED).set(true);
+ embeded_channel.attr(IS_CONNECTED).set(true);
} else {
embeded_channel.attr(IS_CONNECTED).set(false);
- }
+ }
} catch (Exception ex){
logger.info(ex.toString());
}
@@ -213,47 +227,53 @@
super.channelUnregistered(ctx);
logger.debug(LocalTime.now().toString() + " channelUnregistered: " + ctx.name() );
String strCanal = (tcp_channel == primary_channel)?"PRIMARY":"SECONDARY";
- logger.debug("Unregistered of channel: " + strCanal);
+ logger.info("Unregistered of channel: " + strCanal);
//TODO: If embedded channel is closed, we need close all channels
if (ctx == embed_ctx) return;
- if (tcp_channel == ctx.channel())
- embeded_channel.attr(IS_CONNECTED).set(false);
+ if (tcp_channel == ctx.channel()) {
+ embeded_channel.attr(IS_CONNECTED).set(false);
+ embeded_channel.attr(WAS_CONNECTED).set(true);
+ embeded_channel.pipeline().fireUserEventTriggered(new DisconnectedEvent());
+ }
logger.info(embed_ctx.executor().toString());
if ((tcp_channel == primary_channel) &&
(primary_channel == ctx.channel()))
if ((!primary_channel.isActive()) &&
- (secondary_channel != null)) {
- if (secondary_channel.isActive())
+ (secondary_channel != null))
+ if (secondary_channel.isActive()) {
synchronized(tcp_channel) {
logger.info("Using secondary TCP channel.");
tcp_channel = secondary_channel;
embeded_channel.attr(IS_PRIMARY).set(false);
- embeded_channel.pipeline().fireUserEventTriggered(new ConnectEvent());
+ embeded_channel.pipeline().fireUserEventTriggered(new ConnectEvent());
}
};
-
+
if ((tcp_channel == secondary_channel) &&
(secondary_channel == ctx.channel()))
- if ((!secondary_channel.isActive() &&
- (primary_channel.isActive()))) {
- synchronized(tcp_channel) {
+ if ((!secondary_channel.isActive()) &&
+ (primary_channel != null))
+ if (primary_channel.isActive()) {
+ synchronized(tcp_channel) {
logger.info("Using primary TCP channel.");
tcp_channel = primary_channel;
- embeded_channel.attr(IS_PRIMARY).set(true);
- embeded_channel.pipeline().fireUserEventTriggered(new ConnectEvent());
+ embeded_channel.attr(IS_PRIMARY).set(true);
+ embeded_channel.pipeline().fireUserEventTriggered(new ConnectEvent());
}
- }
+ }
+
}
@Override
public void setEmbededhannel(Channel embeded_channel) {
this.embeded_channel = embeded_channel;
- this.embeded_channel.attr(IS_CONNECTED).set(false);
+ this.embeded_channel.attr(IS_CONNECTED).set(false);
+ this.embeded_channel.attr(WAS_CONNECTED).set(false);
this.embeded_channel.attr(IS_PRIMARY).set(true);
this.embeded_channel.attr(READ_TIME_OUT).set(8);
this.embeded_channel.attr(IS_PING_ACTIVE).set(false);
@@ -261,25 +281,35 @@
this.embeded_channel.attr(RETRY_TIME).set(8);
}
+ @Override
public void setPrimaryChannel(Channel primary_channel) {
if ((this.primary_channel == null) && (tcp_channel == null)){
if (primary_channel != null){
this.primary_channel = primary_channel;
tcp_channel = primary_channel;
- embeded_channel.attr(IS_PRIMARY).set(true);
+ embeded_channel.attr(IS_PRIMARY).set(true);
}
- } else if ((!this.primary_channel.isActive()) && (tcp_channel == secondary_channel)){
+ } else if ((this.primary_channel == null) ||
+ ((tcp_channel == secondary_channel)) && (tcp_channel.isActive())){
+ this.primary_channel = primary_channel;
+
+ } else if ((!this.primary_channel.isActive()) && (tcp_channel == secondary_channel)){
this.primary_channel = primary_channel;
- } else if ((!this.primary_channel.isActive()) && (tcp_channel == this.primary_channel)){
+
+ } else if (((!this.primary_channel.isActive()) && (tcp_channel == this.primary_channel)) ||
+ (primary_channel.isActive())) {
synchronized(tcp_channel) {
tcp_channel.close();
this.primary_channel = primary_channel;
tcp_channel = primary_channel;
- embeded_channel.attr(IS_PRIMARY).set(true);
- if (tcp_channel.isActive()) {
- embed_ctx.fireUserEventTriggered(new ConnectEvent());
+ embeded_channel.attr(IS_PRIMARY).set(true);
+
+ if (tcp_channel.isActive()) {
+ embed_ctx.fireUserEventTriggered(new ConnectEvent());
}
}
+ } else if (primary_channel.isActive()) {
+
}
}
@@ -291,11 +321,16 @@
tcp_channel = secondary_channel;
embeded_channel.attr(IS_PRIMARY).set(false);
}
- } else if ((this.secondary_channel == null) || (tcp_channel == primary_channel)){
+
+ } else if ((this.secondary_channel == null) ||
+ ((tcp_channel == primary_channel)) && (tcp_channel.isActive())){
this.secondary_channel = secondary_channel;
+
} else if ((!this.secondary_channel.isActive()) && (tcp_channel == primary_channel)){
this.secondary_channel = secondary_channel;
- } else if ((!this.secondary_channel.isActive()) && (tcp_channel == this.secondary_channel)){
+
+ } else if (((!this.secondary_channel.isActive()) && (tcp_channel == this.secondary_channel)) ||
+ (secondary_channel.isActive())){
synchronized(tcp_channel) {
tcp_channel.close();
this.secondary_channel = secondary_channel;
@@ -307,6 +342,11 @@
}
}
}
+
+ @Override
+ public Channel getTCPChannel() {
+ return tcp_channel;
+ }
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HDefaultNettyPlcConnection.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java
similarity index 65%
rename from plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HDefaultNettyPlcConnection.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java
index 4ff983d..0e93414 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HDefaultNettyPlcConnection.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7HPlcConnection.java
@@ -20,16 +20,25 @@
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
+import io.netty.channel.EventLoop;
import io.netty.channel.embedded.EmbeddedChannel;
import io.netty.handler.codec.MessageToMessageCodec;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
+import java.util.Timer;
+import java.util.TimerTask;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.apache.plc4x.java.api.authentication.PlcAuthentication;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.listener.ConnectionStateListener;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.value.PlcValueHandler;
@@ -40,24 +49,38 @@
import org.apache.plc4x.java.spi.connection.PlcTagHandler;
import org.apache.plc4x.java.spi.connection.ProtocolStackConfigurer;
import org.apache.plc4x.java.spi.events.CloseConnectionEvent;
+import org.apache.plc4x.java.spi.events.ConnectEvent;
+import org.apache.plc4x.java.spi.events.ConnectedEvent;
import org.apache.plc4x.java.spi.events.DisconnectEvent;
+import org.apache.plc4x.java.spi.events.DisconnectedEvent;
import org.apache.plc4x.java.spi.optimizer.BaseOptimizer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- *
- * @author cgarcia
+ * This object generates the main connection and includes the management
+ * of multiple connections to the PLC, in the case of S7H there
+ * are two connections.
+ * Here the reference to the multiplexer object (S7HMuxImpl) is maintained,
+ * which is in charge of managing the physical TCP connections.
+ *
+ * TODO: It should be able to run in the "channel" executor.
+ * You should be able to remove the "executor".
*/
-public class S7HDefaultNettyPlcConnection extends DefaultNettyPlcConnection implements Runnable{
+public class S7HPlcConnection extends DefaultNettyPlcConnection implements Runnable {
- private static final Logger logger = LoggerFactory.getLogger(S7HDefaultNettyPlcConnection.class);
+ private static final Logger logger = LoggerFactory.getLogger(S7HPlcConnection.class);
private static final String MULTIPLEXOR = "MULTIPLEXOR";
private Boolean closed = false;
private ScheduledFuture scf = null;
-
+ private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new BasicThreadFactory.Builder()
+ .namingPattern("plc4x-s7ha-thread-%d")
+ .daemon(true)
+ .priority(Thread.MAX_PRIORITY)
+ .build());
+
protected final ChannelFactory secondaryChannelFactory;
protected Channel primary_channel = null;
protected Channel secondary_channel = null;
@@ -66,7 +89,7 @@
protected int slice_ping = 0;
protected int slice_retry_time = 0;
- public S7HDefaultNettyPlcConnection(boolean canRead,
+ public S7HPlcConnection(boolean canRead,
boolean canWrite,
boolean canSubscribe,
boolean canBrowse,
@@ -142,11 +165,11 @@
sendChannelDisconectEvent();
throw new PlcConnectionException("Connection is not possible.");
}
-
- scf = channel.eventLoop().scheduleWithFixedDelay(this, 1, 1, TimeUnit.SECONDS);
+
+ scf = executor.scheduleAtFixedRate(this, 1, 1, TimeUnit.SECONDS);
/*
- primary_channel.closeFuture().addListener(future -> {
+ primary_channel.closeFuture().addListener(future -> {/watch?v=TmENMZFUU_0&list=RDlBlx1JffMQ4&index=27
if (!sessionDiscoveredCompleteFuture.isDone()) {
//Do Nothing
try {
@@ -159,7 +182,6 @@
});
*/
-
// Send an event to the pipeline telling the Protocol filters what's going on.
sendChannelCreatedEvent();
@@ -170,6 +192,7 @@
//channel.pipeline().write(new ConnectedEvent());
// Set the connection to "connected"
connected = true;
+ //((EmbeddedChannel) channel).runPendingTasks();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new PlcConnectionException(e);
@@ -208,31 +231,40 @@
channel.pipeline().fireUserEventTriggered(new DisconnectEvent());
closed = true;
}
-
+
+ @Override
+ public boolean isConnected() {
+ return channel.attr(S7HMuxImpl.IS_CONNECTED).get();
+ }
+
public void doPrimaryTcpConnections(){
try {
- primary_channel = channelFactory.createChannel(new LoggingHandler(LogLevel.TRACE) );
+ primary_channel = channelFactory.createChannel(new LoggingHandler(LogLevel.TRACE) );
} catch (Exception ex){
+ primary_channel = null;
logger.info(ex.toString());
}
- if (primary_channel!=null)
- if (primary_channel.isActive())
+ if (primary_channel != null)
+ if (primary_channel.isActive()) {
primary_channel.pipeline().addFirst(MULTIPLEXOR,s7hmux);
- ((S7HMux) s7hmux).setPrimaryChannel(primary_channel);
+ ((S7HMux) s7hmux).setPrimaryChannel(primary_channel);
+ }
}
public void doSecondaryTcpConnections(){
try {
secondary_channel = secondaryChannelFactory.createChannel(new LoggingHandler(LogLevel.TRACE) );
} catch (Exception ex){
+ secondary_channel = null;
logger.info(ex.toString());
}
- if (secondary_channel!=null)
- if (secondary_channel.isActive())
+ if (secondary_channel != null)
+ if (secondary_channel.isActive()) {
secondary_channel.pipeline().addFirst(MULTIPLEXOR,s7hmux);
- ((S7HMux) s7hmux).setSecondaryChannel(secondary_channel);
+ ((S7HMux) s7hmux).setSecondaryChannel(secondary_channel);
+ }
}
/*
@@ -251,51 +283,107 @@
* To avoid creating new tasks associated with the supervision of the
* driver, I execute these tasks in a few slices of time. This allows me
* to keep a simple control of the state machines.
+ * Verifies disconnection of the channel, which notifies the client
+ * that they are listening.
*/
@Override
- public void run() {
- if (slice_retry_time >= channel.attr(S7HMuxImpl.RETRY_TIME).get()) {
- if (primary_channel != null){
- if (!primary_channel.isActive()){
- logger.info("Creating prymary conection.");
- primary_channel.eventLoop().shutdownGracefully();
- doPrimaryTcpConnections();
- }
- } else {
- logger.info("Creating firts prymary conection.");
- doPrimaryTcpConnections();
- }
+ public void run() {
- if (secondary_channel != null){
- if (!secondary_channel.isActive()){
- logger.info("Creating secondary conection.");
- secondary_channel.eventLoop().shutdownGracefully();
- doSecondaryTcpConnections();
- }
- } else {
- if (secondaryChannelFactory != null ) {
- logger.info("Creating firts secondary conection.");
- doSecondaryTcpConnections();
- }
- }
- slice_retry_time = 0;
- };
-
+ /*
+ * Here a driver reconnection is detected. If so, a connection event
+ * is generated, so the user application can generate its requests again.
+ */
+ if ((channel.attr(S7HMuxImpl.WAS_CONNECTED).get()) &&
+ (channel.attr(S7HMuxImpl.IS_CONNECTED).get())) {
+ (channel.attr(S7HMuxImpl.WAS_CONNECTED)).set(false);
+ channel.pipeline().fireUserEventTriggered(new ConnectedEvent());
+ }
+
+ /*
+ * Execute the ping towards the PLC. Its purpose is to keep
+ * the TCP channel active, for very long sampling periods.
+ */
if ((channel.attr(S7HMuxImpl.IS_PING_ACTIVE).get())) {
if (slice_ping >= channel.attr(S7HMuxImpl.PING_TIME).get()) {
ping();
slice_ping = 0;
};
- } else slice_ping = 0;
+ slice_ping++;
+ } else slice_ping = 0;
- slice_retry_time++;
- slice_ping++;
- }
+ /*
+ * Here it is verified if the channels are active. If they are not,
+ * the connection is created again.
+ * For H type systems, at least one of the connections must be active,
+ * and if the other is down, the connection must be lifted.
+ * S7HMuxImpl, includes the switching logic between the TCP links.
+ */
+ if (slice_retry_time >= channel.attr(S7HMuxImpl.RETRY_TIME).get()) {
+
+ if (primary_channel != null){
+ if (!primary_channel.isActive()){
+ logger.info("Creating prymary connection.");
+ primary_channel.eventLoop().shutdownGracefully();
+ doPrimaryTcpConnections();
+ } else if (null == secondary_channel)
+ if ((channel.attr(S7HMuxImpl.WAS_CONNECTED).get()) &&
+ (!channel.attr(S7HMuxImpl.IS_CONNECTED).get())) {
+ logger.info("Reconnecting primary channel.");
+ if (null != ((S7HMux) s7hmux).getTCPChannel()) {
+ ((S7HMux) s7hmux).setPrimaryChannel(primary_channel);
+ }
+ }
+ } else {
+ logger.info("Creating firts prymary connection.");
+ doPrimaryTcpConnections();
+ }
+ if (secondary_channel != null){
+ if (!secondary_channel.isActive()){
+ logger.info("Creating secondary connection.");
+ secondary_channel.eventLoop().shutdownGracefully();
+ doSecondaryTcpConnections();
+ } else if (null == primary_channel)
+ if ((channel.attr(S7HMuxImpl.WAS_CONNECTED).get()) &&
+ (!channel.attr(S7HMuxImpl.IS_CONNECTED).get())) {
+ logger.info("Reconnecting secondary channel.");
+ if (null != ((S7HMux) s7hmux).getTCPChannel()) {
+ ((S7HMux) s7hmux).setSecondaryChannel(secondary_channel);
+ }
+ }
+ } else {
+ if (secondaryChannelFactory != null ) {
+ logger.info("Creating firts secondary connection.");
+ doSecondaryTcpConnections();
+ }
+ }
+ slice_retry_time = 0;
+ };
+
+ if (channel.attr(S7HMuxImpl.RETRY_TIME).get() > 0)
+ slice_retry_time++;
+
+ connected = channel.attr(S7HMuxImpl.IS_CONNECTED).get();
+ logger.trace("*************************************************\r\n"
+ +"INSTAMCIA PRIMARIO : " + ((null == primary_channel)?"NULL":primary_channel.toString()) + "\r\n"
+ +"ACTIVO PRIMARIO : " + ((null == primary_channel)?"NULL":primary_channel.isActive()) + "\r\n"
+ +"INSTAMCIA SECUNDARIO : " + ((null == secondary_channel)?"NULL":secondary_channel.toString()) + "\r\n"
+ +"ACTIVO SECUNDARIO : " + ((null == secondary_channel)?"NULL":secondary_channel.isActive()) + "\r\n"
+ +"CANAL CONECTADO? : " + channel.attr(S7HMuxImpl.IS_CONNECTED).get() + "\r\n"
+ +"CANAL ESTUVO CONECTADO? : " + channel.attr(S7HMuxImpl.WAS_CONNECTED).get() + "\r\n"
+ +"CONTADORES : " + slice_ping + " : " + slice_retry_time + "\r\n"
+ +"*************************************************");
+ }
+
+ /*
+ * PING to PLC.
+ */
@Override
public CompletableFuture<Void> ping() {
if (channel.attr(S7HMuxImpl.IS_CONNECTED).get()) {
- channel.eventLoop().execute(()->{
+
+ //channel.eventLoop().execute(()->{
+ executor.execute(()->{
PlcReadRequest.Builder builder = readRequestBuilder();
builder.addTagAddress("value", "%MX1.0:BOOL");
@@ -303,7 +391,7 @@
try
{
PlcReadResponse readResponse = readRequest.execute().get(2, TimeUnit.SECONDS);
- logger.info("PING: " + readResponse.getResponseCode("value"));
+ logger.debug("PING: " + readResponse.getResponseCode("value"));
} catch (Exception ex){
logger.info("PING: " + ex.toString());
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
index 56835b7..f875d0c 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolEventLogic.java
@@ -28,6 +28,7 @@
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
@@ -57,8 +58,8 @@
private Map<EventType, Map<PlcConsumerRegistration, Consumer>> mapIndex = new HashMap();
private Map<EventType, PlcSubscriptionHandle> eventtypehandles = new HashMap(); ;
- private final Runnable runnProcessor;
- private final Runnable runnDispacher;
+ private final Runnable runProcessor;
+ private final Runnable runDispacher;
private Thread processor;
@@ -66,10 +67,21 @@
public S7ProtocolEventLogic(BlockingQueue eventqueue) {
this.eventqueue = eventqueue;
- runnProcessor = new ObjectProcessor(eventqueue,dispachqueue);
- runnDispacher = new EventDispacher(dispachqueue);
- processor = new Thread(runnProcessor);
- dispacher = new Thread(runnDispacher);
+ runProcessor = new ObjectProcessor(eventqueue,dispachqueue);
+ runDispacher = new EventDispacher(dispachqueue);
+// processor = new Thread(runnProcessor);
+// dispacher = new Thread(runnDispacher);
+ processor = new BasicThreadFactory.Builder()
+ .namingPattern("plc4x-evt-processor-thread-%d")
+ .daemon(true)
+ .priority(Thread.MAX_PRIORITY)
+ .build().newThread(runProcessor);
+
+ dispacher = new BasicThreadFactory.Builder()
+ .namingPattern("plc4x-evt-dispacher-thread-%d")
+ .daemon(true)
+ .priority(Thread.MAX_PRIORITY)
+ .build().newThread(runDispacher);
}
public void start() {
@@ -78,8 +90,8 @@
}
public void stop(){
- ((ObjectProcessor) runnProcessor).doShutdown();
- ((EventDispacher) runnDispacher).doShutdown();
+ ((ObjectProcessor) runProcessor).doShutdown();
+ ((EventDispacher) runDispacher).doShutdown();
}
@Override
@@ -158,7 +170,7 @@
Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex);
}
}
- System.out.println("ObjectProcessor Bye!");
+ logger.info("ObjectProcessor Bye!");
}
public void doShutdown(){
@@ -209,12 +221,19 @@
}
}else if (obj instanceof S7CyclicEvent) {
if (mapIndex.containsKey(EventType.CYC)) {
+
Map<PlcConsumerRegistration, Consumer> mapConsumers = mapIndex.get(EventType.CYC);
if (cycDelayedObject != null) {
mapConsumers.forEach((x,y) -> y.accept(cycDelayedObject));
cycDelayedObject = null;
}
- mapConsumers.forEach((x,y) -> y.accept(obj));
+ mapConsumers.forEach((x,y) -> {
+ S7PlcSubscriptionHandle sh = (S7PlcSubscriptionHandle) x.getSubscriptionHandles().get(0);
+ Short id = Short.parseShort(sh.getEventId());
+ if (((S7CyclicEvent) obj).getMap().get("JOBID") == id)
+ y.accept(obj);
+ });
+
} else {
cycDelayedObject = obj;
}
@@ -224,7 +243,7 @@
Logger.getLogger(S7ProtocolEventLogic.class.getName()).log(Level.SEVERE, null, ex);
}
}
- System.out.println("EventDispacher Bye!");
+ logger.info("EventDispacher Bye!");
}
public void doShutdown(){
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
index 343754c..a27c3ce 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
@@ -23,6 +23,7 @@
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
+import io.netty.channel.embedded.EmbeddedChannel;
import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
@@ -97,7 +98,7 @@
*/
public class S7ProtocolLogic extends Plc4xProtocolBase<TPKTPacket> {
- private final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class);
+ private static final Logger logger = LoggerFactory.getLogger(S7ProtocolLogic.class);
public static final Duration REQUEST_TIMEOUT = Duration.ofMillis(10000);
private final AtomicInteger tpduGenerator = new AtomicInteger(10);
@@ -125,7 +126,7 @@
private final S7PlcSubscriptionHandle sysHandle = new S7PlcSubscriptionHandle(EventType.SYS, EventLogic);
private final S7PlcSubscriptionHandle usrHandle = new S7PlcSubscriptionHandle(EventType.USR, EventLogic);
private final S7PlcSubscriptionHandle almHandle = new S7PlcSubscriptionHandle(EventType.ALM, EventLogic);
- private final S7PlcSubscriptionHandle cycHandle = new S7PlcSubscriptionHandle(EventType.CYC,EventLogic);
+ //private final S7PlcSubscriptionHandle cycHandle = new S7PlcSubscriptionHandle(EventType.CYC, EventLogic);
/*
* For the reconnection functionality by a "TimeOut" of the connection,
@@ -136,6 +137,15 @@
* his request.
*/
private HashMap<Object,MutablePair<RequestTransactionManager.RequestTransaction, Object>> active_requests = new HashMap<>();
+
+ /*
+ * This array stores the cyclic subscription requests between the driver
+ * and the PLC. The purpose is to document the tags associated with the
+ * request. Each subscription uses a 'JobID' that is managed by the PLC and
+ * obtained from the response to the request. In the following,
+ * the values sent PUSH from the PLC to the driver refer to this JobID.
+ */
+ private final Map<Short, PlcSubscriptionRequest> cycrequests = new HashMap<>();
private S7DriverContext s7DriverContext;
@@ -165,9 +175,13 @@
return;
}
+ // If the call is for a reconnection, we must clean up
+ // the queued messages so that they release the transaction handler.
+ cleanFutures();
+
//Set feature for all handlers in the pipeline from
//the driver configuration.
- setChannelFeatures();
+ setChannelFeatures();
// Only the TCP transport supports login.
logger.info("S7 Driver running in ACTIVE mode.");
@@ -217,7 +231,7 @@
// in order to detect the type of PLC.
if (s7DriverContext.getControllerType() != S7ControllerType.ANY) {
// Send an event that connection setup is complete.
- context.fireConnected();
+ context.fireConnected();
return;
}
@@ -373,11 +387,13 @@
S7Message message = (request instanceof S7MessageUserData) ?
new S7MessageUserData(tpduId, request.getParameter(), request.getPayload()) :
new S7MessageRequest(tpduId, request.getParameter(), request.getPayload());
-
+
TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null, message, true, (short) tpduId));
-
+
// Start a new request-transaction (Is ended in the response-handler)
+
RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
+
transaction.submit(() -> context.sendRequest(tpktPacket)
.onTimeout(new TransactionErrorCallback<>(future, transaction))
.onError(new TransactionErrorCallback<>(future, transaction))
@@ -391,7 +407,7 @@
active_requests.remove(future);
future.complete(p);
// Finish the request-transaction.
- transaction.endRequest();
+ transaction.endRequest();
}));
active_requests.put(future, new MutablePair<>(transaction, null));
@@ -489,6 +505,8 @@
CompletableFuture<PlcSubscriptionResponse> response = new CompletableFuture<>();
subscriptionRequest.getTagNames().forEach(fieldname -> futures.put(fieldname, new CompletableFuture<>()));
+ //
+ futures.put("DATA_", new CompletableFuture<>());
DefaultPlcSubscriptionRequest request = (DefaultPlcSubscriptionRequest) subscriptionRequest;
@@ -502,8 +520,10 @@
Thread t1 = new Thread(()->{
- for (String tagName : request.getTagNames()) {
- final DefaultPlcSubscriptionTag sf = (DefaultPlcSubscriptionTag) request.getTag(tagName);
+ //for (String tagName : request.getTagNames()) {
+ //System.out.println("Aqui repite: " + tagName);
+ //final DefaultPlcSubscriptionTag sf = (DefaultPlcSubscriptionTag) request.getTag(tagName);
+ final DefaultPlcSubscriptionTag sf = (DefaultPlcSubscriptionTag) request.getTags().get(0);
final S7SubscriptionTag tag = (S7SubscriptionTag) sf.getTag();
switch (tag.getTagType()) {
@@ -520,69 +540,76 @@
encodeAlarmQueryRequest(request, parameterItems, payloadItems);
break;
case CYCLIC_SUBSCRIPTION:
- encodeCycledS7ANYSubscriptionRequest(request.getTag(tagName), parameterItems, payloadItems);
+ encodeCycledS7ANYSubscriptionRequest(request, parameterItems, payloadItems);
break;
case CYCLIC_DB_SUBSCRIPTION:
- encodeCycledDBREADSubscriptionRequest(request.getTag(tagName), parameterItems, payloadItems);
+ encodeCycledDBREADSubscriptionRequest(request, parameterItems, payloadItems);
break;
case CYCLIC_UNSUBSCRIPTION:
- //encodeCycledUnSubscriptionRequest(request, parameterItems, payloadItems);
+ encodeCycledUnSubscriptionRequest(request, parameterItems, payloadItems);
break;
default:
- }
- //final PlcValue plcValue = request.getPlcValue(tagName);
- //parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
- //payloadItems.add(serializePlcValue(tag, plcValue));
- final int tpduId = tpduGenerator.getAndIncrement();
- // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
- if (tpduGenerator.get() == 0xFFFF) {
- tpduGenerator.set(1);
- }
+ }
+ //} //Next
+
+ //final PlcValue plcValue = request.getPlcValue(tagName);
+ //parameterItems.add(new S7VarRequestParameterItemAddress(encodeS7Address(tag)));
+ //payloadItems.add(serializePlcValue(tag, plcValue));
+ final int tpduId = tpduGenerator.getAndIncrement();
+ // If we've reached the max value for a 16 bit transaction identifier, reset back to 1
+ if (tpduGenerator.get() == 0xFFFF) {
+ tpduGenerator.set(1);
+ }
- TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
- new S7MessageUserData(tpduId,
- new S7ParameterUserData(parameterItems),
- new S7PayloadUserData(payloadItems)),
- true, (short) tpduId));
+ TPKTPacket tpktPacket = new TPKTPacket(new COTPPacketData(null,
+ new S7MessageUserData(tpduId,
+ new S7ParameterUserData(parameterItems),
+ new S7PayloadUserData(payloadItems)),
+ true, (short) tpduId));
- // Start a new request-transaction (Is ended in the response-handler)
- RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
- transaction.submit(() -> context.sendRequest(tpktPacket)
- .onTimeout(new TransactionErrorCallback<>(future, transaction))
- .onError(new TransactionErrorCallback<>(future, transaction))
- .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
- .check(p -> p.getPayload() instanceof COTPPacketData)
- .unwrap(p -> ((COTPPacketData) p.getPayload()))
- .unwrap(COTPPacket::getPayload)
- .check(p -> p.getTpduReference() == tpduId)
- .handle(p -> {
- try {
- //future.complete(decodeEventSubscriptionRequest(tagName, p, subscriptionRequest));
- futures.get(tagName).complete(p);
- } catch (Exception e) {
- logger.warn("Error sending 'write' message: '{}'", e.getMessage(), e);
- }
- // Finish the request-transaction.
- transaction.endRequest();
- }));
+ // Start a new request-transaction (Is ended in the response-handler)
+ RequestTransactionManager.RequestTransaction transaction = tm.startRequest();
+ transaction.submit(() -> context.sendRequest(tpktPacket)
+ .onTimeout(new TransactionErrorCallback<>(future, transaction))
+ .onError(new TransactionErrorCallback<>(future, transaction))
+ .expectResponse(TPKTPacket.class, REQUEST_TIMEOUT)
+ .check(p -> p.getPayload() instanceof COTPPacketData)
+ .unwrap(p -> ((COTPPacketData) p.getPayload()))
+ .unwrap(COTPPacket::getPayload)
+ .check(p -> p.getTpduReference() == tpduId)
+ .handle(p -> {
+ try {
+ //future.complete(decodeEventSubscriptionRequest(tagName, p, subscriptionRequest));
+ futures.get("DATA_").complete(p);
+ } catch (Exception e) {
+ logger.warn("Error sending 'write' message: '{}'", e.getMessage(), e);
+ }
+ // Finish the request-transaction.
+ transaction.endRequest();
+ }));
+
+ try {
+ S7Message responseMessage = futures.get("DATA_").get();
+ S7ParameterUserData parameter = (S7ParameterUserData) responseMessage.getParameter();
+ S7ParameterUserDataItemCPUFunctions msgparameter = (S7ParameterUserDataItemCPUFunctions) parameter.getItems().get(0);
- try {
- valuesResponse.put(tagName, decodeEventSubscriptionRequest(tagName, subscriptionRequest, futures.get(tagName).get()));
- } catch (Exception ex) {
- logger.warn(ex.toString());
- }
+ valuesResponse.put(Integer.toString(msgparameter.getSequenceNumber()),
+ decodeEventSubscriptionRequest(Integer.toString(msgparameter.getSequenceNumber()), subscriptionRequest, futures.get("DATA_").get()));
- } //Next
+ } catch (Exception ex) {
+ logger.warn(ex.toString());
+ }
+
try {
- maintask.get();
+ ///maintask.get();
HashMap<String, ResponseItem<PlcSubscriptionHandle>> values = new HashMap<>();
-
+
valuesResponse.forEach((s,p)->{
if (p != null)
values.putAll(((DefaultPlcSubscriptionResponse)p).getValues());
});
-
+
response.complete(new DefaultPlcSubscriptionResponse(subscriptionRequest, values));
} catch (Exception ex) {
@@ -644,7 +671,7 @@
S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest payload;
- //System.out.println("Subsevent: " + subsevent + " : " + String.format("0x%04X", subsevent));
+
if (subsevent > 0) {
payload = new S7PayloadUserDataItemCpuFunctionMsgSubscriptionRequest(
DataTransportErrorCode.OK,
@@ -876,11 +903,15 @@
S7ParameterUserDataItemCPUFunctions msgparameter = (S7ParameterUserDataItemCPUFunctions)
parameter.getItems().get(0);
+ cycrequests.put(msgparameter.getSequenceNumber(), plcSubscriptionRequest);
+
S7CyclicEvent cycevent = new S7CyclicEvent(plcSubscriptionRequest,
msgparameter.getSequenceNumber(),
(S7PayloadUserDataItemCyclicServicesSubscribeResponse) payloadItems.get(0));
- eventQueue.add(cycevent);
+ eventQueue.add(cycevent);
+
+ S7PlcSubscriptionHandle cycHandle = new S7PlcSubscriptionHandle(strTagName, EventType.CYC, EventLogic);
values.put(strTagName, new ResponseItem(PlcResponseCode.OK, cycHandle));
return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);
@@ -889,11 +920,15 @@
S7ParameterUserDataItemCPUFunctions msgparameter = (S7ParameterUserDataItemCPUFunctions)
parameter.getItems().get(0);
+ cycrequests.put(msgparameter.getSequenceNumber(), plcSubscriptionRequest);
+
S7CyclicEvent cycevent = new S7CyclicEvent(plcSubscriptionRequest,
msgparameter.getSequenceNumber(),
(S7PayloadUserDataItemCyclicServicesChangeDrivenSubscribeResponse) payloadItems.get(0));
- eventQueue.add(cycevent);
+ eventQueue.add(cycevent);
+
+ S7PlcSubscriptionHandle cycHandle = new S7PlcSubscriptionHandle(strTagName, EventType.CYC, EventLogic);
values.put(strTagName, new ResponseItem(PlcResponseCode.OK, cycHandle));
return new DefaultPlcSubscriptionResponse(plcSubscriptionRequest,values);
@@ -1041,7 +1076,7 @@
}
- private void encodeCycledS7ANYSubscriptionRequest(PlcSubscriptionTag plctag,
+ private void encodeCycledS7ANYSubscriptionRequest(DefaultPlcSubscriptionRequest request,
List<S7ParameterUserDataItem> parameterItems,
List<S7PayloadUserDataItem> payloadItems){
S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
@@ -1059,25 +1094,46 @@
parameterItems.add(parameter);
//TODO: Chequear la asignacionde tipo
-
- PlcTag tag = ((DefaultPlcSubscriptionTag) plctag).getTag();
- S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
+
+ //PlcTag tag = ((DefaultPlcSubscriptionTag) plctag).getTag();
+ //S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
//
- List<CycServiceItemType> items = new ArrayList();
+ List<CycServiceItemType> items = new ArrayList();
+
+ request.getTags().forEach(tag -> {
+
+// PlcTag plctag = ((DefaultPlcSubscriptionTag) tag).getTag();
+ S7SubscriptionTag s7tag = (S7SubscriptionTag ) ((DefaultPlcSubscriptionTag) ((PlcSubscriptionTag) tag)).getTag();
+//
+ for (S7Tag userfield:s7tag.getS7Tags()) {
+ items.add(new CycServiceItemAnyType(
+ (short) 0x0a,
+ (short) 0x10, //S7ANY
+ userfield.getDataType(),
+ userfield.getNumberOfElements(),
+ userfield.getBlockNumber(),
+ userfield.getMemoryArea(),
+ (long) (((userfield.getByteOffset() << 3) | (userfield.getBitOffset() & 0x0007)))
+ ));
+ }
+ });
+
+ S7SubscriptionTag s7tag_base = (S7SubscriptionTag) ((DefaultPlcSubscriptionTag) ((PlcSubscriptionTag) request.getTags().get(0))).getTag();
+
//
- int i=0;
- for (S7Tag userfield:s7tag.getS7Tags()) {
- items.add(new CycServiceItemAnyType(
- (short) 0x0a,
- (short) 0x10, //S7ANY
- userfield.getDataType(),
- userfield.getNumberOfElements(),
- userfield.getBlockNumber(),
- userfield.getMemoryArea(),
- (long) (((userfield.getByteOffset() << 3) | (userfield.getBitOffset() & 0x0007)))
- ));
- i++;
- }
+// int i=0;
+// for (S7Tag userfield:s7tag.getS7Tags()) {
+// items.add(new CycServiceItemAnyType(
+// (short) 0x0a,
+// (short) 0x10, //S7ANY
+// userfield.getDataType(),
+// userfield.getNumberOfElements(),
+// userfield.getBlockNumber(),
+// userfield.getMemoryArea(),
+// (long) (((userfield.getByteOffset() << 3) | (userfield.getBitOffset() & 0x0007)))
+// ));
+// i++;
+// }
//
// //Length in bytes
// //4+12*items.legth
@@ -1089,17 +1145,17 @@
DataTransportSize.OCTET_STRING,
lengthInBytes,
items.size(),
- s7tag.getTimeBase(),
- s7tag.getMultiplier(),
+ s7tag_base.getTimeBase(),
+ s7tag_base.getMultiplier(),
items
);
-
+
payloadItems.clear();
payloadItems.add(payload);
}
- private void encodeCycledDBREADSubscriptionRequest(PlcSubscriptionTag plctag,
+ private void encodeCycledDBREADSubscriptionRequest(DefaultPlcSubscriptionRequest request,
List<S7ParameterUserDataItem> parameterItems,
List<S7PayloadUserDataItem> payloadItems){
S7ParameterUserDataItemCPUFunctions parameter = new S7ParameterUserDataItemCPUFunctions(
@@ -1118,6 +1174,8 @@
//TODO: Chequear la asignacionde tipo
+ PlcSubscriptionTag plctag = request.getTags().get(0);
+
PlcTag tag = ((DefaultPlcSubscriptionTag) plctag).getTag();
S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
@@ -1186,25 +1244,25 @@
parameterItems.clear();
parameterItems.add(parameter);
- PlcSubscriptionTag tag = request.getTags().get(0);
- S7SubscriptionTag s7tag = (S7SubscriptionTag) tag;
+ DefaultPlcSubscriptionTag tag = (DefaultPlcSubscriptionTag) request.getTags().get(0);
+ S7SubscriptionTag s7tag = (S7SubscriptionTag) tag.getTag();
//PlcField field = ((DefaultPlcSubscriptionField) plcfield).getPlcField();
//S7SubscriptionField s7field = (S7SubscriptionField) field;
+ payloadItems.clear();
//TODO:Check CPU type
- S7PayloadUserDataItemCyclicServicesUnsubscribeRequest payload =
- new S7PayloadUserDataItemCyclicServicesUnsubscribeRequest (
- DataTransportErrorCode.OK,
- DataTransportSize.OCTET_STRING,
- 0x02,
- (short) 0x05,
- s7tag.getAckAlarms().get(0).byteValue()
- );
-
- payloadItems.clear();
- payloadItems.add(payload);
+ s7tag.getAckAlarms().forEach(jobid -> {
+ S7PayloadUserDataItemCyclicServicesUnsubscribeRequest payload =
+ new S7PayloadUserDataItemCyclicServicesUnsubscribeRequest (
+ DataTransportErrorCode.OK,
+ DataTransportSize.OCTET_STRING,
+ 0x02,
+ (short) 0x05,
+ jobid.byteValue());
+ payloadItems.add(payload);
+ });
}
/**
@@ -1252,12 +1310,12 @@
((S7ParameterUserData) parameter).getItems().get(0);
S7PayloadUserData payload = (S7PayloadUserData) s7msg.getPayload();
-
+
S7PayloadUserDataItemCyclicServicesPush payloaditem =
(S7PayloadUserDataItemCyclicServicesPush)
payload.getItems().get(0);
- S7CyclicEvent cycevent = new S7CyclicEvent(null,
+ S7CyclicEvent cycevent = new S7CyclicEvent(cycrequests.get(parameteritem.getSequenceNumber()),
parameteritem.getSequenceNumber(),
payloaditem);
eventQueue.add(cycevent);
@@ -1740,7 +1798,12 @@
s7Tag.getMemoryArea(), s7Tag.getByteOffset(), s7Tag.getBitOffset());
}
-
+ /*
+ * In the case of a reconnection, there may be requests waiting,
+ * for which the operation must be terminated by exception and canceled
+ * in the transaction manager. If this does not happen,
+ * the driver operation can be frozen.
+ */
private void cleanFutures(){
//TODO: Debe ser ejecutado si la conexion esta levanta.
active_requests.forEach((f,p)->{
@@ -1758,8 +1821,7 @@
logger.info(ex.toString());
}
});
- active_requests.clear();
-
+ active_requests.clear();
}
private boolean isConnected(){
@@ -1777,7 +1839,7 @@
context.getChannel().attr(S7HMuxImpl.READ_TIME_OUT).set(s7DriverContext.getReadTimeout());
context.getChannel().attr(S7HMuxImpl.IS_PING_ACTIVE).set(s7DriverContext.getPing());
context.getChannel().attr(S7HMuxImpl.PING_TIME).set(s7DriverContext.getPingTime());
- context.getChannel().attr(S7HMuxImpl.RETRY_TIME).set(s7DriverContext.getRetryTime());
+ context.getChannel().attr(S7HMuxImpl.RETRY_TIME).set(s7DriverContext.getRetryTime());
}
@@ -1896,13 +1958,21 @@
@Override
public void accept(TimeoutException e) {
- transaction.endRequest();
+ try {
+ transaction.endRequest();
+ } catch (Exception ex) {
+ logger.info(ex.getMessage());
+ }
future.completeExceptionally(e);
}
@Override
public void accept(TPKTPacket tpktPacket, E e) {
- transaction.endRequest();
+ try {
+ transaction.endRequest();
+ } catch (Exception ex) {
+ logger.info(ex.getMessage());
+ }
future.completeExceptionally(e);
}
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcSubscriptionHandle.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcSubscriptionHandle.java
index dc5d7aa..d1fab5d 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcSubscriptionHandle.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7PlcSubscriptionHandle.java
@@ -25,14 +25,26 @@
public class S7PlcSubscriptionHandle extends DefaultPlcSubscriptionHandle {
private EventType eventtype;
+ private final String id;
public S7PlcSubscriptionHandle(EventType eventtype, PlcSubscriber plcSubscriber) {
super(plcSubscriber);
this.eventtype = eventtype;
+ this.id = null;
}
+ public S7PlcSubscriptionHandle(String id, EventType eventtype, PlcSubscriber plcSubscriber) {
+ super(plcSubscriber);
+ this.eventtype = eventtype;
+ this.id = id;
+ }
+
public EventType getEventType() {
return eventtype;
}
+ public String getEventId() {
+ return id;
+ }
+
}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
index 10917dd..aa294fd 100644
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
+++ b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/StaticHelper.java
@@ -2138,7 +2138,8 @@
public static int RightShift3(final ReadBuffer buffer, DataTransportSize tsize) throws ParseException {
int value = 0;
- if (tsize == DataTransportSize.OCTET_STRING){
+ if ((tsize == DataTransportSize.OCTET_STRING) ||
+ (tsize == DataTransportSize.REAL)) {
value = buffer.readUnsignedInt(16);
} else {
value = buffer.readUnsignedInt(16) >> 3;
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java
index efd9b52..58333b6 100644
--- a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/CycSubscription.java
@@ -19,109 +19,210 @@
package org.apache.plc4x.examples.plc4j.s7event;
import java.util.Map;
+import java.util.Scanner;
+import java.util.concurrent.TimeUnit;
import org.apache.plc4x.java.DefaultPlcDriverManager;
-import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
-import org.apache.plc4x.java.s7.events.S7AlarmEvent;
import org.apache.plc4x.java.s7.events.S7CyclicEvent;
-import org.apache.plc4x.java.s7.events.S7ModeEvent;
-import org.apache.plc4x.java.s7.events.S7SysEvent;
-import org.apache.plc4x.java.s7.events.S7UserEvent;
-import org.apache.plc4x.java.s7.readwrite.protocol.S7ProtocolLogic;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.simple.SimpleLogger;
import org.apache.commons.codec.binary.Hex;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.listener.ConnectionStateListener;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
+import org.apache.plc4x.java.s7.readwrite.protocol.S7HPlcConnection;
/**
* Example for capturing events generated from a Siemens S7-300, S7-400 or VIPA PLC.
- * Support for mode events ("MODE"), system events ("SYS"), user events ("USR")
- * and alarms ("ALM").
+ * Support for cyclical (CYC) subscriptions.
* Each consumer shows the tags and associated values of the "map" containing
* the event parameters.
*/
-public class CycSubscription {
+public class CycSubscription implements ConnectionStateListener { //01
- private static final Logger logger = LoggerFactory.getLogger(CycSubscription.class);
+ private static final Logger logger = LoggerFactory.getLogger(CycSubscription.class);
+ private S7HPlcConnection connection = null;
+ private PlcSubscriptionRequest.Builder subs_request_builder;
+ private PlcSubscriptionRequest subs_request;
+
+ private PlcSubscriptionResponse subs_response;
+
+ private PlcConsumerRegistration csmr;
+
+ private String jobId;
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws Exception {
- System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "trace");
-
- try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://10.10.1.33?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
- final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
+ System.setProperty(SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "debug");
- //subscription.addEventTagAddress("myCYC", "CYC(B01SEC:5):%DB9002.DBB0[1]");
- subscription.addEventTagAddress("myCYC", "CYC(B01SEC:5):%MB190:BYTE");
+ try {
+ CycSubscription cyc = new CycSubscription();
- final PlcSubscriptionRequest sub = subscription.build();
- final PlcSubscriptionResponse subresponse = sub.execute().get();
-
- //Si todo va bien con la subscripción puedo
-// subresponse
-// .getSubscriptionHandle("myMODE")
-// .register(msg -> {
-// System.out.println("******** S7ModeEvent ********");
-// Map<String, Object> map = ((S7ModeEvent) msg).getMap();
-// map.forEach((x, y) -> {
-// System.out.println(x + " : " + y);
-// });
-// System.out.println("****************************");
-// });
-//
-// subresponse
-// .getSubscriptionHandle("mySYS")
-// .register(msg -> {
-// System.out.println("******** S7SysEvent ********");
-// Map<String, Object> map = ((S7SysEvent) msg).getMap();
-// map.forEach((x, y) -> {
-// if ("INFO1".equals(x)) {
-// System.out.println(x + " : " + String.format("0x%04X", y));
-// } else if ("INFO2".equals(x)) {
-// System.out.println(x + " : " + String.format("0x%08X", y));
-// } else System.out.println(x + " : " + y);
-// });
-// System.out.println("****************************");
-// });
-//
-// subresponse
-// .getSubscriptionHandle("myUSR")
-// .register(msg -> {
-// System.out.println("******** S7UserEvent *******");
-// Map<String, Object> map = ((S7UserEvent) msg).getMap();
-// map.forEach((x, y) -> {
-// System.out.println(x + " : " + y);
-// });
-// System.out.println("****************************");
-// });
-
- subresponse
- .getSubscriptionHandle("myCYC")
- .register(msg -> {
- System.out.println("******** CYC Event *********");
- Map<String, Object> map = ((S7CyclicEvent) msg).getMap();
- map.forEach((x, y) -> {
- if (x.startsWith("DATA_", 0)) {
- System.out.println("Longitud de datos: " + ((byte[]) y).length);
- System.out.println(x + ": " + Hex.encodeHexString((byte[]) y));
- } else
- System.out.println(x + " : " + y);
- });
- System.out.println("****************************");
- });
-
- System.out.println("Waiting for events");
-
- Thread.sleep(10000);
-
- System.out.println("Bye...");
-
+ cyc.OpenConnection();
+ cyc.RegisterPlcTags();
+ cyc.GetConnections();
+ cyc.RegisterCYCHandles();
+
+ System.out.println("Waiting for events...");
+ Scanner scanner = new Scanner(System.in);
+ System.out.println(scanner.nextLine());
+
+ cyc.UnRegisterCYCHandles();
+ cyc.CloseConnection();
+
+ scanner.close();
+
+ } catch (Exception ex) {
+
}
}
+ /*
+ * Open the connection to the controller.
+ * This connection specifies the monitoring parameters of the connection.
+ * read-timeout = 8 ; Maximum wait time to see input data over the
+ * ; TCP channel (sec.).
+ * ping = true ; Enable the PING function. (boolean)
+ * ping-time = 4 ; Run the PING every N seconds.
+ * retry-time = 5 ; Number of seconds to wait for connection monitoring.
+ * ; Default value zero (0) disables it.
+ */
+ public void OpenConnection() {
+ try {
+ connection = (S7HPlcConnection) new DefaultPlcDriverManager().
+ getConnection("s7://10.10.1.33/10.10.1.34?remote-rack=0&remote-slot=3&remote-rack2=0&remote-slot=4&controller-type=S7_400&read-timeout=8&ping=true&ping-time=4&retry-time=5");
+ connection.addEventListener(this);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /*
+ *
+ */
+ public void RegisterPlcTags(){
+ subs_request_builder = connection.subscriptionRequestBuilder();
+
+ subs_request_builder.addEventTagAddress("myCYC01", "CYC(B1SEC:2):%DB2.DBD2:REAL");
+ subs_request_builder.addEventTagAddress("myCYC02", "CYC(B1SEC:2):%DB2.DBB3:BYTE");
+ subs_request_builder.addEventTagAddress("myCYC03", "CYC(B1SEC:2):%MB190:BYTE");
+
+ subs_request = subs_request_builder.build();
+ }
+
+ /*
+ * Create the subscription Tags, only the first Tag is taken into account
+ * to define the request time.
+ * Here the jobId is also captured, which is a value sent from the PLC.
+ * At the moment it is received instead of the Tagname assigned in
+ * the subscription.
+ */
+ public void GetConnections(){
+ try {
+ subs_response = subs_request.execute().get();
+ jobId = (String) subs_response.getTagNames().toArray()[0];
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /*
+ * Closes the connection to the PLC.
+ */
+ public void CloseConnection() {
+ try {
+ connection.close();
+ } catch (PlcConnectionException ex) {
+ ex.printStackTrace();
+ }
+ }
+
+ /*
+ * Here I register my event consumer with the associated jobId.
+ */
+ public void RegisterCYCHandles() {
+ System.out.println("JOBID: " + jobId);
+ csmr = subs_response
+ .getSubscriptionHandle(jobId)
+ .register( msg -> {
+ final S7CyclicEvent cycMsg = (S7CyclicEvent) msg;
+ System.out.println("******** <CYC Event 02> *********");
+ Map<String, Object> map = cycMsg.getMap();
+ map.keySet().forEach(key -> {System.out.println("Field available: " + key);});
+ byte[] data01 = (byte[]) map.get("myCYC01");
+ byte[] data02 = (byte[]) map.get("myCYC02");
+ System.out.println("myCYC01" + ": " + Hex.encodeHexString(data01));
+ System.out.println("myCYC02" + ": " + Hex.encodeHexString(data02));
+ System.out.println("myCYC01" + ": " + cycMsg.getFloat("myCYC01"));
+ System.out.println("myCYC02" + ": " + cycMsg.getByte("myCYC02"));
+ System.out.println("myCYC03" + ": " + cycMsg.getByte("myCYC03"));
+ System.out.println("****************************");
+ });
+ }
+
+ /*
+ * Secure unregistration process for event consumption.
+ * 1. Unsubscribe from the event dispatcher.
+ * 2. Cancels the subscription to the PLC, with the associated jobId.
+ */
+ public void UnRegisterCYCHandles() {
+
+ csmr.unregister();
+
+ PlcSubscriptionResponse subresponse03 = null;
+
+ final PlcSubscriptionRequest.Builder subscription03 = connection.subscriptionRequestBuilder();
+ subscription03.addEventTagAddress("CANCELTAG", "CANCEL:" + jobId);
+
+ final PlcSubscriptionRequest sub03 = subscription03.build();
+
+ try {
+ subresponse03 = sub03.execute().get(500, TimeUnit.MILLISECONDS);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+
+ System.out.println("UnRegisterCYCHandles: " + subresponse03.getResponseCode(jobId));
+
+ }
+
+ /*
+ * For the S7H driver, up to three connections are foreseen,
+ * two real TCP and one virtual or embedded.
+ * The connection of interest is the embedded one.
+ * It is the one that we must monitor until the internal
+ * machine changes its state to connected.
+ */
+ @Override
+ public void connected() {
+ System.out.println("Some connection return!");
+ if (connection.isConnected()) {
+ System.out.println("Reconnecting return!");
+ System.out.println("PASO 1!");
+ RegisterPlcTags();
+ System.out.println("PASO 2!");
+ GetConnections();
+ System.out.println("PASO 3!");
+ RegisterCYCHandles();
+ System.out.println("Salio de aqui!!!!.");
+ }
+ }
+
+ /*
+ * For the disconnection event we must unregister the event consumer.
+ * For asynchronous events, subscriptions must be restarted.
+ */
+ @Override
+ public void disconnected() {
+ System.out.println("Trouble, trouble, we're offline! Status: " + connection.isConnected());
+ csmr.unregister();
+ }
+
+
}
diff --git a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
index a6a111b..d21c38d 100644
--- a/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
+++ b/plc4j/examples/plc4j-s7event/src/main/java/org/apache/plc4x/examples/plc4j/s7event/EventSubscription.java
@@ -53,25 +53,25 @@
try (PlcConnection connection = new DefaultPlcDriverManager().getConnection("s7://10.10.1.33?remote-rack=0&remote-slot=3&controller-type=S7_400")) {
final PlcSubscriptionRequest.Builder subscription = connection.subscriptionRequestBuilder();
-// subscription.addEventTagAddress("myMODE", "MODE");
+ subscription.addEventTagAddress("myMODE", "MODE");
// subscription.addEventTagAddress("mySYS", "SYS");
- subscription.addEventTagAddress("myUSR", "USR");
+// subscription.addEventTagAddress("myUSR", "USR");
// subscription.addEventTagAddress("myALM", "ALM");
final PlcSubscriptionRequest sub = subscription.build();
final PlcSubscriptionResponse subresponse = sub.execute().get();
//Si todo va bien con la subscripción puedo
-// subresponse
-// .getSubscriptionHandle("myMODE")
-// .register(msg -> {
-// System.out.println("******** S7ModeEvent ********");
-// Map<String, Object> map = ((S7ModeEvent) msg).getMap();
-// map.forEach((x, y) -> {
-// System.out.println(x + " : " + y);
-// });
-// System.out.println("****************************");
-// });
+ subresponse
+ .getSubscriptionHandle("myMODE")
+ .register(msg -> {
+ System.out.println("******** S7ModeEvent ********");
+ Map<String, Object> map = ((S7ModeEvent) msg).getMap();
+ map.forEach((x, y) -> {
+ System.out.println(x + " : " + y);
+ });
+ System.out.println("****************************");
+ });
//
// subresponse
// .getSubscriptionHandle("mySYS")
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-metadata/src/main/java/org/apache/plc4x/hop/metadata/util/Plc4xLookup.java b/plc4j/integrations/apache-hop/plc4x-hop-metadata/src/main/java/org/apache/plc4x/hop/metadata/util/Plc4xLookup.java
index fac064e..6289b44 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-metadata/src/main/java/org/apache/plc4x/hop/metadata/util/Plc4xLookup.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-metadata/src/main/java/org/apache/plc4x/hop/metadata/util/Plc4xLookup.java
@@ -35,7 +35,7 @@
*/
public class Plc4xLookup extends AbstractLookup {
private InstanceContent content = null;
- private static Plc4xLookup def = new Plc4xLookup ();
+ private static Plc4xLookup INSTANCE = new Plc4xLookup ();
public Plc4xLookup(InstanceContent content) {
super(content);
@@ -61,7 +61,7 @@
}
public static Plc4xLookup getDefault(){
- return def;
+ return INSTANCE;
}
private static final Convertor<Plc4xWrapperConnection , Plc4xWrapperConnection> Plc4xConvertor =
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/pom.xml b/plc4j/integrations/apache-hop/plc4x-hop-transformer/pom.xml
index 1091369..036b24d 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/pom.xml
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/pom.xml
@@ -160,5 +160,10 @@
<artifactId>org-openide-util-lookup</artifactId>
<version>RELEASE170</version>
</dependency>
+ <dependency>
+ <groupId>commons-codec</groupId>
+ <artifactId>commons-codec</artifactId>
+ <version>1.15</version>
+ </dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xevent/Plc4xEvent.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xevent/Plc4xEvent.java
index 099dc1d..a4d7a8d 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xevent/Plc4xEvent.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xevent/Plc4xEvent.java
@@ -14,20 +14,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.plc4x.hop.transforms.plc4xevent;
-import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import org.apache.hop.core.CheckResult;
import org.apache.hop.core.Const;
import org.apache.hop.core.ICheckResult;
@@ -43,68 +37,63 @@
import org.apache.hop.core.util.StringUtil;
import org.apache.hop.i18n.BaseMessages;
import org.apache.hop.metadata.api.IHopMetadataProvider;
+import org.apache.hop.pipeline.IExecutionStoppedListener;
import org.apache.hop.pipeline.Pipeline;
import org.apache.hop.pipeline.PipelineMeta;
+import org.apache.hop.pipeline.engine.IPipelineEngine;
import org.apache.hop.pipeline.transform.BaseTransform;
-import org.apache.hop.pipeline.transform.ITransform;
import org.apache.hop.pipeline.transform.TransformMeta;
import org.apache.plc4x.hop.metadata.Plc4xConnection;
import org.apache.plc4x.hop.metadata.util.Plc4xLookup;
-import org.apache.plc4x.hop.transforms.util.Plc4xGeneratorField;
import org.apache.plc4x.hop.metadata.util.Plc4xWrapperConnection;
-import org.apache.plc4x.hop.transforms.plc4xinput.Plc4xRead;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.listener.ConnectionStateListener;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.s7.events.S7AlarmEvent;
import org.apache.plc4x.java.s7.events.S7Event;
import org.apache.plc4x.java.s7.events.S7ModeEvent;
-import org.apache.plc4x.java.s7.events.S7ModeEvent.Fields;
import org.apache.plc4x.java.s7.events.S7SysEvent;
import org.apache.plc4x.java.s7.events.S7UserEvent;
-import org.apache.plc4x.java.s7.readwrite.ModeTransitionType;
import org.openide.util.Lookup;
/**
- * This transform receives an event from the S7 driver, of type MODE, SYS,
- * USR or ALM. Only one type can be processed at a time.
+ * This transform receives an event from the S7 driver, of type MODE, SYS, USR
+ * or ALM. Only one type can be processed at a time.
*
*/
-public class Plc4xEvent extends BaseTransform<Plc4xEventMeta, Plc4xEventData> {
+public class Plc4xEvent extends BaseTransform<Plc4xEventMeta, Plc4xEventData> implements ConnectionStateListener {
public static String FIELD_MODE_EVENT = "MODE";
public static String FIELD_USER_EVENT = "USR";
public static String FIELD_SYS_EVENT = "SYS";
public static String FIELD_ALARM_EVENT = "ALM";
-
private static final Class<?> PKG = Plc4xEvent.class; // Needed by Translator
- private Plc4xConnection connmeta = null;
- private Plc4xWrapperConnection connwrapper = null;
- private PlcReadRequest readRequest = null;
- private PlcConsumerRegistration registerMode = null;
- private PlcConsumerRegistration registerUser = null;
- private PlcConsumerRegistration registerSys = null;
- private PlcConsumerRegistration registerAlarm = null;
- private PlcSubscriptionRequest subsbuild = null;
- private PlcSubscriptionResponse subresponse = null;
+ private Plc4xConnection connmeta = null;
+ private Plc4xWrapperConnection connwrapper = null;
+ private PlcConsumerRegistration registerMode = null;
+ private PlcConsumerRegistration registerUser = null;
+ private PlcConsumerRegistration registerSys = null;
+ private PlcConsumerRegistration registerAlarm = null;
+ private PlcSubscriptionRequest subsRequest = null;
+ private PlcSubscriptionResponse subresponse = null;
private List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
private Plc4xLookup lookup = Plc4xLookup.getDefault();
private Lookup.Template template = null;
- private Lookup.Result<Plc4xWrapperConnection> result = null;
+ private Lookup.Result<Plc4xWrapperConnection> result = null;
/*
* The transfer of events is done from the driver tasks. A delay can be added
* for the execution of this transformer.
- */
+ */
private ObjectMapper mapper = new ObjectMapper();
private ConcurrentLinkedQueue<S7Event> events = new ConcurrentLinkedQueue();
private boolean stopBundle = false;
@@ -115,8 +104,8 @@
private static final String dummy = "dummy";
public Plc4xEvent(TransformMeta transformMeta, Plc4xEventMeta meta, Plc4xEventData data, int copyNr, PipelineMeta pipelineMeta,
- Pipeline pipeline ) {
- super( transformMeta, meta, data, copyNr, pipelineMeta, pipeline );
+ Pipeline pipeline) {
+ super(transformMeta, meta, data, copyNr, pipelineMeta, pipeline);
}
/*
@@ -125,11 +114,11 @@
* @param meta Meta data from user dialog
* @param remarks Error registers
* @param origin transform instance name
- */
- public static final RowMetaAndData buildRow(Plc4xEventMeta meta,
- List<ICheckResult> remarks,
- String origin) throws HopPluginException {
-
+ */
+ public static final RowMetaAndData buildRow(Plc4xEventMeta meta,
+ List<ICheckResult> remarks,
+ String origin) throws HopPluginException {
+
IRowMeta rowMeta = new RowMeta();
Object[] rowData = RowDataUtil.allocateRowData(2);
int index = 0;
@@ -137,35 +126,35 @@
ArrayList<String> fields = new ArrayList<String>();
if (meta.isModeEvent()) {
- for (S7ModeEvent.Fields field:S7ModeEvent.Fields.values()) {
+ for (S7ModeEvent.Fields field : S7ModeEvent.Fields.values()) {
fields.add(field.name());
}
} else if (meta.isSysEvent()) {
- for (S7SysEvent.Fields field:S7SysEvent.Fields.values()) {
+ for (S7SysEvent.Fields field : S7SysEvent.Fields.values()) {
fields.add(field.name());
- }
+ }
} else if (meta.isUserEvent()) {
- for (S7UserEvent.Fields field:S7UserEvent.Fields.values()) {
+ for (S7UserEvent.Fields field : S7UserEvent.Fields.values()) {
fields.add(field.name());
- }
+ }
} else if (meta.isAlarmEvent()) {
- fields.add("ALARM");
+ fields.add("ALARM");
}
for (String field : fields) {
- IValueMeta valueMeta =
- ValueMetaFactory.createValueMeta(field, IValueMeta.TYPE_STRING); // build a
- rowData[index] = StringUtil.EMPTY_STRING;
+ IValueMeta valueMeta
+ = ValueMetaFactory.createValueMeta(field, IValueMeta.TYPE_STRING); // build a
+ rowData[index] = StringUtil.EMPTY_STRING;
// Now add value to the row!
// This is in fact a copy from the fields row, but now with data.
rowMeta.addValueMeta(valueMeta);
- index++;
+ index++;
}
return new RowMetaAndData(rowMeta, rowData);
- }
-
- /*
+ }
+
+ /*
* 1. Block the other instances by means of a lock.
* 2. Try to locate an existing connection.
* 3. If it doesn't exist, it tries to take control of the routine to
@@ -174,196 +163,103 @@
* 5. If the connection to the PLC is made, then it creates the query
* and executes it.
*
- */
- @Override
- public boolean processRow() throws HopException {
- Object[] r = getRow(); // Get row from input rowset & set row busy!
- setLogLevel(LogLevel.DEBUG);
-
- if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
-
- lock.lock(); //(01)
- try {
- IHopMetadataProvider metaprovider = getMetadataProvider();
- connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- connwrapper = (Plc4xWrapperConnection) getPipeline().getExtensionDataMap().get(meta.getConnection()); //(02)
- if (connwrapper != null) connwrapper.retain();
- };
+ */
+ @Override
+ public boolean processRow() throws HopException {
+ Object[] r = getRow(); // Get row from input rowset & set row busy!
+ setLogLevel(LogLevel.DEBUG);
- if (connmeta == null){
- logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
+ setOutputDone(); // signal end to receiver(s)
+ return false;
}
- if ((connmeta != null) && (connwrapper == null)){
- readRequest = null;
- try{
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
- if (conn.isConnected()) {
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
- getPipeline().getExtensionDataMap().put(meta.getConnection(), connwrapper); //(04)
+ // If we do not have the jobId, it is because we have not completed
+ // the CYC subscription.
+ if (null == subsRequest) {
+ RegisterPlcTags();
+ GetSubscriptions();
+ RegisterEventHandler();
+ }
+
+ if (!events.isEmpty()) {
+ S7Event s7event = events.poll();
+ index = 0;
+ r = data.outputRowMeta.cloneRow(data.outputRowData);
+ for (String name : data.outputRowMeta.getFieldNames()) {
+ if (null != s7event.getMap().get(name)) {
+ if ("MAP".equals(name)) {
+ try {
+ r[index++] = mapper.writer()
+ .writeValueAsString(s7event.getMap());
+ } catch (Exception ex) {
+ logError(ex.getMessage());
+ }
+ } else {
+ r[index++] = s7event.getMap().get(name).toString();
+ };
+ } else {
+ try {
+ // r[index++] = mapper.writer()
+ // .writeValueAsString(s7event.getMap());
+ r[index++] = null;
+ } catch (Exception ex) {
+ logError(ex.getMessage());
+ }
}
- } catch (Exception ex){
- setErrors(1L);
- logError("Unable to create connection to PLC. " + ex.getMessage());
}
+
+ data.prevDate = data.rowDate;
+ data.rowDate = new Date();
+
+ putRow(data.outputRowMeta, r); // return your data
+ data.rowsWritten++;
}
- } finally {
- lock.unlock();
+
+ if (isStopped()) {
+ setStopped(true);
+ return false;
+ }
+
+ return true;
}
-
- if ((connmeta != null) && (connwrapper != null)){
- if (connwrapper.getConnection().isConnected()){
- if (readRequest == null){
- final PlcSubscriptionRequest.Builder subscription = connwrapper.getConnection().subscriptionRequestBuilder(); //(05)
- if (meta.isModeEvent()) subscription.addEventTagAddress(FIELD_MODE_EVENT, FIELD_MODE_EVENT);
- if (meta.isUserEvent()) subscription.addEventTagAddress(FIELD_USER_EVENT, FIELD_USER_EVENT);
- if (meta.isSysEvent()) subscription.addEventTagAddress(FIELD_SYS_EVENT, FIELD_SYS_EVENT);
- if (meta.isAlarmEvent()) subscription.addEventTagAddress(FIELD_ALARM_EVENT, FIELD_ALARM_EVENT);
-
- subsbuild = subscription.build();
-
- }
- try {
- subresponse = subsbuild.execute().get();
-
- if (meta.isModeEvent() && subresponse.getResponseCode(FIELD_MODE_EVENT) == PlcResponseCode.OK) {
- registerMode =
- subresponse
- .getSubscriptionHandle(FIELD_MODE_EVENT)
- .register(msg -> {
- events.add((S7Event) msg);
- });
- }
-
- if (meta.isUserEvent() && subresponse.getResponseCode(FIELD_USER_EVENT) == PlcResponseCode.OK) {
- registerUser =
- subresponse
- .getSubscriptionHandle(FIELD_USER_EVENT)
- .register(msg -> {
- events.add((S7Event) msg);
- });
- }
-
- if (meta.isSysEvent() && subresponse.getResponseCode(FIELD_SYS_EVENT) == PlcResponseCode.OK) {
- registerSys =
- subresponse
- .getSubscriptionHandle(FIELD_SYS_EVENT)
- .register(msg -> {
- events.add((S7Event) msg);
- });
- }
-
- if (meta.isAlarmEvent() && subresponse.getResponseCode(FIELD_ALARM_EVENT) == PlcResponseCode.OK) {
- registerAlarm =
- subresponse
- .getSubscriptionHandle(FIELD_ALARM_EVENT)
- .register(msg -> {
- events.add((S7Event) msg);
- });
- }
-
- } catch (Exception ex) {
- setErrors(1L);
- logError("Unable read from PLC. " + ex.getMessage());
- }
-
- } else {
- setErrors(1L);
- logError("PLC is not connected.");
- setOutputDone();
- return false;
- }
-
- } else {
- setErrors(1L);
- logError("PLC connection don't exist.");
- setOutputDone();
- return false;
- }
-
- while (events.size() == 0) {
- try {
- Thread.sleep(100);
- if (stopBundle) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
- } catch (InterruptedException ex) {
- break;
- }
- }
-
- S7Event s7event = events.poll();
- index = 0;
- r = data.outputRowMeta.cloneRow(data.outputRowData);
- for (String name:data.outputRowMeta.getFieldNames()) {
- System.out.println(name + ": " + s7event.getMap().get(name));
- if (null != s7event.getMap().get(name)) {
- r[index++] = s7event.getMap().get(name).toString();
- } else {
- try {
- r[index++] = mapper.writer()
- .writeValueAsString(s7event.getMap());
- } catch (Exception ex) {
- Logger.getLogger(Plc4xEvent.class.getName()).log(Level.SEVERE, null, ex);
- }
- }
- }
-
-
- data.prevDate = data.rowDate;
- data.rowDate = new Date();
-
- putRow(data.outputRowMeta, r ); // return your data
- data.rowsWritten++;
- return true;
- }
-
@Override
public boolean init() {
try {
- if(super.init()){
+ if (super.init()) {
// Determine the number of rows to generate...
data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
if (data.rowLimit < 0L) { // Unable to parse
- logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
- return false; // fail
- }
+ logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
+ return false; // fail
+ }
// Create a row (constants) with all the values in it...
List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
if (!remarks.isEmpty()) {
- for (int i = 0; i < remarks.size(); i++) {
- CheckResult cr = (CheckResult) remarks.get(i);
- logError(cr.getText());
- }
- return false;
+ for (int i = 0; i < remarks.size(); i++) {
+ CheckResult cr = (CheckResult) remarks.get(i);
+ logError(cr.getText());
+ }
+ return false;
}
data.outputRowData = outputRow.getData();
- data.outputRowMeta = outputRow.getRowMeta();
+ data.outputRowMeta = outputRow.getRowMeta();
mapper.findAndRegisterModules();
getPlcConnection();
-
+
return true;
}
-
+
return false;
-
- } catch (Exception ex){
+
+ } catch (Exception ex) {
setErrors(1L);
logError("Error initializing transform", ex);
return false;
@@ -373,55 +269,75 @@
/*
* Here, must perform the cleaning of any resource, main of the connection to
* the associated PLC.
- */
+ */
@Override
public void cleanup() {
- System.out.println("*************** CLEANUP *****************");
super.cleanup();
logBasic("Cleanup. Release connection.");
if (null != connwrapper) {
- if (null != registerMode ) registerMode.unregister();
- if (null != registerUser) registerUser.unregister();
- if (null != registerSys) registerSys.unregister();
- if (null != registerAlarm) registerAlarm.unregister();
- connwrapper.release();
- if (connwrapper.refCnt() <= 0)
- lookup.remove(connwrapper);
+ if (null != registerMode) {
+ registerMode.unregister();
+ }
+ if (null != registerUser) {
+ registerUser.unregister();
+ }
+ if (null != registerSys) {
+ registerSys.unregister();
+ }
+ if (null != registerAlarm) {
+ registerAlarm.unregister();
+ }
+ connwrapper.release();
+ if (connwrapper.refCnt() <= 0) {
+ lookup.remove(connwrapper);
+ }
}
}
-
+
/*
* Here, must perform the cleaning of any resource.
* 1. Check if we have reference to wrapper.
* 2. Release de reference to object.
* 3. The lastone remove the global reference to connection wrapper.
* 4. Clear local references.
- */
+ */
@Override
public void dispose() {
- System.out.println("*************** DISPOSE *****************");
super.dispose();
+ if (null != registerMode) {
+ registerMode.unregister();
+ }
+ if (null != registerUser) {
+ registerUser.unregister();
+ }
+ if (null != registerSys) {
+ registerSys.unregister();
+ }
+ if (null != registerAlarm) {
+ registerAlarm.unregister();
+ }
+
if (connwrapper != null) {
- logBasic("Dispose. Release connection: " + connwrapper.refCnt());
+ logBasic("Dispose. Release connection: " + connwrapper.refCnt());
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
- lookup.remove(connwrapper);
+ if (connwrapper.refCnt() <= 0) {
+ lookup.remove(connwrapper);
+ }
connwrapper = null;
- readRequest = null;
- registerMode = null;
- registerUser = null;
- registerSys = null;
- registerAlarm = null;
+ subsRequest = null;
+ registerMode = null;
+ registerUser = null;
+ registerSys = null;
+ registerAlarm = null;
}
}
- @Override
public void stopRunning() throws HopException {
super.stopRunning();
stopBundle = true;
}
-
+
private void getPlcConnection() {
lock.lock(); //(01)
try {
@@ -429,37 +345,38 @@
IHopMetadataProvider metaprovider = getMetadataProvider();
connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
+ if (connwrapper == null) {
+ template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
result = lookup.lookup(template);
if (!result.allItems().isEmpty()) {
- System.out.println("Aqui encontro la conexion: " + meta.getConnection());
+ logBasic("Using connection: " + meta.getConnection());
connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
- if (connwrapper != null) connwrapper.retain();
+ if (connwrapper != null) {
+ connwrapper.retain();
+ }
}
};
- if (connmeta == null){
+ if (connmeta == null) {
logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.Log.SetMetadata",
+ meta.getConnection()));
}
- if ((connmeta != null) && (connwrapper == null)){
- readRequest = null;
- try{
- System.out.println("Creo una nueva conexión...");
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
-
+ if ((connmeta != null) && (connwrapper == null)) {
+ subsRequest = null;
+ try {
+ final PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
+ Thread.sleep(200);
if (conn.isConnected()) {
- System.out.println("**** Agrego la segunda conexion. ****");
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
+ logBasic("Create new connection with url : " + connmeta.getUrl());
+ connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
lookup.add(connwrapper);
}
- } catch (Exception ex){
+ } catch (Exception ex) {
setErrors(1L);
logError("Unable to create connection to PLC. " + ex.getMessage());
}
@@ -469,8 +386,160 @@
logError("Unable to create connection to PLC. " + ex.getMessage());
} finally {
lock.unlock();
- }
- }
-
-
+ }
+ }
+
+ /*
+ * Registers the tags for the cyclical subscription.
+ * In the first processing of the rows, a check of the tags is
+ * carried out in order that they are well formed, generating an exception
+ * if they are not.
+ */
+ public boolean RegisterPlcTags() {
+ if ((connmeta != null) && (connwrapper != null)) {
+ if (connwrapper.getConnection().isConnected()) {
+ if (subsRequest == null) {
+ final PlcSubscriptionRequest.Builder subscription = connwrapper.getConnection().subscriptionRequestBuilder(); //(05)
+ if (meta.isModeEvent()) {
+ subscription.addEventTagAddress(FIELD_MODE_EVENT, FIELD_MODE_EVENT);
+ }
+ if (meta.isUserEvent()) {
+ subscription.addEventTagAddress(FIELD_USER_EVENT, FIELD_USER_EVENT);
+ }
+ if (meta.isSysEvent()) {
+ subscription.addEventTagAddress(FIELD_SYS_EVENT, FIELD_SYS_EVENT);
+ }
+ if (meta.isAlarmEvent()) {
+ subscription.addEventTagAddress(FIELD_ALARM_EVENT, FIELD_ALARM_EVENT);
+ }
+
+ subsRequest = subscription.build();
+
+ }
+
+ } else {
+ setErrors(1L);
+ logError("PLC is not connected.");
+ setOutputDone();
+ return false;
+ }
+
+ } else {
+ setErrors(1L);
+ logError("PLC connection don't exist.");
+ setOutputDone();
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * This method performs the subscription to the events within the PLC.
+ * 1. Take the waiting time as a reference to monitor the request.
+ * 2. Captures the jobId associated with the subscription
+ * which is assigned by the PLC.
+ */
+ public void GetSubscriptions() {
+ try {
+ subresponse = subsRequest.execute().get();
+ } catch (Exception ex) {
+ setErrors(1L);
+ logError("Unable read from PLC. " + ex.getMessage());
+ }
+ }
+
+ /*
+ * Subscribe to incoming events by transferring them to
+ * the local event buffer.
+ */
+ public void RegisterEventHandler() {
+
+ if (meta.isModeEvent() && subresponse.getResponseCode(FIELD_MODE_EVENT) == PlcResponseCode.OK) {
+ registerMode
+ = subresponse
+ .getSubscriptionHandle(FIELD_MODE_EVENT)
+ .register(msg -> {
+ events.add((S7Event) msg);
+ });
+ }
+
+ if (meta.isUserEvent() && subresponse.getResponseCode(FIELD_USER_EVENT) == PlcResponseCode.OK) {
+ registerUser
+ = subresponse
+ .getSubscriptionHandle(FIELD_USER_EVENT)
+ .register(msg -> {
+ events.add((S7Event) msg);
+ });
+ }
+
+ if (meta.isSysEvent() && subresponse.getResponseCode(FIELD_SYS_EVENT) == PlcResponseCode.OK) {
+ registerSys
+ = subresponse
+ .getSubscriptionHandle(FIELD_SYS_EVENT)
+ .register(msg -> {
+ events.add((S7Event) msg);
+ });
+ }
+
+ if (meta.isAlarmEvent() && subresponse.getResponseCode(FIELD_ALARM_EVENT) == PlcResponseCode.OK) {
+ registerAlarm
+ = subresponse
+ .getSubscriptionHandle(FIELD_ALARM_EVENT)
+ .register(msg -> {
+ events.add((S7Event) msg);
+ });
+ }
+ }
+
+ /*
+ * Unsubscribes to the event generator from the driver.
+ * TODO: It remains to verify the unsubscription in line.
+ * At the moment only with the disconnection of the PLC.
+ */
+ public void UnRegisterCYCHandler() {
+ if (null != registerMode) {
+ registerMode.unregister();
+ }
+ if (null != registerUser) {
+ registerUser.unregister();
+ }
+ if (null != registerSys) {
+ registerSys.unregister();
+ }
+ if (null != registerAlarm) {
+ registerAlarm.unregister();
+ }
+ registerMode = null;
+ registerUser = null;
+ registerSys = null;
+ registerAlarm = null;
+ subsRequest = null;
+ }
+
+ /*
+ * When the driver makes a connection this method is called.
+ * In the case of the S7 driver, only the connection of the embedded channel
+ * is served.
+ */
+ @Override
+ public void connected() {
+ if (connwrapper.getConnection().isConnected()) {
+ RegisterPlcTags();
+ GetSubscriptions();
+ RegisterEventHandler();
+ }
+ }
+
+ /*
+ * This method is called from the driver to indicate that it has
+ * disconnected from the PLC.
+ * If the PLC is disconnected, it automatically deletes all
+ * the status associated with this connection.
+ */
+ @Override
+ public void disconnected() {
+ logError("Driver disconnected!");
+ UnRegisterCYCHandler();
+ }
+
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xRead.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xRead.java
index 0d8332d..3080491 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xRead.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xRead.java
@@ -14,9 +14,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.plc4x.hop.transforms.plc4xinput;
+import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
@@ -26,6 +26,8 @@
import java.util.concurrent.locks.ReentrantLock;
import java.util.logging.Level;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
+import org.apache.commons.codec.binary.BinaryCodec;
import org.apache.commons.lang3.StringUtils;
import org.apache.hop.core.CheckResult;
import org.apache.hop.core.Const;
@@ -33,6 +35,7 @@
import org.apache.hop.core.RowMetaAndData;
import org.apache.hop.core.exception.HopException;
import org.apache.hop.core.exception.HopPluginException;
+import org.apache.hop.core.exception.HopTransformException;
import org.apache.hop.core.exception.HopValueException;
import org.apache.hop.core.logging.LogLevel;
import org.apache.hop.core.row.IRowMeta;
@@ -48,198 +51,234 @@
import org.apache.hop.pipeline.Pipeline;
import org.apache.hop.pipeline.PipelineMeta;
import org.apache.hop.pipeline.transform.BaseTransform;
-import org.apache.hop.pipeline.transform.ITransform;
import org.apache.hop.pipeline.transform.TransformMeta;
import org.apache.plc4x.hop.metadata.Plc4xConnection;
import org.apache.plc4x.hop.metadata.util.Plc4xLookup;
import org.apache.plc4x.hop.transforms.util.Plc4xGeneratorField;
import org.apache.plc4x.hop.transforms.util.Plc4xPlcTag;
import org.apache.plc4x.hop.metadata.util.Plc4xWrapperConnection;
+import org.apache.plc4x.hop.transforms.util.Plc4xDataType;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.BYTE;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.DATE;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.DATE_AND_TIME;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.DINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.DWORD;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.INT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LDATE;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LDATE_AND_TIME;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LREAL;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LTIME;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LTIME_OF_DAY;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.LWORD;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.REAL;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.SINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.TIME;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.TIME_OF_DAY;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.UDINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.UINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.ULINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.USINT;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.WORD;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.openide.util.Lookup;
/**
- * Transform That contains the basic skeleton needed to create your own plugin
+ *
*
*/
public class Plc4xRead extends BaseTransform<Plc4xReadMeta, Plc4xReadData> {
- private static final Class<?> PKG = Plc4xRead.class; // Needed by Translator
-
- private Plc4xConnection connmeta = null;
- private Plc4xWrapperConnection connwrapper = null;
- private PlcReadRequest readRequest = null;
- private PlcReadResponse readResponse = null;
-
- private Plc4xLookup lookup = Plc4xLookup.getDefault();
- private Lookup.Template template = null;
- private Lookup.Result<Plc4xWrapperConnection> result = null;
-
- private int maxwait = 0;
- private static final ReentrantLock lock = new ReentrantLock();
-
- private static final String dummy = "dummy";
-
- private Map<String, Integer> index = new HashMap();
- private Map<String, Plc4xPlcTag> plcfields = new HashMap();
+ private static final Class<?> PKG = Plc4xRead.class; // Needed by Translator
- public Plc4xRead(TransformMeta transformMeta, Plc4xReadMeta meta, Plc4xReadData data, int copyNr, PipelineMeta pipelineMeta,
- Pipeline pipeline ) {
- super( transformMeta, meta, data, copyNr, pipelineMeta, pipeline );
- }
+ private Object[] r = null;
- /*
+ private Plc4xConnection connmeta = null;
+ private Plc4xWrapperConnection connwrapper = null;
+ private PlcReadRequest.Builder builder = null;
+ private PlcReadRequest readRequest = null;
+ private PlcReadResponse readResponse = null;
+
+ private Plc4xLookup lookup = Plc4xLookup.getDefault();
+ private Lookup.Template template = null;
+ private Lookup.Result<Plc4xWrapperConnection> result = null;
+
+ private BinaryCodec binarycodec = new BinaryCodec();
+
+ private int maxwait = 0;
+ private int counter = 0;
+ private int intField = 0;
+ private String strField = null;
+
+ private static final ReentrantLock lock = new ReentrantLock();
+
+ private static final String dummy = "dummy";
+
+ private Map<String, Integer> index = new HashMap();
+ private Map<String, Plc4xPlcTag> plctags = new HashMap();
+ private Plc4xDataType valuetype = null;
+
+ private ObjectMapper mapper = new ObjectMapper();
+
+ public Plc4xRead(TransformMeta transformMeta, Plc4xReadMeta meta, Plc4xReadData data, int copyNr, PipelineMeta pipelineMeta,
+ Pipeline pipeline) {
+ super(transformMeta, meta, data, copyNr, pipelineMeta, pipeline);
+ }
+
+ /*
* Including Date and Time field for every row
*
* @param meta Meta data from user dialog
* @param remarks Error registers
* @param origin transform instance name
- */
- public static final RowMetaAndData buildRow(Plc4xReadMeta meta,
- List<ICheckResult> remarks,
- String origin) throws HopPluginException {
-
- IRowMeta rowMeta = new RowMeta();
- Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
- int index = 0;
+ */
+ public static final RowMetaAndData buildRow(Plc4xReadMeta meta,
+ List<ICheckResult> remarks,
+ String origin) throws HopPluginException {
- if (!Utils.isEmpty(meta.getRowTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
- rowData[index++] = null;
- }
+ IRowMeta rowMeta = new RowMeta();
+ Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
+ int index = 0;
- if (!Utils.isEmpty(meta.getLastTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
- rowData[index++] = null;
- }
-
- for (Plc4xGeneratorField field : meta.getFields()) {
- int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
- if (StringUtils.isNotEmpty(field.getType())) {
-
- IValueMeta valueMeta =
- ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
- // value!
- valueMeta.setLength(field.getLength());
- valueMeta.setPrecision(field.getPrecision());
- valueMeta.setConversionMask(field.getFormat());
- valueMeta.setCurrencySymbol(field.getCurrency());
- valueMeta.setGroupingSymbol(field.getGroup());
- valueMeta.setDecimalSymbol(field.getDecimal());
- valueMeta.setOrigin(origin);
-
- IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
-
- if (field.isSetEmptyString()) {
- // Set empty string
- rowData[index] = StringUtil.EMPTY_STRING;
- } else {
- String stringValue = field.getValue();
-
- // If the value is empty: consider it to be NULL.
- if (Utils.isEmpty(stringValue)) {
- rowData[index] = null;
-
- if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- }
- } else {
- // Convert the data from String to the specified type ...
- //
- try {
- System.out.println("stringValue: " + stringValue);
- rowData[index] = valueMeta.convertData(stringMeta, stringValue);
- } catch (HopValueException e) {
- switch (valueMeta.getType()) {
- case IValueMeta.TYPE_NUMBER:
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_DATE:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_INTEGER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_BIGNUMBER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_TIMESTAMP:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- default:
- // Boolean and binary don't throw errors normally, so it's probably an unspecified
- // error problem...
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
- }
- }
- }
+ if (!Utils.isEmpty(meta.getRowTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
+ rowData[index++] = null;
}
- // Now add value to the row!
- // This is in fact a copy from the fields row, but now with data.
- rowMeta.addValueMeta(valueMeta);
- index++;
- }
+ if (!Utils.isEmpty(meta.getLastTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
+ rowData[index++] = null;
+ }
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
+ if (StringUtils.isNotEmpty(field.getType())) {
+
+ IValueMeta valueMeta
+ = ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
+ // value!
+ valueMeta.setLength(field.getLength());
+ valueMeta.setPrecision(field.getPrecision());
+ valueMeta.setConversionMask(field.getFormat());
+ valueMeta.setCurrencySymbol(field.getCurrency());
+ valueMeta.setGroupingSymbol(field.getGroup());
+ valueMeta.setDecimalSymbol(field.getDecimal());
+ valueMeta.setOrigin(origin);
+
+ IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
+
+ if (field.isSetEmptyString()) {
+ // Set empty string
+ rowData[index] = StringUtil.EMPTY_STRING;
+ } else {
+ String stringValue = field.getValue();
+
+ // If the value is empty: consider it to be NULL.
+ if (Utils.isEmpty(stringValue)) {
+ rowData[index] = null;
+
+ if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ }
+ } else {
+ // Convert the data from String to the specified type ...
+ //
+ try {
+// System.out.println("stringValue: " + stringValue);
+ rowData[index] = valueMeta.convertData(stringMeta, stringValue);
+ } catch (HopValueException e) {
+ switch (valueMeta.getType()) {
+ case IValueMeta.TYPE_NUMBER:
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_DATE:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_INTEGER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_BIGNUMBER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_TIMESTAMP:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ default:
+ // Boolean and binary don't throw errors normally, so it's probably an unspecified
+ // error problem...
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+ }
+ }
+ }
+ }
+
+ // Now add value to the row!
+ // This is in fact a copy from the fields row, but now with data.
+ rowMeta.addValueMeta(valueMeta);
+ index++;
+ }
+ }
+
+ return new RowMetaAndData(rowMeta, rowData);
}
- return new RowMetaAndData(rowMeta, rowData);
- }
-
+
/*
* 1. Block the other instances by means of a lock.
* 2. Try to locate an existing connection.
@@ -249,207 +288,509 @@
* 5. If the connection to the PLC is made, then it creates the query
* and executes it.
* TODO: Field validation.
- */
+ */
@Override
- public boolean processRow() throws HopException {
- System.out.println("*************** PROCESSROW *****************");
- Object[] r = getRow(); // Get row from input rowset & set row busy!
+ public boolean processRow() throws HopException {
+
+ r = getRow(); // Get row from input rowset & set row busy!
setLogLevel(LogLevel.DEBUG);
-
- if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
-
- System.out.println("Nombre del transform: " + getName() + " : " + getPipeline().getFilename());
- System.out.println("Plc4xRead Objetos registrados: " + getPipeline().getExtensionDataMap().size());
- if (first) {
- index.clear();
- plcfields.clear();
- //This performs a minimal check on the user item.
- //It guarantees that the rates are within those managed by Plc4x.
- meta.getFields().forEach((f) ->{
- plcfields.put(f.getName(),Plc4xPlcTag.of(f.getItem()));
- });
- first = false;
- }
-
-// lock.lock(); //(01)
-// try {
-//
-// IHopMetadataProvider metaprovider = getMetadataProvider();
-// connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
-//
-// if (connwrapper == null) {
-// template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
-// result = lookup.lookup(template);
-// if (!result.allItems().isEmpty()) {
-// System.out.println("Aqui encontro la conexion: " + meta.getConnection());
-// connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
-// if (connwrapper != null) connwrapper.retain();
-// }
-// };
-//
-// if (connmeta == null){
-// logError(
-// BaseMessages.getString(
-// PKG,
-// "Plc4x.Read.Meta.Log.SetMetadata",
-// meta.getConnection()));
-// }
-//
-// if ((connmeta != null) && (connwrapper == null)){
-// readRequest = null;
-// try{
-// System.out.println("Creo una nueva conexión...");
-// PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
-//
-// if (conn.isConnected()) {
-// System.out.println("**** Agrego la segunda conexion. ****");
-// connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
-// lookup.add(connwrapper);
-// }
-//
-// } catch (Exception ex){
-// setErrors(1L);
-// logError("Unable to create connection to PLC. " + ex.getMessage());
-// }
-// }
-//
-// } finally {
-// lock.unlock();
-// }
-
- if ((connmeta != null) && (connwrapper != null)){
- if (connwrapper.getConnection().isConnected()){
- if (readRequest == null){
- PlcReadRequest.Builder builder = connwrapper.getConnection().readRequestBuilder(); //(05)
- for (Plc4xGeneratorField field: meta.getFields()){
- builder.addTagAddress(field.getName(), field.getItem());
- }
- readRequest = builder.build();
- }
- try {
- maxwait = Integer.parseInt(meta.getMaxwaitInMs());
- maxwait = (maxwait<100)?100:maxwait;
- readResponse = readRequest.execute().get(maxwait, TimeUnit.MILLISECONDS);
-
- for (Plc4xGeneratorField field: meta.getFields()){
- field.setValue(readResponse.getString(field.getName()));
- }
- } catch (Exception ex) {
- setErrors(1L);
- logError("Unable read from PLC. " + ex.getMessage());
- }
-
- } else {
- setErrors(1L);
- logError("PLC is not connected.");
- setOutputDone();
- return false;
+ if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
+ setOutputDone(); // signal end to receiver(s)
+ return false;
}
-
- } else {
- setErrors(1L);
- logError("PLC connection don't exist.");
- setOutputDone();
- return false;
- }
- //
- int interval = Integer.parseInt(meta.getIntervalInMs());
-
- try {
- Thread.sleep(interval);
- } catch (InterruptedException ex) {
- setErrors(1L);
- logError(ex.getMessage());
- }
-
- r = data.outputRowMeta.cloneRow(data.outputRowData);
-
- data.prevDate = data.rowDate;
- data.rowDate = new Date();
- int index = 0;
-
- if (!Utils.isEmpty(meta.getRowTimeField())) {
- r[index++] = data.rowDate;
- }
-
- if (!Utils.isEmpty(meta.getLastTimeField())) {
- r[index++] = data.prevDate;
- }
-
- for (Plc4xGeneratorField field: meta.getFields()){
- if (field.getType().equalsIgnoreCase("Boolean")){
- r[index++] = Boolean.parseBoolean(field.getValue());
- } else if (field.getType().equalsIgnoreCase("Number")){
- r[index++] = Double.parseDouble(field.getValue());
- } else if (field.getType().equalsIgnoreCase("Integer")){
- r[index++] = Integer.parseInt(field.getValue());
+ if (first) {
+ index.clear();
+ plctags.clear();
+ //This performs a minimal check on the user item.
+ //It guarantees that the rates are within those managed by Plc4x.
+ meta.getFields().forEach((f) -> {
+ if (null == r) {
+ plctags.put(f.getName(), Plc4xPlcTag.of(f.getItem()));
+ } else {
+ intField = getInputRowMeta().indexOfValue(f.getItem());
+ if (intField != -1) {
+ strField = r[intField].toString();
+ plctags.put(f.getName(), Plc4xPlcTag.of(strField));
+ } else {
+ plctags.put(f.getName(), Plc4xPlcTag.of(f.getItem()));
+ }
+ }
+ });
+ first = false;
}
- }
- putRow(data.outputRowMeta, r ); // return your data
- data.rowsWritten++;
- return true;
- }
+ //In case of any problem I end the processing of the row.
+ if (!RegisterPlcTags()) {
+ return false;
+ }
+ if (!GetReads()) {
+ return false;
+ }
+ //
+ int interval = Integer.parseInt(meta.getIntervalInMs());
- @Override
- public boolean init() {
- System.out.println("*************** INIT *****************");
try {
- if(super.init()){
+ Thread.sleep(interval);
+ } catch (InterruptedException ex) {
+ setErrors(1L);
+ logError(ex.getMessage());
+ }
+
+ r = data.outputRowMeta.cloneRow(data.outputRowData);
+
+ data.prevDate = data.rowDate;
+ data.rowDate = new Date();
+ int index = 0;
+
+ if (!Utils.isEmpty(meta.getRowTimeField())) {
+ r[index++] = data.rowDate;
+ }
+
+ if (!Utils.isEmpty(meta.getLastTimeField())) {
+ r[index++] = data.prevDate;
+ }
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ try {
+ valuetype = plctags.get(field.getName()).getDataType();
+
+ if (field.getType().equalsIgnoreCase("Avro Record")) {
+ throw new HopException("'Avro Record' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("BigNumber")) {
+ throw new HopException("'BigNumber' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("Binary")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(readResponse.getByte(field.getName())));
+ break;
+ case WORD:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(readResponse.getShort(field.getName())));
+ break;
+ case DWORD:
+ r[index++] = binarycodec.toByteArray(
+ Integer.toBinaryString(readResponse.getInteger(field.getName())));
+ break;
+ case LWORD:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(readResponse.getLong(field.getName())));
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+ }
+
+ } else if (field.getType().equalsIgnoreCase("Boolean")) {
+ switch (valuetype) {
+ case BOOL:
+ r[index++] = readResponse.getBoolean(field.getName());
+ break;
+ default:
+ }
+ } else if (field.getType().equalsIgnoreCase("Date")) {
+ switch (valuetype) {
+ case DATE:;
+ case LDATE:
+ r[index++] = readResponse.getDate(field.getName());
+ break;
+ case DATE_AND_TIME:;
+ case LDATE_AND_TIME:
+ r[index++] = readResponse.getDateTime(field.getName());
+ break;
+ default:
+ throw new HopException("'Date' type is not supported");
+ }
+ } else if (field.getType().equalsIgnoreCase("Graph")) {
+ throw new HopException("'Graph' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("Integer")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = Long.valueOf(readResponse.getByte(field.getName()));
+ break;
+ case WORD:
+ r[index++] = Long.valueOf(readResponse.getShort(field.getName()));
+ break;
+ case DWORD:
+ r[index++] = Long.valueOf(readResponse.getInteger(field.getName()));
+ break;
+ case LWORD:
+ r[index++] = readResponse.getLong(field.getName());
+ break;
+ case INT:
+ r[index++] = Long.valueOf(readResponse.getShort(field.getName()));
+ break;
+ case UINT:
+ r[index++] = Long.valueOf(readResponse.getShort(field.getName()) & 0xFFFF);
+ break;
+ case SINT:
+ r[index++] = Long.valueOf(readResponse.getByte(field.getName()));
+ break;
+ case USINT:
+ r[index++] = Long.valueOf(readResponse.getByte(field.getName()) & 0xFF);
+ break;
+ case DINT:
+ r[index++] = Long.valueOf(readResponse.getInteger(field.getName()));
+ break;
+ case UDINT:
+ r[index++] = Long.valueOf(readResponse.getInteger(field.getName()) & 0xFFFF);
+ break;
+ case LINT:
+ r[index++] = readResponse.getLong(field.getName());
+ break;
+ case ULINT:
+ r[index++] = readResponse.getLong(field.getName()) & 0xFFFFFFFFL;
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+ }
+ } else if (field.getType().equalsIgnoreCase("Internet Address")) {
+ throw new HopException("'Internet Address' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("JSON")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllBytes(field.getName())));
+ break;
+ case WORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllShorts(field.getName())));
+ break;
+ case DWORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllIntegers(field.getName())));
+ break;
+ case LWORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllLongs(field.getName())));
+ break;
+ case INT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllShorts(field.getName())));
+ break;
+ case UINT: {
+ List<Long> numbers = readResponse.getAllShorts(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers));
+ }
+ break;
+ case SINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllBytes(field.getName())));
+ break;
+ case USINT: {
+ List<Long> numbers = readResponse.getAllBytes(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers));
+ }
+ break;
+ case DINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllIntegers(field.getName())));
+ break;
+ case UDINT: {
+ List<Long> numbers = readResponse.getAllBytes(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers));
+ }
+ break;
+ case LINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllLongs(field.getName())));
+ break;
+ case ULINT: {
+ List<Long> numbers = readResponse.getAllLongs(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFFFFFFL);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers));
+ }
+ break;
+ case REAL:
+ case LREAL:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllFloats(field.getName())));
+ break;
+ case DATE:;
+ case LDATE:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllDates(field.getName())));
+ break;
+ case DATE_AND_TIME:;
+ case LDATE_AND_TIME:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllDateTimes(field.getName())));
+ break;
+ case TIME:;
+ case LTIME:;
+ case TIME_OF_DAY:;
+ case LTIME_OF_DAY:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllTimes(field.getName())));
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+
+ }
+ } else if (field.getType().equalsIgnoreCase("Number")) {
+ switch (valuetype) {
+ case REAL:
+ case LREAL:
+ r[index++] = Double.valueOf(readResponse.getFloat(field.getName()));
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+ }
+
+ } else if (field.getType().equalsIgnoreCase("String")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllBytes(field.getName()))).toString();
+ break;
+ case WORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllShorts(field.getName()))).toString();
+ break;
+ case DWORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllIntegers(field.getName()))).toString();
+ break;
+ case LWORD:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllLongs(field.getName()))).toString();
+ break;
+ case INT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllShorts(field.getName()))).toString();
+ case UINT: {
+ List<Long> numbers = readResponse.getAllShorts(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers)).toString();
+ }
+ break;
+ case SINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllBytes(field.getName()))).toString();
+ break;
+ case USINT: {
+ List<Long> numbers = readResponse.getAllBytes(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers)).toString();
+ }
+ break;
+ case DINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllIntegers(field.getName()))).toString();
+ break;
+ case UDINT: {
+ List<Long> numbers = readResponse.getAllBytes(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFF);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers)).toString();
+ }
+ break;
+ case LINT:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllLongs(field.getName()))).toString();
+ break;
+ case ULINT: {
+ List<Long> numbers = readResponse.getAllLongs(field.getName())
+ .stream()
+ .map(n -> {
+ return Long.valueOf(n & 0xFFFFFFFFL);
+ })
+ .collect(Collectors.toList());
+
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ numbers)).toString();
+ }
+ break;
+ case REAL:
+ case LREAL:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllFloats(field.getName()))).toString();
+ case DATE:;
+ case LDATE:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllDates(field.getName()))).toString();
+ break;
+ case DATE_AND_TIME:;
+ case LDATE_AND_TIME:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllDateTimes(field.getName()))).toString();
+ break;
+ case TIME:;
+ case LTIME:;
+ case TIME_OF_DAY:;
+ case LTIME_OF_DAY:
+ r[index++] = mapper.createObjectNode().set(field.getName(),
+ mapper.valueToTree(
+ readResponse.getAllTimes(field.getName()))).toString();
+ break;
+ case STRING:;
+ default:
+ throw new HopException("'STRING' type is not supported");
+ }
+ } else if (field.getType().equalsIgnoreCase("Timestamp")) {
+ switch (valuetype) {
+ case TIME:
+ case LTIME:
+ r[index++] = readResponse.getTime(field.getName());
+ break;
+ case TIME_OF_DAY:;
+ case LTIME_OF_DAY:
+ r[index++] = readResponse.getTime(field.getName());
+ break;
+ default:
+ throw new HopException("'LTIME, LTIME_OF_DAY' type is not supported");
+ }
+ }
+ } catch (Exception ex) {
+ try {
+ System.out.println("META: " + data.outputRowMeta.toStringMeta());
+ putError(data.outputRowMeta, r, 1,
+ "Tag error!.", field.getName(),
+ ex.getMessage());
+ } catch (HopTransformException ex1) {
+ logError(ex1.toString());
+ }
+ System.out.println("TagName: " + field.getName());
+ }
+ } // for
+
+ readResponse = null; //To GC?
+
+ putRow(data.outputRowMeta, r); // return your data
+ data.rowsWritten++;
+
+ return true;
+ }
+
+ @Override
+ public boolean init() {
+ try {
+ if (super.init()) {
// Determine the number of rows to generate...
data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
data.rowsWritten = 0L;
data.delay = Const.toLong(resolve(meta.getIntervalInMs()), -1L);
if (data.rowLimit < 0L) { // Unable to parse
- logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
- return false; // fail
- }
+ logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
+ return false; // fail
+ }
// Create a row (constants) with all the values in it...
List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
if (!remarks.isEmpty()) {
- for (int i = 0; i < remarks.size(); i++) {
- CheckResult cr = (CheckResult) remarks.get(i);
- logError(cr.getText());
- }
- return false;
+ for (int i = 0; i < remarks.size(); i++) {
+ CheckResult cr = (CheckResult) remarks.get(i);
+ logError(cr.getText());
+ }
+ return false;
}
data.outputRowData = outputRow.getData();
- data.outputRowMeta = outputRow.getRowMeta();
+ data.outputRowMeta = outputRow.getRowMeta();
getPlcConnection();
-
+
return true;
}
return false;
- } catch (Exception ex){
+ } catch (Exception ex) {
setErrors(1L);
logError("Error initializing transform", ex);
return false;
}
}
- /*
- * Here, must perform the cleaning of any resource, main of the connection to
- * the associated PLC.
- */
+ /*
+ * Here, must perform the cleaning of any resource, main of the connection to
+ * the associated PLC.
+ */
@Override
public void cleanup() {
- System.out.println("*************** CLEANUP *****************");
super.cleanup();
logBasic("Cleanup. Release connection.");
if (connwrapper != null) {
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
+ if (connwrapper.refCnt() <= 0) {
lookup.remove(connwrapper);
+ }
}
}
@@ -460,22 +801,22 @@
* 2. Release de reference to object.
* 3. The lastone remove the global reference to connection wrapper.
* 4. Clear local references.
- */
+ */
@Override
public void dispose() {
- System.out.println("*************** DISPOSE *****************");
super.dispose();
if (connwrapper != null) {
- logBasic("Dispose. Release connection: " + connwrapper.refCnt());
+ logBasic("Dispose. Release connection: " + connwrapper.refCnt());
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
- lookup.remove(connwrapper);
+ if (connwrapper.refCnt() <= 0) {
+ lookup.remove(connwrapper);
+ }
connwrapper = null;
readRequest = null;
}
}
-
+
private void getPlcConnection() {
lock.lock(); //(01)
try {
@@ -483,48 +824,127 @@
IHopMetadataProvider metaprovider = getMetadataProvider();
connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
+ if (connwrapper == null) {
+ template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
result = lookup.lookup(template);
if (!result.allItems().isEmpty()) {
- System.out.println("Aqui encontro la conexion: " + meta.getConnection());
+ logBasic("Using connection: " + meta.getConnection());
connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
- if (connwrapper != null) connwrapper.retain();
+ if (connwrapper != null) {
+ connwrapper.retain();
+ }
}
};
- if (connmeta == null){
+ if (connmeta == null) {
logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.Log.SetMetadata",
+ meta.getConnection()));
}
- if ((connmeta != null) && (connwrapper == null)){
+ if ((connmeta != null) && (connwrapper == null)) {
readRequest = null;
- try{
- System.out.println("Creo una nueva conexión...");
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
-
+ try {
+ final PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
+ Thread.sleep(200);
if (conn.isConnected()) {
- System.out.println("**** Agrego la segunda conexion. ****");
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
+ logBasic("Create new connection with url : " + connmeta.getUrl());
+ connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
lookup.add(connwrapper);
}
- } catch (Exception ex){
+ } catch (Exception ex) {
setErrors(1L);
logError("Unable to create connection to PLC. " + ex.getMessage());
}
}
} catch (HopException ex) {
- Logger.getLogger(Plc4xRead.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Plc4xRead.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
- }
+ }
}
-
-
+
+ /*
+ * Registers the tags to write.
+ * In the first processing of the rows, a check of the tags is
+ * carried out in order that they are well formed, generating an exception
+ * if they are not.
+ */
+ public boolean RegisterPlcTags() {
+ if ((connmeta != null) && (connwrapper != null)) {
+ if (connwrapper.getConnection().isConnected()) {
+ if (readRequest == null) {
+ builder = connwrapper.getConnection().readRequestBuilder(); //(05)
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ if (null == r) {
+ builder.addTagAddress(field.getName(), field.getItem());
+ } else {
+ intField = getInputRowMeta().indexOfValue(field.getItem());
+ if (intField != -1) {
+ strField = r[intField].toString();
+ builder.addTagAddress(field.getName(), strField);
+ } else {
+ builder.addTagAddress(field.getName(), field.getItem());
+ }
+ }
+ }
+ readRequest = builder.build();
+ }
+ } else {
+ setErrors(1L);
+ logError("PLC is not connected.");
+ setOutputDone();
+ return false;
+ }
+
+ } else {
+ setErrors(1L);
+ logError("PLC connection don't exist.");
+ setOutputDone();
+ return false;
+ }
+
+ return true;
+ }
+
+ public boolean GetReads() {
+
+ try {
+ maxwait = Integer.parseInt(meta.getMaxwaitInMs());
+ maxwait = (maxwait < 100) ? 100 : maxwait;
+ readResponse = readRequest.execute().get(maxwait, TimeUnit.MILLISECONDS);
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ if (readResponse.getResponseCode(field.getName()) != PlcResponseCode.OK) {
+ logDebug(field.getName() + " : " + readResponse.getResponseCode(field.getName()).name());
+ try {
+ putError(data.outputRowMeta, r, 1,
+ "Tag error.", field.getName(),
+ readResponse.getResponseCode(field.getName()).name());
+ } catch (HopTransformException ex) {
+ logError(ex.toString());
+ }
+ }
+ }
+ } catch (Exception ex) {
+ setErrors(1L);
+ try {
+ putError(getInputRowMeta(), r, 1,
+ "Tag error!.", ex.getMessage(),
+ ex.toString());
+ } catch (HopTransformException ex1) {
+ logError(ex.toString());
+ }
+ logError("Unable read from PLC. " + ex.getMessage());
+ setOutputDone();
+ return false;
+ }
+
+ return true;
+ }
+
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadDialog.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadDialog.java
index 96a47e5..928ee6d 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadDialog.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadDialog.java
@@ -19,6 +19,7 @@
import org.apache.hop.core.Const;
import org.apache.hop.core.exception.HopException;
+import org.apache.hop.core.row.IRowMeta;
import org.apache.hop.core.row.value.ValueMetaFactory;
import org.apache.hop.core.util.Utils;
import org.apache.hop.core.variables.IVariables;
@@ -40,6 +41,7 @@
import org.apache.hop.ui.core.widget.TextVar;
import org.apache.hop.ui.pipeline.dialog.PipelinePreviewProgressDialog;
import org.apache.hop.ui.pipeline.transform.BaseTransformDialog;
+import org.apache.hop.ui.pipeline.transform.ITableItemInsertListener;
import org.apache.hop.ui.util.SwtSvgImageUtil;
import org.apache.plc4x.hop.metadata.Plc4xConnection;
import org.apache.plc4x.hop.transforms.util.Plc4xGeneratorField;
@@ -272,14 +274,20 @@
wOk = new Button(shell, SWT.PUSH);
wOk.setText(BaseMessages.getString(PKG, "System.Button.OK"));
wOk.addListener(SWT.Selection, e -> ok());
+
+ wGet = new Button(shell, SWT.PUSH);
+ wGet.setText(BaseMessages.getString(PKG, "Get Fields"));
+ wGet.addListener(SWT.Selection, e -> getfields());
+
wPreview = new Button(shell, SWT.PUSH);
wPreview.setText(BaseMessages.getString(PKG, "System.Button.Preview"));
wPreview.addListener(SWT.Selection, e -> preview());
+
wCancel = new Button(shell, SWT.PUSH);
wCancel.setText(BaseMessages.getString(PKG, "System.Button.Cancel"));
wCancel.addListener(SWT.Selection, e -> cancel());
- setButtonPositions(new Button[] {wOk, wPreview, wCancel}, margin, null);
+ setButtonPositions(new Button[] {wOk, wPreview, wGet , wCancel}, margin, null);
Label wlFields = new Label(shell, SWT.NONE);
wlFields.setText(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Dialog.Fields.Label"));
@@ -528,6 +536,40 @@
}
}
+ private void getfields() {
+ try {
+
+ IRowMeta r = pipelineMeta.getPrevTransformFields(variables, transformName);
+
+ if (r != null && !r.isEmpty()) {
+ ITableItemInsertListener listener =
+ (tableItem, v) -> {
+
+ tableItem.setText(2, "");
+ tableItem.setText(3, v.getTypeDesc());
+ tableItem.setText(4, v.getFormatMask()==null?"":v.getFormatMask());
+ tableItem.setText(5, Integer.toString(v.getLength()));
+ tableItem.setText(6, Integer.toString(v.getPrecision()));
+ tableItem.setText(7, v.getCurrencySymbol()==null?"":v.getCurrencySymbol());
+ tableItem.setText(8, v.getDecimalSymbol()==null?"":v.getDecimalSymbol());
+ tableItem.setText(9, v.getGroupingSymbol()==null?"":v.getGroupingSymbol());
+ //tableItem.setText(10, "N");
+ tableItem.setText(11, "N");
+ return true;
+ };
+ BaseTransformDialog.getFieldsFromPrevious(
+ r, wFields, 1, new int[] {1}, null, -1, -1, listener);
+ }
+
+
+ } catch (Exception ex){
+ new ErrorDialog(
+ shell,
+ BaseMessages.getString(PKG, "Plc4x.Read.Meta.Dialog.Illegal.Dialog.Settings.Title"),
+ BaseMessages.getString(PKG, "Plc4x.Read.Meta.Dialog.Illegal.Dialog.Settings.Message"),
+ ex);
+ }
+ }
/**
* Preview the data generated by this transform. This generates a pipeline using this transform &
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadMeta.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadMeta.java
index c431789..559dce2 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadMeta.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xinput/Plc4xReadMeta.java
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.plc4x.hop.transforms.plc4xinput;
import java.util.ArrayList;
@@ -52,251 +51,266 @@
)
public class Plc4xReadMeta extends BaseTransformMeta<Plc4xRead, Plc4xReadData> {
- private static final Class<?> PKG = Plc4xReadMeta.class; // Needed by Translator
+ private static final Class<?> PKG = Plc4xReadMeta.class; // Needed by Translator
-
- @HopMetadataProperty(
- key = "connection",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.Connection")
- private String connection;
+ @HopMetadataProperty(
+ key = "connection",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.Connection")
+ private String connection;
- @HopMetadataProperty(
- key = "never_ending",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.NeverEnding")
- private boolean neverEnding;
+ @HopMetadataProperty(
+ key = "never_ending",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.NeverEnding")
+ private boolean neverEnding;
- @HopMetadataProperty(
- key = "maxwait_in_ms",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.MaxwaitInMs")
- private String maxwaitInMs;
-
- @HopMetadataProperty(
- key = "interval_in_ms",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.IntervalInMs")
- private String intervalInMs;
+ @HopMetadataProperty(
+ key = "maxwait_in_ms",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.MaxwaitInMs")
+ private String maxwaitInMs;
- @HopMetadataProperty(
- key = "row_time_field",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.RowTimeField")
- private String rowTimeField;
+ @HopMetadataProperty(
+ key = "interval_in_ms",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.IntervalInMs")
+ private String intervalInMs;
- @HopMetadataProperty(
- key = "last_time_field",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.LastTimeField")
- private String lastTimeField;
+ @HopMetadataProperty(
+ key = "row_time_field",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.RowTimeField")
+ private String rowTimeField;
- @HopMetadataProperty(
- key = "limit",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.RowLimit")
- private String rowLimit;
+ @HopMetadataProperty(
+ key = "last_time_field",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.LastTimeField")
+ private String lastTimeField;
- @HopMetadataProperty(
- groupKey = "fields",
- key = "field",
- injectionGroupDescription = "Plc4x.Read.Meta.Injection.Fields",
- injectionKeyDescription = "Plc4x.Read.Meta.Injection.Fields")
- private List<Plc4xGeneratorField> fields;
+ @HopMetadataProperty(
+ key = "limit",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.RowLimit")
+ private String rowLimit;
- public Plc4xReadMeta() {
- fields = new ArrayList<>();
+ @HopMetadataProperty(
+ groupKey = "fields",
+ key = "field",
+ injectionGroupDescription = "Plc4x.Read.Meta.Injection.Fields",
+ injectionKeyDescription = "Plc4x.Read.Meta.Injection.Fields")
+ private List<Plc4xGeneratorField> fields;
- rowLimit = "10";
- neverEnding = false;
- maxwaitInMs = "1000";
- intervalInMs = "5000";
- rowTimeField = "now";
- lastTimeField = "last";
- }
-
- public Plc4xReadMeta(Plc4xReadMeta m) {
- this.connection = m.connection;
- this.neverEnding = m.neverEnding;
- this.intervalInMs = m.intervalInMs;
- this.rowTimeField = m.rowTimeField;
- this.lastTimeField = m.lastTimeField;
- this.rowLimit = m.rowLimit;
- this.fields = new ArrayList<>();
- for (Plc4xGeneratorField field : m.fields) {
- this.fields.add(new Plc4xGeneratorField(field));
+ public Plc4xReadMeta() {
+ fields = new ArrayList<>();
+
+ rowLimit = "10";
+ neverEnding = false;
+ maxwaitInMs = "1000";
+ intervalInMs = "5000";
+ rowTimeField = "now";
+ lastTimeField = "last";
}
- }
- public Plc4xReadMeta clone() {
- return new Plc4xReadMeta(this);
- }
-
-
-
- public void getFields( IRowMeta inputRowMeta, String name, IRowMeta[] info, TransformMeta nextTransform,
- IVariables variables, IHopMetadataProvider metadataProvider ) throws HopTransformException {
- try {
- List<ICheckResult> remarks = new ArrayList<>();
- RowMetaAndData rowMetaAndData = Plc4xRead.buildRow(this, remarks, name);
-
- if (!remarks.isEmpty()) {
- StringBuilder stringRemarks = new StringBuilder();
- for (ICheckResult remark : remarks) {
- stringRemarks.append(remark.toString()).append(Const.CR);
- }
- throw new HopTransformException(stringRemarks.toString());
+ public Plc4xReadMeta(Plc4xReadMeta m) {
+ this.connection = m.connection;
+ this.neverEnding = m.neverEnding;
+ this.intervalInMs = m.intervalInMs;
+ this.rowTimeField = m.rowTimeField;
+ this.lastTimeField = m.lastTimeField;
+ this.rowLimit = m.rowLimit;
+ this.fields = new ArrayList<>();
+ for (Plc4xGeneratorField field : m.fields) {
+ this.fields.add(new Plc4xGeneratorField(field));
}
-
- for (IValueMeta valueMeta : rowMetaAndData.getRowMeta().getValueMetaList()) {
- valueMeta.setOrigin(name);
- }
-
- inputRowMeta.mergeRowMeta(rowMetaAndData.getRowMeta());
- } catch (Exception e) {
- throw new HopTransformException(e);
}
- }
+ public Plc4xReadMeta clone() {
+ return new Plc4xReadMeta(this);
+ }
- public Plc4xRead createTransform(TransformMeta transformMeta, Plc4xReadData data, int copyNr,
- PipelineMeta pipelineMeta, Pipeline pipeline ) {
- return new Plc4xRead( transformMeta, this, data, copyNr, pipelineMeta, pipeline );
- }
+ public void getFields(IRowMeta inputRowMeta, String name, IRowMeta[] info, TransformMeta nextTransform,
+ IVariables variables, IHopMetadataProvider metadataProvider) throws HopTransformException {
+ try {
+ List<ICheckResult> remarks = new ArrayList<>();
+ RowMetaAndData rowMetaAndData = Plc4xRead.buildRow(this, remarks, name);
+ if (!remarks.isEmpty()) {
+ StringBuilder stringRemarks = new StringBuilder();
+ for (ICheckResult remark : remarks) {
+ stringRemarks.append(remark.toString()).append(Const.CR);
+ }
+ throw new HopTransformException(stringRemarks.toString());
+ }
- public Plc4xReadData getTransformData() {
- return new Plc4xReadData();
- }
-
-/*
+ for (IValueMeta valueMeta : rowMetaAndData.getRowMeta().getValueMetaList()) {
+ valueMeta.setOrigin(name);
+ }
+
+ inputRowMeta.mergeRowMeta(rowMetaAndData.getRowMeta());
+ } catch (Exception e) {
+ throw new HopTransformException(e);
+ }
+ }
+
+ public Plc4xRead createTransform(TransformMeta transformMeta, Plc4xReadData data, int copyNr,
+ PipelineMeta pipelineMeta, Pipeline pipeline) {
+ return new Plc4xRead(transformMeta, this, data, copyNr, pipelineMeta, pipeline);
+ }
+
+ public Plc4xReadData getTransformData() {
+ return new Plc4xReadData();
+ }
+
+ /*
@Override
public void loadXml( Node transformNode, IHopMetadataProvider metadataProvider ) throws HopXmlException {
//load the saved values from the transformnode
String sampleValue = XmlHandler.getTagValue( transformNode, "sampleValue" );
}
-*/
- @Override
- public void setDefault() {
- //default values when creating a new transform
- }
-
-
- /**
- * Returns the Input/Output metadata for this transform.
- * The generator transform only produces output, does not accept input!
- * TransformIOMeta(inputAcceptor, outputProducer, inputOptional, outputDynamic, inputDynamic)
- */
- @Override
- public ITransformIOMeta getTransformIOMeta() {
- return new TransformIOMeta(false, true, false, false, false, false);
- }
+ */
+ @Override
+ public void setDefault() {
+ //default values when creating a new transform
+ }
- /**
- * Gets Plc4xConnection metadata name.
- *
- * @return value of intervalInMs
- */
- public String getConnection() {
- return connection;
- }
-
- /** @param connection */
- public void setConnection(String connection) {
- this.connection = connection;
- }
-
-
- /**
- * Gets neverEnding
- *
- * @return value of neverEnding
- */
- public boolean isNeverEnding() {
- return neverEnding;
- }
-
- /** @param neverEnding The neverEnding to set */
- public void setNeverEnding(boolean neverEnding) {
- this.neverEnding = neverEnding;
- }
-
/**
- * Gets intervalInMs
- *
- * @return value of intervalInMs
- */
- public String getMaxwaitInMs() {
- return maxwaitInMs;
- }
+ * Returns the Input/Output metadata for this transform. The generator
+ * transform only produces output, does not accept input!
+ * TransformIOMeta(inputAcceptor, outputProducer, inputOptional,
+ * outputDynamic, inputDynamic)
+ */
+ @Override
+ public ITransformIOMeta getTransformIOMeta() {
+ return new TransformIOMeta(true, true, false, false, false, false);
+ }
- /** @param intervalInMs The intervalInMs to set */
- public void setMaxwaitInMs(String maxwaitInMs) {
- this.maxwaitInMs = maxwaitInMs;
- }
+ /**
+ * Gets Plc4xConnection metadata name.
+ *
+ * @return value of intervalInMs
+ */
+ public String getConnection() {
+ return connection;
+ }
- /**
- * Gets intervalInMs
- *
- * @return value of intervalInMs
- */
- public String getIntervalInMs() {
- return intervalInMs;
- }
+ /**
+ * @param connection
+ */
+ public void setConnection(String connection) {
+ this.connection = connection;
+ }
- /** @param intervalInMs The intervalInMs to set */
- public void setIntervalInMs(String intervalInMs) {
- this.intervalInMs = intervalInMs;
- }
+ /**
+ * Gets neverEnding
+ *
+ * @return value of neverEnding
+ */
+ public boolean isNeverEnding() {
+ return neverEnding;
+ }
- /**
- * Gets rowTimeField
- *
- * @return value of rowTimeField
- */
- public String getRowTimeField() {
- return rowTimeField;
- }
+ /**
+ * @param neverEnding The neverEnding to set
+ */
+ public void setNeverEnding(boolean neverEnding) {
+ this.neverEnding = neverEnding;
+ }
- /** @param rowTimeField The rowTimeField to set */
- public void setRowTimeField(String rowTimeField) {
- this.rowTimeField = rowTimeField;
- }
+ /**
+ * Gets intervalInMs
+ *
+ * @return value of intervalInMs
+ */
+ public String getMaxwaitInMs() {
+ return maxwaitInMs;
+ }
- /**
- * Gets lastTimeField
- *
- * @return value of lastTimeField
- */
- public String getLastTimeField() {
- return lastTimeField;
- }
+ /**
+ * @param intervalInMs The intervalInMs to set
+ */
+ public void setMaxwaitInMs(String maxwaitInMs) {
+ this.maxwaitInMs = maxwaitInMs;
+ }
- /** @param lastTimeField The lastTimeField to set */
- public void setLastTimeField(String lastTimeField) {
- this.lastTimeField = lastTimeField;
- }
+ /**
+ * Gets intervalInMs
+ *
+ * @return value of intervalInMs
+ */
+ public String getIntervalInMs() {
+ return intervalInMs;
+ }
- /**
- * Gets rowLimit
- *
- * @return value of rowLimit
- */
- public String getRowLimit() {
- return rowLimit;
- }
+ /**
+ * @param intervalInMs The intervalInMs to set
+ */
+ public void setIntervalInMs(String intervalInMs) {
+ this.intervalInMs = intervalInMs;
+ }
- /** @param rowLimit The rowLimit to set */
- public void setRowLimit(String rowLimit) {
- this.rowLimit = rowLimit;
- }
+ /**
+ * Gets rowTimeField
+ *
+ * @return value of rowTimeField
+ */
+ public String getRowTimeField() {
+ return rowTimeField;
+ }
- /**
- * Gets fields
- *
- * @return value of fields
- */
- public List<Plc4xGeneratorField> getFields() {
- return fields;
- }
-
- /** @param fields The fields to set */
- public void setFields(List<Plc4xGeneratorField> fields) {
- this.fields = fields;
- }
-
+ /**
+ * @param rowTimeField The rowTimeField to set
+ */
+ public void setRowTimeField(String rowTimeField) {
+ this.rowTimeField = rowTimeField;
+ }
+
+ /**
+ * Gets lastTimeField
+ *
+ * @return value of lastTimeField
+ */
+ public String getLastTimeField() {
+ return lastTimeField;
+ }
+
+ /**
+ * @param lastTimeField The lastTimeField to set
+ */
+ public void setLastTimeField(String lastTimeField) {
+ this.lastTimeField = lastTimeField;
+ }
+
+ /**
+ * Gets rowLimit
+ *
+ * @return value of rowLimit
+ */
+ public String getRowLimit() {
+ return rowLimit;
+ }
+
+ /**
+ * @param rowLimit The rowLimit to set
+ */
+ public void setRowLimit(String rowLimit) {
+ this.rowLimit = rowLimit;
+ }
+
+ /**
+ * Gets fields
+ *
+ * @return value of fields
+ */
+ public List<Plc4xGeneratorField> getFields() {
+ return fields;
+ }
+
+ /**
+ * @param fields The fields to set
+ */
+ public void setFields(List<Plc4xGeneratorField> fields) {
+ this.fields = fields;
+ }
+
+ @Override
+ public boolean supportsErrorHandling() {
+ return true;
+ }
+
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWrite.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWrite.java
index bf71bf6..5f972d3 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWrite.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWrite.java
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.plc4x.hop.transforms.plc4xoutput;
import java.util.ArrayList;
@@ -32,6 +31,7 @@
import org.apache.hop.core.RowMetaAndData;
import org.apache.hop.core.exception.HopException;
import org.apache.hop.core.exception.HopPluginException;
+import org.apache.hop.core.exception.HopTransformException;
import org.apache.hop.core.exception.HopValueException;
import org.apache.hop.core.logging.LogLevel;
import org.apache.hop.core.row.IRowMeta;
@@ -54,10 +54,15 @@
import org.apache.plc4x.hop.transforms.util.Plc4xGeneratorField;
import org.apache.plc4x.hop.transforms.util.Plc4xPlcTag;
import org.apache.plc4x.hop.metadata.util.Plc4xWrapperConnection;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.BOOL;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.BYTE;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.REAL;
+import static org.apache.plc4x.hop.transforms.util.Plc4xDataType.WORD;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
import org.apache.plc4x.java.api.messages.PlcWriteRequest;
import org.apache.plc4x.java.api.messages.PlcWriteResponse;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
import org.openide.util.Lookup;
/**
@@ -66,177 +71,179 @@
*/
public class Plc4xWrite extends BaseTransform<Plc4xWriteMeta, Plc4xWriteData> {
- private static final Class<?> PKG = Plc4xWrite.class; // Needed by Translator
-
- private Plc4xConnection connmeta = null;
- private Plc4xWrapperConnection connwrapper = null;
- private PlcWriteRequest writeRequest = null;
- private PlcWriteRequest.Builder builder = null;
- private PlcWriteResponse writeResponse = null;
-
- private Plc4xLookup lookup = Plc4xLookup.getDefault();
- private Lookup.Template template = null;
- private Lookup.Result<Plc4xWrapperConnection> result = null;
-
- private static final ReentrantLock lock = new ReentrantLock();
-
- private static final String dummy = "dummy";
-
- private Map<String, Integer> index = new HashMap();
- private Map<String, Plc4xPlcTag> plcfields = new HashMap();
+ private static final Class<?> PKG = Plc4xWrite.class; // Needed by Translator
- public Plc4xWrite(TransformMeta transformMeta, Plc4xWriteMeta meta, Plc4xWriteData data, int copyNr, PipelineMeta pipelineMeta,
- Pipeline pipeline ) {
- super( transformMeta, meta, data, copyNr, pipelineMeta, pipeline );
- }
+ private Object[] r = null;
- /*
+ private Plc4xConnection connmeta = null;
+ private Plc4xWrapperConnection connwrapper = null;
+ private PlcWriteRequest writeRequest = null;
+ private PlcWriteRequest.Builder builder = null;
+ private PlcWriteResponse writeResponse = null;
+
+ private Plc4xLookup lookup = Plc4xLookup.getDefault();
+ private Lookup.Template template = null;
+ private Lookup.Result<Plc4xWrapperConnection> result = null;
+
+ private static final ReentrantLock lock = new ReentrantLock();
+
+ private static final String dummy = "dummy";
+
+ private Map<String, Integer> index = new HashMap();
+ private Map<String, Plc4xPlcTag> plcfields = new HashMap();
+
+ public Plc4xWrite(TransformMeta transformMeta, Plc4xWriteMeta meta, Plc4xWriteData data, int copyNr, PipelineMeta pipelineMeta,
+ Pipeline pipeline) {
+ super(transformMeta, meta, data, copyNr, pipelineMeta, pipeline);
+ }
+
+ /*
* Including Date and Time field for every row
*
* @param meta Meta data from user dialog
* @param remarks Error registers
* @param origin transform instance name
- */
- public static final RowMetaAndData buildRow(
- Plc4xWriteMeta meta, List<ICheckResult> remarks, String origin) throws HopPluginException {
- IRowMeta rowMeta = new RowMeta();
- Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
- int index = 0;
+ */
+ public static final RowMetaAndData buildRow(
+ Plc4xWriteMeta meta, List<ICheckResult> remarks, String origin) throws HopPluginException {
+ IRowMeta rowMeta = new RowMeta();
+ Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
+ int index = 0;
- if (!Utils.isEmpty(meta.getRowTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
- rowData[index++] = null;
- }
-
- if (!Utils.isEmpty(meta.getLastTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
- rowData[index++] = null;
- }
-
- for (Plc4xGeneratorField field : meta.getFields()) {
- int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
- if (StringUtils.isNotEmpty(field.getType())) {
- IValueMeta valueMeta =
- ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
- // value!
- valueMeta.setLength(field.getLength());
- valueMeta.setPrecision(field.getPrecision());
- valueMeta.setConversionMask(field.getFormat());
- valueMeta.setCurrencySymbol(field.getCurrency());
- valueMeta.setGroupingSymbol(field.getGroup());
- valueMeta.setDecimalSymbol(field.getDecimal());
- valueMeta.setOrigin(origin);
-
- IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
-
- if (field.isSetEmptyString()) {
- // Set empty string
- rowData[index] = StringUtil.EMPTY_STRING;
- } else {
- String stringValue = field.getValue();
-
- // If the value is empty: consider it to be NULL.
- if (Utils.isEmpty(stringValue)) {
- rowData[index] = null;
-
- if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- }
- } else {
- // Convert the data from String to the specified type ...
- //
- try {
- rowData[index] = valueMeta.convertData(stringMeta, stringValue);
- } catch (HopValueException e) {
- switch (valueMeta.getType()) {
- case IValueMeta.TYPE_NUMBER:
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_DATE:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_INTEGER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_BIGNUMBER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_TIMESTAMP:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- default:
- // Boolean and binary don't throw errors normally, so it's probably an unspecified
- // error problem...
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
- }
- }
- }
+ if (!Utils.isEmpty(meta.getRowTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
+ rowData[index++] = null;
}
- // Now add value to the row!
- // This is in fact a copy from the fields row, but now with data.
- rowMeta.addValueMeta(valueMeta);
- index++;
- }
+ if (!Utils.isEmpty(meta.getLastTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
+ rowData[index++] = null;
+ }
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
+ if (StringUtils.isNotEmpty(field.getType())) {
+ IValueMeta valueMeta
+ = ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
+ // value!
+ valueMeta.setLength(field.getLength());
+ valueMeta.setPrecision(field.getPrecision());
+ valueMeta.setConversionMask(field.getFormat());
+ valueMeta.setCurrencySymbol(field.getCurrency());
+ valueMeta.setGroupingSymbol(field.getGroup());
+ valueMeta.setDecimalSymbol(field.getDecimal());
+ valueMeta.setOrigin(origin);
+
+ IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
+
+ if (field.isSetEmptyString()) {
+ // Set empty string
+ rowData[index] = StringUtil.EMPTY_STRING;
+ } else {
+ String stringValue = field.getValue();
+
+ // If the value is empty: consider it to be NULL.
+ if (Utils.isEmpty(stringValue)) {
+ rowData[index] = null;
+
+ if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ }
+ } else {
+ // Convert the data from String to the specified type ...
+ //
+ try {
+ rowData[index] = valueMeta.convertData(stringMeta, stringValue);
+ } catch (HopValueException e) {
+ switch (valueMeta.getType()) {
+ case IValueMeta.TYPE_NUMBER:
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_DATE:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_INTEGER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_BIGNUMBER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_TIMESTAMP:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ default:
+ // Boolean and binary don't throw errors normally, so it's probably an unspecified
+ // error problem...
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+ }
+ }
+ }
+ }
+
+ // Now add value to the row!
+ // This is in fact a copy from the fields row, but now with data.
+ rowMeta.addValueMeta(valueMeta);
+ index++;
+ }
+ }
+
+ return new RowMetaAndData(rowMeta, rowData);
}
- return new RowMetaAndData(rowMeta, rowData);
- }
-
- /*
+ /*
* 1. Stores the indexes of the incoming fields from the user's selection.
* It is only done during the first cycle.
* 2. Block the other instances by means of a lock.
@@ -247,249 +254,103 @@
* 6. If the connection to the PLC is made, then it creates the query
* and executes it.
*
- */
- @Override
- public boolean processRow() throws HopException {
- final Object[] r = getRow(); // Get row from input rowset & set row busy!
-
- if (r == null) {
- setOutputDone();
- return false;
- }
-
- data.outputRowMeta = getInputRowMeta();
-
- first = true;
- if (first) {
- index.clear();
- plcfields.clear();
- meta.getFields().forEach((f) ->{
- Integer i = getInputRowMeta().indexOfValue(f.getName()); //(01)
- if (i>=0) {
- logDebug(">> i: " + i + " : " + f.getName() + " : " + f.getItem());
- index.put(f.getName(), i);
- plcfields.put(f.getName(), Plc4xPlcTag.of(f.getItem()));
- }
- });
- first = false;
- }
-
- IRowMeta inputRowMeta = getInputRowMeta();
+ */
+ @Override
+ public boolean processRow() throws HopException {
+// final Object[] r = getRow(); // Get row from input rowset & set row busy!
+ r = getRow();
- setLogLevel(LogLevel.DEBUG);
-
- if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
-
-// lock.lock(); //(02)
-// try {
-//
-// IHopMetadataProvider metaprovider = getMetadataProvider();
-// connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
-//
-// if (connwrapper == null) {
-// template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null); //(03)
-// result = lookup.lookup(template);
-// if (!result.allItems().isEmpty()) {
-// System.out.println("Aqui encontro la conexion: " + meta.getConnection());
-// connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
-// if (connwrapper != null) connwrapper.retain();
-// }
-// };
-//
-// if (connmeta == null){
-// logError(
-// BaseMessages.getString(
-// PKG,
-// "Plc4x.Read.Meta.Log.SetMetadata",
-// meta.getConnection()));
-// }
-//
-// if ((connmeta != null) && (connwrapper == null)){
-// writeRequest = null;
-// try{
-// System.out.println("Creo una nueva conexión...");
-// PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(04)
-//
-// if (conn.isConnected()) {
-// System.out.println("**** Agrego la segunda conexion. ****");
-// connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
-// lookup.add(connwrapper); //(05)
-// }
-//
-// } catch (Exception ex){
-// setErrors(1L);
-// logError("Unable to create connection to PLC. " + ex.getMessage());
-// }
-// }
-//
-// } finally {
-// lock.unlock();
-// }
-
- if ((connmeta != null) && (connwrapper != null)){
- if (connwrapper.getConnection().isConnected()){
- logDebug(">>>> Paso por aqui!");
- builder = null;
- builder = connwrapper.getConnection().writeRequestBuilder(); //(05)
- Integer i;
- for (Plc4xGeneratorField field: meta.getFields()){
- logDebug(">>>> Paso por aqui! 22");
- i = index.get(field.getName());
- if (i != null) {
- //From Input Type
- logDebug(">>>> Paso por aqui! 33: " + inputRowMeta.getValueMeta(i).getTypeDesc() + " : " + field.getType());
- if (inputRowMeta.getValueMeta(i).getTypeDesc().
- equalsIgnoreCase(field.getType()))
- switch(inputRowMeta.getValueMeta(i).getType()) {
- case IValueMeta.TYPE_BOOLEAN:
- case IValueMeta.TYPE_INTEGER:
- case IValueMeta.TYPE_NUMBER:
- case IValueMeta.TYPE_BIGNUMBER:
- Object value= null;
- switch(plcfields.get(field.getName()).getDataType()) {
- case BOOL:
- case BYTE:
- case WORD:
- value = Short.parseShort(r[i].toString());
- break;
- case REAL:
- value = Float.parseFloat(r[i].toString());
- break;
- }
-
- logDebug(">>>> " + field.getName() + " : " + field.getItem() + " : " + r[i] + " : " + plcfields.get(field.getName()).getDataType().name());
- builder.addTagAddress(field.getName(),
- field.getItem(),
- value);
- break;
- case IValueMeta.TYPE_DATE:
- builder.addTagAddress(field.getName(),
- field.getItem(),
- Double.parseDouble(inputRowMeta.getString(r, i)));
- break;
- case IValueMeta.TYPE_TIMESTAMP:
- builder.addTagAddress(field.getName(),
- field.getItem(),
- Double.parseDouble(inputRowMeta.getString(r, i)));
- break;
- case IValueMeta.TYPE_INET:
- builder.addTagAddress(field.getName(),
- field.getItem(),
- Double.parseDouble(inputRowMeta.getString(r, i)));
- break;
- case IValueMeta.TYPE_STRING:
- builder.addTagAddress(field.getName(),
- field.getItem(),
- Double.parseDouble(inputRowMeta.getString(r, i)));
- break;
- case IValueMeta.TYPE_SERIALIZABLE:
- builder.addTagAddress(field.getName(),
- field.getItem(),
- Double.parseDouble(inputRowMeta.getString(r, i)));
- break;
-
- }
- //field.setValue(inputRowMeta.getString(r, i));
- };
- }
-
- writeRequest = builder.build();
-
- try {
- int maxwait = Integer.parseInt(meta.getMaxwaitInMs());
- maxwait = (maxwait<100)?100:maxwait;
- writeResponse = writeRequest.execute().get(maxwait, TimeUnit.MILLISECONDS);
-
- if (isDebug())
- index.forEach((n,y)->{
- logDebug("Result: " + writeResponse.getResponseCode(n));
- });
-
- } catch (Exception ex) {
- setErrors(1L);
- logError("Unable write to PLC. " + ex.getMessage());
- }
-
- } else {
- setErrors(1L);
- logError("PLC is not connected.");
+ if (r == null) {
setOutputDone();
- return false;
+ return false;
}
-
- } else {
- setErrors(1L);
- logError("PLC connection don't exist.");
- setOutputDone();
- return false;
+
+ data.outputRowMeta = getInputRowMeta();
+
+ first = true;
+ if (first) {
+ index.clear();
+ plcfields.clear();
+ meta.getFields().forEach((f) -> {
+ final Integer i = getInputRowMeta().indexOfValue(f.getName()); //(01)
+ if (i >= 0) {
+ index.put(f.getName(), i);
+ plcfields.put(f.getName(), Plc4xPlcTag.of(f.getItem()));
+ }
+ });
+ first = false;
+ }
+
+ if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
+ setOutputDone(); // signal end to receiver(s)
+ return false;
+ }
+
+ if (!RegisterPlcTags()) {
+ return false;
+ }
+ GetWrites();
+
+ putRow(data.outputRowMeta, r); // return your data
+ data.rowsWritten++;
+ return true;
}
-
- putRow(data.outputRowMeta, r); // return your data
- data.rowsWritten++;
- return true;
- }
+ @Override
+ public boolean init() {
+ try {
+ if (super.init()) {
+ // Determine the number of rows to generate...
+ data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
+ data.rowsWritten = 0L;
+ data.delay = Const.toLong(resolve(meta.getIntervalInMs()), -1L);
+ if (data.rowLimit < 0L) { // Unable to parse
+ logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
+ return false; // fail
+ }
- @Override
- public boolean init() {
- System.out.println("*************** INIT *****************");
- try {
- if(super.init()){
- // Determine the number of rows to generate...
- data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
- data.rowsWritten = 0L;
- data.delay = Const.toLong(resolve(meta.getIntervalInMs()), -1L);
+ // Create a row (constants) with all the values in it...
+ List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
+ RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
+ if (!remarks.isEmpty()) {
+ for (int i = 0; i < remarks.size(); i++) {
+ CheckResult cr = (CheckResult) remarks.get(i);
+ logError(cr.getText());
+ }
+ return false;
+ }
- if (data.rowLimit < 0L) { // Unable to parse
- logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
- return false; // fail
- }
-
- // Create a row (constants) with all the values in it...
- List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
- RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
- if (!remarks.isEmpty()) {
- for (int i = 0; i < remarks.size(); i++) {
- CheckResult cr = (CheckResult) remarks.get(i);
- logError(cr.getText());
- }
- return false;
+ data.outputRowData = outputRow.getData();
+ data.outputRowMeta = outputRow.getRowMeta();
+
+ getPlcConnection();
+
+ return true;
}
-
- data.outputRowData = outputRow.getData();
- data.outputRowMeta = outputRow.getRowMeta();
-
- getPlcConnection();
-
- return true;
+ return false;
+ } catch (Exception ex) {
+ setErrors(1L);
+ logError("Error initializing transform", ex);
+ return false;
}
- return false;
- } catch (Exception ex){
- setErrors(1L);
- logError("Error initializing transform", ex);
- return false;
+
}
- }
-
- /*
- * Here, must perform the cleaning of any resource, main of the connection to
- * the associated PLC.
- */
+ /*
+ * Here, must perform the cleaning of any resource, main of the connection to
+ * the associated PLC.
+ */
@Override
public void cleanup() {
- System.out.println("*************** CLEANUP *****************");
super.cleanup();
logBasic("Cleanup. Release connection.");
if (connwrapper != null) {
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
+ if (connwrapper.refCnt() <= 0) {
lookup.remove(connwrapper);
- }
+ }
+ }
}
@@ -499,22 +360,22 @@
* 2. Release de reference to object.
* 3. The lastone remove the global reference to connection wrapper.
* 4. Clear local references.
- */
+ */
@Override
public void dispose() {
- System.out.println("*************** DISPOSE *****************");
super.dispose();
if (connwrapper != null) {
- logBasic("Dispose. Release connection: " + connwrapper.refCnt());
+ logBasic("Dispose. Release connection: " + connwrapper.refCnt());
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
- lookup.remove(connwrapper);
+ if (connwrapper.refCnt() <= 0) {
+ lookup.remove(connwrapper);
+ }
connwrapper = null;
writeRequest = null;
}
}
-
+
private void getPlcConnection() {
lock.lock(); //(01)
try {
@@ -522,48 +383,171 @@
IHopMetadataProvider metaprovider = getMetadataProvider();
connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
+ if (connwrapper == null) {
+ template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
result = lookup.lookup(template);
if (!result.allItems().isEmpty()) {
- System.out.println("Aqui encontro la conexion: " + meta.getConnection());
+ logBasic("Using connection: " + meta.getConnection());
connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
- if (connwrapper != null) connwrapper.retain();
+ if (connwrapper != null) {
+ connwrapper.retain();
+ }
}
};
- if (connmeta == null){
+ if (connmeta == null) {
logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.Log.SetMetadata",
+ meta.getConnection()));
}
- if ((connmeta != null) && (connwrapper == null)){
+ if ((connmeta != null) && (connwrapper == null)) {
writeRequest = null;
- try{
- System.out.println("Creo una nueva conexión...");
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
-
+ try {
+ final PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
+ Thread.sleep(200);
if (conn.isConnected()) {
- System.out.println("**** Agrego la segunda conexion. ****");
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
+ logBasic("Create new connection with url : " + connmeta.getUrl());
+ connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
lookup.add(connwrapper);
}
- } catch (Exception ex){
+ } catch (Exception ex) {
setErrors(1L);
logError("Unable to create connection to PLC. " + ex.getMessage());
}
}
} catch (HopException ex) {
- Logger.getLogger(Plc4xWrite.class.getName()).log(Level.SEVERE, null, ex);
+ Logger.getLogger(Plc4xWrite.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
- }
- }
-
-
+ }
+ }
+
+ /*
+ * Registers the tags to write.
+ * In the first processing of the rows, a check of the tags is
+ * carried out in order that they are well formed, generating an exception
+ * if they are not.
+ */
+ public boolean RegisterPlcTags() {
+ if ((connmeta != null) && (connwrapper != null)) {
+ if (connwrapper.getConnection().isConnected()) {
+ builder = null;
+ builder = connwrapper.getConnection().writeRequestBuilder(); //(05)
+ Integer i = null;
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ try {
+ i = index.get(field.getName());
+ if (i != null) {
+ //From Input Type
+ if (getInputRowMeta().getValueMeta(i).getTypeDesc().
+ equalsIgnoreCase(field.getType())) {
+ switch (getInputRowMeta().getValueMeta(i).getType()) {
+ case IValueMeta.TYPE_BOOLEAN:
+ case IValueMeta.TYPE_INTEGER:
+ case IValueMeta.TYPE_NUMBER:
+ case IValueMeta.TYPE_BIGNUMBER:
+ Object value = null;
+ switch (plcfields.get(field.getName()).getDataType()) {
+ case BOOL:
+ case BYTE:
+ case WORD:
+ value = Short.parseShort(r[i].toString());
+ break;
+ case REAL:
+ value = Float.parseFloat(r[i].toString());
+ break;
+ }
+
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ value);
+ break;
+ case IValueMeta.TYPE_DATE:
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ Double.parseDouble(getInputRowMeta().getString(r, i)));
+ break;
+ case IValueMeta.TYPE_TIMESTAMP:
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ Double.parseDouble(getInputRowMeta().getString(r, i)));
+ break;
+ case IValueMeta.TYPE_INET:
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ Double.parseDouble(getInputRowMeta().getString(r, i)));
+ break;
+ case IValueMeta.TYPE_STRING:
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ Double.parseDouble(getInputRowMeta().getString(r, i)));
+ break;
+ case IValueMeta.TYPE_SERIALIZABLE:
+ builder.addTagAddress(field.getName(),
+ field.getItem(),
+ Double.parseDouble(getInputRowMeta().getString(r, i)));
+ break;
+
+ }
+ }
+ //field.setValue(inputRowMeta.getString(r, i));
+ };
+ } catch (HopValueException ex) {
+ try {
+ putError(getInputRowMeta(), r, 1,
+ "Tag error!.", r[i].toString(),
+ ex.getMessage());
+ } catch (HopTransformException ex1) {
+ logError(ex1.toString());
+ }
+ }
+ }
+
+ writeRequest = builder.build();
+
+ } else {
+ setErrors(1L);
+ logError("PLC is not connected.");
+ setOutputDone();
+ return false;
+ }
+
+ } else {
+ setErrors(1L);
+ logError("PLC connection don't exist.");
+ setOutputDone();
+ return false;
+ }
+
+ return true;
+ }
+
+ public void GetWrites() {
+ try {
+ int maxwait = Integer.parseInt(meta.getMaxwaitInMs());
+ maxwait = (maxwait < 100) ? 100 : maxwait;
+ writeResponse = writeRequest.execute().get(2 * maxwait, TimeUnit.MILLISECONDS);
+ index.forEach((n, y) -> {
+ logDebug("Result: " + writeResponse.getResponseCode(n));
+ if (writeResponse.getResponseCode(n) != PlcResponseCode.OK) {
+ try {
+ putError(getInputRowMeta(), r, 1,
+ "Tag error.", n,
+ writeResponse.getResponseCode(n).toString());
+ } catch (HopTransformException ex) {
+ logError(ex.toString());
+ }
+ }
+ });
+ } catch (Exception ex) {
+ setErrors(1L);
+ logError("Unable write to PLC. " + ex.getMessage());
+ }
+ }
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWriteMeta.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWriteMeta.java
index d9461f6..d32959f 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWriteMeta.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xoutput/Plc4xWriteMeta.java
@@ -185,7 +185,7 @@
*/
@Override
public ITransformIOMeta getTransformIOMeta() {
- return new TransformIOMeta(false, true, false, false, false, false);
+ return new TransformIOMeta(true, true, false, false, false, false);
}
/**
@@ -295,10 +295,15 @@
public List<Plc4xGeneratorField> getFields() {
return fields;
}
-
+
/** @param fields The fields to set */
public void setFields(List<Plc4xGeneratorField> fields) {
this.fields = fields;
}
+ @Override
+ public boolean supportsErrorHandling() {
+ return true;
+ }
+
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xsubs/Plc4xSubs.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xsubs/Plc4xSubs.java
index 5ed2513..efc1dc7 100644
--- a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xsubs/Plc4xSubs.java
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/plc4xsubs/Plc4xSubs.java
@@ -14,7 +14,6 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-
package org.apache.plc4x.hop.transforms.plc4xsubs;
import java.time.Duration;
@@ -29,7 +28,10 @@
import java.util.function.Consumer;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.commons.codec.binary.BinaryCodec;
import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
import org.apache.hop.core.CheckResult;
import org.apache.hop.core.Const;
import org.apache.hop.core.ICheckResult;
@@ -62,195 +64,228 @@
import org.apache.plc4x.hop.transforms.plc4xinput.Plc4xRead;
import org.apache.plc4x.java.DefaultPlcDriverManager;
import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
+import org.apache.plc4x.java.api.listener.ConnectionStateListener;
import org.apache.plc4x.java.api.messages.PlcReadRequest;
import org.apache.plc4x.java.api.messages.PlcReadResponse;
import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
import org.apache.plc4x.java.api.messages.PlcSubscriptionRequest;
import org.apache.plc4x.java.api.messages.PlcSubscriptionResponse;
+import org.apache.plc4x.java.api.model.PlcConsumerRegistration;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.api.types.PlcValueType;
+import static org.apache.plc4x.java.api.types.PlcValueType.BYTE;
+import static org.apache.plc4x.java.api.types.PlcValueType.DATE;
+import static org.apache.plc4x.java.api.types.PlcValueType.DATE_AND_TIME;
+import static org.apache.plc4x.java.api.types.PlcValueType.DWORD;
+import static org.apache.plc4x.java.api.types.PlcValueType.LDATE;
+import static org.apache.plc4x.java.api.types.PlcValueType.LDATE_AND_TIME;
+import static org.apache.plc4x.java.api.types.PlcValueType.LTIME;
+import static org.apache.plc4x.java.api.types.PlcValueType.LWORD;
+import static org.apache.plc4x.java.api.types.PlcValueType.STRING;
+import static org.apache.plc4x.java.api.types.PlcValueType.TIME;
+import static org.apache.plc4x.java.api.types.PlcValueType.WORD;
+import org.apache.plc4x.java.s7.events.S7CyclicEvent;
import org.apache.plc4x.java.s7.events.S7Event;
+import org.apache.plc4x.java.s7.readwrite.protocol.S7HPlcConnection;
+import org.apache.plc4x.java.s7.readwrite.tag.S7SubscriptionTag;
+import org.apache.plc4x.java.spi.utils.hex.Hex;
import org.openide.util.Lookup;
/**
- * Transform That contains the basic skeleton needed to create your own plugin
+ *
*
*/
-public class Plc4xSubs extends BaseTransform<Plc4xSubsMeta, Plc4xSubsData> {
+public class Plc4xSubs extends BaseTransform<Plc4xSubsMeta, Plc4xSubsData> implements ConnectionStateListener {
private static final Class<?> PKG = Plc4xSubs.class; // Needed by Translator
private Plc4xConnection connmeta = null;
private Plc4xWrapperConnection connwrapper = null;
private PlcSubscriptionRequest subsRequest = null;
- private PlcSubscriptionResponse subsResponse = null;
+ private PlcSubscriptionResponse subsResponse = null;
+
+ private PlcConsumerRegistration csmr;
+
private int maxwait = 0;
private static final ReentrantLock lock = new ReentrantLock();
private Plc4xLookup lookup = Plc4xLookup.getDefault();
private Lookup.Template template = null;
- private Lookup.Result<Plc4xWrapperConnection> result = null;
+ private Lookup.Result<Plc4xWrapperConnection> result = null;
private ConcurrentLinkedQueue<PlcSubscriptionEvent> events = new ConcurrentLinkedQueue();
private boolean stopBundle = false;
+ private boolean isConnected = false;
- private static final String dummy = "dummy";
+ private String jobId = null;
- private Map<String, Integer> index = new HashMap();
- private Map<String, Plc4xPlcSubscriptionTag> plctags = new HashMap();
+ private BinaryCodec binarycodec = new BinaryCodec();
+
+ private static final String DUMMY = "dummy";
+ private static final String DATA = "DATA_";
+
+ private int counter = 0;
+ private String strData;
+ private PlcValueType valuetype = null;
+
+ private Map<String, String> tags_index = new HashMap();
+ private Map<String, Pair<String, S7SubscriptionTag>> plctags = new HashMap();
public Plc4xSubs(TransformMeta transformMeta, Plc4xSubsMeta meta, Plc4xSubsData data, int copyNr, PipelineMeta pipelineMeta,
- Pipeline pipeline ) {
- super( transformMeta, meta, data, copyNr, pipelineMeta, pipeline );
+ Pipeline pipeline) {
+ super(transformMeta, meta, data, copyNr, pipelineMeta, pipeline);
}
- /*
+ /*
* Including Date and Time field for every row
*
* @param meta Meta data from user dialog
* @param remarks Error registers
* @param origin transform instance name
- */
- public static final RowMetaAndData buildRow(
- Plc4xSubsMeta meta, List<ICheckResult> remarks, String origin) throws HopPluginException {
- IRowMeta rowMeta = new RowMeta();
- Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
- int index = 0;
+ */
+ public static final RowMetaAndData buildRow(
+ Plc4xSubsMeta meta, List<ICheckResult> remarks, String origin) throws HopPluginException {
+ IRowMeta rowMeta = new RowMeta();
+ Object[] rowData = RowDataUtil.allocateRowData(meta.getFields().size() + 2);
+ int index = 0;
- if (!Utils.isEmpty(meta.getRowTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
- rowData[index++] = null;
- }
-
- if (!Utils.isEmpty(meta.getLastTimeField())) {
- rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
- rowData[index++] = null;
- }
-
- for (Plc4xGeneratorField field : meta.getFields()) {
- int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
- if (StringUtils.isNotEmpty(field.getType())) {
-
- IValueMeta valueMeta =
- ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
- // value!
- valueMeta.setLength(field.getLength());
- valueMeta.setPrecision(field.getPrecision());
- valueMeta.setConversionMask(field.getFormat());
- valueMeta.setCurrencySymbol(field.getCurrency());
- valueMeta.setGroupingSymbol(field.getGroup());
- valueMeta.setDecimalSymbol(field.getDecimal());
- valueMeta.setOrigin(origin);
-
- IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
-
- if (field.isSetEmptyString()) {
- // Set empty string
- rowData[index] = StringUtil.EMPTY_STRING;
- } else {
- String stringValue = field.getValue();
-
- // If the value is empty: consider it to be NULL.
- if (Utils.isEmpty(stringValue)) {
- rowData[index] = null;
-
- if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- }
- } else {
- // Convert the data from String to the specified type ...
- //
- try {
-
- rowData[index] = valueMeta.convertData(stringMeta, stringValue);
- } catch (HopValueException e) {
- switch (valueMeta.getType()) {
- case IValueMeta.TYPE_NUMBER:
- String message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_DATE:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_INTEGER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_BIGNUMBER:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- case IValueMeta.TYPE_TIMESTAMP:
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
- valueMeta.getName(),
- stringValue,
- e.toString());
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
-
- default:
- // Boolean and binary don't throw errors normally, so it's probably an unspecified
- // error problem...
- message =
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
- valueMeta.getName(),
- stringValue);
- remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
- break;
- }
- }
- }
+ if (!Utils.isEmpty(meta.getRowTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getRowTimeField()));
+ rowData[index++] = null;
}
- // Now add value to the row!
- // This is in fact a copy from the fields row, but now with data.
- rowMeta.addValueMeta(valueMeta);
- index++;
- }
+ if (!Utils.isEmpty(meta.getLastTimeField())) {
+ rowMeta.addValueMeta(new ValueMetaDate(meta.getLastTimeField()));
+ rowData[index++] = null;
+ }
+
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ int typeString = ValueMetaFactory.getIdForValueMeta(field.getType());
+ if (StringUtils.isNotEmpty(field.getType())) {
+
+ IValueMeta valueMeta
+ = ValueMetaFactory.createValueMeta(field.getName(), typeString); // build a
+ // value!
+ valueMeta.setLength(field.getLength());
+ valueMeta.setPrecision(field.getPrecision());
+ valueMeta.setConversionMask(field.getFormat());
+ valueMeta.setCurrencySymbol(field.getCurrency());
+ valueMeta.setGroupingSymbol(field.getGroup());
+ valueMeta.setDecimalSymbol(field.getDecimal());
+ valueMeta.setOrigin(origin);
+
+ IValueMeta stringMeta = ValueMetaFactory.cloneValueMeta(valueMeta, IValueMeta.TYPE_STRING);
+
+ if (field.isSetEmptyString()) {
+ // Set empty string
+ rowData[index] = StringUtil.EMPTY_STRING;
+ } else {
+ String stringValue = field.getValue();
+
+ // If the value is empty: consider it to be NULL.
+ if (Utils.isEmpty(stringValue)) {
+ rowData[index] = null;
+
+ if (valueMeta.getType() == IValueMeta.TYPE_NONE) {
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ }
+ } else {
+ // Convert the data from String to the specified type ...
+ //
+ try {
+ System.out.println("stringValue: " + stringValue);
+ rowData[index] = valueMeta.convertData(stringMeta, stringValue);
+ } catch (HopValueException e) {
+ switch (valueMeta.getType()) {
+ case IValueMeta.TYPE_NUMBER:
+ String message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Number",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_DATE:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Date",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_INTEGER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Integer",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_BIGNUMBER:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.BigNumber",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ case IValueMeta.TYPE_TIMESTAMP:
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.BuildRow.Error.Parsing.Timestamp",
+ valueMeta.getName(),
+ stringValue,
+ e.toString());
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+
+ default:
+ // Boolean and binary don't throw errors normally, so it's probably an unspecified
+ // error problem...
+ message
+ = BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.CheckResult.SpecifyTypeError",
+ valueMeta.getName(),
+ stringValue);
+ remarks.add(new CheckResult(ICheckResult.TYPE_RESULT_ERROR, message, null));
+ break;
+ }
+ }
+ }
+ }
+
+ // Now add value to the row!
+ // This is in fact a copy from the fields row, but now with data.
+ rowMeta.addValueMeta(valueMeta);
+ index++;
+ }
+ }
+
+ return new RowMetaAndData(rowMeta, rowData);
}
- return new RowMetaAndData(rowMeta, rowData);
- }
-
- /*
+ /*
* 1. Block the other instances by means of a lock.
* 2. Try to locate an existing connection.
* 3. If it doesn't exist, it tries to take control of the routine to
@@ -259,199 +294,275 @@
* 5. If the connection to the PLC is made, then it creates the query
* and executes it.
*
- */
- @Override
- public boolean processRow() throws HopException {
- Object[] r = getRow(); // Get row from input rowset & set row busy!
- setLogLevel(LogLevel.DEBUG);
-
- if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
-
- if (first) {
- index.clear();
- plctags.clear();
- //This performs a minimal check on the user item.
- //It guarantees that the rates are within those managed by Plc4x.
- meta.getFields().forEach((f) ->{
- plctags.put(f.getName(),Plc4xPlcSubscriptionTag.of(f.getItem()));
- });
- first = false;
- }
-
- lock.lock(); //(01)
- try {
- IHopMetadataProvider metaprovider = getMetadataProvider();
- connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- System.out.println("PASO 02");
- connwrapper = (Plc4xWrapperConnection) getPipeline().getExtensionDataMap().get(meta.getConnection()); //(02)
- if (connwrapper != null) connwrapper.retain();
- };
+ */
+ @Override
+ public boolean processRow() throws HopException {
+ Object[] r = getRow(); // Get row from input rowset & set row busy!
+ setLogLevel(LogLevel.DEBUG);
- if (connmeta == null){
- logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ if ((!meta.isNeverEnding() && data.rowsWritten >= data.rowLimit) && !isStopped()) {
+ setOutputDone(); // signal end to receiver(s)
+ return false;
}
- if ((connmeta != null) && (connwrapper == null)){
- subsRequest = null;
- try{
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
- if (conn.isConnected()) {
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
- getPipeline().getExtensionDataMap().put(meta.getConnection(), connwrapper); //(04)
+ if (first) {
+ plctags.clear();
+ //This performs a minimal check on the user item.
+ //It guarantees that the rates are within those managed by Plc4x.
+ meta.getFields().forEach((f) -> {
+ plctags.put(f.getName(), new ImmutablePair(f.getName(), S7SubscriptionTag.of(f.getItem())));
+ });
+ first = false;
+ }
+
+ // If we do not have the jobId, it is because we have not completed
+ // the CYC subscription.
+ if ((null == jobId) && (null == subsRequest)) {
+ RegisterPlcTags();
+ GetSubscriptions();
+ RegisterCYCHandler();
+ }
+
+ while (events.size() == 0) {
+ try {
+ Thread.sleep(100);
+ if (stopBundle) {
+ setOutputDone(); // signal end to receiver(s)
+ return false;
}
- } catch (Exception ex){
- setErrors(1L);
- logError("Unable to create connection to PLC. " + ex.getMessage());
+ } catch (InterruptedException ex) {
+ break;
}
}
- } finally {
- lock.unlock();
- }
-
- if ((connmeta != null) && (connwrapper != null)){
- if (connwrapper.getConnection().isConnected()){
- if (subsRequest == null){
- PlcSubscriptionRequest.Builder builder = connwrapper.getConnection().subscriptionRequestBuilder(); //(05)
- for (Plc4xGeneratorField field: meta.getFields()){
- System.out.println(field.getName() + " : " + field.getItem().toString());
- builder.addCyclicTagAddress(field.getName(), field.getItem().toString(), Duration.ofMillis(1000));
- }
- System.out.println("PASO: 05");
- subsRequest = builder.build();
- }
- try {
- maxwait = Integer.parseInt(meta.getMaxwaitInMs());
- maxwait = (maxwait<1000)?1000:maxwait;
- System.out.println("PASO: 06");
- subsResponse = subsRequest.execute().get();
- System.out.println("PASO: 07");
- //Only for Siemens S7
- subsResponse.getSubscriptionHandles().forEach(a -> a.register(e -> events.add(e)));
- System.out.println("PASO: 08");
- } catch (Exception ex) {
- setErrors(1L);
- logError("Unable read from PLC. " + ex.getMessage());
- ex.printStackTrace();
- }
-
- } else {
- setErrors(1L);
- logError("PLC is not connected.");
- setOutputDone();
- return false;
+
+ S7CyclicEvent s7event = (S7CyclicEvent) events.poll();
+ //System.out.println("Ejecuto el consumidor en el cliente..." + s7event.getTagNames());
+
+ r = data.outputRowMeta.cloneRow(data.outputRowData);
+
+ //s7event.getTimestamp() Takes the time sent by the PLC
+ data.prevDate = data.rowDate;
+ data.rowDate = Date.from(s7event.getTimestamp());
+ int index = 0;
+ if (!Utils.isEmpty(meta.getRowTimeField())) {
+ r[index++] = data.rowDate;
}
-
- } else {
- setErrors(1L);
- logError("PLC connection don't exist.");
- setOutputDone();
- return false;
- }
-
- //
- while (events.size() == 0) {
- try {
- Thread.sleep(100);
- if (stopBundle) {
- setOutputDone(); // signal end to receiver(s)
- return false;
- }
- } catch (InterruptedException ex) {
- break;
+ if (!Utils.isEmpty(meta.getLastTimeField())) {
+ r[index++] = data.prevDate;
}
- }
-
- PlcSubscriptionEvent s7event = events.poll();
- System.out.println("Ejecuto el consumidor en el cliente..." + s7event.getTagNames());
-
- r = data.outputRowMeta.cloneRow(data.outputRowData);
- data.prevDate = data.rowDate;
- data.rowDate = new Date();
- int index = 0;
- if (!Utils.isEmpty(meta.getRowTimeField())) {
- r[index++] = data.rowDate;
- }
- if (!Utils.isEmpty(meta.getLastTimeField())) {
- r[index++] = data.prevDate;
- }
- for (Plc4xGeneratorField field: meta.getFields()){
- if (field.getType().equalsIgnoreCase("Boolean")){
- r[index++] = Boolean.parseBoolean(field.getValue());
- } else if (field.getType().equalsIgnoreCase("Number")){
- r[index++] = Double.parseDouble(field.getValue());
- } else if (field.getType().equalsIgnoreCase("Integer")){
- r[index++] = Integer.parseInt(field.getValue());
- }
- }
- putRow(data.outputRowMeta, r ); // return your data
- data.rowsWritten++;
- return true;
- }
-
-
- @Override
- public boolean init() {
- System.out.println("*************** INIT *****************");
- try {
- if(super.init()){
- // Determine the number of rows to generate...
- data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
- data.rowsWritten = 0L;
- data.delay = Const.toLong(resolve(meta.getIntervalInMs()), -1L);
-
- if (data.rowLimit < 0L) { // Unable to parse
- logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
- return false; // fail
- }
-
- // Create a row (constants) with all the values in it...
- List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
- RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
- if (!remarks.isEmpty()) {
- for (int i = 0; i < remarks.size(); i++) {
- CheckResult cr = (CheckResult) remarks.get(i);
- logError(cr.getText());
- }
- return false;
+ counter = 0;
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ valuetype = ((S7SubscriptionTag) plctags.get(field.getName()).getRight()).getS7Tags()[0].getPlcValueType();
+ if (null != valuetype) {
+ System.out.println("Tipo enviado desde el PLC: " + valuetype.name());
+ } else {
+ System.out.println("El tipo de NULL.");
}
- data.outputRowData = outputRow.getData();
- data.outputRowMeta = outputRow.getRowMeta();
+ if (field.getType().equalsIgnoreCase("Avro Record")) {
+ throw new HopException("'Avro Record' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("BigNumber")) {
+ throw new HopException("'BigNumber' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("Binary")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(Long.valueOf(s7event.getByte(field.getName()))));
+ break;
+ case WORD:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(Long.valueOf(s7event.getShort(field.getName()))));
+ break;
+ case DWORD:
+ r[index++] = binarycodec.toByteArray(
+ Integer.toBinaryString(s7event.getInteger(field.getName())));
+ break;
+ case LWORD:
+ r[index++] = binarycodec.toByteArray(
+ Long.toBinaryString(s7event.getLong(field.getName())));
+ break;
+ default:
+ throw new HopException("'DATE, LDATE, DATE_AND_TIME, LDATE_AND_TIME' type is not supported");
+ }
- return true;
+ } else if (field.getType().equalsIgnoreCase("Boolean")) {
+ switch (valuetype) {
+ case BOOL:
+ r[index++] = s7event.getBoolean(plctags.get(field.getName()).getKey());
+ break;
+ default:
+ }
+ } else if (field.getType().equalsIgnoreCase("Date")) {
+ switch (valuetype) {
+ case DATE:;
+ break;
+ case LDATE:;
+ break;
+ case DATE_AND_TIME:;
+ break;
+ case LDATE_AND_TIME:;
+ break;
+ default:
+ throw new HopException("'DATE, LDATE, DATE_AND_TIME, LDATE_AND_TIME' type is not supported");
+ }
+ } else if (field.getType().equalsIgnoreCase("Graph")) {
+ throw new HopException("'Graph' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("Integer")) {
+ switch (valuetype) {
+ case BYTE:
+ r[index++] = Long.valueOf(s7event.getByte(field.getName()));
+ break;
+ case WORD:
+ r[index++] = Long.valueOf(s7event.getShort(field.getName()));
+ break;
+ case DWORD:
+ r[index++] = Long.valueOf(s7event.getInteger(field.getName()));
+ break;
+ case LWORD:
+ r[index++] = s7event.getLong(field.getName());
+ break;
+ case INT:
+ r[index++] = Long.valueOf(s7event.getShort(field.getName()));
+ break;
+ case UINT:
+ r[index++] = Long.valueOf((s7event.getShort(field.getName())) & 0xFFFF);
+ break;
+ case SINT:
+ r[index++] = Long.valueOf(s7event.getByte(field.getName()));
+ break;
+ case USINT:
+ r[index++] = Long.valueOf(s7event.getByte(field.getName()) & 0xFF);
+ break;
+ case DINT:
+ r[index++] = Long.valueOf(s7event.getInteger(field.getName()));
+ break;
+ case UDINT:
+ r[index++] = Long.valueOf(s7event.getInteger(field.getName()) & 0xFFFF);
+ break;
+ case LINT:
+ r[index++] = s7event.getLong(field.getName());
+ break;
+ case ULINT:
+ r[index++] = (s7event.getLong(field.getName())) & 0xFFFFFFFFL;
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+ }
+ } else if (field.getType().equalsIgnoreCase("Internet Address")) {
+ throw new HopException("'Internet Address' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("JSON")) {
+ throw new HopException("'JSON' type is not supported");
+ } else if (field.getType().equalsIgnoreCase("Number")) {
+ switch (valuetype) {
+ case REAL:
+ System.out.println("Hex: " + Hex.dump((byte[]) s7event.getMap().get(field.getName())));
+ r[index++] = Double.valueOf(s7event.getFloat(field.getName()));
+ break;
+ case LREAL:
+ r[index++] = s7event.getDouble(field.getName());
+ break;
+ default:
+ throw new HopException("Tag type is not supported. Check tag definition.");
+ }
+
+ } else if (field.getType().equalsIgnoreCase("String")) {
+ switch (valuetype) {
+ case STRING:;
+ case DWORD:
+ r[index++] = String.valueOf(s7event.getFloat(field.getName()));
+ break;
+ default:
+ throw new HopException("'STRING' type is not supported");
+ }
+ } else if (field.getType().equalsIgnoreCase("Timestamp")) {
+ switch (valuetype) {
+ case TIME:;
+ r[index++] = s7event.getTime(plctags.get(field.getName()).getKey());
+ break;
+ case LTIME:;
+ break;
+ case TIME_OF_DAY:;
+ r[index++] = s7event.getTime(plctags.get(field.getName()).getKey());
+ break;
+ case LTIME_OF_DAY:;
+ break;
+ default:
+ throw new HopException("'LTIME, LTIME_OF_DAY' type is not supported");
+ }
+ }
}
- return false;
- } catch (Exception ex){
- setErrors(1L);
- logError("Error initializing transform", ex);
- return false;
- }
- }
- /*
- * Here, must perform the cleaning of any resource, main of the connection to
- * the associated PLC.
- */
+ putRow(data.outputRowMeta, r); // return your data
+ data.rowsWritten++;
+ return true;
+ }
+
+ @Override
+ public boolean init() {
+ try {
+ if (super.init()) {
+ // Determine the number of rows to generate...
+ data.rowLimit = Const.toLong(resolve(meta.getRowLimit()), -1L);
+ data.rowsWritten = 0L;
+ data.delay = Const.toLong(resolve(meta.getIntervalInMs()), -1L);
+
+ if (data.rowLimit < 0L) { // Unable to parse
+ logError(BaseMessages.getString(PKG, "Plc4x.Read.Meta.Wrong.RowLimit.Number"));
+ return false; // fail
+ }
+
+ // Create a row (constants) with all the values in it...
+ List<ICheckResult> remarks = new ArrayList<>(); // stores the errors...
+ RowMetaAndData outputRow = buildRow(meta, remarks, getTransformName());
+ if (!remarks.isEmpty()) {
+ for (int i = 0; i < remarks.size(); i++) {
+ CheckResult cr = (CheckResult) remarks.get(i);
+ logError(cr.getText());
+ }
+
+ return false;
+ }
+
+ data.outputRowData = outputRow.getData();
+ data.outputRowMeta = outputRow.getRowMeta();
+
+ jobId = null;
+ subsRequest = null;
+ subsResponse = null;
+
+ getPlcConnection();
+
+ final S7HPlcConnection conn = (S7HPlcConnection) connwrapper.getConnection();
+ conn.addEventListener(this);
+
+ return true;
+ }
+ return false;
+ } catch (Exception ex) {
+ setErrors(1L);
+ logError("Error initializing transform", ex);
+ return false;
+ }
+ }
+
+ /*
+ * Here, must perform the cleaning of any resource, main of the connection to
+ * the associated PLC.
+ */
@Override
public void cleanup() {
- System.out.println("*************** CLEANUP *****************");
super.cleanup();
super.cleanup();
logBasic("Cleanup. Release connection.");
if (connwrapper != null) {
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
+ if (connwrapper.refCnt() <= 0) {
lookup.remove(connwrapper);
- }
+ }
+ connwrapper = null;
+ subsRequest = null;
+ }
}
@@ -461,27 +572,34 @@
* 2. Release de reference to object.
* 3. The lastone remove the global reference to connection wrapper.
* 4. Clear local references.
- */
+ */
@Override
public void dispose() {
- System.out.println("*************** DISPOSE *****************");
+
+ UnRegisterCYCHandler();
+
+ if (connwrapper.getConnection() instanceof S7HPlcConnection) {
+ final S7HPlcConnection conn = (S7HPlcConnection) connwrapper.getConnection();
+ conn.removeEventListener(this);
+ }
+
super.dispose();
if (connwrapper != null) {
- logBasic("Dispose. Release connection: " + connwrapper.refCnt());
+ logBasic("Dispose. Release connection: " + connwrapper.refCnt());
connwrapper.release();
- if (connwrapper.refCnt() <= 0)
- lookup.remove(connwrapper);
+ if (connwrapper.refCnt() <= 0) {
+ lookup.remove(connwrapper);
+ }
connwrapper = null;
subsRequest = null;
}
}
-
@Override
public void stopRunning() throws HopException {
super.stopRunning();
stopBundle = true;
- }
+ }
private void getPlcConnection() {
lock.lock(); //(01)
@@ -490,48 +608,177 @@
IHopMetadataProvider metaprovider = getMetadataProvider();
connmeta = metaprovider.getSerializer(Plc4xConnection.class).load(meta.getConnection());
- if (connwrapper == null) {
- template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
+ if (connwrapper == null) {
+ template = new Lookup.Template<>(Plc4xWrapperConnection.class, meta.getConnection(), null);
result = lookup.lookup(template);
if (!result.allItems().isEmpty()) {
- System.out.println("Aqui encontro la conexion: " + meta.getConnection());
+ logBasic("Using connection: " + meta.getConnection());
connwrapper = (Plc4xWrapperConnection) result.allInstances().toArray()[0];
- if (connwrapper != null) connwrapper.retain();
+ if (connwrapper != null) {
+ connwrapper.retain();
+ }
}
};
- if (connmeta == null){
+ if (connmeta == null) {
logError(
- BaseMessages.getString(
- PKG,
- "Plc4x.Read.Meta.Log.SetMetadata",
- meta.getConnection()));
+ BaseMessages.getString(
+ PKG,
+ "Plc4x.Read.Meta.Log.SetMetadata",
+ meta.getConnection()));
}
- if ((connmeta != null) && (connwrapper == null)){
+ if ((connmeta != null) && (connwrapper == null)) {
subsRequest = null;
- try{
- System.out.println("Creo una nueva conexión...");
- PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
-
+ try {
+ final PlcConnection conn = new DefaultPlcDriverManager().getConnection(connmeta.getUrl()); //(03)
+ Thread.sleep(200);
if (conn.isConnected()) {
- System.out.println("**** Agrego la segunda conexion. ****");
- connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
+ logBasic("Create new connection with url : " + connmeta.getUrl());
+ connwrapper = new Plc4xWrapperConnection(conn, meta.getConnection());
lookup.add(connwrapper);
}
- } catch (Exception ex){
+ } catch (Exception ex) {
setErrors(1L);
logError("Unable to create connection to PLC. " + ex.getMessage());
}
}
} catch (HopException ex) {
- Logger.getLogger(Plc4xRead.class.getName()).log(Level.SEVERE, null, ex);
+ logError(ex.getMessage());
} finally {
lock.unlock();
- }
- }
-
-
+ }
+ }
+
+ /*
+ * Registers the tags for the cyclical subscription.
+ * In the first processing of the rows, a check of the tags is
+ * carried out in order that they are well formed, generating an exception
+ * if they are not.
+ */
+ public boolean RegisterPlcTags() {
+ if ((connmeta != null) && (connwrapper != null)) {
+ if (connwrapper.getConnection().isConnected()) {
+ if (subsRequest == null) {
+ final PlcSubscriptionRequest.Builder builder = connwrapper.getConnection().subscriptionRequestBuilder(); //(05)
+ for (Plc4xGeneratorField field : meta.getFields()) {
+ builder.addEventTagAddress(field.getName(), field.getItem().toString());
+ }
+
+ subsRequest = builder.build();
+
+ }
+ } else {
+ setErrors(1L);
+ logError("PLC is not connected.");
+ setOutputDone();
+ return false;
+ }
+
+ } else {
+ setErrors(1L);
+ logError("PLC connection don't exist.");
+ setOutputDone();
+ return false;
+ }
+ return true;
+ }
+
+ /*
+ * This method performs the subscription to the events within the PLC.
+ * 1. Take the waiting time as a reference to monitor the request.
+ * 2. Captures the jobId associated with the subscription
+ * which is assigned by the PLC.
+ */
+ public void GetSubscriptions() {
+ jobId = null;
+ try {
+ if (null != subsRequest) {
+ maxwait = Integer.parseInt(meta.getMaxwaitInMs());
+ maxwait = (maxwait < 1000) ? 1000 : maxwait;
+
+ subsResponse = subsRequest.execute().get(maxwait * 2, TimeUnit.MILLISECONDS);
+
+ //Only for Siemens S7
+// subsResponse.getTagNames().forEach(s -> logDebug("Capture JobID: " + s));
+ //Only one JobId per subscription will be obtained.
+ jobId = (String) subsResponse.getTagNames().toArray()[0];
+ }
+ } catch (Exception ex) {
+ logError(ex.toString());
+ jobId = null;
+ subsResponse = null;
+ }
+ }
+
+ /*
+ * Subscribe to incoming events by transferring them to
+ * the local event buffer.
+ */
+ public void RegisterCYCHandler() {
+ if (null != subsResponse) {
+ csmr = subsResponse
+ .getSubscriptionHandle(jobId)
+ .register(evt -> {
+ events.add(evt);
+ });
+ }
+ }
+
+ /*
+ * Unsubscribes to the event generator from the driver and requests
+ * to cancel the sending of PLC events for the specified job.
+ */
+ public void UnRegisterCYCHandler() {
+ if (null != csmr) {
+ csmr.unregister();
+
+ PlcSubscriptionResponse unregister_response = null;
+
+ final PlcSubscriptionRequest.Builder unregister_builder = connwrapper.getConnection().subscriptionRequestBuilder();
+ unregister_builder.addEventTagAddress("CANCELTAG", "CANCEL:" + jobId);
+
+ final PlcSubscriptionRequest unregister_request = unregister_builder.build();
+
+ try {
+ unregister_response = unregister_request.execute().get(500, TimeUnit.MILLISECONDS);
+ } catch (Exception ex) {
+ logError(ex.getMessage());
+ }
+
+ logBasic("UnRegisterCYCHandles: " + unregister_response.getResponseCode(jobId));
+ }
+ }
+
+ /*
+ * When the driver makes a connection this method is called.
+ * In the case of the S7 driver, only the connection of the embedded channel
+ * is served.
+ */
+ @Override
+ public void connected() {
+ if (connwrapper.getConnection().isConnected()) {
+ RegisterPlcTags();
+ GetSubscriptions();
+ RegisterCYCHandler();
+ }
+ }
+
+ /*
+ * This method is called from the driver to indicate that it has
+ * disconnected from the PLC.
+ * If the PLC is disconnected, it automatically deletes all
+ * the status associated with this connection.
+ */
+ @Override
+ public void disconnected() {
+ logError("Driver disconnected!");
+ isConnected = false;
+ csmr.unregister();
+ csmr = null;
+ subsRequest = null;
+ }
+
}
diff --git a/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/util/Plc4xPlcField.java b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/util/Plc4xPlcField.java
new file mode 100644
index 0000000..295dc9f
--- /dev/null
+++ b/plc4j/integrations/apache-hop/plc4x-hop-transformer/src/main/java/org/apache/plc4x/hop/transforms/util/Plc4xPlcField.java
@@ -0,0 +1,148 @@
+/*
+ * 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.hop.transforms.util;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.apache.plc4x.java.api.exceptions.PlcInvalidTagException;
+import org.apache.plc4x.java.api.model.PlcTag;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.SerializationException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.utils.Serializable;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/*
+* Code taken from the Modbus driver implementation.
+* This allows me to make the correct interpretation of the "Hop" values
+* towards the writing fields.
+*
+* TODO: The HOP interpreter generates an error when processing
+* the "Integer" fields.
+*/
+
+public class Plc4xPlcField implements PlcTag, Serializable {
+
+ public static final Pattern ADDRESS_PATTERN = Pattern.compile("(?<address>[\\%a-zA-Z_\\.0-9]+)(:(?<datatype>[a-zA-Z_]+))?(\\[(?<quantity>\\d+)])?");
+
+ protected static final int PROTOCOL_ADDRESS_OFFSET = 1;
+
+ private final String address;
+
+ private final int quantity;
+
+ private final Plc4xDataType dataType;
+
+ public static Plc4xPlcField of(String addressString) {
+ if (Plc4xPlcField.matches(addressString)) {
+ Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
+
+ matcher.matches();
+
+ String address = matcher.group("address");
+
+ String quantityString = matcher.group("quantity");
+ int quantity = quantityString != null ? Integer.parseInt(quantityString) : 1;
+
+ Plc4xDataType dataType = (matcher.group("datatype") != null) ? Plc4xDataType.valueOf(matcher.group("datatype")) : Plc4xDataType.BOOL;
+
+
+ return new Plc4xPlcField(address, quantity, dataType);
+ }
+
+ throw new PlcInvalidTagException("Unable to parse address: " + addressString);
+ }
+
+ protected Plc4xPlcField(String address, Integer quantity, Plc4xDataType dataType) {
+ this.address = address;
+
+ this.quantity = quantity != null ? quantity : 1;
+
+ this.dataType = dataType != null ? dataType : Plc4xDataType.INT;
+ }
+
+ public static boolean matches(String addressString) {
+ return ADDRESS_PATTERN.matcher(addressString).matches();
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public int getNumberOfElements() {
+ return quantity;
+ }
+
+ public int getLengthBytes() {
+ return quantity * dataType.getDataTypeSize();
+ }
+
+ @JsonIgnore
+ public int getLengthWords() {
+ return (int) ((quantity * (float) dataType.getDataTypeSize()) / 2.0f);
+ }
+
+ public Plc4xDataType getDataType() {
+ return dataType;
+ }
+
+ public String getPlcDataType() {
+ return dataType.name();
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (!(o instanceof Plc4xPlcField)) {
+ return false;
+ }
+ Plc4xPlcField that = (Plc4xPlcField) o;
+ return address == that.address;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(address);
+ }
+
+ @Override
+ public String toString() {
+ return "Plc4xPlcField{" +
+ " address=" + address +
+ " datatype=" + dataType +
+ " quantity=" + quantity +
+ " }";
+ }
+
+ @Override
+ public void serialize(WriteBuffer wb) throws SerializationException {
+ throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ }
+
+ @Override
+ public String getAddressString() {
+ throw new UnsupportedOperationException("Not supported yet."); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/GeneratedMethodBody
+ }
+
+}
diff --git a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
index 7e30104..58353c2 100644
--- a/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
+++ b/plc4j/spi/src/main/java/org/apache/plc4x/java/spi/connection/DefaultNettyPlcConnection.java
@@ -40,6 +40,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
import java.util.stream.Stream;
public class DefaultNettyPlcConnection extends AbstractPlcConnection implements ChannelExposingConnection, EventPlcConnection {
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectRequest.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectRequest.java
index c632933..b1146e1 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectRequest.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectRequest.java
@@ -58,7 +58,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xConnectRequest");
// Implicit Field (connectionStringLen) (Used for parsing, but its value is not stored as it's
@@ -104,8 +103,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xConnectRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short connectionStringLen =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectResponse.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectResponse.java
index 6017878..c3f74bc 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectResponse.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConnectResponse.java
@@ -64,7 +64,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xConnectResponse");
// Simple Field (connectionId)
@@ -112,8 +111,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xConnectResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int connectionId =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConstants.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConstants.java
index 5891b02..686c63b 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConstants.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xConstants.java
@@ -51,7 +51,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xConstants");
// Const Field (plc4xTcpDefaultPort)
@@ -86,8 +85,6 @@
public static Plc4xConstants staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xConstants");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int plc4xTcpDefaultPort =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xMessage.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xMessage.java
index e8019cd..dfb051e 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xMessage.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xMessage.java
@@ -65,7 +65,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xMessage");
// Const Field (version)
@@ -143,8 +142,6 @@
public static Plc4xMessage staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xMessage");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short version =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadRequest.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadRequest.java
index b8426a5..5d24a78 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadRequest.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadRequest.java
@@ -64,7 +64,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xReadRequest");
// Simple Field (connectionId)
@@ -123,8 +122,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xReadRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int connectionId =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadResponse.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadResponse.java
index 96a85cd..e57738d 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadResponse.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xReadResponse.java
@@ -74,7 +74,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xReadResponse");
// Simple Field (connectionId)
@@ -147,8 +146,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xReadResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int connectionId =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTag.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTag.java
index 110c307..c5a9b36 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTag.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTag.java
@@ -58,7 +58,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xTag");
// Implicit Field (nameLen) (Used for parsing, but its value is not stored as it's implicitly
@@ -114,8 +113,6 @@
public static Plc4xTag staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xTag");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
short nameLen = readImplicitField("nameLen", readUnsignedShort(readBuffer, 8));
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagRequest.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagRequest.java
index 0a30976..6eec2a4 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagRequest.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagRequest.java
@@ -52,7 +52,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xTagRequest");
// Simple Field (tag)
@@ -87,8 +86,6 @@
public static Plc4xTagRequest staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xTagRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Plc4xTag tag =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagResponse.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagResponse.java
index b603c11..03db129 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagResponse.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagResponse.java
@@ -58,7 +58,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xTagResponse");
// Simple Field (tag)
@@ -106,8 +105,6 @@
public static Plc4xTagResponse staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xTagResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Plc4xTag tag =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueRequest.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueRequest.java
index cc092c5..7b5f5dc 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueRequest.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueRequest.java
@@ -64,7 +64,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xTagValueRequest");
// Simple Field (tag)
@@ -123,8 +122,6 @@
public static Plc4xTagValueRequest staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xTagValueRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Plc4xTag tag =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueResponse.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueResponse.java
index af2af4f..ebfc6c3 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueResponse.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xTagValueResponse.java
@@ -71,7 +71,6 @@
public void serialize(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xTagValueResponse");
// Simple Field (tag)
@@ -143,8 +142,6 @@
public static Plc4xTagValueResponse staticParse(ReadBuffer readBuffer) throws ParseException {
readBuffer.pullContext("Plc4xTagValueResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
Plc4xTag tag =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteRequest.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteRequest.java
index 6a0cb14..8020ba0 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteRequest.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteRequest.java
@@ -64,7 +64,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xWriteRequest");
// Simple Field (connectionId)
@@ -123,8 +122,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xWriteRequest");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int connectionId =
diff --git a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteResponse.java b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteResponse.java
index 0c50b76..7966508 100644
--- a/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteResponse.java
+++ b/plc4j/tools/plc4x-server/src/main/generated/org/apache/plc4x/java/plc4x/readwrite/Plc4xWriteResponse.java
@@ -74,7 +74,6 @@
protected void serializePlc4xMessageChild(WriteBuffer writeBuffer) throws SerializationException {
PositionAware positionAware = writeBuffer;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
- int startPos = positionAware.getPos();
writeBuffer.pushContext("Plc4xWriteResponse");
// Simple Field (connectionId)
@@ -147,8 +146,6 @@
throws ParseException {
readBuffer.pullContext("Plc4xWriteResponse");
PositionAware positionAware = readBuffer;
- int startPos = positionAware.getPos();
- int curPos;
boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
int connectionId =
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index d6df405..c6cfcdd 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -285,10 +285,10 @@
]
]
-//TODO: Se debe modificar el calculo para incluir el tipo
-// . si es tipo 4 usa el desplazamiento
-// . si es tipo 3, la longitud es la indicada
-// . verificar calculo con los otros tipos
+//TODO: The calculation must be modified to include the type
+// . if it is type 0x07(REAL) or 0x09 (OCTET_STRING), the length is indicated
+// . another type uses scrolling
+// . verify calculation with the other types
[type AssociatedValueType
[simple DataTransportErrorCode returnCode]
[simple DataTransportSize transportSize]
@@ -439,7 +439,8 @@
[simple uint 8 syntaxId]
[typeSwitch syntaxId
['0x10' CycServiceItemAnyType
- [simple TransportSize transportSize]
+ //[simple TransportSize transportSize]
+ [enum TransportSize transportSize code]
[simple uint 16 length]
[simple uint 16 dbNumber]
[simple MemoryArea memoryArea]
diff --git a/src/site/asciidoc/images/01.png b/src/site/asciidoc/images/01.png
new file mode 100644
index 0000000..cdaee05
--- /dev/null
+++ b/src/site/asciidoc/images/01.png
Binary files differ
diff --git a/src/site/asciidoc/images/dt0.png b/src/site/asciidoc/images/dt0.png
new file mode 100644
index 0000000..cdaee05
--- /dev/null
+++ b/src/site/asciidoc/images/dt0.png
Binary files differ
diff --git a/src/site/asciidoc/images/dt01.png b/src/site/asciidoc/images/dt01.png
new file mode 100644
index 0000000..3174991
--- /dev/null
+++ b/src/site/asciidoc/images/dt01.png
Binary files differ
diff --git a/src/site/asciidoc/images/dt02.png b/src/site/asciidoc/images/dt02.png
new file mode 100644
index 0000000..dea5bdb
--- /dev/null
+++ b/src/site/asciidoc/images/dt02.png
Binary files differ
diff --git a/src/site/asciidoc/users/protocols/01.png.cache b/src/site/asciidoc/users/protocols/01.png.cache
new file mode 100644
index 0000000..4abb29e
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/01.png.cache
@@ -0,0 +1 @@
+{"checksum":"2b16800aeba308644e43681f1314ab2a","options":{"size_limit":"4096"},"width":1008,"height":304}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/dt0.png.cache b/src/site/asciidoc/users/protocols/dt0.png.cache
new file mode 100644
index 0000000..11149ed
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/dt0.png.cache
@@ -0,0 +1 @@
+{"checksum":"c808d44b13e6d057cfcc50d10ff7e929","options":{"size_limit":"4096"},"width":1008,"height":304}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/dt01.png.cache b/src/site/asciidoc/users/protocols/dt01.png.cache
new file mode 100644
index 0000000..1297334
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/dt01.png.cache
@@ -0,0 +1 @@
+{"checksum":"d539c70f876e8e357a919b10b9dcf29d","options":{"size_limit":"4096"},"width":1003,"height":271}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/dt02.png.cache b/src/site/asciidoc/users/protocols/dt02.png.cache
new file mode 100644
index 0000000..ec88114
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/dt02.png.cache
@@ -0,0 +1 @@
+{"checksum":"e7ee86c34507deeee522b5e8b0ba45e1","options":{"size_limit":"4096"},"width":1008,"height":304}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image01.png.cache b/src/site/asciidoc/users/protocols/image01.png.cache
new file mode 100644
index 0000000..e93185c
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image01.png.cache
@@ -0,0 +1 @@
+{"checksum":"927460dace51ee1ffb74eba202a239df","options":{"size_limit":"4096"},"width":481,"height":237}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image02.png.cache b/src/site/asciidoc/users/protocols/image02.png.cache
new file mode 100644
index 0000000..a74ff84
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image02.png.cache
@@ -0,0 +1 @@
+{"checksum":"be5a0b433ec34212455075ee88f529b6","options":{"size_limit":"4096"},"width":583,"height":725}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image03.png.cache b/src/site/asciidoc/users/protocols/image03.png.cache
new file mode 100644
index 0000000..5b00fd9
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image03.png.cache
@@ -0,0 +1 @@
+{"checksum":"4c358749a62fbd501299c6b07d0e8011","options":{"size_limit":"4096"},"width":583,"height":725}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image04.png.cache b/src/site/asciidoc/users/protocols/image04.png.cache
new file mode 100644
index 0000000..5277d14
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image04.png.cache
@@ -0,0 +1 @@
+{"checksum":"8cfde6283d105f74d587067a1bac0ab0","options":{"size_limit":"4096"},"width":608,"height":512}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image05.png.cache b/src/site/asciidoc/users/protocols/image05.png.cache
new file mode 100644
index 0000000..a30da12
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image05.png.cache
@@ -0,0 +1 @@
+{"checksum":"8c5c56c1338dc35a04ba5bd737e2bd7a","options":{"size_limit":"4096"},"width":563,"height":499}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image06.png.cache b/src/site/asciidoc/users/protocols/image06.png.cache
new file mode 100644
index 0000000..24a71c9
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image06.png.cache
@@ -0,0 +1 @@
+{"checksum":"36150160a227b22a9626c7df61d5c1ff","options":{"size_limit":"4096"},"width":1383,"height":1153}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/image07.png.cache b/src/site/asciidoc/users/protocols/image07.png.cache
new file mode 100644
index 0000000..c3012a8
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/image07.png.cache
@@ -0,0 +1 @@
+{"checksum":"82c532e400f533e33736652fa662fcb1","options":{"size_limit":"4096"},"width":481,"height":237}
\ No newline at end of file
diff --git a/src/site/asciidoc/users/protocols/s7.adoc b/src/site/asciidoc/users/protocols/s7.adoc
index dd1759b..54ced53 100755
--- a/src/site/asciidoc/users/protocols/s7.adoc
+++ b/src/site/asciidoc/users/protocols/s7.adoc
@@ -236,6 +236,151 @@
|===
+[plantuml, target="../../dt01", format=png, align="center"]
+....
+@startuml
+Title S7-comm driver diagram
+clock clk with period 1
+binary "PING" as PING
+binary "READ_TIMEOUT" as RTOUT
+binary "CONNECT" as CONNECT
+concise "tcp channel" as db
+
+@0
+PING is low
+CONNECT is high
+db is {-}
+
+@1
+CONNECT is low
+db is "0101"
+
+@2
+db is {-}
+
+@3
+db is "0101"
+
+@4
+
+@5
+PING is high
+db is "0101"
+
+@6
+PING is low
+db is "0101"
+
+@7
+
+@8
+
+
+@9
+PING is low
+db is {-}
+
+@10
+PING is high
+db is "0101"
+
+@11
+PING is low
+db is {-}
+
+@12
+
+@13
+PING is low
+db is "1010"
+
+@16
+db is {-}
+
+@PING
+@1<->@+4 : {ping-time}
+@enduml
+....
+
+[plantuml, target="../../dt02", format=png, align="center"]
+....
+
+Title S7-comm driver reconnection diagram
+clock clk with period 1
+binary "PING" as PING
+binary "READ_TIMEOUT" as RTOUT
+binary "CONNECT" as CONNECT
+concise "tcp channel" as db
+
+@0
+PING is low
+CONNECT is high
+db is {-}
+
+@1
+CONNECT is low
+
+@2
+db is {-}
+
+@3
+
+@4
+
+@5
+PING is high
+db is "0101"
+
+@6
+PING is low
+db is {-}
+
+@7
+
+@8
+
+@9
+PING is high : rise timeout
+
+@10
+PING is low
+RTOUT is low
+
+@11
+CONNECT is low
+
+@12
+
+@13
+PING is high : rise timeout
+
+@14
+PING is low
+RTOUT is high
+
+
+@15
+PING is low
+RTOUT is low
+CONNECT is high
+
+@16
+CONNECT is low
+db is "1010"
+
+@PING
+@1<->@+4 : {ping-time}
+
+@RTOUT
+@6<->@+8 : {read-timeout}
+
+highlight 14 to 16 : reconnect
+@enduml
+....
+
+
+
+
==== TWO
After defining the URL, the connection is made. Driver selection from the URL is done via PLC4X's SPI support, so driver instantiation and mapping originating from the URL is done transparently by the Java SPI services.
diff --git a/src/site/asciidoc/users/protocols/szlxy11demo.png.cache b/src/site/asciidoc/users/protocols/szlxy11demo.png.cache
new file mode 100644
index 0000000..39abd6e
--- /dev/null
+++ b/src/site/asciidoc/users/protocols/szlxy11demo.png.cache
@@ -0,0 +1 @@
+{"checksum":"e6cb1ec63fc034e73a05158cc1168cf5","options":{"size_limit":"4096"},"width":487,"height":479}
\ No newline at end of file