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));