javaserial-portmodbus

Java ModbusRTU writing registers


I need to write 2 registers of slave device using serialport, protocol ModbusRTU. I can read all registers using libs net.wimpi.modbus. I need to write the current time value into the holding register, which is located at address 55 in the device. I am reading the values using the following method

public static void MGo() {
        SerialConnection con = null;
        ModbusSerialTransaction trans = null;
        ReadInputRegistersRequest req = null; //the request
        ReadInputRegistersResponse res = null; //the response
        
        ReadMultipleRegistersRequest Mreq = null;
        ReadMultipleRegistersResponse Mres = null;

        int unitid = 1; //идентификатор юнита, с которым мы будем разговаривать
        int ref = 0; //ссылка, с чего начать читать
        int count = 57; //количество IR для чтения
        int repeat = 1; //цикл для повторения транзакции

        //ModbusCoupler.createModbusCoupler(null);
        ModbusCoupler.getReference().setUnitID(1);

        SerialParameters params = new SerialParameters();
        params.setPortName(SelectCOM.ComPortBox.getSelectedItem().toString());
        params.setBaudRate(SelectCOM.BaudRateBox.getSelectedItem().toString());
        params.setDatabits(SelectCOM.DataBitBox.getSelectedItem().toString());
        params.setParity(SelectCOM.ParityBox.getSelectedItem().toString());
        params.setStopbits(SelectCOM.StopBitBox.getSelectedItem().toString());
        params.setEncoding("rtu");
        params.setEcho(false);

        // Открываем соединение
        con = new SerialConnection(params);
        try {
            con.open();
//          System.out.println(con.getSerialPort());
        } catch (Exception e) {
            e.printStackTrace();
        }
     // подготавливаем запрос
        Mreq = new ReadMultipleRegistersRequest(ref, count);
        Mreq.setUnitID(unitid);
        Mreq.setHeadless();

        trans = new ModbusSerialTransaction(con);
        trans.setRequest(Mreq);

        //7. Execute the transaction repeat times
        int k = 0;
        do {
            try {
                trans.execute();
            } catch (ModbusException e) {
                e.printStackTrace();
            }
/*          res = (ReadInputRegistersResponse) trans.getResponse();*/
            Mres = (ReadMultipleRegistersResponse) trans.getResponse();
            for (int n = 0; n < Mres.getWordCount(); n++) {
                HoldingRegs[n] = Mres.getRegisterValue(n);
            }
            k++;
        } while (k < repeat);
    

        con.close();
    
    }

I tried to write a similar method for WriteMultipleRegistersRequest

public static void WriteRTU(int RegAdr) throws IOException {
        SerialConnection con = null;
        ModbusSerialTransaction trans = null;
        WriteMultipleRegistersRequest Wreq = null; //the request
   

        int unitid = 1; //идентификатор юнита, с которым мы будем разговаривать
        int ref = RegAdr; //ссылка, с чего начать читать
        int count = 57; //количество IR для чтения
        int repeat = 1; //цикл для повторения транзакции

        ModbusCoupler.getReference().setUnitID(1);

        SerialParameters params = new SerialParameters();
        params.setPortName(SelectCOM.ComPortBox.getSelectedItem().toString());
        params.setBaudRate(SelectCOM.BaudRateBox.getSelectedItem().toString());
        params.setDatabits(SelectCOM.DataBitBox.getSelectedItem().toString());
        params.setParity(SelectCOM.ParityBox.getSelectedItem().toString());
        params.setStopbits(SelectCOM.StopBitBox.getSelectedItem().toString());
        params.setEncoding("rtu");
        params.setEcho(false);

        // Открываем соединение
        con = new SerialConnection(params);
        try {
            con.open();
//          System.out.println(con.getSerialPort());
        } catch (Exception e) {
            e.printStackTrace();
        }
     // подготавливаем запрос
        Wreq = new  WriteMultipleRegistersRequest();
        Wreq.setUnitID(unitid);
        Wreq.setHeadless();
        ModbusRequest.createModbusRequest(0x05);

        trans = new ModbusSerialTransaction(con);
        trans.setRequest(Wreq);

        //7. Execute the transaction repeat times
        int k = 0;
        do {
            try {
                trans.execute();
            } catch (ModbusException e) {
                e.printStackTrace();
            }

            k++;
        } while (k < repeat);
        con.close();
    
    }

It does'nt working


Solution

  • Please give the following a try. I cannot reproduce it, because of the lack of a Modbus Serial setup.

    According to the API, the WriteMultipleRegistersRequest can be constructed with an array of Registers: https://jamod.sourceforge.net/api/net/wimpi/modbus/msg/WriteMultipleRegistersRequest.html#WriteMultipleRegistersRequest(int,%20net.wimpi.modbus.procimg.Register[])

    Therefore create an array of SimpleRegisteres and call the constructor https://jamod.sourceforge.net/api/net/wimpi/modbus/procimg/SimpleRegister.html

    ...something like:

    ...
    final Register[] registers = {new SimpleRegister(42)};
    Wreq = new  WriteMultipleRegistersRequest(ref, registers);
    ...