java使用Modbus协议与设备进行通信
使用说明
我创建了一个Java应用程序,用于通过Modbus协议与设备进行通信。这个项目包含以下几个主要文件:
- ModbusClient.java - 用于TCP/IP通信的Modbus客户端类
import com.ghgande.j2mod.modbus.ModbusException;
import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
import com.ghgande.j2mod.modbus.msg.ReadInputRegistersRequest;
import com.ghgande.j2mod.modbus.msg.ReadInputRegistersResponse;
import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest;
import com.ghgande.j2mod.modbus.msg.WriteSingleRegisterRequest;
import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
import com.ghgande.j2mod.modbus.procimg.Register;
import com.ghgande.j2mod.modbus.procimg.SimpleRegister;
import java.net.InetAddress;
import java.util.Arrays;
public class ModbusClient {
private TCPMasterConnection connection;
private InetAddress address;
private int port;
/**
* 构造函数
* @param ipAddress Modbus设备的IP地址
* @param port Modbus设备的端口号,默认为502
*/
public ModbusClient(String ipAddress, int port) {
try {
this.address = InetAddress.getByName(ipAddress);
this.port = port;
} catch (Exception e) {
System.err.println("初始化Modbus客户端失败: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 连接到Modbus设备
* @return 连接是否成功
*/
public boolean connect() {
try {
if (connection == null) {
connection = new TCPMasterConnection(address);
connection.setPort(port);
}
if (!connection.isConnected()) {
connection.connect();
System.out.println("成功连接到Modbus设备: " + address.getHostAddress() + ":" + port);
}
return true;
} catch (Exception e) {
System.err.println("连接Modbus设备失败: " + e.getMessage());
e.printStackTrace();
return false;
}
}
/**
* 断开与Modbus设备的连接
*/
public void disconnect() {
if (connection != null && connection.isConnected()) {
connection.close();
System.out.println("已断开与Modbus设备的连接");
}
}
/**
* 读取输入寄存器
* @param slaveId 从站ID
* @param registerAddress 寄存器地址
* @param count 要读取的寄存器数量
* @return 读取的寄存器值数组
*/
public int[] readInputRegisters(int slaveId, int registerAddress, int count) {
if (!connect()) {
return null;
}
try {
// 创建读取请求
ReadInputRegistersRequest request = new ReadInputRegistersRequest(registerAddress, count);
request.setUnitID(slaveId);
// 创建Modbus事务
ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
transaction.setRequest(request);
transaction.execute();
// 获取响应
ReadInputRegistersResponse response = (ReadInputRegistersResponse) transaction.getResponse();
// 提取寄存器值
int[] values = new int[count];
for (int i = 0; i < count; i++) {
values[i] = response.getRegisterValue(i);
}
System.out.println("成功读取输入寄存器 " + registerAddress + "-" + (registerAddress + count - 1) +
",值: " + Arrays.toString(values