Menu

Write single register response not according specification?

2015-11-30
2017-01-09
  • Michael Dressel

    Michael Dressel - 2015-11-30

    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 {
    }

    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) {
    • WriteSingleRegisterResponse response =
    • new WriteSingleRegisterResponse(ref, value);
      +
    • setupRespone(response);
      +
    • return response;
    • }
      +
    • private void setupRespone(WriteSingleRegisterResponse response) {
    • response.setHeadless(isHeadless());
      if (!isHeadless()) {
      response.setProtocolID(getProtocolID());
      response.setTransactionID(getTransactionID());
      }
      response.setFunctionCode(getFunctionCode());
      response.setUnitID(getUnitID());
      -
    • return response;
    • }

    • public ModbusResponse createResponse() {
    • }
    • public ModbusResponse createResponse() {
      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;
    }

     
  • Michael Dressel

    Michael Dressel - 2015-11-30

    For better readability I attach the diffs ina separate file.

     
  • Michael Dressel

    Michael Dressel - 2017-01-09

    The change concerning the number of bytes to be read (from 4 to 5) was wrong.

     

    Last edit: Michael Dressel 2017-01-09

Log in to post a comment.