springboot中使用modbus4j

阅读数:6 评论数:0

跳转到新版页面

分类

python/Java

正文

一、概述

在Spring Boot项目中集成Modbus4J库进行Modbus通信。

可以使用spring的@Async注解实现异步通信,避免阻塞主线程。

二、添加依赖

Modbus4J可能未在Maven中央仓库直接提供,需手动安装或使用第三方仓库(如JitPack)。以下是两种常见方式:

1、手动安装jar到本地仓库

(1)下载Modbus4j的jar包

(2)执行maven安装命令

mvn install:install-file -Dfile=modbus4j-3.0.3.jar -DgroupId=com.github.steveohara -DartifactId=modbus4j -Dversion=3.0.3 -Dpackaging=jar

(3)在pom.xml中添加依赖

<dependency>
    <groupId>com.github.steveohara</groupId>
    <artifactId>modbus4j</artifactId>
    <version>3.0.3</version>
</dependency>

2、使用jitpack仓库

(1)在pom.xml中添加jitpack仓库

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

(2)添加依赖

<dependency>
    <groupId>com.github.steveohara</groupId>
    <artifactId>modbus4j</artifactId>
    <version>3.0.3</version>
</dependency>

三、配置modbus通信参数

根据协议类型(TCP或串口)配置连接参数:

1、TCP连接示例

@Configuration
public class ModbusConfig {

    @Bean
    public ModbusFactory modbusFactory() {
        return new ModbusFactory();
    }

    @Bean
    public ModbusMaster tcpMaster(ModbusFactory modbusFactory) {
        // 配置TCP参数
        IpParameters params = new IpParameters();
        params.setHost("192.168.1.100");  // Modbus从机IP
        params.setPort(502);              // Modbus端口
        
        // 创建TCP Master(true表示保持长连接)
        return modbusFactory.createTcpMaster(params, true);
    }
}

2、串口连接示例

@Bean
public ModbusMaster serialMaster(ModbusFactory modbusFactory) {
    // 配置串口参数
    SerialParameters params = new SerialParameters();
    params.setCommPortId("COM3");         // 串口号(如COM3、/dev/ttyUSB0)
    params.setBaudRate(9600);             // 波特率
    params.setDataBits(8);                // 数据位
    params.setStopBits(1);                // 停止位
    params.setParity(0);                  // 校验位(0-None, 1-Odd, 2-Even)
    
    // 创建串口Master
    return modbusFactory.createRtuMaster(params);
}

3、tcp/ip和rtu over tcp/ip

IpParameters params = new IpParameters();
params.setHost("192.168.1.100");  // Modbus从机IP
params.setPort(502);              // Modbus端口
params.setEncapsulated(false); // false时是modbus tcp/ip协议帧,true时为modbus rtu over tcp/ip协议帧

四、实现modbus读写逻辑

1、读取保持寄存器(功能码0x03)

@Service
public class ModbusService {

    @Autowired
    private ModbusMaster modbusMaster;

    public int[] readHoldingRegisters(int slaveId, int startOffset, int quantity) throws ModbusTransportException {
        try {
            modbusMaster.init();  // 初始化连接
            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(
                slaveId,         // 从机地址
                startOffset,     // 寄存器起始地址
                quantity         // 读取数量
            );
            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) modbusMaster.send(request);
            return response.getShortData();  // 返回寄存器值(int数组)
        } finally {
            modbusMaster.destroy();  // 关闭连接(长连接模式下可忽略)
        }
    }
}

2、写入单个寄存器(功能码0x06)

public void writeSingleRegister(int slaveId, int offset, int value) throws ModbusTransportException {
    try {
        modbusMaster.init();
        WriteRegisterRequest request = new WriteRegisterRequest(
            slaveId,   // 从机地址
            offset,    // 寄存器地址
            value      // 写入的值(0~65535)
        );
        modbusMaster.send(request);
    } finally {
        modbusMaster.destroy();
    }
}

五、异常处理与重试机制

Modbus通信易受网络波动影响,需添加异常处理和重试逻辑:

public int[] readRegistersWithRetry(int slaveId, int start, int count, int maxRetries) {
    int retries = 0;
    while (retries < maxRetries) {
        try {
            return readHoldingRegisters(slaveId, start, count);
        } catch (ModbusTransportException | ErrorResponseException e) {
            retries++;
            if (retries >= maxRetries) {
                throw new RuntimeException("Modbus通信失败: " + e.getMessage());
            }
        }
    }
    return new int[0];
}



相关推荐