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 2021/09/07 07:52:13 UTC

[plc4x] branch develop updated: PLC4X-314: Fixed a bug, not adding the size of the item causing a split

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 45ebf29  PLC4X-314: Fixed a bug, not adding the size of the item causing a split
45ebf29 is described below

commit 45ebf298ce5ee4516a7db944f567b9d5a0209ec8
Author: cdutz <ch...@c-ware.de>
AuthorDate: Tue Sep 7 09:50:49 2021 +0200

    PLC4X-314: Fixed a bug, not adding the size of the item causing a split
    
    NO JIRA: Updated the code to utilize the requests better in case of writing boolean arrays
---
 .../plc4x/java/s7/readwrite/optimizer/S7Optimizer.java      | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

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 ed56759..3dc98b9 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
@@ -126,7 +126,12 @@ public class S7Optimizer extends BaseOptimizer {
             S7Field field = (S7Field) writeRequest.getField(fieldName);
             PlcValue value = writeRequest.getPlcValue(fieldName);
 
-            int writeRequestItemSize = S7_ADDRESS_ANY_SIZE + 4/* Size of Payload item header*/ +(field.getNumberOfElements() * field.getDataType().getSizeInBytes());
+            int writeRequestItemSize = S7_ADDRESS_ANY_SIZE + 4/* Size of Payload item header*/;
+            if (field.getDataType() == TransportSize.BOOL) {
+                writeRequestItemSize += Math.ceil((double) field.getNumberOfElements() / 8);
+            } else {
+                writeRequestItemSize += (field.getNumberOfElements() * field.getDataType().getSizeInBytes());
+            }
             // If it's an odd number of bytes, add one to make it even
             if (writeRequestItemSize % 2 == 1) {
                 writeRequestItemSize++;
@@ -142,15 +147,15 @@ public class S7Optimizer extends BaseOptimizer {
 
                 // Add the item.
             }
-            // If they would exceed, start a new request.
+            // If adding them would exceed, start a new request.
             else {
                 // Create a new PlcWriteRequest containing the current field item.
                 processedRequests.add(new DefaultPlcWriteRequest(
                     ((DefaultPlcWriteRequest) writeRequest).getWriter(), curFields));
 
                 // Reset the size and item lists.
-                curRequestSize = EMPTY_WRITE_REQUEST_SIZE;
-                curResponseSize = EMPTY_WRITE_RESPONSE_SIZE;
+                curRequestSize = EMPTY_WRITE_REQUEST_SIZE + writeRequestItemSize;
+                curResponseSize = EMPTY_WRITE_RESPONSE_SIZE + writeResponseItemSize;
                 curFields = new LinkedHashMap<>();
 
                 // Splitting of huge fields not yet implemented, throw an exception instead.