This is an automated email from the ASF dual-hosted git repository.
hutcheb pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git
The following commit(s) were added to refs/heads/develop by this push:
new 29e6fc1384 fix(plc4j/profinet): Update for OctetString and
F_MESSAGETRAILER4BYTE datatypes
29e6fc1384 is described below
commit 29e6fc1384949c4f2ade4274053471582d76cbb7
Author: Ben Hutcheson <[email protected]>
AuthorDate: Fri Mar 31 06:25:19 2023 +0200
fix(plc4j/profinet): Update for OctetString and F_MESSAGETRAILER4BYTE
datatypes
---
.../plc4x/java/profinet/readwrite/DataItem.java | 290 +++++++++++++++++++++
.../java/profinet/readwrite/ProfinetDataType.java | 10 +-
.../drivers/profinet/src/test/resources/gsdml.xml | 4 +
.../main/resources/protocols/profinet/pnio.mspec | 38 ++-
4 files changed, 339 insertions(+), 3 deletions(-)
diff --git
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
index b2ca0430e3..4404c32b75 100644
---
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
+++
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DataItem.java
@@ -72,6 +72,36 @@ public class DataItem {
}
}
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+
+ // Simple Field (value)
+ Short value = /*TODO: migrate me*/ /*TODO: migrate me*/
readBuffer.readUnsignedShort("", 8);
+
+ return new PlcUSINT(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.OCTETSTRING)) { // List
+ // Array field (value)
+ // Count array
+ if (numberOfValues > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + (numberOfValues)
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) numberOfValues;
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcUINT(
+ (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readUnsignedShort("", 8)));
+ }
+ }
+
return new PlcList(value);
} else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
&& EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
@@ -479,6 +509,146 @@ public class DataItem {
}
}
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+ // Simple Field (value)
+ String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+
+ return new PlcCHAR(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)) { // List
+ // Array field (value)
+ // Count array
+ if (numberOfValues > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + (numberOfValues)
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) numberOfValues;
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcSTRING(
+ (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 8,
WithOption.WithEncoding("UTF-8"))));
+ }
+ }
+
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+ // Simple Field (value)
+ String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 16, WithOption.WithEncoding("UTF-16"));
+
+ return new PlcCHAR(value);
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) {
// List
+ // Array field (value)
+ // Count array
+ if (numberOfValues > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + (numberOfValues)
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) numberOfValues;
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcSTRING(
+ (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 16,
WithOption.WithEncoding("UTF-16"))));
+ }
+ }
+
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+
+ // Simple Field (value)
+ String value = /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 8, WithOption.WithEncoding("UTF-8"));
+
+ return new PlcCHAR(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)) { // List
+ // Array field (value)
+ // Count array
+ if (numberOfValues > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + (numberOfValues)
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) numberOfValues;
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcSTRING(
+ (String) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readString("", 8,
WithOption.WithEncoding("UTF-8"))));
+ }
+ }
+
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // List
+ // Array field (value)
+ // Count array
+ if ((4) * (8) > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + ((4) * (8))
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) (4) * (8);
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcUINT(
+ (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readUnsignedShort("", 8)));
+ }
+ }
+
+ return new PlcList(value);
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+ // Array field (value)
+ // Count array
+ if ((numberOfValues) * (32) > Integer.MAX_VALUE) {
+ throw new ParseException(
+ "Array count of "
+ + ((numberOfValues) * (32))
+ + " exceeds the maximum allowed count of "
+ + Integer.MAX_VALUE);
+ }
+ List<PlcValue> value;
+ {
+ int itemCount = (int) (numberOfValues) * (32);
+ value = new LinkedList<>();
+ for (int curItem = 0; curItem < itemCount; curItem++) {
+ value.add(
+ new PlcUINT(
+ (Short) /*TODO: migrate me*/ /*TODO: migrate me*/
+ readBuffer.readUnsignedShort("", 8)));
+ }
+ }
+
return new PlcList(value);
}
return null;
@@ -512,6 +682,21 @@ public class DataItem {
/*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value));
}
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+ // Simple Field (value)
+ short value = (short) _value.getShort();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number)
(value)).shortValue());
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.OCTETSTRING)) { // List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ Short value = (Short) val.getShort();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number)
(value)).shortValue());
+ }
+
} else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
&& EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
// Simple Field (value)
@@ -725,6 +910,76 @@ public class DataItem {
/*TODO: migrate me*/ writeBuffer.writeString(
"", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
}
+
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ String value = (String) _value.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)) { // List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ String value = (String) val.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+ }
+
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ String value = (String) _value.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) {
// List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ String value = (String) val.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 16, (String) (value), WithOption.WithEncoding("UTF-16"));
+ }
+
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ String value = (String) _value.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)) { // List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ String value = (String) val.getString();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeString(
+ "", 8, (String) (value), WithOption.WithEncoding("UTF-8"));
+ }
+
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ Short value = (Short) val.getShort();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number)
(value)).shortValue());
+ }
+
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+ PlcList values = (PlcList) _value;
+
+ for (PlcValue val : ((List<PlcValue>) values.getList())) {
+ Short value = (Short) val.getShort();
+ /*TODO: migrate me*/
+ /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number)
(value)).shortValue());
+ }
}
}
@@ -743,6 +998,13 @@ public class DataItem {
} else if (EvaluationHelper.equals(dataType, ProfinetDataType.BOOL)) { //
List
PlcList values = (PlcList) _value;
sizeInBits += values.getList().size() * 1;
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.OCTETSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // USINT
+ // Simple Field (value)
+ sizeInBits += 8;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.OCTETSTRING)) { // List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 8;
} else if (EvaluationHelper.equals(dataType, ProfinetDataType.BYTE)
&& EvaluationHelper.equals(numberOfValues, 1)) { // BYTE
// Simple Field (value)
@@ -843,6 +1105,34 @@ public class DataItem {
} else if (EvaluationHelper.equals(dataType, ProfinetDataType.WCHAR)) { //
List
PlcList values = (PlcList) _value;
sizeInBits += values.getList().size() * 16;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ sizeInBits += 8;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.UNICODESTRING8)) { // List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 8;
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ sizeInBits += 16;
+ } else if (EvaluationHelper.equals(dataType, ProfinetDataType.WSTRING)) {
// List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 16;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // CHAR
+ // Simple Field (value)
+ sizeInBits += 8;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.VISIBLESTRING)) { // List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 8;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)
+ && EvaluationHelper.equals(numberOfValues, 1)) { // List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 8;
+ } else if (EvaluationHelper.equals(dataType,
ProfinetDataType.F_MESSAGETRAILER4BYTE)) { // List
+ PlcList values = (PlcList) _value;
+ sizeInBits += values.getList().size() * 8;
}
return sizeInBits;
}
diff --git
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
index 4b9fae34b1..f41e9335d6 100644
---
a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
+++
b/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/ProfinetDataType.java
@@ -51,8 +51,14 @@ public enum ProfinetDataType {
LDATE_AND_TIME((short) 23, (short) 8, (String) "LDATE_AND_TIME"),
CHAR((short) 24, (short) 1, (String) "CHAR"),
WCHAR((short) 25, (short) 2, (String) "WCHAR"),
- STRING((short) 26, (short) 1, (String) "STRING"),
- WSTRING((short) 27, (short) 2, (String) "WSTRING");
+ UNICODESTRING8((short) 26, (short) 1, (String) "UNICODESTRING8"),
+ WSTRING((short) 27, (short) 2, (String) "WSTRING"),
+ VISIBLESTRING((short) 28, (short) 1, (String) "VISIBLESTRING"),
+ F_MESSAGETRAILER4BYTE((short) 29, (short) 4, (String)
"F_MESSAGETRAILER4BYTE"),
+ TIMESTAMP((short) 30, (short) 12, (String) "TIMESTAMP"),
+ TIMESTAMPDIFFERENCE((short) 31, (short) 12, (String) "TIMESTAMPDIFFERENCE"),
+ TIMESTAMPDIFFERENCESHORT((short) 32, (short) 8, (String)
"TIMESTAMPDIFFERENCESHORT"),
+ OCTETSTRING((short) 33, (short) 1, (String) "OCTETSTRING");
private static final Map<Short, ProfinetDataType> map;
static {
diff --git a/plc4j/drivers/profinet/src/test/resources/gsdml.xml
b/plc4j/drivers/profinet/src/test/resources/gsdml.xml
index 7631f229cf..4e720bda6f 100644
--- a/plc4j/drivers/profinet/src/test/resources/gsdml.xml
+++ b/plc4j/drivers/profinet/src/test/resources/gsdml.xml
@@ -212,6 +212,10 @@
</DataItem>
<DataItem DataType="Float32"
TextId="PLC4X_INPUT_MODULE_INFO_FLOAT"/>
</Input>
+ <Input Consistency="None">
+ <DataItem Length="15" TextId="Inputs"
DataType="OctetString" UseAsBits="true" />
+ <DataItem DataType="Float32"
TextId="PLC4X_INPUT_MODULE_INFO_FLOAT"/>
+ </Input>
</IOData>
<ModuleInfo>
<Name TextId="PLC4X_VIRTUAL_INPUT_MODULE_NAME"/>
diff --git
a/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
index 991c297130..0d0606a706 100644
--- a/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
+++ b/protocols/profinet/src/main/resources/protocols/profinet/pnio.mspec
@@ -523,6 +523,12 @@
['BOOL' List
[array bit value count 'numberOfValues' ]
]
+ ['OCTETSTRING','1' USINT
+ [simple uint 8 value]
+ ]
+ ['OCTETSTRING' List
+ [array uint 8 value count 'numberOfValues' ]
+ ]
['BYTE','1' BYTE
[simple uint 8 value]
]
@@ -610,6 +616,30 @@
['WCHAR' List
[array string 16 value count 'numberOfValues' encoding='"UTF-16"']
]
+ ['UNICODESTRING8','1' CHAR
+ [simple string 8 value encoding='"UTF-8"']
+ ]
+ ['UNICODESTRING8' List
+ [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
+ ]
+ ['WSTRING','1' CHAR
+ [simple string 16 value encoding='"UTF-16"']
+ ]
+ ['WSTRING' List
+ [array string 16 value count 'numberOfValues' encoding='"UTF-16"']
+ ]
+ ['VISIBLESTRING','1' CHAR
+ [simple string 8 value encoding='"UTF-8"']
+ ]
+ ['VISIBLESTRING' List
+ [array string 8 value count 'numberOfValues' encoding='"UTF-8"']
+ ]
+ ['F_MESSAGETRAILER4BYTE','1' List
+ [array uint 8 value count '4 * 8' ]
+ ]
+ ['F_MESSAGETRAILER4BYTE' List
+ [array uint 8 value count 'numberOfValues * 32' ]
+ ]
]
]
@@ -639,6 +669,12 @@
['23' LDATE_AND_TIME ['8','LDATE_AND_TIME']]
['24' CHAR ['1','CHAR']]
['25' WCHAR ['2','WCHAR']]
- ['26' STRING ['1','STRING']]
+ ['26' UNICODESTRING8 ['1','UNICODESTRING8']]
['27' WSTRING ['2','WSTRING']]
+ ['28' VISIBLESTRING ['1','VISIBLESTRING']]
+ ['29' F_MESSAGETRAILER4BYTE ['4','F_MESSAGETRAILER4BYTE']]
+ ['30' TIMESTAMP ['12','TIMESTAMP']]
+ ['31' TIMESTAMPDIFFERENCE ['12','TIMESTAMPDIFFERENCE']]
+ ['32' TIMESTAMPDIFFERENCESHORT ['8','TIMESTAMPDIFFERENCESHORT']]
+ ['33' OCTETSTRING ['1','OCTETSTRING']]
]