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<String, ModbusMaster> contextModbusMap() {
|
return new HashMap<>();
|
}
|
|
@Autowired
|
private ModbusFactory modbusFactory;
|
|
@Autowired
|
@Qualifier("contextModbusMap")
|
private HashMap<String, ModbusMaster> 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);
|
}
|
}
|