You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2025/05/02 09:18:47 UTC

(plc4x) branch develop updated: feat(plc4j/modbus): ModbusOptimizer fixes for discrete-input and endianness (#2055)

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

sruehl 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 896c088fb9 feat(plc4j/modbus): ModbusOptimizer fixes for discrete-input and endianness (#2055)
896c088fb9 is described below

commit 896c088fb9b8786bcba49fadc80825d244a47df4
Author: IsmoLeszczynski <15...@users.noreply.github.com>
AuthorDate: Fri May 2 12:18:41 2025 +0300

    feat(plc4j/modbus): ModbusOptimizer fixes for discrete-input and endianness (#2055)
    
    * Update ModbusOptimizer.java
    
    Fix Discrete Input handling when processing response
    
    * Update ModbusOptimizer.java
    
    Fixed endianness resolution to check modbusTag overrides
---
 .../plc4x/java/modbus/base/optimizer/ModbusOptimizer.java   | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java
index db838c6a0b..0bde206c48 100644
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/optimizer/ModbusOptimizer.java
@@ -192,7 +192,7 @@ public class ModbusOptimizer extends SingleTagOptimizer {
                 }
                 // Go through all responses till we find one where that contains the current tag's data.
                 for (Response response : responses.get(tagType)) {
-                    if(modbusTag instanceof ModbusTagCoil) {
+                    if((modbusTag instanceof ModbusTagCoil) || (modbusTag instanceof ModbusTagDiscreteInput)) {
                         if(response.matchesCoil(modbusTag)) {
                             // If this response was invalid, return all associated addresses as equally invalid.
                             // TODO: Possibly it would be worth doing a single item request for each of these
@@ -204,12 +204,11 @@ public class ModbusOptimizer extends SingleTagOptimizer {
                                 break;
                             }
 
-                            // Coils are read completely different from registers.
-                            ModbusTagCoil coilTag = (ModbusTagCoil) modbusTag;
+                            // Coils and Discrete Inputs are read completely different from registers.
 
                             // Calculate the byte that contains the response for this Coil
                             byte[] responseData = response.getResponseData();
-                            int bitPosition = coilTag.getAddress() - response.startingAddress;
+                            int bitPosition = modbusTag.getAddress() - response.startingAddress;
                             int bytePosition = bitPosition / 8;
                             int bitPositionInByte = bitPosition % 8;
                             boolean isBitSet = (responseData[bytePosition] & (1 << bitPositionInByte)) != 0;
@@ -229,12 +228,14 @@ public class ModbusOptimizer extends SingleTagOptimizer {
                             break;
                         }
 
+                        var byteOrder = modbusTag.getByteOrder() != null ? modbusTag.getByteOrder() : modbusContext.getByteOrder();
+
                         byte[] responseData = response.getResponseDataForTag(modbusTag);
-                        ReadBuffer readBuffer = getReadBuffer(responseData, modbusContext.getByteOrder());
+                        ReadBuffer readBuffer = getReadBuffer(responseData, byteOrder);
                         try {
                             PlcValue plcValue = DataItem.staticParse(readBuffer, modbusTag.getDataType(),
                                 modbusTag.getNumberOfElements(),
-                                modbusContext.getByteOrder() == ModbusByteOrder.BIG_ENDIAN);
+                                byteOrder == ModbusByteOrder.BIG_ENDIAN);
                             values.put(tagName, new DefaultPlcResponseItem<>(PlcResponseCode.OK, plcValue));
                         } catch (ParseException e) {
                             values.put(tagName, new DefaultPlcResponseItem<>(PlcResponseCode.INTERNAL_ERROR, null));