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
