使用Modbus4j+seroUtils读取风速风向仪数据,现有设备IP,端口号,从机地址,寄存器读取开始地址,读取的寄存器数量。没有上述jar包可以自行搜索,网上资源挺多
/**
* @author chengy
*/
@Component
public class ModbusUtil {
private static ModbusFactory modbusFactory;
static {
if (modbusFactory == null) {
modbusFactory = new ModbusFactory();
}
}
/**
* @param ip 远程服务机地址
* @param port 端口号
* @param slaveId 从机地址
* @param offset 寄存器读取开始地址
* @param quantity 读取的寄存器数量
* @return
*/
public static short[] getValueByRTU(String ip, int port, int slaveId, int offset, int quantity){
short[] result = new short[2];
IpParameters params = new IpParameters();
params.setHost(ip);
params.setPort(port);
//这个属性确定了协议帧是否是通过tcp封装的RTU结构,采用modbus tcp/ip时,要设为false, 采用modbus rtu over tcp/ip时,要设为true
params.setEncapsulated(true);
com.serotonin.modbus4j.ModbusMaster master = modbusFactory.createTcpMaster(params, true);// TCP 协议
try {
//设置超时时间
master.setTimeout(1000);
//设置重连次数
master.setRetries(3);
//初始化
master.init();
try {
ReadHoldingRegistersRequest request = null;
request = new ReadHoldingRegistersRequest(slaveId, offset, quantity);
ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);
if (response.isException())
System.out.println("读取风速设备数据失败," + response.getExceptionMessage());
else
result = response.getShortData();
} catch (ModbusTransportException e) {
throw new RuntimeException("读取风速设备数据失败");
}
} catch (ModbusInitException e) {
throw new RuntimeException("建立风速设备连接失败");
}
return result;
}
}
相关文章:Java实现ModbusTCP通信