使用Java做一个modbus tcp
时间: 2023-08-29 09:05:45 浏览: 58
要使用Java实现Modbus TCP通信,可以借助第三方库j2mod。以下是一个简单的示例代码:
```java
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import com.serotonin.modbus4j.BasicProcessImage;
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.ProcessImage;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.tcp.TcpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.ReadCoilsRequest;
import com.serotonin.modbus4j.msg.ReadCoilsResponse;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsRequest;
import com.serotonin.modbus4j.msg.ReadDiscreteInputsResponse;
import com.serotonin.modbus4j.msg.ReadInputRegistersRequest;
import com.serotonin.modbus4j.msg.ReadInputRegistersResponse;
import com.serotonin.modbus4j.msg.ReadMultipleRegistersRequest;
import com.serotonin.modbus4j.msg.ReadMultipleRegistersResponse;
import com.serotonin.modbus4j.msg.WriteCoilRequest;
import com.serotonin.modbus4j.msg.WriteCoilResponse;
import com.serotonin.modbus4j.msg.WriteMultipleCoilsRequest;
import com.serotonin.modbus4j.msg.WriteMultipleCoilsResponse;
import com.serotonin.modbus4j.msg.WriteMultipleRegistersRequest;
import com.serotonin.modbus4j.msg.WriteMultipleRegistersResponse;
import com.serotonin.modbus4j.msg.WriteSingleRegisterRequest;
import com.serotonin.modbus4j.msg.WriteSingleRegisterResponse;
public class ModbusTcpClient {
public static void main(String[] args) throws UnknownHostException, ModbusTransportException, ErrorResponseException, ModbusInitException {
// TCP参数
TcpParameters tcpParameters = new TcpParameters();
tcpParameters.setHost(InetAddress.getLocalHost());
tcpParameters.setPort(502);
// 创建ModbusMaster
ModbusFactory modbusFactory = new ModbusFactory();
ModbusMaster modbusMaster = modbusFactory.createTcpMaster(tcpParameters);
// 初始化
modbusMaster.init();
// 读线圈
ReadCoilsRequest readCoilsRequest = new ReadCoilsRequest(1, 0, 10);
ReadCoilsResponse readCoilsResponse = (ReadCoilsResponse) modbusMaster.send(readCoilsRequest);
boolean[] coilsData = readCoilsResponse.getBooleanData();
System.out.println(Arrays.toString(coilsData));
// 写单个线圈
WriteCoilRequest writeCoilRequest = new WriteCoilRequest(1, 0, true);
WriteCoilResponse writeCoilResponse = (WriteCoilResponse) modbusMaster.send(writeCoilRequest);
System.out.println(writeCoilResponse.isOk());
// 读离散输入
ReadDiscreteInputsRequest readDiscreteInputsRequest = new ReadDiscreteInputsRequest(1, 0, 10);
ReadDiscreteInputsResponse readDiscreteInputsResponse = (ReadDiscreteInputsResponse) modbusMaster.send(readDiscreteInputsRequest);
boolean[] discreteInputsData = readDiscreteInputsResponse.getBooleanData();
System.out.println(Arrays.toString(discreteInputsData));
// 读输入寄存器
ReadInputRegistersRequest readInputRegistersRequest = new ReadInputRegistersRequest(1, 0, 10);
ReadInputRegistersResponse readInputRegistersResponse = (ReadInputRegistersResponse) modbusMaster.send(readInputRegistersRequest);
short[] inputRegistersData = readInputRegistersResponse.getShortData();
System.out.println(Arrays.toString(inputRegistersData));
// 写单个保持寄存器
WriteSingleRegisterRequest writeSingleRegisterRequest = new WriteSingleRegisterRequest(1, 0, 123);
WriteSingleRegisterResponse writeSingleRegisterResponse = (WriteSingleRegisterResponse) modbusMaster.send(writeSingleRegisterRequest);
System.out.println(writeSingleRegisterResponse.isOk());
// 读多个保持寄存器
ReadMultipleRegistersRequest readMultipleRegistersRequest = new ReadMultipleRegistersRequest(1, 0, 10);
ReadMultipleRegistersResponse readMultipleRegistersResponse = (ReadMultipleRegistersResponse) modbusMaster.send(readMultipleRegistersRequest);
short[] multipleRegistersData = readMultipleRegistersResponse.getShortData();
System.out.println(Arrays.toString(multipleRegistersData));
// 写多个保持寄存器
WriteMultipleRegistersRequest writeMultipleRegistersRequest = new WriteMultipleRegistersRequest(1, 0, new short[] { 1, 2, 3, 4, 5 });
WriteMultipleRegistersResponse writeMultipleRegistersResponse = (WriteMultipleRegistersResponse) modbusMaster.send(writeMultipleRegistersRequest);
System.out.println(writeMultipleRegistersResponse.isOk());
// 写多个线圈
WriteMultipleCoilsRequest writeMultipleCoilsRequest = new WriteMultipleCoilsRequest(1, 0, new boolean[] { true, false, true, false, true });
WriteMultipleCoilsResponse writeMultipleCoilsResponse = (WriteMultipleCoilsResponse) modbusMaster.send(writeMultipleCoilsRequest);
System.out.println(writeMultipleCoilsResponse.isOk());
// 销毁ModbusMaster
modbusMaster.destroy();
}
}
```
在代码中,首先创建了一个TcpParameters对象,设置了IP地址和端口号。然后使用ModbusFactory创建一个ModbusMaster对象,并调用init方法进行初始化。
接着通过各种请求对象(如ReadCoilsRequest、WriteSingleRegisterRequest等)和send方法向Modbus服务器发送请求,并获得响应结果(如ReadCoilsResponse、WriteSingleRegisterResponse等)进行处理。
最后调用destroy方法销毁ModbusMaster对象。