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

commit 31fd33c62200fad61dc1e524d7baa532d9348ab6
Author: Christofer Dutz <[email protected]>
AuthorDate: Sat May 24 13:50:47 2025 +0200

    feat: Made the Modbus driver use the single-register request variant, if 
the tag fits into a single register.
---
 .../modbus/base/protocol/ModbusProtocolLogic.java    | 20 +++++++++++++-------
 .../plc4x/java/modbus/ManualModbusTCPDriverTest.java | 10 +++++-----
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git 
a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/protocol/ModbusProtocolLogic.java
 
b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/protocol/ModbusProtocolLogic.java
index 12a185dcfc..4e82e16b21 100644
--- 
a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/protocol/ModbusProtocolLogic.java
+++ 
b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/protocol/ModbusProtocolLogic.java
@@ -172,14 +172,20 @@ public abstract class ModbusProtocolLogic<T extends 
ModbusADU> extends Plc4xProt
             if(holdingRegister.getByteOrder() != null) {
                 byteOrder = holdingRegister.getByteOrder();
             }
-            ModbusPDUWriteMultipleHoldingRegistersRequest request =
-                new 
ModbusPDUWriteMultipleHoldingRegistersRequest(holdingRegister.getAddress(),
-                    holdingRegister.getLengthWords(), fromPlcValue(tag, 
plcValue, byteOrder));
-            if (request.getValue().length == holdingRegister.getLengthWords() 
* 2) {
-                return request;
+            byte[] bytes = fromPlcValue(tag, plcValue, byteOrder);
+            if(bytes.length == 2) {
+                int value = ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
+                return new 
ModbusPDUWriteSingleRegisterRequest(holdingRegister.getAddress(), value);
             } else {
-                throw new PlcRuntimeException("Number of requested values (" + 
request.getValue().length / 2 +
-                    ") doesn't match number of requested addresses (" + 
holdingRegister.getLengthWords() + ")");
+                ModbusPDUWriteMultipleHoldingRegistersRequest request =
+                    new 
ModbusPDUWriteMultipleHoldingRegistersRequest(holdingRegister.getAddress(),
+                        holdingRegister.getLengthWords(), bytes);
+                if (request.getValue().length == 
holdingRegister.getLengthWords() * 2) {
+                    return request;
+                } else {
+                    throw new PlcRuntimeException("Number of requested values 
(" + request.getValue().length / 2 +
+                        ") doesn't match number of requested addresses (" + 
holdingRegister.getLengthWords() + ")");
+                }
             }
         } else if (tag instanceof ModbusTagExtendedRegister) {
             ModbusTagExtendedRegister extendedRegister = 
(ModbusTagExtendedRegister) tag;
diff --git 
a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusTCPDriverTest.java
 
b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusTCPDriverTest.java
index 46f3b02d10..824e5e0537 100644
--- 
a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusTCPDriverTest.java
+++ 
b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusTCPDriverTest.java
@@ -71,12 +71,12 @@ public class ManualModbusTCPDriverTest extends ManualTest {
     public static void main(String[] args) throws Exception {
         ManualModbusTCPDriverTest test = new 
ManualModbusTCPDriverTest("modbus-tcp://192.168.23.30");
         test.addTestCase("holding-register:1:BOOL", new PlcBOOL(true)); // 0001
-        test.addTestCase("holding-register:2:BYTE", new PlcBYTE(42)); // 2A
-        //test.addTestCase("holding-register:3:WORD", new PlcWORD(42424)); // 
A5B8
+        test.addTestCase("holding-register:2:BYTE", new PlcBYTE(42)); // 002A
+        test.addTestCase("holding-register:3:WORD", new PlcWORD(42424)); // 
A5B8
         test.addTestCase("holding-register:4:DWORD", new 
PlcDWORD(4242442424L)); // FCDE 88B8
-//        test.addTestCase("holding-register:6:LWORD", new 
PlcLWORD(4242442424242424242L)); // FCDE 88B8 FCDE 88B8
-        test.addTestCase("holding-register:10:SINT", new PlcSINT(-42)); // D6
-        test.addTestCase("holding-register:11:USINT", new PlcUSINT(42)); // 2A
+        test.addTestCase("holding-register:6:LWORD", new 
PlcLWORD(4242442424242424242L)); // 3AE0 2EE8 4D04 49B2
+        test.addTestCase("holding-register:10:SINT", new PlcSINT(-42)); // FFD6
+        test.addTestCase("holding-register:11:USINT", new PlcUSINT(42)); // 
002A
         test.addTestCase("holding-register:12:INT", new PlcINT(-2424)); // F688
         test.addTestCase("holding-register:13:UINT", new PlcUINT(42424)); // 
A5B8
         test.addTestCase("holding-register:14:DINT", new PlcDINT(-242442424)); 
// F18C 9F48

Reply via email to