This is an automated email from the ASF dual-hosted git repository.

cdutz 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 3b35391  PLC4X-208 - [S7] When trying to write to a S7 device and 
writing is not explicitly enabled, the PLC will respond with an error code
3b35391 is described below

commit 3b35391a376690315b9e4ebdb152df51dd07feac
Author: Christofer Dutz <[email protected]>
AuthorDate: Wed Jul 8 22:06:05 2020 +0200

    PLC4X-208 - [S7] When trying to write to a S7 device and writing is not 
explicitly enabled, the PLC will respond with an error code
    
    - Fixed some wrong constant values in the TransportSize
    - Changed the way the "length" is calculated in S7VarPayloadDataItem 
(Changed from 'simple' to 'implicit')
    - Fixed a 2 code-generation problems in C that were displayed due to these 
changes
---
 RELEASE_NOTES                                       |  5 ++++-
 .../plc4x/language/c/CLanguageTemplateHelper.java   | 21 ++++++++++++++++++++-
 .../java/s7/readwrite/protocol/S7ProtocolLogic.java |  5 ++---
 .../s7/src/test/resources/testsuite/S7DriverIT.xml  |  1 -
 .../resources/testsuite/S7ParserSerializerTest.xml  |  8 --------
 .../s7/src/main/resources/protocols/s7/s7.mspec     | 18 +++++++++---------
 .../server/s7/protocol/S7Step7ServerAdapter.java    |  4 ++--
 .../s7/includes/s7_var_payload_data_item.h          |  1 -
 .../generated-sources/s7/includes/transport_size.h  |  4 ++--
 .../s7/src/s7_var_payload_data_item.c               |  9 ++++-----
 10 files changed, 43 insertions(+), 33 deletions(-)

diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index abcb595..a0551b1 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -16,7 +16,10 @@ Bug Fixes
 ---------
 
 PLC4X-206   When writing short values exceptions are thrown
-while preparing the write request.
+            while preparing the write request.
+PLC4X-208   [S7] When trying to write to a S7 device and writing
+            is not explicitly enabled, the PLC will respond with
+            an error code
 
 ==============================================================
 Apache PLC4X 0.7.0
diff --git 
a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
 
b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index efe2f5d..9b444e2 100644
--- 
a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ 
b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -526,7 +526,7 @@ public class CLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelpe
                     return "lastItem";
                 // If this literal references an Enum type, then we have to 
output it differently.
                 } else if (getTypeDefinitions().get(variableLiteral.getName()) 
instanceof EnumTypeDefinition) {
-                    return variableLiteral.getName() + "." + 
variableLiteral.getChild().getName();
+                    return getCTypeName(variableLiteral.getName()) + "_" + 
variableLiteral.getChild().getName();
                 } else {
                     return variableExpressionGenerator.apply(term);
                 }
