package com.ld.igds.protocol.modbus; import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.exception.ModbusInitException; import com.serotonin.modbus4j.ip.IpParameters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import java.util.HashMap; @Configuration @Import(com.serotonin.modbus4j.ModbusFactory.class) public class ModbusConfig { @Bean public HashMap contextModbusMap() { return new HashMap<>(); } @Autowired private ModbusFactory modbusFactory; @Autowired @Qualifier("contextModbusMap") private HashMap masterMap; /** * @Description: 通过ip获取对应的modbus连接器 */ public ModbusMaster getMaster(String ip, int port) { ModbusMaster modbusMaster = masterMap.get(ip); if (modbusMaster == null || !modbusMaster.isConnected()) { setMaster(ip, port); modbusMaster = masterMap.get(ip); } return modbusMaster; } /** * @Description: 设置ip对应的modbus连接器 */ private void setMaster(String ip, Integer port) { ModbusMaster master; IpParameters params = new IpParameters(); params.setHost(ip); params.setPort(port); //设置为true,会导致TimeoutException: request=com.serotonin.modbus4j.ip.encap.EncapMessageRequest@774dfba5", //params.setEncapsulated(true); master = modbusFactory.createTcpMaster(params, true);// TCP 协议 try { //设置超时时间 master.setTimeout(3 * 1000); //设置重连次数 master.setRetries(3); //初始化 master.init(); } catch (ModbusInitException e) { e.printStackTrace(); } masterMap.put(ip, master); } }