我需要使用串口、协议ModbusRTU写入从设备的2个寄存器。我可以使用 libs net.wimpi.modbus 读取所有寄存器。我需要将当前时间值写入保持寄存器,该寄存器位于设备中的地址 55 处。我正在使用以下方法读取值
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();
}
我尝试为 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();
}
不起作用
请尝试以下操作。由于缺少 Modbus 串行设置,我无法重现它。如果它不起作用,请在投反对票之前给我写个便条;)
根据 API,WriteMultipleRegistersRequest 可以用寄存器数组构造: https://jamod.sourceforge.net/api/net/wimpi/modbus/msg/WriteMultipleRegistersRequest.html#WriteMultipleRegistersRequest(int,%20net.wimpi .modbus.procimg.Register[])
因此创建一个 SimpleRegisteres 数组并调用构造函数 https://jamod.sourceforge.net/api/net/wimpi/modbus/procimg/SimpleRegister.html
...类似:
...
final Register[] registers = {new SimpleRegister(42)};
Wreq = new WriteMultipleRegistersRequest(ref, registers);
...
如前所述,如果它不起作用,请告诉我,我会调整(或删除)它。
问候, 托马斯