We use modbus with a PLC as master. The PLC expects the register value in the response message. This is according to the specification
"MODBUS APPLICATION PROTOCOL SPECIFICATION
V1.1b3" for Function 0x06.
j2mod does not respond with the register value. I made a change to the software for demonstration purposes.Below I put the diff to version 1.06.
There may be other response messages with the same issue.
+import gnu.io.UnsupportedCommOperationException;
+
/**
* Class that implements the ModbusRTU transport flavor.
*
@@ -230,9 +230,11 @@ public class ModbusRTUTransport extends ModbusSerialTransport {
case Modbus.READ_INPUT_DISCRETES:
case Modbus.READ_MULTIPLE_REGISTERS:
case Modbus.READ_INPUT_REGISTERS:
+ readRequestData(4, inpBuf, out);
+ break;
case Modbus.WRITE_COIL:
case Modbus.WRITE_SINGLE_REGISTER:
- readRequestData(4, inpBuf, out);
+ readRequestData(5, inpBuf, out);
break;
case Modbus.MASK_WRITE_REGISTER:
readRequestData(6, inpBuf, out);
diff --git a/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java b/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
index 4a57884..4ca0f7e 100755
--- a/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
+++ b/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
@@ -88,20 +88,33 @@ public final class WriteSingleRegisterRequest extends ModbusRequest {
}
public ModbusResponse getResponse() {
WriteSingleRegisterResponse response = new WriteSingleRegisterResponse();
WriteSingleRegisterResponse response =
new WriteSingleRegisterResponse();
setupRespone(response);
return response;
}
response.setHeadless(isHeadless());
public ModbusResponse getResponse(int ref, int value) {
We use modbus with a PLC as master. The PLC expects the register value in the response message. This is according to the specification
"MODBUS APPLICATION PROTOCOL SPECIFICATION
V1.1b3" for Function 0x06.
j2mod does not respond with the register value. I made a change to the software for demonstration purposes.Below I put the diff to version 1.06.
There may be other response messages with the same issue.
Cheers
Michael
diff --git a/src/com/ghgande/j2mod/modbus/io/ModbusRTUTransport.java b/src/com/ghgande/j2mod/modbus/io/ModbusRTUTransport.java
index 47cc83e..10ac89d 100755
--- a/src/com/ghgande/j2mod/modbus/io/ModbusRTUTransport.java
+++ b/src/com/ghgande/j2mod/modbus/io/ModbusRTUTransport.java
@@ -33,8 +33,6 @@
***/
package com.ghgande.j2mod.modbus.io;
-import gnu.io.UnsupportedCommOperationException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -47,6 +45,8 @@ import com.ghgande.j2mod.modbus.msg.ModbusRequest;
import com.ghgande.j2mod.modbus.msg.ModbusResponse;
import com.ghgande.j2mod.modbus.util.ModbusUtil;
+import gnu.io.UnsupportedCommOperationException;
+
/**
* Class that implements the ModbusRTU transport flavor.
*
@@ -230,9 +230,11 @@ public class ModbusRTUTransport extends ModbusSerialTransport {
case Modbus.READ_INPUT_DISCRETES:
case Modbus.READ_MULTIPLE_REGISTERS:
case Modbus.READ_INPUT_REGISTERS:
+ readRequestData(4, inpBuf, out);
+ break;
case Modbus.WRITE_COIL:
case Modbus.WRITE_SINGLE_REGISTER:
- readRequestData(4, inpBuf, out);
+ readRequestData(5, inpBuf, out);
break;
case Modbus.MASK_WRITE_REGISTER:
readRequestData(6, inpBuf, out);
diff --git a/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java b/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
index 4a57884..4ca0f7e 100755
--- a/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
+++ b/src/com/ghgande/j2mod/modbus/msg/WriteSingleRegisterRequest.java
@@ -88,20 +88,33 @@ public final class WriteSingleRegisterRequest extends ModbusRequest {
}
}
response.setHeadless(isHeadless());
+
+
+
if (!isHeadless()) {
response.setProtocolID(getProtocolID());
response.setTransactionID(getTransactionID());
}
response.setFunctionCode(getFunctionCode());
response.setUnitID(getUnitID());
-
}
WriteSingleRegisterResponse response = null;
Register reg = null;
@@ -115,8 +128,8 @@ public final class WriteSingleRegisterRequest extends ModbusRequest {
} catch (IllegalAddressException iaex) {
return createExceptionResponse(Modbus.ILLEGAL_ADDRESS_EXCEPTION);
}
- response = (WriteSingleRegisterResponse) getResponse();
-
+ response = (WriteSingleRegisterResponse) getResponse(m_Reference, reg.getValue());
+
return response;
}
For better readability I attach the diffs ina separate file.
The change concerning the number of bytes to be read (from 4 to 5) was wrong.
Last edit: Michael Dressel 2017-01-09