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

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.mrgr.cn/news/70882.html

相关文章:

  • 如何使用Django写个接口,然后postman中调用
  • 【目标检测】【Ultralytics-YOLO系列】Windows11下YOLOV5人脸目标检测
  • 【Linux】网络编程3
  • goframe开发一个企业网站 rabbitmq队例15
  • Android 开启混淆R8编译问题处理
  • JavaScript:loadScript 方法
  • C# 网络编程技术
  • js 获取token并保存30分钟,过期重新获取
  • 比特大陆/算能科技嵌入式面试题及参考答案
  • VMware(虚拟机)下的 Windows 10系统安装Vmwere Tools的详细教程
  • 软件开发的具体流程与管理规章制度规范,项目管理文件,开发过程文件(Word原件)
  • vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框
  • 高阶智驾「扔下」价格“炸弹”
  • 酒店叮咚门铃的类型有哪些
  • HTMLCSS 打造的酷炫菜单选项卡
  • 智能科技赋能金融决策:中阳科技的数据分析解决方案
  • 如何使用亿图脑图MindMaster大纲功能
  • 3175. 找到连续赢 K 场比赛的第一位玩家
  • C# 委托与匿名方法
  • 微知-tar命令如何只查看tgz文件内容不解压
  • 精品案例PPT | 企业架构及典型设计方案
  • 大数据应用开发——实时数据采集
  • Vue.js 组件开发详解
  • 斗破QT编程入门系列之四:GUI应用程序设计基础:UI文件设计原理与运行机制(五星斗师)
  • 腾讯云边缘安全加速平台EdgeOne最佳实践
  • 拾贝(Shibei):微信读书笔记管理的新篇章