使用Modbus4j+seroUtils讀取風速風向儀資料,現有設備IP,埠號,從機地址,暫存器讀取開始地址,讀取的暫存器數量,沒有上述jar包可以自行搜索,網上資源挺多
getValueByTCP是采用Modbus TCP/IP協議的,getValueByRtu采用Modbus RTU Over TCP/IP
import com.intelligt.modbus.jlibmodbus.Modbus;
import com.intelligt.modbus.jlibmodbus.master.ModbusMaster;
import com.intelligt.modbus.jlibmodbus.master.ModbusMasterFactory;
import com.intelligt.modbus.jlibmodbus.tcp.TcpParameters;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
import org.springframework.stereotype.Component;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
/**
* @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 Map<Integer, Integer> getValueByTCP(String ip, int port, int slaveId, int offset, int quantity) {
// 創建讀取量大小的Map集合
Map<Integer, Integer> resultMap = new HashMap<>(quantity);
try {
// 設定主機TCP引數
TcpParameters tcpParameters = new TcpParameters();
// 設定TCP的ip地址
InetAddress address = InetAddress.getByName(ip);
// TCP引數設定ip地址
tcpParameters.setHost(address);
// TCP設定長連接
tcpParameters.setKeepAlive(true);
// TCP設定埠,這里設定是默認埠502
tcpParameters.setPort(port);
// 創建一個主機
ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
Modbus.setAutoIncrementTransactionId(true);
try {
if (!master.isConnected()) {
// 開啟連接
master.connect();
}
// 讀取對應從機的資料,readInputRegisters讀取的寫暫存器,功能碼04
int[] registerValues = master.readInputRegisters(slaveId, offset, quantity);
// 資料組裝
for (int value : registerValues) {
resultMap.put(offset++, value);
}
} catch (Exception e) {
throw new RuntimeException("建立連接失敗,環境監測設備不在線");
} finally {
master.disconnect();
}
} catch (Exception e) {
throw new RuntimeException("初始化連接失敗,環境監測設備不在線");
}
return resultMap;
}
/**
* @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通信
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292575.html
標籤:其他
