当前位置: 首页 > article >正文

【在Spring Boot项目中接入Modbus协议】

【在Spring Boot项目中接入Modbus协议】

在Spring Boot项目中接入Modbus协议,可以通过使用第三方库(如jamodmodbus4j)来实现。以下是一个基本的步骤指南,帮助你在Spring Boot项目中集成Modbus。


1. 添加依赖

首先,在pom.xml文件中添加Modbus相关的依赖。推荐使用jamodmodbus4j

使用 jamod
<dependency>
    <groupId>com.infiniteautomation</groupId>
    <artifactId>jamod</artifactId>
    <version>1.2</version>
</dependency>
使用 modbus4j
<dependency>
    <groupId>org.modbus4j</groupId>
    <artifactId>modbus4j</artifactId>
    <version>2.0.0</version>
</dependency>

2. 配置Modbus连接

根据你的需求选择TCP或RTU模式进行配置。

Modbus TCP 示例
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;

public class ModbusTcpService {
    private ModbusMaster tcpMaster;

    public void init(String ipAddress, int port) throws ModbusInitException {
        ModbusFactory modbusFactory = new ModbusFactory();
        tcpMaster = modbusFactory.createTcpMaster(ipAddress + ":" + port, false);
        tcpMaster.setTimeout(3000); // 设置超时时间
        tcpMaster.setRetries(3);    // 设置重试次数
        tcpMaster.init();           // 初始化连接
    }

    public void readHoldingRegisters(int slaveId, int startRegister, int numRegisters) throws ModbusTransportException {
        var response = tcpMaster.sendRequest(modbusFactory.createReadHoldingRegistersRequest(slaveId, startRegister, numRegisters), slaveId);
        System.out.println("Response: " + Arrays.toString(response.getShortData()));
    }

    public void close() {
        if (tcpMaster != null) {
            tcpMaster.destroy();
        }
    }
}
Modbus RTU 示例
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.serial.SerialPortFactory;
import com.serotonin.modbus4j.exception.ModbusTransportException;

public class ModbusRtuService {
    private ModbusMaster rtuMaster;

    public void init(String portName, int baudRate, int dataBits, int stopBits, char parity) throws ModbusInitException {
        ModbusFactory modbusFactory = new ModbusFactory();
        rtuMaster = modbusFactory.createRtuMaster(SerialPortFactory.createSerialPort(portName, baudRate, dataBits, stopBits, parity));
        rtuMaster.setTimeout(3000); // 设置超时时间
        rtuMaster.setRetries(3);    // 设置重试次数
        rtuMaster.init();           // 初始化连接
    }

    public void readHoldingRegisters(int slaveId, int startRegister, int numRegisters) throws ModbusTransportException {
        var response = rtuMaster.sendRequest(modbusFactory.createReadHoldingRegistersRequest(slaveId, startRegister, numRegisters), slaveId);
        System.out.println("Response: " + Arrays.toString(response.getShortData()));
    }

    public void close() {
        if (rtuMaster != null) {
            rtuMaster.destroy();
        }
    }
}

3. 集成到Spring Boot

将上述服务类集成到Spring Boot中,并通过Spring管理其生命周期。

创建Spring Bean
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ModbusConfig {

    @Bean(initMethod = "init", destroyMethod = "close")
    public ModbusTcpService modbusTcpService() throws Exception {
        ModbusTcpService service = new ModbusTcpService();
        service.init("192.168.1.100", 502); // 替换为实际的IP和端口
        return service;
    }
}
在Controller中使用
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ModbusController {

    private final ModbusTcpService modbusTcpService;

    public ModbusController(ModbusTcpService modbusTcpService) {
        this.modbusTcpService = modbusTcpService;
    }

    @GetMapping("/read-registers")
    public String readRegisters() {
        try {
            modbusTcpService.readHoldingRegisters(1, 0, 10); // 读取从机ID为1,起始寄存器为0,数量为10
            return "Success";
        } catch (Exception e) {
            return "Error: " + e.getMessage();
        }
    }
}

4. 测试与调试

  • 启动Spring Boot应用。
  • 使用Postman或其他工具访问/read-registers接口,验证是否能够正确读取Modbus设备的数据。
  • 如果遇到问题,检查网络连接、串口权限、设备地址等配置。

注意事项

  1. 异常处理:确保对Modbus通信中的异常进行捕获和处理。
  2. 线程安全:如果多个线程同时访问Modbus设备,需确保线程安全。
  3. 性能优化:对于高频读写场景,可以考虑使用缓存或批量操作减少通信开销。
  4. 日志记录:建议为Modbus通信添加详细的日志记录,便于排查问题。

http://www.kler.cn/a/571775.html

相关文章:

  • PyTorch系列教程:评估和推理模式下模型预测
  • post get 给后端传参数
  • 爬虫系列之发送请求与响应《一》
  • 通俗版解释:分布式和微服务就像开餐厅
  • sa-token全局过滤器之写法优化(包含设置Order属性)
  • HiRT:利用分层机器人Transformer 增强机器人控制
  • 企业级Python后端数据库使用指南(简略版)
  • 计算机视觉算法实战——医学影像分割(主页有源码)
  • 深入解析Tiktokenizer:大语言模型中核心分词技术的原理与架构
  • Spring线程池学习笔记
  • [LeetCode]day33 150.逆波兰式求表达值 + 239.滑动窗口最大值
  • STM32MP1xx的启动流程
  • 【数据结构与算法】常见数据结构与算法在JDK和Spring中的实现:源码解析与实战代码!
  • Arm64架构的Linux服务器安装jdk8
  • 珈和科技亮相CCTV-13《新闻直播间》,AI多模态农业大模型引领智慧农业新变革
  • 【蓝桥杯集训·每日一题2025】 AcWing 5526. 平衡细菌 python
  • 最新Flutter导航拦截PopScope使用
  • 国家网络安全通报中心:大模型工具Ollama存在安全风险
  • Ubuntu的tmux配置
  • Delphi连接MySql数据库房