Modbus通讯协议——Java通过Modbus-Master-TCP实现Modbus Master(主机)TCP的Read/Write

1、Modbus-Master-TCP

1)、TCP-Read

import com.digitalpetri.modbus.codec.Modbus;
import com.digitalpetri.modbus.master.ModbusTcpMaster;
import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest;
import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
import io.netty.buffer.ByteBuf;
import io.netty.util.ReferenceCountUtil;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class ModbusMasterTcpReader {

    static ModbusTcpMaster tcpMaster;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        initModbusMasterTcp();
        Number number = readHoldingRegisters(0, 10, 1);
        System.out.println(number.toString());
        release();
    }
    // 初始化
    public static void initModbusMasterTcp(){
        // 创建匹配,添加信息
        ModbusTcpMasterConfig tcpMasterConfig = new ModbusTcpMasterConfig
                .Builder("127.0.0.1")
                .setPort(502)
                .build();
        tcpMaster = new ModbusTcpMaster(tcpMasterConfig);
        tcpMaster.connect();
    }

    public static Number readHoldingRegisters(int serverAddress, int quantity, int unitId) throws ExecutionException, InterruptedException {
        Number result = null;
        CompletableFuture<ReadHoldingRegistersResponse> future = tcpMaster
                .sendRequest(new ReadHoldingRegistersRequest(serverAddress, quantity), unitId);

        // 同步执行
        ReadHoldingRegistersResponse response = future.get();
        if (response != null){
            ByteBuf registers = response.getRegisters();
            System.out.println(registers);
            int i = registers.readInt();
            System.out.println(i);
            result = registers.readFloat();
            ReferenceCountUtil.release(response);
        }
        return result;
    }
    // 释放资源
    public static void release(){
        if (tcpMaster != null){
            tcpMaster.disconnect();
        }
        Modbus.releaseSharedResources();
    }
}

2)、TCP-Write

import com.digitalpetri.modbus.codec.Modbus;
import com.digitalpetri.modbus.master.ModbusTcpMaster;
import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
import com.digitalpetri.modbus.requests.WriteSingleRegisterRequest;
import com.digitalpetri.modbus.responses.WriteSingleRegisterResponse;
import io.netty.util.ReferenceCountUtil;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class ModbusMasterTcpWriter {
    static ModbusTcpMaster writeMaster;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        initModbusMasterTcp();
        writeHoldingRegisters(0, 12, 1);
        release();
    }
    // 初始化
    public static void initModbusMasterTcp(){
        // 创建匹配,添加信息
        ModbusTcpMasterConfig writeTcpMasterConfig = new ModbusTcpMasterConfig
                .Builder("127.0.0.1")
                .setPort(502)
                .build();
        writeMaster = new ModbusTcpMaster(writeTcpMasterConfig);
        writeMaster.connect();
    }

    public static Number writeHoldingRegisters(int serverAddress, int value, int unitId) throws ExecutionException, InterruptedException {
        Number result = null;
        CompletableFuture<WriteSingleRegisterResponse> future = writeMaster
                .sendRequest(new WriteSingleRegisterRequest(serverAddress, value), unitId);
        WriteSingleRegisterResponse response = future.get();
        if (response != null){
            result = response.getValue();
            ReferenceCountUtil.release(response);
        }
        return result;
    }
    // 释放资源
    public static void release(){
        if (writeMaster != null){
            writeMaster.disconnect();
        }
        Modbus.releaseSharedResources();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值