Java 通过Modbus简单实现数采

一、引入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从设备的连接,并向其发送读取保持寄存器的请求,然后处理从设备返回的响应数据。

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值