一、引入pom依赖
<dependency>
<groupId>io.github.jimmy-j</groupId>
<artifactId>modbus4</artifactId>
<version>1.2.0</version>
</dependency>
二、代码实现
package com.example.demo;
import com.zgkxzx.modbus4And.ModbusFactory;
import com.zgkxzx.modbus4And.ModbusMaster;
import com.zgkxzx.modbus4And.exception.ModbusInitException;
import com.zgkxzx.modbus4And.exception.ModbusTransportException;
import com.zgkxzx.modbus4And.ip.IpParameters;
import com.zgkxzx.modbus4And.msg.*;
import com.zgkxzx.modbus4And.sero.util.queue.ByteQueue;
public class ReadAWriteUtil {
/**
* 批量写数据到保持寄存器
* @param ip 从站IP
* @param port modbus端口
* @param slaveId 从站ID
* @param start 起始地址偏移量
* @param values 待写数据
*/
public static void modbusWTCP(String ip, int port, int slaveId, int start, short[] values) {
ModbusFactory modbusFactory = new ModbusFactory();
// 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
IpParameters params = new IpParameters();
params.setHost(ip);
// 设置端口,默认502
if (502 != port) {
params.setPort(port);
}
ModbusMaster tcpMaster = null;
// 参数1:IP和端口信息 参数2:保持连接激活
tcpMaster = modbusFactory.createTcpMaster(params, true);
try {
tcpMaster.init();
System.out.println("=======初始化成功========");
} catch (ModbusInitException e) {
System.out.println("初始化异常");
}
try {
WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);
WriteRegistersResponse response = (WriteRegistersResponse) tcpMaster.send(request);
if (response.isException()){
System.out.println("Exception response: message=" + response.getExceptionMessage());
}else{
System.out.println("Success");
}
} catch (ModbusTransportException e) {
e.printStackTrace();
}
}
/**
* 读保持寄存器上的内容
* @param ip 从站IP
* @param port modbus端口
* @param start 起始地址偏移量
* @param readLenth 待读寄存器个数
* @return
*/
public static ByteQueue modbusTCP(String ip, int port, int start, int readLenth) {
ModbusFactory modbusFactory = new ModbusFactory();
// 设备ModbusTCP的Ip与端口,如果不设定端口则默认为502
IpParameters params = new IpParameters();
params.setHost(ip);
//设置端口,默认502
if(502!=port){
params.setPort(port);
}
ModbusMaster tcpMaster = null;
tcpMaster = modbusFactory.createTcpMaster(params, true);
try {
tcpMaster.init();
System.out.println("========初始化成功=======");
} catch (ModbusInitException e) {
return null;
}
ModbusRequest modbusRequest=null;
try {
//功能码03 读取保持寄存器的值
modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
ModbusResponse modbusResponse=null;
try {
modbusResponse = tcpMaster.send(modbusRequest);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
ByteQueue byteQueue= new ByteQueue(1024);
modbusResponse.write(byteQueue);
System.out.println("功能码:"+modbusRequest.getFunctionCode());
System.out.println("从站地址:"+modbusRequest.getSlaveId());
System.out.println("收到的响应信息大小:"+byteQueue.size());
System.out.println("收到的响应信息值:"+byteQueue);
return byteQueue;
}
public static void main(String[] args) {
// short [] list={100,20,30,9,67,0,65,0,89,90};
// modbusWTCP("127.0.0.1",502,1,0,list);
//读数据
modbusTCP("10.34.194.18",8080,0,2);
}
}
三、代码详情
这段代码是使用Java语言编写的Modbus TCP通信的示例代码,主要用于与Modbus TCP从设备进行通信。
ModbusFactory modbusFactory = new ModbusFactory();
这行代码创建了一个ModbusFactory对象,用于创建ModbusMaster实例。
IpParameters params = new IpParameters();
params.setHost(ip);
if(502 != port){
params.setPort(port);
}
在这里,创建了一个IpParameters对象,用于设置Modbus TCP通信的IP地址和端口号。如果端口不是默认的502端口,则设置指定的端口号。
ModbusMaster tcpMaster = null;
tcpMaster = modbusFactory.createTcpMaster(params, true);
这行代码创建了一个ModbusMaster实例,使用之前设置的IpParameters对象来初始化。第二个参数设置为true表示使用了非阻塞模式。
try {
tcpMaster.init();
System.out.println("========初始化成功=======");
} catch (ModbusInitException e) {
return null;
}
在这里,通过tcpMaster.init()方法初始化了ModbusMaster实例,如果初始化成功,就会打印"========初始化成功======="。
ModbusRequest modbusRequest = null;
try {
modbusRequest = new ReadHoldingRegistersRequest(1, start, readLenth);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
这段代码创建了一个Modbus请求对象,使用功能码03(读取保持寄存器的值),并指定了起始地址和读取长度。
ModbusResponse modbusResponse = null;
try {
modbusResponse = tcpMaster.send(modbusRequest);
} catch (ModbusTransportException e) {
e.printStackTrace();
}
这段代码发送了之前创建的Modbus请求对象,并尝试接收从设备返回的响应数据。
ByteQueue byteQueue = new ByteQueue(1024);
modbusResponse.write(byteQueue);
最后,这段代码将从设备返回的响应数据写入到一个ByteQueue对象中,以便后续对数据进行处理。
这些代码主要是用于建立与Modbus TCP从设备的连接,并向其发送读取保持寄存器的请求,然后处理从设备返回的响应数据。