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