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

java使用Modbus协议与设备进行通信

使用说明

我创建了一个Java应用程序,用于通过Modbus协议与设备进行通信。这个项目包含以下几个主要文件:

  1. ModbusClient.java - 用于TCP/IP通信的Modbus客户端类
import com.ghgande.j2mod.modbus.ModbusException;
import com.ghgande.j2mod.modbus.io.ModbusTCPTransaction;
import com.ghgande.j2mod.modbus.msg.ReadInputRegistersRequest;
import com.ghgande.j2mod.modbus.msg.ReadInputRegistersResponse;
import com.ghgande.j2mod.modbus.msg.WriteMultipleRegistersRequest;
import com.ghgande.j2mod.modbus.msg.WriteSingleRegisterRequest;
import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
import com.ghgande.j2mod.modbus.procimg.Register;
import com.ghgande.j2mod.modbus.procimg.SimpleRegister;

import java.net.InetAddress;
import java.util.Arrays;

public class ModbusClient {
   
    private TCPMasterConnection connection;
    private InetAddress address;
    private int port;
    
    /**
     * 构造函数
     * @param ipAddress Modbus设备的IP地址
     * @param port Modbus设备的端口号,默认为502
     */
    public ModbusClient(String ipAddress, int port) {
   
        try {
   
            this.address = InetAddress.getByName(ipAddress);
            this.port = port;
        } catch (Exception e) {
   
            System.err.println("初始化Modbus客户端失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
    
    /**
     * 连接到Modbus设备
     * @return 连接是否成功
     */
    public boolean connect() {
   
        try {
   
            if (connection == null) {
   
                connection = new TCPMasterConnection(address);
                connection.setPort(port);
            }
            
            if (!connection.isConnected()) {
   
                connection.connect();
                System.out.println("成功连接到Modbus设备: " + address.getHostAddress() + ":" + port);
            }
            return true;
        } catch (Exception e) {
   
            System.err.println("连接Modbus设备失败: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }
    
    /**
     * 断开与Modbus设备的连接
     */
    public void disconnect() {
   
        if (connection != null && connection.isConnected()) {
   
            connection.close();
            System.out.println("已断开与Modbus设备的连接");
        }
    }
    
    /**
     * 读取输入寄存器
     * @param slaveId 从站ID
     * @param registerAddress 寄存器地址
     * @param count 要读取的寄存器数量
     * @return 读取的寄存器值数组
     */
    public int[] readInputRegisters(int slaveId, int registerAddress, int count) {
   
        if (!connect()) {
   
            return null;
        }
        
        try {
   
            // 创建读取请求
            ReadInputRegistersRequest request = new ReadInputRegistersRequest(registerAddress, count);
            request.setUnitID(slaveId);
            
            // 创建Modbus事务
            ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
            transaction.setRequest(request);
            transaction.execute();
            
            // 获取响应
            ReadInputRegistersResponse response = (ReadInputRegistersResponse) transaction.getResponse();
            
            // 提取寄存器值
            int[] values = new int[count];
            for (int i = 0; i < count; i++) {
   
                values[i] = response.getRegisterValue(i);
            }
            
            System.out.println("成功读取输入寄存器 " + registerAddress + "-" + (registerAddress + count - 1) + 
                              ",值: " + Arrays.toString(values

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

相关文章:

  • 【sgFloatDialog】自定义组件:浮动弹窗,支持修改尺寸、拖拽位置、最大化、还原、最小化、复位
  • AdaWaveNet:用于时间序列分析的自适应小波网络
  • 高并发编程有哪些规范?
  • 群晖中的docker设置总是不生效,尤其代理
  • 天梯赛 L2-011 玩转二叉树
  • 【MyDB】7-客户端服务端通信之3-Client的实现
  • AI日报 - 2025年3月21日
  • 使用FastAPI为知识库问答系统前端提供后端功能接口
  • 期货和期权的区别,通俗易懂!
  • ccf3401矩阵重塑(其一)
  • deepseek使用记录24——小灵
  • Spring 事务注解原理
  • [Xilinx]工具篇_Vivado自动安装
  • 计算机网络快速入门
  • 【C#知识点详解】ExcelDataReader介绍
  • 记一次性能调优-20250320
  • 【嵌入式硬件】 天线与距离问题
  • JVM常用概念之压缩引用
  • C语言的setjmp和longjmp:可以作异常处理
  • 【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)