Browse Source

fixed: modbus 增加重连机制

fixed: 回退修改包结构
master
HSZ_HeSongZhen 3 months ago
parent
commit
0540b35d40
  1. 2
      src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java
  2. 69
      src/main/java/com/iflytop/gd/hardware/comm/modbus/ModbusMasterService.java
  3. 1
      src/main/java/com/iflytop/gd/hardware/config/StepMotorConfig.java
  4. 12
      src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java
  5. 4
      src/main/resources/application-dev.yml

2
src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java

@ -4,7 +4,9 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication
public class GraphiteDigesterServiceApplication {

69
src/main/java/com/iflytop/gd/hardware/comm/modbus/ModbusMasterService.java

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

1
src/main/java/com/iflytop/gd/hardware/config/StepMotorConfig.java

@ -83,6 +83,7 @@ public class StepMotorConfig {
static final double HEATER_MOTOR_DEFAULT_MAX_LIMIT = 100.0;
static final double ACID_PUMP_MOTOR_DEFAULT_MAX_LIMIT = 1000000;
final static Map<StepMotorMId, Double> stepMotorMaxLimitMap = Map.ofEntries(
Map.entry(StepMotorMId.SHAKE_MOTOR_MID, 20000.0),
Map.entry(StepMotorMId.TRAY_MOTOR_MID, 200.0),
Map.entry(StepMotorMId.HBOT_X_MOTOR_MID, 1400.0),
Map.entry(StepMotorMId.HBOT_Y_MOTOR_MID, 700.0),

12
src/main/java/com/iflytop/gd/hardware/type/A8kPacket.java

@ -40,11 +40,11 @@ public class A8kPacket {
public static final int PACKET_TYPE_OFFSET = 0;
public static final int CMDID_OFFSET = 1;
public static final int MODULE_ID_OFFSET = 3;
public static final int INDEX_OFFSET = 5;
public static final int DATA_LEN_OFFSET = 7;
public static final int DATA_OFFSET = 8;
public static final int INDEX_OFFSET = 4;
public static final int DATA_LEN_OFFSET = 6;
public static final int DATA_OFFSET = 7;
public static final int PACKET_MIN_LEN = 9;//
public static final int PACKET_MIN_LEN = 8;//
public static final int CMD_OVERTIME = 1500;
@ -83,7 +83,7 @@ public class A8kPacket {
}
public int getModuleId() {
return ByteArray.readU16bit(raw, MODULE_ID_OFFSET);
return ByteArray.readU8bit(raw, MODULE_ID_OFFSET);
}
public int getDataLen() {
@ -203,7 +203,7 @@ public class A8kPacket {
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.put((byte) (packetType & 0xff)); // packetType
buffer.putShort((short) (cmdId & 0xffff)); // cmdid
buffer.putShort((short) (moduleId & 0xffff)); // moduleId
buffer.put((byte) (moduleId & 0xFF)); // moduleId
buffer.put((byte) 0x4C); // index
buffer.put((byte) 0x00); // index
buffer.put((byte) (params.length * 4)); // datalen

4
src/main/resources/application-dev.yml

@ -36,13 +36,13 @@ command_bus:
device.enableCanBus: true
iflytophald:
ip: 192.168.1.140
ip: 192.168.8.168
cmdch.port: 19004
datach.port: 19005
#window config
#modbus:
# port: COM2
# port: COM18
# baudrate: 9600
#工控机 config

Loading…
Cancel
Save