2022-04-22 Java JLibModbus读取ModbusTCP数据

Modbus

ModbusTCP

JLibModbus

Java中使用JLibModbus库使用ModbusTCP协议读取数据

项目地址

https://gitee.com/premeditate/Modbus

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
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
Java可以通过jlibmodbus库连接modbus tcp获取数据的步骤如下: 1. 导入jlibmodbus库到Java项目中。 2. 创建一个ModbusMasterTcp类的实例,用于连接到modbus tcp服务器。可以通过指定服务器的IP地址和端口号来创建实例。 3. 使用ModbusMasterTcp类的readInputRegisters方法或readHoldingRegisters方法来读取modbus设备上的寄存器值。需要指定寄存器的地址和数量。 4. 处理读取到的寄存器值,可以将它们转换为所需的数据类型。 以下是一个简单的示例代码,演示如何使用jlibmodbus库连接modbus tcp服务器并读取寄存器值: ``` import com.intelligt.modbus.jlibmodbus.master.ModbusMasterTcp; public class ModbusTcpClient { public static void main(String[] args) { try { // 创建一个ModbusMasterTcp实例,连接到modbus tcp服务器 ModbusMasterTcp master = new ModbusMasterTcp("192.168.1.1", 502); // 读取寄存器值 int[] rawValues = master.readInputRegisters(0, 10); // 处理寄存器值 float temperature = decodeTemperature(rawValues[0], rawValues[1]); int pressure = decodePressure(rawValues[2], rawValues[3]); // 输出结果 System.out.println("Temperature: " + temperature); System.out.println("Pressure: " + pressure); } catch (Exception e) { e.printStackTrace(); } } private static float decodeTemperature(int highWord, int lowWord) { // 根据协议解析温度值 return 0.0f; } private static int decodePressure(int highWord, int lowWord) { // 根据协议解析压力值 return 0; } } ``` 请注意,以上代码中的decodeTemperature和decodePressure方法需要根据实际的协议进行实现,以正确解析寄存器值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值