springboot读取modbus数据

1、引入依赖    jlibmodbus

<dependency><groupId>com.intelligt.modbus</groupId><artifactId>jlibmodbus</artifactId><version>1.2.9.7</version>
</dependency>

2、数据获取

public String processData(String ip) {try {// 设置主机TCP参数TcpParameters tcpParameters = new TcpParameters();// 设置TCP的ip地址InetAddress adress = InetAddress.getByName(ip);// TCP参数设置ip地址tcpParameters.setHost(adress);// TCP设置长连接tcpParameters.setKeepAlive(true);// TCP设置端口,这里设置是默认端口502tcpParameters.setPort(Modbus.TCP_PORT);// 创建一个主机ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);Modbus.setAutoIncrementTransactionId(true);final int SLAVE_ID = 1;//从机地址final int START_ADDRESS = 1;//寄存器读取开始地址 尝试从设备地址 减1 开始final int QUANTITY = 66;//读取的寄存器数量 不能大于设备设置的最大值否则会报错;try {if (!master.isConnected()) {master.connect();// 开启连接}// 读保持寄存器,功能码03  // 注意:这里读取的数据都是整型的需要根据plc设备设置的进行相应的转换int[] values = master.readHoldingRegisters(SLAVE_ID, START_ADDRESS, QUANTITY); for (int i = 0; i < values.length; i++) {System.out.println(i + ": " + values[i]);}// 获取长整型数据PlcUtils.getLongValue(values[0],values[1]);}} catch (ModbusProtocolException e) {log.error("Modbus 协议异常,ip: {},异常信息:{}", ip, e.getMessage());e.printStackTrace();} catch (ModbusNumberException e) {log.error("Modbus 编号异常,ip: {},异常信息:{}", ip, e.getMessage());e.printStackTrace();} catch (ModbusIOException e) {log.error("Modbus IO 异常,ip: {},异常信息:{}", ip, e.getMessage());e.printStackTrace();} finally {try {master.disconnect();} catch (ModbusIOException e) {log.error("Modbus 连接断开异常,ip: {},异常信息:{}", ip, e.getMessage());e.printStackTrace();}}} catch (RuntimeException e) {throw e;} catch (Exception e) {e.printStackTrace();}return "数据获取成功!";}

3、数据处理工具

/*** @author liang* @version 1.0* @date 2024/10/28 10:06*/
public class PlcUtils implements Serializable {/*** 获取长整型数据* 低字节在前(Little-Endian) 对应 最不重要的寄存器优先的*/public static int getLongValue(int[] registers) {if (registers.length < 2) {throw new IllegalArgumentException("需要至少2个寄存器来组成32位整型");}return ((registers[1] & 0xFFFF) << 16) | (registers[0] & 0xFFFF);}/*** 高字节在前(Big-Endian)  对应 最重要的寄存器优先* 获取长整型数据** @param registers* @return*/private static int combineIntValue(int[] registers) {if (registers.length < 2) {throw new IllegalArgumentException("需要至少2个寄存器来组成32位整型");}return ((registers[0] & 0xFFFF) << 16) | (registers[1] & 0xFFFF);}/*** 获取浮点型数据** @param registers* @return*/public static float getFloatValue(int[] registers) {return Float.intBitsToFloat(getLongValue(registers));}/*** 获取二进制数据** @param val* @return*/public static String getBinaryString(int val) {return Integer.toBinaryString(val);}// 将4个16位寄存器组合成一个64位长整型值private static long combineLongValue(int[] registers) {if (registers.length < 4) {throw new IllegalArgumentException("需要至少4个寄存器来组成长整型");}return ((long)(registers[0] & 0xFFFF) << 48) |((long)(registers[1] & 0xFFFF) << 32) |((long)(registers[2] & 0xFFFF) << 16) |((long)(registers[3] & 0xFFFF));}}

4、模拟设备设置

 服务端 modsim32  一次只能模拟一种数据类型,需要多种时切换即可

客户端 modscan32

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/886038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW中坐标排序与旋转 参见附件snippet程序

LabVIEW中坐标排序与旋转 参见附件snippet程序LabVIEW中坐标排序与旋转 参见附件snippet程序 - 北京瀚文网星科技有限公司 在LabVIEW中处理坐标排序的过程&#xff0c;尤其是按顺时针或逆时针排列坐标点&#xff0c;常见的应用包括处理几何形状、路径规划等任务。下面我将为您…

01-如何引导AI来帮助我们完善项目

后台项目有哪些亮点, 有哪些难点,你怎么解决的 封装 组件封装 2. 自定义指令 3. hook (vue3的组合式函数)优化 (举例) 防抖节流 2. 避免内存泄露 3. 组件销毁时销毁定时器,window对象的事件绑定vue 计算属性 key值 keep-alive差异化的功能 面试回答的套路 项目背景和目标 (简…

详解kafka消息发送重试机制的案例

在 Kafka 生产者中实现消息发送的重试机制&#xff0c;可以通过配置 KafkaProducer 的相关属性来实现。以下是一些关键的配置项&#xff1a; retries&#xff1a;设置生产者发送失败后重试的次数。 retry.backoff.ms&#xff1a;设置生产者在重试前等待的时间。 buffer.memo…

JS手写-this绑定实现

在 JavaScript 中&#xff0c;bind、call 和 apply 方法都可以用来改变函数的 this 指向。下面我们将分别实现这些方法的简单版本。 1. 实现 bind bind 方法创建一个新的函数&#xff0c;在调用时设置 this 值&#xff0c;并返回这个新的函数。 Function.prototype.myBind …

植物明星大乱斗8

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 util.hutil.cppplatform.hplatform.cppmain.cppgameScene.hgameScene.cpp util.h #pragma once #include <graphics.h> #include "camera.h"void flipImage(IMAGE* src, IMAGE* dst);void putImag…

51单片机应用开发(进阶)---定时器应用(电子时钟)

实现目标 1、巩固定时器的配置流程&#xff1b; 2、掌握按键、数码管与定时器配合使用&#xff1b; 3、功能1&#xff1a;&#xff08;1&#xff09;简单显示时间。显示格式&#xff1a;88-88-88&#xff08;时-分-秒&#xff09; 4、功能2&#xff1a;&#xff08;1&#…

FPGA实现PCIE采集电脑端视频转SFP光口万兆UDP输出,基于XDMA+GTX架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的PCIE方案10G Ethernet Subsystem实现万兆以太网物理层方案 3、PCIE基础知识扫描4、工程详细设计方案工程设计原理框图电脑端视频PCIE视频采集QT上位机XDMA配置及使用XDMA中断模块FDMA图像缓存UDP视频组包发送UDP协议栈MAC…

使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)

import binascii import unicorn import capstonedef printArm32Regs(mu):for i in range(66,78):print("R%d,value:%x"%(i-66,mu.reg_read(i)))def testhumb():CODE b\x1C\x00\x0A\x46\x1E\x00"""MOV R3, R0 的机器码&#xff1a;0x1C 0x00&#xf…

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件&#xff08;使用了…

第三十一天|贪心算法| 56. 合并区间,738.单调递增的数字 , 968.监控二叉树

目录 56. 合并区间 方法1&#xff1a;fff 看方法2&#xff1a;fff优化版 方法3&#xff1a; 738.单调递增的数字 968.监控二叉树&#xff08;贪心二叉树&#xff09; 56. 合并区间 判断重叠区间问题&#xff0c;与452和435是一个套路 方法1&#xff1a;fff 看方法2&am…

LeetCode 热题100(八)【二叉树】(3)

目录 8.11二叉树展开为链表&#xff08;中等&#xff09; 8.12从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 8.13路径总和III&#xff08;中等&#xff09; 8.14二叉树的最近公共祖先&#xff08;中等&#xff09; 8.15二叉树中的最大路径和&#xff08;困…

nginx配置负载均衡详解

在现代的 web 应用中&#xff0c;负载均衡是确保高可用性、可扩展性和稳定性的关键技术之一。Nginx 是一个非常流行的反向代理服务器和负载均衡器&#xff0c;它支持多种负载均衡策略&#xff0c;能够帮助将客户端的请求分发到多个后端服务器&#xff0c;以提高系统的整体性能和…

AutoSAR CP DoIP规范导读

主要功能和用途 诊断通信协议实现 遵循标准&#xff1a;遵循ISO 13400 - 2标准&#xff0c;实现了诊断通信在IP网络上的传输协议和网络层服务&#xff0c;包括数据封装、传输、路由等功能。 多种消息支持 车辆识别与公告&#xff1a;能够进行车辆识别请求和响应&#xff0c;…

sqlsever 分布式存储查询

当数据存储在不同的服务器上的时候怎么取出来进行正常管连呢?比如你有 A 和B 两个服务器 里面存有两个表 分别是 A_TABLE、B_TABLE 其中 他们的关联关系是 ID 互相关联 1.创建链接服务器如果在B数据库要访问A数据库 那么 就在B数据库创建 -- 创建链接服务器 EXEC sp_addlink…

Simulink中Matlab function使用全局变量

目录 一. 引言二. 普通Matlab function使用全局变量三. Simulink中的Matlab function使用全局变量四. 如何利用Matlab function的全局变量施加随机噪声 一. 引言 最近发现了之前仿真中的一个问题&#xff0c;记录一下备忘。 Matlab function中有时候需要用到全局变量&#xf…

屏幕缩放后截屏图片尺寸数字偏大导致前端DOM尺寸设置失真问题

如果显示器的尺寸缩放&#xff0c;而不是100%的话&#xff0c;利用截屏软件截取屏幕中的区域&#xff0c;截取时读取到的区域尺寸&#xff0c;就会失真&#xff1b;如果使用这个尺寸去设置网页中的DOM&#xff0c;则Dom的尺寸也会跟着失真。 比如&#xff0c; 如果使用失真…

蓝桥杯每日真题 - 第7天

题目&#xff1a;&#xff08;爬山&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 前缀和构造&#xff1a;为了高效地计算子数组的和&#xff0c;我们可以先构造前缀和数组 a&#xff0c;其中 a[i] 表示从第 1 个元素到第 i 个元素的…

给阿里云OSS绑定域名并启用SSL

为什么要这么做&#xff1f; 问题描述&#xff1a; 当用户通过 OSS 域名访问文件时&#xff0c;OSS 会在响应头中增加 Content-Disposition: attachment 和 x-oss-force-download: true&#xff0c;导致文件被强制下载而不是预览。这个问题特别影响在 2022/10/09 之后新开通 OS…

CTF-WEB:PHP伪协议用法总结

php:// 伪协议&#xff1a; php:// 是 PHP 中的一个虚拟协议&#xff08;或称为流包装器&#xff09;&#xff0c;用于访问 PHP 内部流资源。它是 PHP 提供的内置流协议之一&#xff0c;允许你通过流&#xff08;stream&#xff09;方式访问 PHP 内部的数据流、文件或其他资源…

电脑浏览器打不开网页怎么办 浏览器无法访问网页解决方法

我们在使用电脑的时候&#xff0c;使用浏览器是经常的&#xff0c;很多用户在点开浏览器时&#xff0c;却遇到浏览器无法访问网页的情况。那么电脑浏览器打不开网页是什么原因呢&#xff1f;今天小编就给大家分享几个常见的原因和具体的解决方法&#xff0c;希望能对大家有所帮…