温控采集器对接-java版-modbus4j

2023-11-01 02:40

本文主要是介绍温控采集器对接-java版-modbus4j,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

温控采集器对接

  • 业务需求
  • 需求分析
  • 需求实现
    • 环境准备
      • 1.modbus-RTU转TCP
      • 2.必要参数
    • 代码实现
      • 1.需知
      • 2.实现
  • 其它
    • 写入寄存器
    • 更多实现参考

看此文说明你已经了解了modbus协议,这里不再赘述

业务需求

采集冷柜温控采集器的温度,web端显示各个冷柜的温度(定时采集

需求分析

1️⃣.采集温度
2️⃣.将采集的温度与对应冷柜做绑定( 本文主要采集温度,这里就不讲解绑定了。根据自身业务实现即可

需求实现

环境准备

1.modbus-RTU转TCP

模块通过串口传输数据,由于我们要收集多个温控,显然通过串口采集数据不现实,这里我们需要将modbus-RTU转为TCP协议,然后通过TCP协议采集温度。使用modbus-RTU转TCP温控采集器)的设备即可满足需求。这个某宝某东一搜一大堆,如下所示:
在这里插入图片描述
然后我们通过tcp采集模块中的数据即可。

2.必要参数

参数说明
host 温控采集器地址(这个购买温控采集器时一般通过所附带的客户端进行设置
post ip地址(这个购买温控采集器时一般通过所附带的客户端进行设置
slaveId 设备地址
offset 寄存器地址
numberOfBits 采集数(通道)

代码实现

以下以采集一个温控采集器设备上的数据为例
以下数据均为16进制,假设已知如下设备信息👇👇

设备地址01
起始寄存器地址00 28
通道07
ip地址192.168.1.154
端口502

1.需知

modbus是十六进制传输协议,下文是十进制采集

1234
采集数据时需将寄存器地址(十六进制)转换为十进制获取温度时,返回的也是十进制,唯一需要处理的是数据值除以10为实际温度返回的温度数据2248(-2248)代表当前通道无温度数据功能码03

2.实现

1在项目根目录下创建lib文件夹,并添加jar包
jar包下载
在这里插入图片描述
2.pom.xml引入依赖

        <dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.0.0</version><scope>system</scope><systemPath>${basedir}/lib/modbus4j-3.0.0.jar</systemPath></dependency><dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j-javadoc</artifactId><version>3.0.0</version><scope>system</scope><systemPath>${basedir}/lib/modbus4j-3.0.0-javadoc.jar</systemPath></dependency><dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j-sources</artifactId><version>3.0.0</version><scope>system</scope><systemPath>${basedir}/lib/modbus4j-3.0.0-sources.jar</systemPath></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency>

3.开启定时任务
启动类中添加 @EnableScheduling

4.WKJob

package com.lvyq.controller;import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersRequest;
import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;/*** 温控监控测试*/
@Component
public class WKJob {public static ModbusFactory modbusFactory=new ModbusFactory();/*** 温控* @throws Exception*/@Scheduled(fixedRate = 1000)public void  job3() throws Exception{List<String> lis = new ArrayList<>();System.out.println("进入温控");short[] data = readHoldingRegister("192.168.1.154",502,1,40,7);if (data.length>0){for (int i=0;i<data.length;i++){System.out.println("温控:"+data[i]);}}}/*** @description: 读保持寄存器 功能码03 offset为10进制,modbus rtu 为16进制 28(十六)转40(十)* @author: lvyq* @date: 2022/5/17 13:53* @version 1.0*/public static short[] readHoldingRegister(String host,int post,int slaveId, int offset, int numberOfBits)throws ModbusTransportException {IpParameters params = new IpParameters();params.setHost(host);params.setPort(post);params.setEncapsulated(true);ModbusFactory modbusFactory =new ModbusFactory();ModbusMaster master = modbusFactory.createTcpMaster(params, false);try {master.setTimeout(1000);master.setRetries(3);master.init();} catch (ModbusInitException e) {  e.printStackTrace(); }//读取ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, offset, numberOfBits);ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);return response.getShortData();}
}

执行结果:
在这里插入图片描述
至此,采集温度结束!!!

============其它=============

其它

写入寄存器

    public static boolean writeRegisters(int slaveId, int startOffset, short[] sdata)throws ModbusTransportException, ModbusInitException {// 获取masterIpParameters params = new IpParameters();params.setHost("192.168.1.154");params.setPort(502);params.setEncapsulated(true);ModbusMaster master = modbusFactory.createTcpMaster(params, false);try {master.setTimeout(1000);master.setRetries(3);master.init();} catch (ModbusInitException e) {  e.printStackTrace(); }// 创建请求对象WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);// 发送请求并获取响应对象ModbusResponse response = master.send(request);if (response.isException()) {//  log.error(response.getExceptionMessage());return false;} else {return true;}}

在这里插入图片描述

执行上文中读的方法,结果如下:
在这里插入图片描述

更多实现参考

https://github.com/MangoAutomation/modbus4j

如有问题,可在下方留言👇👇👇

这篇关于温控采集器对接-java版-modbus4j的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/319898

相关文章

Java实现MD5加密的四种方式

《Java实现MD5加密的四种方式》MD5是一种广泛使用的哈希算法,其输出结果是一个128位的二进制数,通常以32位十六进制数的形式表示,MD5的底层实现涉及多个复杂的步骤和算法,本文给大家介绍了Ja... 目录MD5介绍Java 中实现 MD5 加密方式方法一:使用 MessageDigest方法二:使用

Java中的runnable 和 callable 区别解析

《Java中的runnable和callable区别解析》Runnable接口用于定义不需要返回结果的任务,而Callable接口可以返回结果并抛出异常,通常与Future结合使用,Runnab... 目录1. Runnable接口1.1 Runnable的定义1.2 Runnable的特点1.3 使用Ru

Java中Runnable和Callable的区别和联系及使用场景

《Java中Runnable和Callable的区别和联系及使用场景》Java多线程有两个重要的接口,Runnable和Callable,分别提供一个run方法和call方法,二者是有较大差异的,本文... 目录一、Runnable使用场景二、Callable的使用场景三、关于Future和FutureTa

Spring 中 BeanFactoryPostProcessor 的作用和示例源码分析

《Spring中BeanFactoryPostProcessor的作用和示例源码分析》Spring的BeanFactoryPostProcessor是容器初始化的扩展接口,允许在Bean实例化前... 目录一、概览1. 核心定位2. 核心功能详解3. 关键特性二、Spring 内置的 BeanFactory

Spring组件初始化扩展点BeanPostProcessor的作用详解

《Spring组件初始化扩展点BeanPostProcessor的作用详解》本文通过实战案例和常见应用场景详细介绍了BeanPostProcessor的使用,并强调了其在Spring扩展中的重要性,感... 目录一、概述二、BeanPostProcessor的作用三、核心方法解析1、postProcessB

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

Java实现将Markdown转换为纯文本

《Java实现将Markdown转换为纯文本》这篇文章主要为大家详细介绍了两种在Java中实现Markdown转纯文本的主流方法,文中的示例代码讲解详细,大家可以根据需求选择适合的方案... 目录方法一:使用正则表达式(轻量级方案)方法二:使用 Flexmark-Java 库(专业方案)1. 添加依赖(Ma

Spring Boot拦截器Interceptor与过滤器Filter详细教程(示例详解)

《SpringBoot拦截器Interceptor与过滤器Filter详细教程(示例详解)》本文详细介绍了SpringBoot中的拦截器(Interceptor)和过滤器(Filter),包括它们的... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)详细教程1. 概述1

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自