Java实现使用Modbus4j+seroUtils读取Mudbus RTU/ASCII Over TCP/IP连接设备数据

news/2024/7/24 11:44:11 标签: modbus, RTU Over TCP/IP, 物联网, modbus4j

使用Modbus4j+seroUtils读取风速风向仪数据,现有设备IP,端口号,从机地址,寄存器读取开始地址,读取的寄存器数量。没有上述jar包可以自行搜索,网上资源挺多


/**
 * @author chengy
 */
@Component
public class ModbusUtil {

    private static ModbusFactory modbusFactory;

    static {
        if (modbusFactory == null) {
            modbusFactory = new ModbusFactory();
        }
    }

    /**
     * @param ip       远程服务机地址
     * @param port     端口号
     * @param slaveId  从机地址
     * @param offset   寄存器读取开始地址
     * @param quantity 读取的寄存器数量
     * @return
     */
    public static short[] getValueByRTU(String ip, int port, int slaveId, int offset, int quantity){
        short[] result = new short[2];
        IpParameters params = new IpParameters();
        params.setHost(ip);
        params.setPort(port);
        //这个属性确定了协议帧是否是通过tcp封装的RTU结构,采用modbus tcp/ip时,要设为false, 采用modbus rtu over tcp/ip时,要设为true
        params.setEncapsulated(true);
        com.serotonin.modbus4j.ModbusMaster master = modbusFactory.createTcpMaster(params, true);// TCP 协议
        try {
            //设置超时时间
            master.setTimeout(1000);
            //设置重连次数
            master.setRetries(3);
            //初始化
            master.init();

            try {
                ReadHoldingRegistersRequest request = null;
                request = new ReadHoldingRegistersRequest(slaveId, offset, quantity);
                ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);
                if (response.isException())
                    System.out.println("读取风速设备数据失败," + response.getExceptionMessage());
                else
                    result = response.getShortData();
            } catch (ModbusTransportException e) {
                throw new RuntimeException("读取风速设备数据失败");
            }

        } catch (ModbusInitException e) {
            throw new RuntimeException("建立风速设备连接失败");
        }

        return result;
    }
}

在这里插入图片描述

相关文章:Java实现ModbusTCP通信


http://www.niftyadmin.cn/n/1691235.html

相关文章

解决Spring RestTemplate请求相应内容中文乱码问题

参考:https://www.cnblogs.com/BillyYoung/p/10737081.html 1、原因 RestTemplate的默认构造方法初始化的StringHttpMessageConverter的默认字符集是ISO-8859-1,所以导致RestTemplate请求的响应内容会出现中文乱码。 2、解决方法 Springboot中Bean配…

RestTempLate 请求头、参数、请求体设置

参考:https://blog.csdn.net/qq_35642849/article/details/103821900 应用场景:通过微信公众号access_token接口获取到token,然后查询公众号的文章列表。 //region 2.获取文章列表String articleUrl "https://api.weixin.qq.com/cgi-bi…

辗转相除法(欧几里德法)

欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。应用领域有数学和计算机两个方面。计算公式gcd(a,b) gcd(b,a mod b)。 代码实现 public static int gcd (int a, int b) {// write code hereif(b 0) return a;return gcd(b, a…

Echarts柱状图解决数据差距过大不美观,处理数据为0时y轴只显示0~10的情况

问题一:数据差距过大不美观 解决方法:设置yAxis.type log ,使用log轴可以解决这个问题 把yAxis下的type属性设为log就可以调整数据差距过大的问题,我们可以看到y轴的数值呈现对数递增 问题二:久而久之&#xff0c…

Load balancer does not contain an instance for the service xxx-service

分两种可能性: 服务名不符合规范 在Nacos注册的服务名和配置文件的命名使用下划线“ _ ”,服务注册的时候使用“ _ ”可以注册,但被调用就不行了。重新命名为 ruoyi-business 问题解决,可以调用 SpringCloud版本问题 当你的s…

win10安装MySQL8 问题

1、安装时一直无法启动MySQL服务 查看日志内容: MySQL error 1042: Unable to connect to any of the specified MySQL hosts. Waiting 5 seconds before the next connection attempt… Retry 5: Attempting to connect to Mysqllocalhost:3306 with user root wi…

广度优先遍历类似于二叉树的_关于二叉树,你该了解这些

我们要开启新的征程了,大家跟上!说道二叉树,大家对于二叉树其实都很熟悉了,本文呢我也不想教科书式的把二叉树的基础内容在啰嗦一遍,所以一下我讲的都是一些比较重点的内容。相信只要耐心看完,都会有所收获…

el-table实现表格数据为空时自定义内容

使用element ui的el-table组件&#xff0c;当表格数据为空时自定义提示文字和添加按钮等内容 页面效果 自定义文字按钮 官方文档 空数据时显示的文本内容&#xff0c;也可以通过slot"empty"设置 效果实现 使用vue组件template和slot插槽 <el-table :data&qu…