Modbus
ModbusTCP
JLibModbus
Java中使用JLibModbus库使用ModbusTCP协议读取数据
项目地址
1.使用Modbus slave工具模拟Modbus数据站并添加一些数据
2022-04-22_112324.png
2.添加JLibModbus依赖
<dependency>
<groupId>com.intelligt.modbus</groupId>
<artifactId>jlibmodbus</artifactId>
<version>1.2.9.7</version>
</dependency>
3.读取代码
package org.modbus;
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 java.net.InetAddress;
import java.util.Random;
/**
* @Author Jxx 让世界看到我
* @Create 2022/4/22 11:32
* @Note jlibmodbus读写modbus数据
*/
public class Main {
//读线程的标识,在业务需要时可以控制程序的状态
public static boolean FLAG = true;
//读间隔时间
public static final long READ_SPACE = 1000;
public static final String IP = "127.0.0.1";
//从机地址
public static final int SLAVE_ID = 1;
public static Random R = new Random();
public static void main(String[] args) {
new Thread(new Runnable() {
public void run() {
try {
//设置主机TCP参数
TcpParameters tcpParameters = new TcpParameters();
//设置TCP的IP地址
InetAddress inetAddress = InetAddress.getByName(IP);
//TCP参数设置IP地址
tcpParameters.setHost(inetAddress);
//TCP设置长连接
tcpParameters.setKeepAlive(true);
//tcp设置端口,这里使用Modbus的默认端口502
tcpParameters.setPort(Modbus.TCP_PORT);
//创建一个主机
ModbusMaster modbusMaster = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);
//Modbus.setLogLevel(Modbus.LogLevel.LEVEL_DEBUG);
//设置自增的id
Modbus.setAutoIncrementTransactionId(true);
if (!modbusMaster.isConnected()) {
//在博客中看到一位大佬点评,在创建master时,ModbusMasterTCP构造函数中已经进行了连接,理论上在这里不需要进行连接,
//如果在构造中连接失败,那么在这里连接应该也还会失败吧,那么在这里就应该停掉程序给用户提示连接失败信息,各位根据业务处理吧
/**
* public ModbusMasterTCP(TcpParameters parameters) {
* super(ModbusConnectionFactory.getTcpMaster(parameters));
* this.keepAlive = parameters.isKeepAlive();
*
* try {
* if (this.isKeepAlive()) {
* this.connect();
* }
* } catch (ModbusIOException var3) {
* Modbus.log().warning("keepAlive is set, connection failed at creation time.");
* }
*
* }
*/
System.out.println("Modbus主机没有连接,现在建立连接");
modbusMaster.connect();
} else {
System.out.println("Modbus主机已经连接");
}
while (FLAG) {
//寄存器读取开始地址
int offset = 0;
//读取寄存器数量
int quantity = 10;
//读取对应从机的数据
//注意这里使用的read函数,要根据寄存器的方法属性选用不同的读函数
//readHoldingRegisters
//readInputRegisters
//readCoils
//readDiscreteInputs
int[] registers = modbusMaster.readHoldingRegisters(SLAVE_ID, offset, quantity);
for (int register : registers) {
System.out.println("读取寄存器数据:" + offset++ + "-" + register);
//修改寄存器的值
modbusMaster.writeSingleRegister(SLAVE_ID, offset - 1, R.nextInt(1000) + 1);
}
System.out.println("--------------------------------------------");
Thread.sleep(READ_SPACE);
}
} catch (Exception e) {
System.out.println("jlibmodbus运行异常:" + e.getClass().getName() + "-->" + e.getMessage());
e.printStackTrace();
}
}
}).start();
}
}
4.输出结果
通过打印输出,能够正确读取到Modbus数据站中的数据
2022-04-22_112653.png