You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2022/08/24 16:12:17 UTC
[plc4x] 08/12: chore(protocols/ads): Switched the ads spec to use PlcValueType enums for DataIo
This is an automated email from the ASF dual-hosted git repository.
cdutz pushed a commit to branch feature/ads-symbol-discovery
in repository https://gitbox.apache.org/repos/asf/plc4x.git
commit bf2c042d8905df9ddad90f3a04e4f66c7f21eed6
Author: Christofer Dutz <ch...@rivian.com>
AuthorDate: Wed Aug 24 10:19:55 2022 +0200
chore(protocols/ads): Switched the ads spec to use PlcValueType enums for DataIo
---
.../plc4x/java/ads/protocol/AdsProtocolLogic.java | 14 +-
.../ads/src/main/resources/protocols/ads/ads.mspec | 181 +++++++++++++--------
2 files changed, 122 insertions(+), 73 deletions(-)
diff --git a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
index 36d8f3507..58e065e5f 100644
--- a/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
+++ b/plc4j/drivers/ads/src/main/java/org/apache/plc4x/java/ads/protocol/AdsProtocolLogic.java
@@ -467,12 +467,12 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
final int stringLength = strLen;
if (field.getNumberOfElements() == 1) {
return new ResponseItem<>(PlcResponseCode.OK,
- DataItem.staticParse(readBuffer, field.getAdsDataType().getDataFormatName(), stringLength));
+ DataItem.staticParse(readBuffer, field.getAdsDataType().getPlcValueType(), stringLength));
} else {
// Fetch all
final PlcValue[] resultItems = IntStream.range(0, field.getNumberOfElements()).mapToObj(i -> {
try {
- return DataItem.staticParse(readBuffer, field.getAdsDataType().getDataFormatName(), stringLength);
+ return DataItem.staticParse(readBuffer, field.getAdsDataType().getPlcValueType(), stringLength);
} catch (ParseException e) {
LOGGER.warn("Error parsing field item of type: '{}' (at position {}})", field.getAdsDataType(), i, e);
}
@@ -564,8 +564,8 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
}
try {
WriteBufferByteBased writeBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue,
- plcField.getAdsDataType().getDataFormatName(), stringLength));
- DataItem.staticSerialize(writeBuffer, plcValue, plcField.getAdsDataType().getDataFormatName(), stringLength, ByteOrder.LITTLE_ENDIAN);
+ plcField.getAdsDataType().getPlcValueType(), stringLength));
+ DataItem.staticSerialize(writeBuffer, plcValue, plcField.getAdsDataType().getPlcValueType(), stringLength, ByteOrder.LITTLE_ENDIAN);
AmsPacket amsPacket = new AdsWriteRequest(configuration.getTargetAmsNetId(), configuration.getTargetAmsPort(),
configuration.getSourceAmsNetId(), configuration.getSourceAmsPort(),
0, getInvokeId(), directAdsField.getIndexGroup(), directAdsField.getIndexOffset(), writeBuffer.getData());
@@ -621,9 +621,9 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
}
try {
WriteBufferByteBased itemWriteBuffer = new WriteBufferByteBased(DataItem.getLengthInBytes(plcValue,
- field.getAdsDataType().getDataFormatName(), stringLength));
+ field.getAdsDataType().getPlcValueType(), stringLength));
DataItem.staticSerialize(itemWriteBuffer, plcValue,
- field.getAdsDataType().getDataFormatName(), stringLength, ByteOrder.LITTLE_ENDIAN);
+ field.getAdsDataType().getPlcValueType(), stringLength, ByteOrder.LITTLE_ENDIAN);
int numBytes = itemWriteBuffer.getPos();
System.arraycopy(itemWriteBuffer.getData(), 0, writeBuffer, pos, numBytes);
pos += numBytes;
@@ -921,7 +921,7 @@ public class AdsProtocolLogic extends Plc4xProtocolBase<AmsTCPPacket> implements
Map<String, ResponseItem<PlcValue>> values = new HashMap<>();
ReadBufferByteBased readBuffer = new ReadBufferByteBased(data, ByteOrder.LITTLE_ENDIAN);
values.put(subscriptionHandle.getPlcFieldName(), new ResponseItem<>(PlcResponseCode.OK,
- DataItem.staticParse(readBuffer, subscriptionHandle.getAdsDataType().getDataFormatName(), data.length)));
+ DataItem.staticParse(readBuffer, subscriptionHandle.getAdsDataType().getPlcValueType(), data.length)));
return values;
}
diff --git a/protocols/ads/src/main/resources/protocols/ads/ads.mspec b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
index da0a42945..a27f0cb72 100644
--- a/protocols/ads/src/main/resources/protocols/ads/ads.mspec
+++ b/protocols/ads/src/main/resources/protocols/ads/ads.mspec
@@ -383,12 +383,12 @@
[array byte data count 'sampleSize']
]
-[dataIo DataItem(vstring dataFormatName, int 32 stringLength)
- [typeSwitch dataFormatName
+[dataIo DataItem(PlcValueType plcValueType, int 32 stringLength)
+ [typeSwitch plcValueType
// -----------------------------------------
// Bit
// -----------------------------------------
- ['"IEC61131_BOOL"' BOOL
+ ['BOOL' BOOL
[reserved uint 7 '0x00']
[simple bit value]
]
@@ -397,15 +397,15 @@
// Bit-strings
// -----------------------------------------
// 1 byte
- ['"IEC61131_BYTE"' BitString
+ ['BYTE' BitString
[simple uint 8 value]
]
// 2 byte (16 bit)
- ['"IEC61131_WORD"' BitString
+ ['WORD' BitString
[simple uint 16 value]
]
// 4 byte (32 bit)
- ['"IEC61131_DWORD"' BitString
+ ['DWORD' BitString
[simple uint 32 value]
]
@@ -413,58 +413,58 @@
// Integers
// -----------------------------------------
// 8 bit:
- ['"IEC61131_SINT"' SINT
+ ['SINT' SINT
[simple int 8 value]
]
- ['"IEC61131_USINT"' USINT
+ ['USINT' USINT
[simple uint 8 value]
]
// 16 bit:
- ['"IEC61131_INT"' INT
+ ['INT' INT
[simple int 16 value]
]
- ['"IEC61131_UINT"' UINT
+ ['UINT' UINT
[simple uint 16 value]
]
// 32 bit:
- ['"IEC61131_DINT"' DINT
+ ['DINT' DINT
[simple int 32 value]
]
- ['"IEC61131_UDINT"' UDINT
+ ['UDINT' UDINT
[simple uint 32 value]
]
// 64 bit:
- ['"IEC61131_LINT"' LINT
+ ['LINT' LINT
[simple int 64 value]
]
- ['"IEC61131_ULINT"' ULINT
+ ['ULINT' ULINT
[simple uint 64 value]
]
// -----------------------------------------
// Floating point values
// -----------------------------------------
- ['"IEC61131_REAL"' REAL
+ ['REAL' REAL
[simple float 32 value]
]
- ['"IEC61131_LREAL"' LREAL
+ ['LREAL' LREAL
[simple float 64 value]
]
// -----------------------------------------
// Characters & Strings
// -----------------------------------------
- ['"IEC61131_CHAR"' STRING
+ ['CHAR' STRING
[simple string 8 value]
]
- ['"IEC61131_WCHAR"' STRING
+ ['WCHAR' STRING
[simple string 16 value encoding='"UTF-16"']
]
- ['"IEC61131_STRING"' STRING
+ ['STRING' STRING
// TODO: Fix this length
[manual vstring value 'STATIC_CALL("parseAmsString", readBuffer, stringLength, _type.encoding)' 'STATIC_CALL("serializeAmsString", writeBuffer, _value, stringLength, _type.encoding)' 'stringLength + 1']
]
- ['"IEC61131_WSTRING"' STRING
+ ['WSTRING' STRING
// TODO: Fix this length
[manual vstring value 'STATIC_CALL("parseAmsString", readBuffer, stringLength, _type.encoding)' 'STATIC_CALL("serializeAmsString", writeBuffer, _value, stringLength, _type.encoding)' '(stringLength * 2) + 2' encoding='"UTF-16"']
]
@@ -473,92 +473,141 @@
// Date & Times
// -----------------------------------------
// Interpreted as "milliseconds"
- ['"IEC61131_TIME"' TIME
+ ['TIME' TIME
[simple uint 32 value]
]
// Interpreted as "nanoseconds"
- ['"IEC61131_LTIME"' LTIME
+ ['LTIME' LTIME
[simple uint 64 value]
]
// Interpreted as "seconds since epoch"
- ['"IEC61131_DATE"' DATE
+ ['DATE' DATE
[simple uint 32 value]
]
// Interpreted as "milliseconds since midnight"
- ['"IEC61131_TIME_OF_DAY"' TIME_OF_DAY
+ ['TIME_OF_DAY' TIME_OF_DAY
[simple uint 32 value]
]
// Interpreted as "seconds since epoch"
- ['"IEC61131_DATE_AND_TIME"' DATE_AND_TIME
+ ['DATE_AND_TIME' DATE_AND_TIME
[simple uint 32 secondsSinceEpoch]
]
]
]
-[enum int 8 AdsDataType(uint 16 numBytes, vstring dataFormatName)
- ['0x01' BOOL ['1', '"IEC61131_BOOL"']]
- ['0x02' BIT ['1', '"IEC61131_BOOL"']]
+[enum uint 8 PlcValueType
+ ['0x00' NULL ]
+
+ // Bit Strings
+ ['0x01' BOOL ]
+ ['0x02' BYTE ]
+ ['0x03' WORD ]
+ ['0x04' DWORD ]
+ ['0x05' LWORD ]
+
+ // Unsigned Integers
+ ['0x11' USINT ]
+ ['0x12' UINT ]
+ ['0x13' UDINT ]
+ ['0x14' ULINT ]
+
+ // Signed Integers
+ ['0x21' SINT ]
+ ['0x22' INT ]
+ ['0x23' DINT ]
+ ['0x24' LINT ]
+
+ // Floating Point Values
+ ['0x31' REAL ]
+ ['0x32' LREAL ]
+
+ // Chars and Strings
+ ['0x41' CHAR ]
+ ['0x42' WCHAR ]
+ ['0x43' STRING ]
+ ['0x44' WSTRING ]
+
+ // Times and Dates
+ ['0x51' TIME ]
+ ['0x52' LTIME ]
+ ['0x53' DATE ]
+ ['0x54' LDATE ]
+ ['0x55' TIME_OF_DAY ]
+ ['0x56' LTIME_OF_DAY ]
+ ['0x57' DATE_AND_TIME ]
+ ['0x58' LDATE_AND_TIME]
+
+ // Complex types
+ ['0x61' Struct ]
+ ['0x62' List ]
+
+ ['0x71' RAW_BYTE_ARRAY]
+]
+
+[enum int 8 AdsDataType(uint 16 numBytes, PlcValueType plcValueType)
+ ['0x01' BOOL ['1', 'BOOL' ]]
+ ['0x02' BIT ['1', 'BOOL' ]]
// -----------------------------------------
// Bit-strings
// -----------------------------------------
// 1 byte
- ['0x03' BIT8 ['1', '"IEC61131_BYTE"']]
- ['0x04' BYTE ['1', '"IEC61131_BYTE"']]
- ['0x05' BITARR8 ['1', '"IEC61131_BYTE"']]
+ ['0x03' BIT8 ['1', 'BYTE' ]]
+ ['0x04' BYTE ['1', 'BYTE' ]]
+ ['0x05' BITARR8 ['1', 'BYTE' ]]
// 2 byte (16 bit)
- ['0x06' WORD ['2', '"IEC61131_WORD"']]
- ['0x07' BITARR16 ['2', '"IEC61131_WORD"']]
+ ['0x06' WORD ['2', 'WORD' ]]
+ ['0x07' BITARR16 ['2', 'WORD' ]]
// 4 byte (32 bit)
- ['0x08' DWORD ['4', '"IEC61131_DWORD"']]
- ['0x09' BITARR32 ['4', '"IEC61131_DWORD"']]
+ ['0x08' DWORD ['4', 'DWORD' ]]
+ ['0x09' BITARR32 ['4', 'DWORD' ]]
// -----------------------------------------
// Integers
// -----------------------------------------
// 8 bit:
- ['0x0A' SINT ['1', '"IEC61131_SINT"']]
- ['0x0B' INT8 ['1', '"IEC61131_SINT"']]
- ['0x0C' USINT ['1', '"IEC61131_USINT"']]
- ['0x0D' UINT8 ['1', '"IEC61131_USINT"']]
+ ['0x0A' SINT ['1', 'SINT' ]]
+ ['0x0B' INT8 ['1', 'SINT' ]]
+ ['0x0C' USINT ['1', 'USINT' ]]
+ ['0x0D' UINT8 ['1', 'USINT' ]]
// 16 bit:
- ['0x0E' INT ['2', '"IEC61131_INT"']]
- ['0x0F' INT16 ['2', '"IEC61131_INT"']]
- ['0x10' UINT ['2', '"IEC61131_UINT"']]
- ['0x11' UINT16 ['2', '"IEC61131_UINT"']]
+ ['0x0E' INT ['2', 'INT' ]]
+ ['0x0F' INT16 ['2', 'INT' ]]
+ ['0x10' UINT ['2', 'UINT' ]]
+ ['0x11' UINT16 ['2', 'UINT' ]]
// 32 bit:
- ['0x12' DINT ['4', '"IEC61131_DINT"']]
- ['0x13' INT32 ['4', '"IEC61131_DINT"']]
- ['0x14' UDINT ['4', '"IEC61131_UDINT"']]
- ['0x15' UINT32 ['4', '"IEC61131_UDINT"']]
+ ['0x12' DINT ['4', 'DINT' ]]
+ ['0x13' INT32 ['4', 'DINT' ]]
+ ['0x14' UDINT ['4', 'UDINT' ]]
+ ['0x15' UINT32 ['4', 'UDINT' ]]
// 64 bit:
- ['0x16' LINT ['8', '"IEC61131_LINT"']]
- ['0x17' INT64 ['8', '"IEC61131_LINT"']]
- ['0x18' ULINT ['8', '"IEC61131_ULINT"']]
- ['0x19' UINT64 ['8', '"IEC61131_ULINT"']]
+ ['0x16' LINT ['8', 'LINT' ]]
+ ['0x17' INT64 ['8', 'LINT' ]]
+ ['0x18' ULINT ['8', 'ULINT' ]]
+ ['0x19' UINT64 ['8', 'ULINT' ]]
// -----------------------------------------
// Floating point values
// -----------------------------------------
- ['0x1A' REAL ['4', '"IEC61131_REAL"']]
- ['0x1B' FLOAT ['4', '"IEC61131_REAL"']]
- ['0x1C' LREAL ['8', '"IEC61131_LREAL"']]
- ['0x1D' DOUBLE ['8', '"IEC61131_LREAL"']]
+ ['0x1A' REAL ['4', 'REAL' ]]
+ ['0x1B' FLOAT ['4', 'REAL' ]]
+ ['0x1C' LREAL ['8', 'LREAL' ]]
+ ['0x1D' DOUBLE ['8', 'LREAL' ]]
// -----------------------------------------
// Characters & Strings
// -----------------------------------------
- ['0x1E' CHAR ['1', '"IEC61131_CHAR"']]
- ['0x1F' WCHAR ['2', '"IEC61131_WCHAR"']]
- ['0x20' STRING ['256', '"IEC61131_STRING"']]
- ['0x21' WSTRING ['512', '"IEC61131_WSTRING"']]
+ ['0x1E' CHAR ['1', 'CHAR' ]]
+ ['0x1F' WCHAR ['2', 'WCHAR' ]]
+ ['0x20' STRING ['256', 'STRING' ]]
+ ['0x21' WSTRING ['512', 'WSTRING' ]]
// -----------------------------------------
// Dates & Times
// -----------------------------------------
- ['0x22' TIME ['4', '"IEC61131_TIME"']]
- ['0x23' LTIME ['8', '"IEC61131_LTIME"']]
- ['0x24' DATE ['4', '"IEC61131_DATE"']]
- ['0x25' TIME_OF_DAY ['4', '"IEC61131_TIME_OF_DAY"']]
- ['0x26' TOD ['4', '"IEC61131_TIME_OF_DAY"']]
- ['0x27' DATE_AND_TIME ['4', '"IEC61131_DATE_AND_TIME"']]
- ['0x28' DT ['4', '"IEC61131_DATE_AND_TIME"']]
+ ['0x22' TIME ['4', 'TIME' ]]
+ ['0x23' LTIME ['8', 'LTIME' ]]
+ ['0x24' DATE ['4', 'DATE' ]]
+ ['0x25' TIME_OF_DAY ['4', 'TIME_OF_DAY' ]]
+ ['0x26' TOD ['4', 'TIME_OF_DAY' ]]
+ ['0x27' DATE_AND_TIME ['4', 'DATE_AND_TIME']]
+ ['0x28' DT ['4', 'DATE_AND_TIME']]
]
// https://github.com/Beckhoff/ADS/blob/master/AdsLib/standalone/AdsDef.h