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

springboot整合modbus4J(二)

springboot整合modbus4J(二)

  1. maven依赖
<dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.1.0</version>
</dependency>
<dependency><groupId>net.wimpi</groupId><artifactId>jamod</artifactId><version>1.2</version>
</dependency>
  1. 代码
import com.serotonin.modbus4j.ModbusFactory;
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.code.DataType;
import com.serotonin.modbus4j.exception.ErrorResponseException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.exception.ModbusTransportException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;
import com.serotonin.modbus4j.msg.*;
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
import net.wimpi.modbus.procimg.Register;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;import java.net.InetAddress;
import java.util.Properties;/*** @Author: Administrator* @Date: 2023/8/24* @Description:*/
public class Modbus4jWriteUtils {static String host = "192.168.0.5";static int port = 4001;/*** 工厂。*/static ModbusFactory modbusFactory;static {if (modbusFactory == null) {modbusFactory = new ModbusFactory();}}/*** 获取tcpMaster** @return* @throws ModbusInitException*/public static ModbusMaster getMaster() throws ModbusInitException {IpParameters params = new IpParameters();//params.setHost((String)getCommonYml("system.modbus.client.host"));//params.setPort((Integer)getCommonYml("system.modbus.client.port"));params.setHost("127.0.0.1");params.setPort(4001);ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, false);tcpMaster.init();return tcpMaster;}/*** 写 [01 Coil Status(0x)]写一个 function ID = 5** @param slaveId*            slave的ID* @param writeOffset*            位置* @param writeValue*            值* @return 是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeCoil(int slaveId, int writeOffset, boolean writeValue)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);// 发送请求并获取响应对象WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);if (response.isException()) {return false;} else {return true;}}/*** 写[01 Coil Status(0x)] 写多个 function ID = 15** @param slaveId*            slaveId* @param startOffset*            开始位置* @param bdata*            写入的数据* @return 是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeCoils(int slaveId, int startOffset, boolean[] bdata)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, bdata);// 发送请求并获取响应对象WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);if (response.isException()) {return false;} else {return true;}}/**** 写[03 Holding Register(4x)] 写一个 function ID = 6** @param slaveId* @param writeOffset* @param writeValue* @return* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeRegister(int slaveId, int writeOffset, int writeValue)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求对象WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);WriteRegisterResponse response = null;try {response = (WriteRegisterResponse) tcpMaster.send(request);if (response.isException()) {System.out.println(response.getExceptionMessage());return false;}} catch (Exception e) {e.getMessage();System.err.println(e.getMessage());}return true;}/**** 写入[03 Holding Register(4x)]写多个 function ID=16** @param slaveId*            modbus的slaveID* @param startOffset*            起始位置偏移量值* @param sdata*            写入的数据* @return 返回是否写入成功* @throws ModbusTransportException* @throws ModbusInitException*/public static boolean writeRegisters(int slaveId, int startOffset, short[] sdata)throws ModbusTransportException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 创建请求对象WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);// 发送请求并获取响应对象ModbusResponse response = tcpMaster.send(request);if (response.isException()) {System.out.println(response.getExceptionMessage());return false;} else {return true;}}/*** 写入数字类型的模拟量(如:写入Float类型的模拟量、Double类型模拟量、整数类型Short、Integer、Long)** @param slaveId* @param offset* @param value*            写入值,Number的子类,例如写入Float浮点类型,Double双精度类型,以及整型short,int,long* @param registerCount*            ,com.serotonin.modbus4j.code.DataType* @throws ModbusTransportException* @throws ErrorResponseException* @throws ModbusInitException*/public static void writeHoldingRegister(int slaveId, int offset, Number value, int dataType)throws ModbusTransportException, ErrorResponseException, ModbusInitException {// 获取masterModbusMaster tcpMaster = getMaster();// 类型BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);tcpMaster.setValue(locator, value);}/*** 获取配置文件参数** @param key*/public static Object getCommonYml(Object key){Resource resource = new ClassPathResource("application.yml");Properties properties = null;try {YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean();yamlFactory.setResources(resource);properties = yamlFactory.getObject();} catch (Exception e) {e.printStackTrace();return null;}return properties.get(key);}/*** 读保持寄存器数据  0x03* @param slaveId* @param offset* @param dataType* @return* @throws ModbusInitException* @throws ModbusTransportException* @throws ErrorResponseException*/public static Number holdingRegister(int slaveId, int offset, int dataType) throws ModbusInitException, ModbusTransportException, ErrorResponseException {BaseLocator<Number> holdingRegister = BaseLocator.holdingRegister(slaveId, offset, dataType);Number value = getMaster().getValue(holdingRegister);return value;}public static void main(String[] args) {try {// Modbus TCP connection settingsInetAddress ipAddress = InetAddress.getByName("127.0.0.1");int port = 4001; // Modbus default port is 502TCPMasterConnection connection = new TCPMasterConnection(ipAddress);connection.setPort(port);connection.connect();// Create a Modbus request for batch reading holding registersReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 2);request.setUnitID(1); // Set the Modbus unit ID// Prepare the transactionModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);transaction.setRequest(request);// Execute the transactiontransaction.execute();// Get the responseReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse) transaction.getResponse();if (response != null) {Register[] registers = response.getRegisters();for (Register value : registers) {System.out.println("value:" + value.getValue());}} else {System.out.println("Response is null.");}// Close the connectionconnection.close();} catch (Exception e) {e.printStackTrace();}}public static void main1(String[] args) throws ModbusInitException, ModbusTransportException, ErrorResponseException {//try {//@formatter:off// 测试01
//			boolean t01 = writeCoil(1, 0, true);
//			System.out.println("T01:" + t01);
//
//			// 测试02
//			boolean t02 = writeCoils(1, 0, new boolean[] { true, false, true });
//			System.out.println("T02:" + t02);// 测试03short v = -2;boolean t03 = writeRegister(1, 2,  100);System.out.println("T03:" + t03);Number number = holdingRegister(1,2,DataType.TWO_BYTE_INT_SIGNED);System.out.println(number);
//			// 测试04
//			boolean t04 = writeRegisters(1, 0, new short[] { -3, 3, 9 });
//			System.out.println("t04:" + t04);
//			//写模拟量//writeHoldingRegister(1,0, 10.1f, DataType.FOUR_BYTE_FLOAT);//			//@formatter:on
//			writeRegister(1, 4, (short)298);/* } catch (Exception e) {e.printStackTrace();}*/}
}

相关文章:

springboot整合modbus4J(二)

springboot整合modbus4J&#xff08;二&#xff09; maven依赖 <dependency><groupId>com.infiniteautomation</groupId><artifactId>modbus4j</artifactId><version>3.1.0</version> </dependency> <dependency><…...

ROS2之topic

目录 ros2 topic命令行 ros2 topic命令行 查看topic输出&#xff1a; ros2 topic echo <topic_name> 查看topic频率&#xff1a;ros2 topic hz <topic_name>...

C语言数值表示——进制、数值存储方式

进制 进制也就是进位制&#xff0c;是人们规定的一种进位方法对于任何一种进制—X进制&#xff0c;就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一&#xff0c;十六进制是逢十六进一&#xff0c;二进制就是逢二进一&#xff0c;以此类推&#xff0c;x进制就是逢x进位…...

linux————keepalived+LVS(DR模式)

一、作用 使用keepalived解决LVS的单点故障 高可用集群 二、 调度器配置 环境 两台LVS服务 一主一备 两台web服务 采用nginx &#xff08;实现LVS负载均衡&#xff09; 服务ip 主LVS 192.168.100.3 备LVS 192.168.100.6 web1 192.…...

8月28日,每日信息差

1、欧拉汽车第40万台整车下线。据介绍品牌与用户共创的最新成果2023款好猫&好猫GT木兰版尊荣型也在同一时间上市&#xff0c;限时12.98万起 2、马克古尔曼&#xff1a;M3款苹果MacBook最早今年10月发布 3、大麦成立“艺展鸿图”展览厂牌。专注于高品质艺术展览、授权等业…...

vue-element-admin最新版4.4实现多个url路由匹配到一个路径时,左侧菜单保持高亮状态

文章目录 环境&#xff1a;需求&#xff1a;原因分析&#xff1a;如何解决&#xff1a; 环境&#xff1a; vue-admin-template-4.4版本&#xff08;vue2&#xff09; 需求&#xff1a; 当我访问申请开户时&#xff0c;也希望支付菜单能保持高亮状态。 原因分析&#xff1a; …...

Android自定义view实现横向滚动弹幕

参考文章 此方案使用动画方式实现&#xff0c;只适合轻量级别的弹幕滚动效果实现&#xff0c;数据量过大时会出现内存激增的情况。 效果&#xff1a; 自定义view代码 public class TumbleLayout extends ViewGroup {private final String TAG "TumbleLayout";priva…...

学习ts(十二)Proxy与Reflect

定义 Proxy 为开发者提供了拦截并向基本操作嵌入额外行为的能力。具体的说&#xff0c;可以给目标对象定义一个关联的代理对象&#xff0c;而这个代理对象可以作为抽象的目标对象来使用。在对目标对象的各种操作影响目标对象之前&#xff0c;可以在代理对象中对这些操作加以控…...

性能优化之分库分表

1、什么是分库分表 1.1、分表 将同一个库中的一张表&#xff08;比如SPU表&#xff09;按某种方式&#xff08;垂直拆分、水平拆分&#xff09;拆分成SPU1、SPU2、SPU3、SPU4…等若干张表&#xff0c;如下图所示&#xff1a; 1.2、分库 在表数据不变的情况下&#xff0c;对…...

每日一学——STP、VRRP 、BFD、POE

STP (Spanning Tree Protocol): STP是一种用于构建安全和冗余的网络拓扑的协议。 它能够检测并防止网络中的环路形成&#xff0c;从而防止数据包在网络中无限循环。STP通过选择一个主桥和确定最短路径来实现拓扑稳定。STP有多种版本&#xff0c;如STP、RSTP和PVST等。 VRRP (V…...

Spring MVC 一 :从MVC Servlet开始

甩开膀子&#xff0c;继续干活。 今天开始Spring Framework中的另外一部分重头戏&#xff1a;Spring Web MVC&#xff0c;借助Spring Web MVC&#xff0c;Spring Framework可以通过Servlet API轻松构建基于web的应用。 在开始Spring Web MVC之前&#xff0c;我们还是要简单了…...

Ansible学习笔记(二)

3.ansible的使用示例&#xff08;playbook&#xff09; 1.创建mysql 账户和mysql 组的 playbook ---#create mysql user and group - hosts: allremote_user: roottasks:- name: create groupgroup: namemysql systemyes gid306- name: create useruser: namemysql systemyes…...

Web安全测试(一):HTTP请求详解

一、前言 结合内部资料,与安全渗透部门同事合力整理的安全测试相关资料教程,全方位涵盖电商、支付、金融、网络、数据库等领域的安全测试,覆盖Web、APP、中间件、内外网、Linux、Windows多个平台。学完后一定能成为安全大佬! 全部文章请访问专栏:《全栈安全测试教程(0基…...

Android工具条

在底层&#xff0c;所有通过主题得到应用条的活动都使用ActionBar类实现它的应用条。不过最新的应用条特性已经增加到AppCompat支持库中的Toolbar类。这意味着&#xff0c;如果你想在应用中使用最新的应用条特性&#xff0c;就需要使用支持库中的ToolBar类。 如何增加工具条 1…...

【项目实战典型案例】05.前后端分离的好处(发送调查问卷)

目录 一、背景二、思路三、过程1、主要的业务逻辑2、解决问题的思路 四、总结五、面向对象的好处 一、背景 以下流程图是给用户发送调查问的整体流程&#xff0c;将不必要的业务逻辑放到前端进行处理。这样导致逻辑混乱难以维护。前后端分离的其中一个目的是将功能的样式放在了…...

(Deep Learning)准确率和召回率的基础概念

算法模型极大的提升了对各类结果的预测效率。 【算法模型的本质】 算法模型的本质&#xff0c;是基于输入的各类变量因子&#xff0c;通过计算规则&#xff08;模型or公式&#xff09;&#xff0c;得出预测结果。 典型的预测结果比如&#xff1a; 1.&#xff08;通过历史行为…...

【业务功能篇85】微服务-springcloud-Nginx-反向代理-网关

Nginx域名 1.hosts文件 在c:/window/system32/drivers/etc/hosts文件&#xff0c;我们在这个文件中添加 192.168.56.100 msb.mall.com注意如果是没有操作权限&#xff0c;那么点击该文件右击属性&#xff0c;去掉只读属性即可 通过这个域名访问到Nginx服务 2.Nginx的方向代…...

深度适配?华为鸿蒙OS智能座舱酷狗音乐车载版5.0,车内尽享K歌

此次华为 HarmonyOS 智能座舱酷狗音乐车载版 5.0 升级为搭载了 HarmonyOS 车机系统的多款车型带来了更丰富的功能和互动体验。新版本的升级内容主要包括创新交互设计和高品质音质两个方面。 在创新交互设计方面&#xff0c;华为 HarmonyOS 智能座舱酷狗音乐车载版 5.0 深度适配…...

数字孪生体技术--学习笔记

一.数字孪生体技术概述 数字孪生体技术是跨层级&#xff0c;跨尺度的现实世界和虚拟世界的建立沟通的桥梁&#xff0c;是第四次工业革命的通用目的技术和核心技术体系之一&#xff0c;是支撑万物互联的综合技术系统&#xff0c;是数字经济发展的基础&#xff0c;是未来智能时代…...

proxysql使用心得

proxySQL 多层配置系统结构 -------------------------| RUNTIME |-------------------------/|\ || |[1] | [2] || \|/-------------------------| MEMORY |------------------------- _/|\ | …...

RK3568交叉编译环境搭建:ARM官方GCC 8.3与Linaro版本到底怎么选?我的踩坑与选择心得

RK3568交叉编译环境搭建&#xff1a;ARM官方GCC 8.3与Linaro版本深度对比与实战选择指南 在嵌入式开发领域&#xff0c;交叉编译环境的搭建往往是项目启动的第一道门槛。对于RK3568这样的高性能ARM处理器&#xff0c;选择合适的交叉编译器不仅关系到开发效率&#xff0c;更直接…...

免费开源Sunshine游戏串流服务器终极指南:打造你的专属云游戏平台

免费开源Sunshine游戏串流服务器终极指南&#xff1a;打造你的专属云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 想要在任何设备上畅玩PC游戏&#xff0c;却受限于硬件…...

避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)

高德DistrictSearch深度避坑&#xff1a;5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时&#xff0c;突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节&#xff0c;而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...

FPGA密码锁设计避坑指南:状态机划分、时序约束与安全逻辑的那些事儿

FPGA密码锁设计避坑指南&#xff1a;状态机划分、时序约束与安全逻辑的那些事儿 在FPGA开发领域&#xff0c;密码锁设计看似简单&#xff0c;实则暗藏玄机。许多工程师在完成基础功能后&#xff0c;往往会在状态机划分、时序约束和安全逻辑等环节踩坑。本文将结合实战经验&…...

Pyspark环境搭建及案例(Windows)

Windows环境下开发pyspark程序 一、环境准备&#xff1a;Anaconda Python 虚拟环境 1. 安装 Anaconda&#xff08;推荐&#xff09; 下载地址&#xff1a;https://www.anaconda.com/products/distribution 安装时选择“Add Anaconda to PATH”会更方便。 2、新建虚拟环境 使…...

nli-distilroberta-base参数解析与调优指南:关键配置项详解

nli-distilroberta-base参数解析与调优指南&#xff1a;关键配置项详解 1. 引言 如果你正在使用nli-distilroberta-base模型进行自然语言推理任务&#xff0c;可能会遇到这样的困惑&#xff1a;为什么同样的模型在不同机器上运行速度差异这么大&#xff1f;为什么有时候推理结…...

实验室搬砖实录:手把手教你搞定柱层析,从TLC监测到梯度洗脱的保姆级避坑指南

实验室搬砖实录&#xff1a;手把手教你搞定柱层析&#xff0c;从TLC监测到梯度洗脱的保姆级避坑指南 记得第一次独立做柱层析时&#xff0c;盯着那根玻璃柱看了半小时&#xff0c;愣是没敢动手。TLC板上明明分得挺开的点&#xff0c;怎么一上柱子就全乱了&#xff1f;洗脱液极性…...

万物识别在智能体(Skills Agent)中的集成应用

万物识别在智能体(Skills Agent)中的集成应用 想象一下&#xff0c;你正在开发一个智能客服机器人&#xff0c;用户发来一张照片&#xff0c;里面是自家厨房水槽下漏水的一堆零件。用户问&#xff1a;“这是什么东西坏了&#xff1f;我该买什么配件&#xff1f;” 传统的文本对…...

智能农业大棚设计详解

基于单片机的智能农业大棚设计温湿度二氧化碳光照&#xff08;详细设计说明 10119-基于单片机的智能农业大棚设计温湿度二氧化碳光照&#xff08;详细设计说明书proteus源代码原理图元件清单&#xff09; 功能需求&#xff1a; 智慧农业大棚的底层理念是实现智能化控制与生产&a…...

Arduino智能小车避坑指南:从TB6612驱动到HC-05蓝牙,新手最容易搞错的5个硬件连接点

Arduino智能小车避坑实战&#xff1a;5个硬件连接致命细节与示波器级调试方案 刚拿到Arduino套件的新手们&#xff0c;总会在论坛里发出同样的灵魂拷问&#xff1a;"为什么我的小车要么瘫着不动&#xff0c;要么像醉汉一样乱撞&#xff1f;"这个问题背后&#xff0c;…...