use of io.openems.api.exception.OpenemsModbusException in project openems by OpenEMS.
the class ModbusBridge method writeMultipleCoils.
private ModbusResponse writeMultipleCoils(int modbusUnitId, int address, boolean[] coils) throws OpenemsModbusException, ModbusException {
ModbusTransaction trans = getTransaction();
BitVector vec = new BitVector(coils.length);
for (int i = 0; i < coils.length; i++) {
vec.setBit(i, coils[i]);
}
WriteMultipleCoilsRequest req = new WriteMultipleCoilsRequest(address, vec);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
try {
trans.execute();
} catch (ModbusException e) {
// try again with new connection
closeModbusConnection();
trans = getTransaction();
req = new WriteMultipleCoilsRequest(address, vec);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
trans.execute();
}
return trans.getResponse();
}
use of io.openems.api.exception.OpenemsModbusException in project openems by OpenEMS.
the class ModbusBridge method queryMultipleRegisters.
/**
* Executes a query on the Modbus client
*
* @param modbusUnitId
* @param address
* @param count
* @return
* @throws OpenemsModbusException
*/
private Register[] queryMultipleRegisters(int modbusUnitId, int address, int count) throws OpenemsModbusException {
ModbusTransaction trans = getTransaction();
ReadMultipleRegistersRequest req = new ReadMultipleRegistersRequest(address, count);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
try {
trans.execute();
} catch (ModbusException e) {
// try again with new connection
closeModbusConnection();
trans = getTransaction();
req = new ReadMultipleRegistersRequest(address, count);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
try {
trans.execute();
} catch (ModbusException e1) {
throw new OpenemsModbusException(//
"Error on modbus query. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Count [" + count + "]: " + e1.getMessage());
}
}
ModbusResponse res = trans.getResponse();
if (res instanceof ReadMultipleRegistersResponse) {
ReadMultipleRegistersResponse mres = (ReadMultipleRegistersResponse) res;
return mres.getRegisters();
} else {
throw new OpenemsModbusException(//
"Unable to read modbus response. " + "UnitId [" + modbusUnitId + "], Address [" + address + "], Count [" + count + "]: " + res.toString());
}
}
use of io.openems.api.exception.OpenemsModbusException in project openems by OpenEMS.
the class ModbusBridge method write.
protected void write(int modbusUnitId, int address, Register... register) throws OpenemsModbusException {
ModbusResponse res;
try {
if (register.length == 0) {
return;
} else if (register.length == 1) {
res = writeSingleRegister(modbusUnitId, address, register[0]);
} else {
res = writeMultipleRegisters(modbusUnitId, address, register);
}
} catch (ModbusException | OpenemsModbusException e) {
throw new OpenemsModbusException(//
"Error on modbus write. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Register [" + registersAsString(register) + "]: " + e.getMessage());
}
if (res instanceof ExceptionResponse) {
throw new OpenemsModbusException(//
"Error on modbus write response. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Register [" + registersAsString(register) + "]: " + res.toString());
}
log.debug(//
"Successful write. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Register [" + registersAsString(register) + "]");
}
use of io.openems.api.exception.OpenemsModbusException in project openems by OpenEMS.
the class ModbusBridge method queryInputRegisters.
/**
* Executes a query on the Modbus client
*
* @param modbusUnitId
* @param address
* @param count
* @return
* @throws OpenemsModbusException
*/
private InputRegister[] queryInputRegisters(int modbusUnitId, int address, int count) throws OpenemsModbusException {
ModbusTransaction trans = getTransaction();
ReadInputRegistersRequest req = new ReadInputRegistersRequest(address, count);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
try {
trans.execute();
} catch (ModbusException e) {
// try again with new connection
closeModbusConnection();
trans = getTransaction();
req = new ReadInputRegistersRequest(address, count);
req.setUnitID(modbusUnitId);
trans.setRequest(req);
try {
trans.execute();
} catch (ModbusException e1) {
throw new OpenemsModbusException(//
"Error on modbus query. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Count [" + count + "]: " + e1.getMessage());
}
}
ModbusResponse res = trans.getResponse();
if (res instanceof ReadInputRegistersResponse) {
ReadInputRegistersResponse mres = (ReadInputRegistersResponse) res;
return mres.getRegisters();
} else {
throw new OpenemsModbusException(//
"Unable to read modbus response. " + "UnitId [" + modbusUnitId + "], Address [" + address + "], Count [" + count + "]: " + res.toString());
}
}
use of io.openems.api.exception.OpenemsModbusException in project openems by OpenEMS.
the class ModbusBridge method writeCoil.
protected void writeCoil(int modbusUnitId, int address, Boolean... values) throws OpenemsModbusException {
boolean[] coils = new boolean[values.length];
for (int i = 0; i < values.length; i++) {
coils[i] = values[i];
}
ModbusResponse res;
try {
if (coils.length == 0) {
return;
} else if (coils.length == 1) {
res = writeSingleCoil(modbusUnitId, address, coils[0]);
} else {
res = writeMultipleCoils(modbusUnitId, address, coils);
}
} catch (ModbusException | OpenemsModbusException e) {
throw new OpenemsModbusException(//
"Error on modbus write. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Coil [" + coilsAsString(coils) + "]: " + e.getMessage());
}
if (res instanceof ExceptionResponse) {
throw new OpenemsModbusException(//
"Error on modbus write response. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Coil [" + coilsAsString(coils) + "]: " + res.toString());
}
log.debug(//
"Successful write. " + "UnitId [" + modbusUnitId + "], Address [" + address + "/0x" + Integer.toHexString(address) + "], Coil [" + coilsAsString(coils) + "]");
}
Aggregations