@@ -863,9 +863,28 @@ public class CLanguageTemplateHelper extends 
BaseFreemarkerLanguageTemplateHelpe
             }
         } else {
             StringBuilder sb = new StringBuilder("_message->");
+            // If this is a property of a sub-type, add the sub-type name to 
the property.
             if(baseType != getThisTypeDefinition()) {
                 
sb.append(camelCaseToSnakeCase(baseType.getName())).append("_");
             }
+
+            // If this expression references enum constants we need to do 
things differently
+            final Optional<TypeReference> typeReferenceForProperty =
+                getTypeReferenceForProperty(baseType, vl.getName());
+            if(typeReferenceForProperty.isPresent()) {
+                final TypeReference typeReference = 
typeReferenceForProperty.get();
+                if(typeReference instanceof ComplexTypeReference) {
+                    final TypeDefinition typeDefinitionForTypeReference =
+                        getTypeDefinitionForTypeReference(typeReference);
+                    if ((typeDefinitionForTypeReference instanceof 
EnumTypeDefinition) && (vl.getChild() != null)){
+                        sb.append(camelCaseToSnakeCase(vl.getName()));
+                        return 
getCTypeName(typeDefinitionForTypeReference.getName()) +
+                            "_get_" + 
camelCaseToSnakeCase(vl.getChild().getName()) +
+                            "(" + sb.toString() + ")";
+                    }
+                }
+            }
+            // If it wasn't an enum, treat it as a normal property.
             appendVariableExpressionRest(sb, baseType, vl);
             return sb.toString();
         }
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 0221603..ccefd87 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
@@ -431,12 +431,11 @@ public class S7ProtocolLogic extends 
Plc4xProtocolBase<TPKTPacket> {
 
     private S7VarPayloadDataItem serializePlcValue(S7Field field, PlcValue 
plcValue) {
         try {
-            DataTransportSize transportSize = 
(field.getDataType().getDataProtocolId() == 1) ?
-                DataTransportSize.BIT : DataTransportSize.BYTE_WORD_DWORD;
+            DataTransportSize transportSize = 
field.getDataType().getDataTransportSize();
             WriteBuffer writeBuffer = DataItemIO.staticSerialize(plcValue, 
field.getDataType().getDataProtocolId());
             if(writeBuffer != null) {
                 byte[] data = writeBuffer.getData();
-                return new S7VarPayloadDataItem(DataTransportErrorCode.OK, 
transportSize, data.length, data);
+                return new S7VarPayloadDataItem(DataTransportErrorCode.OK, 
transportSize, data);
             }
         } catch (ParseException e) {
             logger.warn(String.format("Error serializing field item of type: 
'%s'", field.getDataType().name()), e);
diff --git a/plc4j/drivers/s7/src/test/resources/testsuite/S7DriverIT.xml 
b/plc4j/drivers/s7/src/test/resources/testsuite/S7DriverIT.xml
index 2802439..9facd9e 100644
--- a/plc4j/drivers/s7/src/test/resources/testsuite/S7DriverIT.xml
+++ b/plc4j/drivers/s7/src/test/resources/testsuite/S7DriverIT.xml
@@ -270,7 +270,6 @@
                   <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                     <returnCode>OK</returnCode>
                     <transportSize>BIT</transportSize>
-                    <dataLength>1</dataLength>
                     <data>AQ==</data>
                   </items>
                 </items>
diff --git 
a/plc4j/drivers/s7/src/test/resources/testsuite/S7ParserSerializerTest.xml 
b/plc4j/drivers/s7/src/test/resources/testsuite/S7ParserSerializerTest.xml
index 4c702a9..1c3b735 100644
--- a/plc4j/drivers/s7/src/test/resources/testsuite/S7ParserSerializerTest.xml
+++ b/plc4j/drivers/s7/src/test/resources/testsuite/S7ParserSerializerTest.xml
@@ -322,25 +322,21 @@
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
               </items>
@@ -436,25 +432,21 @@
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
                 <items 
className="org.apache.plc4x.java.s7.readwrite.S7VarPayloadDataItem">
                   <returnCode>OK</returnCode>
                   <transportSize>BIT</transportSize>
-                  <dataLength>1</dataLength>
                   <data>AQ==</data>
                 </items>
               </items>
diff --git a/protocols/s7/src/main/resources/protocols/s7/s7.mspec 
b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
index 5b91e79..de1d087 100644
--- a/protocols/s7/src/main/resources/protocols/s7/s7.mspec
+++ b/protocols/s7/src/main/resources/protocols/s7/s7.mspec
@@ -230,11 +230,11 @@
 
 // This is actually not quite correct as depending pon the transportSize the 
length is either defined in bits or bytes.
 [type 'S7VarPayloadDataItem' [bit 'lastItem']
-    [enum    DataTransportErrorCode 'returnCode']
-    [enum    DataTransportSize      'transportSize']
-    [simple  uint 16                'dataLength']
-    [array   int  8                 'data' count 'transportSize.sizeInBits ? 
CEIL(dataLength / 8.0) : dataLength']
-    [padding uint 8                 'pad' '0x00' '!lastItem && ((COUNT(data) % 
2) == 1)']
+    [enum     DataTransportErrorCode 'returnCode']
+    [enum     DataTransportSize      'transportSize']
+    [implicit uint 16                'dataLength' 'COUNT(data) * 
((transportSize == DataTransportSize.BIT) ? 1 : (transportSize.sizeInBits ? 8 : 
1))']
+    [array    int  8                 'data'       count 
'transportSize.sizeInBits ? CEIL(dataLength / 8.0) : dataLength']
+    [padding  uint 8                 'pad'        '0x00' '!lastItem && 
((COUNT(data) % 2) == 1)']
 ]
 
 [type 'S7VarPayloadStatusItem'
@@ -410,13 +410,13 @@
 
     // Integer values
     // INT and UINT moved out of order as the enum constant INT needs to be 
generated before it's used in java
-    ['0x05' INT              ['W'              , '2'                 , 'null'  
                , 'DataTransportSize.BYTE_WORD_DWORD'  , '23'                   
, 'true'                , 'true'                , 'true'                 , 
'true'                 , 'true'              ]]
-    ['0x05' UINT             ['W'              , '2'                 , 
'TransportSize.INT'     , 'DataTransportSize.BYTE_WORD_DWORD'  , '24'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
+    ['0x05' INT              ['W'              , '2'                 , 'null'  
                , 'DataTransportSize.INTEGER'          , '23'                   
, 'true'                , 'true'                , 'true'                 , 
'true'                 , 'true'              ]]
+    ['0x05' UINT             ['W'              , '2'                 , 
'TransportSize.INT'     , 'DataTransportSize.INTEGER'          , '24'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
     // ...
     ['0x02' SINT             ['B'              , '1'                 , 
'TransportSize.INT'     , 'DataTransportSize.BYTE_WORD_DWORD'  , '21'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
     ['0x02' USINT            ['B'              , '1'                 , 
'TransportSize.INT'     , 'DataTransportSize.BYTE_WORD_DWORD'  , '22'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
-    ['0x07' DINT             ['D'              , '4'                 , 
'TransportSize.INT'     , 'DataTransportSize.BYTE_WORD_DWORD'  , '25'           
        , 'true'                , 'true'                , 'true'                
 , 'true'                 , 'true'              ]]
-    ['0x07' UDINT            ['D'              , '4'                 , 
'TransportSize.INT'     , 'DataTransportSize.BYTE_WORD_DWORD'  , '26'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
+    ['0x07' DINT             ['D'              , '4'                 , 
'TransportSize.INT'     , 'DataTransportSize.INTEGER'          , '25'           
        , 'true'                , 'true'                , 'true'                
 , 'true'                 , 'true'              ]]
+    ['0x07' UDINT            ['D'              , '4'                 , 
'TransportSize.INT'     , 'DataTransportSize.INTEGER'          , '26'           
        , 'false'               , 'false'               , 'true'                
 , 'true'                 , 'true'              ]]
     ['0x00' LINT             ['X'              , '8'                 , 
'TransportSize.INT'     , 'null'                               , '27'           
        , 'false'               , 'false'               , 'false'               
 , 'true'                 , 'false'             ]]
     ['0x00' ULINT            ['X'              , '16'                , 
'TransportSize.INT'     , 'null'                               , '28'           
        , 'false'               , 'false'               , 'false'               
 , 'true'                 , 'false'             ]]
 
diff --git 
a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
 
b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
index 9c60514..594bbe1 100644
--- 
a/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
+++ 
b/sandbox/plc-simulator/src/main/java/org/apache/plc4x/simulator/server/s7/protocol/S7Step7ServerAdapter.java
@@ -265,7 +265,7 @@ public class S7Step7ServerAdapter extends 
ChannelInboundHandlerAdapter {
                                                             byte[] data = new 
byte[2];
                                                             data[0] = (byte) 
(shortValue & 0xff);
                                                             data[1] = (byte) 
((shortValue >> 8) & 0xff);
-                                                            payloadItems[i] = 
new S7VarPayloadDataItem(DataTransportErrorCode.OK, 
DataTransportSize.BYTE_WORD_DWORD, 8 * data.length, data);
+                                                            payloadItems[i] = 
new S7VarPayloadDataItem(DataTransportErrorCode.OK, 
DataTransportSize.BYTE_WORD_DWORD, data);
                                                             break;
                                                         }
                                                         default: {
@@ -281,7 +281,7 @@ public class S7Step7ServerAdapter extends 
ChannelInboundHandlerAdapter {
                                                         
addressAny.getNumberOfElements() : 
addressAny.getTransportSize().getSizeInBytes() * 8;
                                                     final BitSet bitSet = 
toBitSet(context.getDigitalInputs(), ioNumber, numElements);
                                                     final byte[] data = 
Arrays.copyOf(bitSet.toByteArray(), (numElements + 7) / 8);
-                                                    payloadItems[i] = new 
S7VarPayloadDataItem(DataTransportErrorCode.OK, 
DataTransportSize.BYTE_WORD_DWORD, 8 * data.length, data);
+                                                    payloadItems[i] = new 
S7VarPayloadDataItem(DataTransportErrorCode.OK, 
DataTransportSize.BYTE_WORD_DWORD, data);
                                                     break;
                                                 }
                                             }
diff --git 
a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h 
b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
index be57402..3f8c5b4 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_payload_data_item.h
@@ -32,7 +32,6 @@ struct plc4c_s7_read_write_s7_var_payload_data_item {
   /* Properties */
   plc4c_s7_read_write_data_transport_error_code return_code;
   plc4c_s7_read_write_data_transport_size transport_size;
-  uint16_t data_length;
   plc4c_list* data;
 };
 typedef struct plc4c_s7_read_write_s7_var_payload_data_item 
plc4c_s7_read_write_s7_var_payload_data_item;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/transport_size.h 
b/sandbox/plc4c/generated-sources/s7/includes/transport_size.h
index 141ec56..298cc07 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/transport_size.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/transport_size.h
@@ -364,13 +364,13 @@ plc4c_s7_read_write_data_transport_size 
plc4c_s7_read_write_transport_size_get_d
       return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
     }
     case 5: { /* '0x05' */
-      return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
+      return plc4c_s7_read_write_data_transport_size_INTEGER;
     }
     case 6: { /* '0x06' */
       return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
     }
     case 7: { /* '0x07' */
-      return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
+      return plc4c_s7_read_write_data_transport_size_INTEGER;
     }
     case 8: { /* '0x08' */
       return plc4c_s7_read_write_data_transport_size_BYTE_WORD_DWORD;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c 
b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index d92d5d0..d5f6de2 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -51,13 +51,12 @@ plc4c_return_code 
plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
   }
   (*_message)->transport_size = transportSize;
 
-  // Simple Field (dataLength)
+  // Implicit Field (dataLength) (Used for parsing, but it's value is not 
stored as it's implicitly given by the objects content)
   uint16_t dataLength = 0;
   _res = plc4c_spi_read_unsigned_short(buf, 16, (uint16_t*) &dataLength);
   if(_res != OK) {
     return _res;
   }
-  (*_message)->data_length = dataLength;
 
   // Array field (data)
   plc4c_list* data = malloc(sizeof(plc4c_list));
@@ -111,8 +110,8 @@ plc4c_return_code 
plc4c_s7_read_write_s7_var_payload_data_item_serialize(plc4c_s
     return _res;
   }
 
-  // Simple Field (dataLength)
-  _res = plc4c_spi_write_unsigned_short(buf, 16, _message->data_length);
+  // Implicit Field (dataLength) (Used for parsing, but it's value is not 
stored as it's implicitly given by the objects content)
+  _res = plc4c_spi_write_unsigned_short(buf, 16, 
(plc4c_spi_evaluation_helper_count(_message->data)) * 
((((((_message->transport_size) == 
(plc4c_s7_read_write_data_transport_size_BIT))) ? 1 : 
(((plc4c_s7_read_write_data_transport_size_get_size_in_bits(_message->transport_size))
 ? 8 : 1))))));
   if(_res != OK) {
     return _res;
   }
@@ -155,7 +154,7 @@ uint8_t 
plc4c_s7_read_write_s7_var_payload_data_item_length_in_bits(plc4c_s7_rea
   // Enum Field (transportSize)
   lengthInBits += 8;
 
-  // Simple field (dataLength)
+  // Implicit Field (dataLength)
   lengthInBits += 16;
 
   // Array field

Reply via email to