Skip to content

Commit 31fd33c

Browse files
committed
feat: Made the Modbus driver use the single-register request variant, if the tag fits into a single register.
1 parent fc8c145 commit 31fd33c

File tree

2 files changed

+18
-12
lines changed

2 files changed

+18
-12
lines changed

plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/base/protocol/ModbusProtocolLogic.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,20 @@ protected ModbusPDU getWriteRequestPdu(PlcTag tag, PlcValue plcValue) {
172172
if(holdingRegister.getByteOrder() != null) {
173173
byteOrder = holdingRegister.getByteOrder();
174174
}
175-
ModbusPDUWriteMultipleHoldingRegistersRequest request =
176-
new ModbusPDUWriteMultipleHoldingRegistersRequest(holdingRegister.getAddress(),
177-
holdingRegister.getLengthWords(), fromPlcValue(tag, plcValue, byteOrder));
178-
if (request.getValue().length == holdingRegister.getLengthWords() * 2) {
179-
return request;
175+
byte[] bytes = fromPlcValue(tag, plcValue, byteOrder);
176+
if(bytes.length == 2) {
177+
int value = ((bytes[0] & 0xFF) << 8) | (bytes[1] & 0xFF);
178+
return new ModbusPDUWriteSingleRegisterRequest(holdingRegister.getAddress(), value);
180179
} else {
181-
throw new PlcRuntimeException("Number of requested values (" + request.getValue().length / 2 +
182-
") doesn't match number of requested addresses (" + holdingRegister.getLengthWords() + ")");
180+
ModbusPDUWriteMultipleHoldingRegistersRequest request =
181+
new ModbusPDUWriteMultipleHoldingRegistersRequest(holdingRegister.getAddress(),
182+
holdingRegister.getLengthWords(), bytes);
183+
if (request.getValue().length == holdingRegister.getLengthWords() * 2) {
184+
return request;
185+
} else {
186+
throw new PlcRuntimeException("Number of requested values (" + request.getValue().length / 2 +
187+
") doesn't match number of requested addresses (" + holdingRegister.getLengthWords() + ")");
188+
}
183189
}
184190
} else if (tag instanceof ModbusTagExtendedRegister) {
185191
ModbusTagExtendedRegister extendedRegister = (ModbusTagExtendedRegister) tag;

plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualModbusTCPDriverTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@ public ManualModbusTCPDriverTest(String connectionString) {
7171
public static void main(String[] args) throws Exception {
7272
ManualModbusTCPDriverTest test = new ManualModbusTCPDriverTest("modbus-tcp://192.168.23.30");
7373
test.addTestCase("holding-register:1:BOOL", new PlcBOOL(true)); // 0001
74-
test.addTestCase("holding-register:2:BYTE", new PlcBYTE(42)); // 2A
75-
//test.addTestCase("holding-register:3:WORD", new PlcWORD(42424)); // A5B8
74+
test.addTestCase("holding-register:2:BYTE", new PlcBYTE(42)); // 002A
75+
test.addTestCase("holding-register:3:WORD", new PlcWORD(42424)); // A5B8
7676
test.addTestCase("holding-register:4:DWORD", new PlcDWORD(4242442424L)); // FCDE 88B8
77-
// test.addTestCase("holding-register:6:LWORD", new PlcLWORD(4242442424242424242L)); // FCDE 88B8 FCDE 88B8
78-
test.addTestCase("holding-register:10:SINT", new PlcSINT(-42)); // D6
79-
test.addTestCase("holding-register:11:USINT", new PlcUSINT(42)); // 2A
77+
test.addTestCase("holding-register:6:LWORD", new PlcLWORD(4242442424242424242L)); // 3AE0 2EE8 4D04 49B2
78+
test.addTestCase("holding-register:10:SINT", new PlcSINT(-42)); // FFD6
79+
test.addTestCase("holding-register:11:USINT", new PlcUSINT(42)); // 002A
8080
test.addTestCase("holding-register:12:INT", new PlcINT(-2424)); // F688
8181
test.addTestCase("holding-register:13:UINT", new PlcUINT(42424)); // A5B8
8282
test.addTestCase("holding-register:14:DINT", new PlcDINT(-242442424)); // F18C 9F48

0 commit comments

Comments
 (0)