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
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);
...