|
@ -5,6 +5,7 @@ import com.serotonin.modbus4j.msg.*; |
|
|
import jakarta.annotation.PostConstruct; |
|
|
import jakarta.annotation.PostConstruct; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.RequiredArgsConstructor; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
|
import org.jboss.logging.BasicLogger; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.beans.factory.annotation.Value; |
|
|
import org.springframework.stereotype.Component; |
|
|
import org.springframework.stereotype.Component; |
|
|
import org.springframework.scheduling.annotation.Scheduled; |
|
|
import org.springframework.scheduling.annotation.Scheduled; |
|
@ -26,14 +27,14 @@ public class ModbusMasterService { |
|
|
|
|
|
|
|
|
@PostConstruct |
|
|
@PostConstruct |
|
|
public void init() { |
|
|
public void init() { |
|
|
|
|
|
modbusMaster_ = ModbusMasterFactory.createModbusRtuMaster(port, baudrate); |
|
|
log.info("============== ============== ============== ============== =============="); |
|
|
log.info("============== ============== ============== ============== =============="); |
|
|
log.info("============== ============== ============== ============== =============="); |
|
|
log.info("============== ============== ============== ============== =============="); |
|
|
try { |
|
|
try { |
|
|
modbusMaster_ = ModbusMasterFactory.createModbusRtuMaster(port, baudrate); |
|
|
|
|
|
modbusMaster_.init(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.connect(); |
|
|
log.info("Modbus master 端口: {} 波特率:{} initialized successfully.", port, baudrate); |
|
|
log.info("Modbus master 端口: {} 波特率:{} initialized successfully.", port, baudrate); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to initialize Modbus master: {} 端口: {} 波特率: {}", |
|
|
log.error("Failed to initialize Modbus master: {} 端口: {} 波特率: {}", |
|
|
e.getMessage(), port, baudrate); |
|
|
e.getMessage(), port, baudrate); |
|
|
} |
|
|
} |
|
@ -68,11 +69,13 @@ public class ModbusMasterService { |
|
|
ReadCoilsRequest request = new ReadCoilsRequest(slaveId, startAddress, length); |
|
|
ReadCoilsRequest request = new ReadCoilsRequest(slaveId, startAddress, length); |
|
|
ReadCoilsResponse response = (ReadCoilsResponse) modbusMaster_.send(request); |
|
|
ReadCoilsResponse response = (ReadCoilsResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error reading coils: {}", response.getExceptionMessage()); |
|
|
log.error("Error reading coils: {}", response.getExceptionMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
return response.getBooleanData(); |
|
|
return response.getBooleanData(); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to read coils: {}", e.getMessage()); |
|
|
log.error("Failed to read coils: {}", e.getMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} finally { |
|
|
} finally { |
|
@ -90,11 +93,13 @@ public class ModbusMasterService { |
|
|
ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, startAddress, length); |
|
|
ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, startAddress, length); |
|
|
ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) modbusMaster_.send(request); |
|
|
ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error reading discrete inputs: {}", response.getExceptionMessage()); |
|
|
log.error("Error reading discrete inputs: {}", response.getExceptionMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
return response.getBooleanData(); |
|
|
return response.getBooleanData(); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to read discrete inputs: {}", e.getMessage()); |
|
|
log.error("Failed to read discrete inputs: {}", e.getMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} finally { |
|
|
} finally { |
|
@ -112,11 +117,13 @@ public class ModbusMasterService { |
|
|
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, startAddress, length); |
|
|
ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, startAddress, length); |
|
|
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) modbusMaster_.send(request); |
|
|
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error reading holding registers: {}", response.getExceptionMessage()); |
|
|
log.error("Error reading holding registers: {}", response.getExceptionMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
return response.getShortData(); |
|
|
return response.getShortData(); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to read holding registers: {}", e.getMessage()); |
|
|
log.error("Failed to read holding registers: {}", e.getMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} finally { |
|
|
} finally { |
|
@ -134,11 +141,13 @@ public class ModbusMasterService { |
|
|
ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, startAddress, length); |
|
|
ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, startAddress, length); |
|
|
ReadInputRegistersResponse response = (ReadInputRegistersResponse) modbusMaster_.send(request); |
|
|
ReadInputRegistersResponse response = (ReadInputRegistersResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error reading input registers: {}", response.getExceptionMessage()); |
|
|
log.error("Error reading input registers: {}", response.getExceptionMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} |
|
|
} |
|
|
return response.getShortData(); |
|
|
return response.getShortData(); |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to read input registers: {}", e.getMessage()); |
|
|
log.error("Failed to read input registers: {}", e.getMessage()); |
|
|
return null; |
|
|
return null; |
|
|
} finally { |
|
|
} finally { |
|
@ -156,11 +165,13 @@ public class ModbusMasterService { |
|
|
WriteCoilRequest request = new WriteCoilRequest(slaveId, address, value); |
|
|
WriteCoilRequest request = new WriteCoilRequest(slaveId, address, value); |
|
|
WriteCoilResponse response = (WriteCoilResponse) modbusMaster_.send(request); |
|
|
WriteCoilResponse response = (WriteCoilResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error writing coil: {}", response.getExceptionMessage()); |
|
|
log.error("Error writing coil: {}", response.getExceptionMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to write coil: {}", e.getMessage()); |
|
|
log.error("Failed to write coil: {}", e.getMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} finally { |
|
|
} finally { |
|
@ -178,11 +189,13 @@ public class ModbusMasterService { |
|
|
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, address, value); |
|
|
WriteRegisterRequest request = new WriteRegisterRequest(slaveId, address, value); |
|
|
WriteRegisterResponse response = (WriteRegisterResponse) modbusMaster_.send(request); |
|
|
WriteRegisterResponse response = (WriteRegisterResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error writing register: {}", response.getExceptionMessage()); |
|
|
log.error("Error writing register: {}", response.getExceptionMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to write register: {}", e.getMessage()); |
|
|
log.error("Failed to write register: {}", e.getMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} finally { |
|
|
} finally { |
|
@ -200,11 +213,13 @@ public class ModbusMasterService { |
|
|
WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startAddress, values); |
|
|
WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startAddress, values); |
|
|
WriteCoilsResponse response = (WriteCoilsResponse) modbusMaster_.send(request); |
|
|
WriteCoilsResponse response = (WriteCoilsResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error writing coils: {}", response.getExceptionMessage()); |
|
|
log.error("Error writing coils: {}", response.getExceptionMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to write coils: {}", e.getMessage()); |
|
|
log.error("Failed to write coils: {}", e.getMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} finally { |
|
|
} finally { |
|
@ -222,11 +237,13 @@ public class ModbusMasterService { |
|
|
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startAddress, values); |
|
|
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startAddress, values); |
|
|
WriteRegistersResponse response = (WriteRegistersResponse) modbusMaster_.send(request); |
|
|
WriteRegistersResponse response = (WriteRegistersResponse) modbusMaster_.send(request); |
|
|
if (response.isException()) { |
|
|
if (response.isException()) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Error writing registers: {}", response.getExceptionMessage()); |
|
|
log.error("Error writing registers: {}", response.getExceptionMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} catch (Exception e) { |
|
|
} catch (Exception e) { |
|
|
|
|
|
modbusMaster_.setConnected(false); |
|
|
log.error("Failed to write registers: {}", e.getMessage()); |
|
|
log.error("Failed to write registers: {}", e.getMessage()); |
|
|
return false; |
|
|
return false; |
|
|
} finally { |
|
|
} finally { |
|
@ -235,23 +252,33 @@ public class ModbusMasterService { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// ==== ==== ==== ==== ==== ==== 自动重连 ==== ==== ==== ==== ==== ==== |
|
|
// ==== ==== ==== ==== ==== ==== 自动重连 ==== ==== ==== ==== ==== ==== |
|
|
|
|
|
void connect() throws Exception |
|
|
|
|
|
{ |
|
|
|
|
|
modbusMaster_.init(); |
|
|
|
|
|
modbusMaster_.setRetries(3); |
|
|
|
|
|
// modbusMaster_.setIoLog(new BasicLogger()); |
|
|
|
|
|
modbusMaster_.setTimeout(2000); |
|
|
|
|
|
modbusMaster_.setConnected(true); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// /** |
|
|
|
|
|
// * 自动重连 |
|
|
|
|
|
// */ |
|
|
|
|
|
// @Scheduled(fixedRate = 1000) |
|
|
|
|
|
// public void autoReconnect() { |
|
|
|
|
|
// lock.lock(); |
|
|
|
|
|
// try { |
|
|
|
|
|
// if (modbusMaster_ == null || modbusMaster_.isConnected()) { |
|
|
|
|
|
// return; |
|
|
|
|
|
// } |
|
|
|
|
|
// modbusMaster_.init(); |
|
|
|
|
|
// log.info("Modbus master reconnected successfully."); |
|
|
|
|
|
// } catch (Exception e) { |
|
|
|
|
|
// log.error("Failed to reconnect Modbus master: {}", e.getMessage()); |
|
|
|
|
|
// } finally { |
|
|
|
|
|
// lock.unlock(); |
|
|
|
|
|
// } |
|
|
|
|
|
// } |
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 自动重连 |
|
|
|
|
|
*/ |
|
|
|
|
|
@Scheduled(fixedRate = 1000) |
|
|
|
|
|
public void autoReconnect() { |
|
|
|
|
|
lock.lock(); |
|
|
|
|
|
try { |
|
|
|
|
|
if(modbusMaster_ ==null || !modbusMaster_.isInitialized() || modbusMaster_.isConnected()) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
this.connect(); |
|
|
|
|
|
|
|
|
|
|
|
log.info("Modbus master 重连成功 端口: {} 波特率:{}.", port, baudrate); |
|
|
|
|
|
} catch (Exception e) { |
|
|
|
|
|
log.error("Modbus master : {}", e.getMessage()); |
|
|
|
|
|
log.info("Modbus master 重连失败 端口: {} 波特率:{}. {}", port, baudrate, e.getMessage()); |
|
|
|
|
|
} finally { |
|
|
|
|
|
lock.unlock(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |