Modbus TCP读取寄存器数据

2023-11-03

modbus4j读取寄存器数据

ModbusReadUtil读取工具类

package cn.sync.modbus;

import org.apache.log4j.Logger;

import com.serotonin.modbus4j.BatchRead;
import com.serotonin.modbus4j.BatchResults;
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;

/**
 * 
 * Modbus TCP协议读取数据
 * @author zyl
 *
 */
public class ModbusReadUtil {
    
	private static Logger logger = Logger.getLogger(ModbusReadUtil.class);
	
	/**
	 * 单列工厂。
	 */
	static ModbusFactory modbusFactory;
	static {
		if (modbusFactory == null) {
			modbusFactory = new ModbusFactory();
		}
	}
	
	/**
	 * 获取master 
	 * @param host  IP地址
	 * @param port  端口号
	 * @return
	 * @throws ModbusInitException
	 */
	public static ModbusMaster getMaster(String host,int port) throws ModbusInitException {
		try {
			IpParameters params = new IpParameters();
			params.setHost(host);
			params.setPort(port);
			ModbusMaster master = modbusFactory.createTcpMaster(params, false);// TCP 协议
			master.init();  //master初始化
			return master;
		} catch (Exception e) {
			logger.error("获取master出现异常"+e);
			e.printStackTrace();
		}
         return null;
	}
	
	
	/**
	 * 读取[03 Holding Register类型 2x]模拟量数据
	 * @param master ModbusMaster对象
	 * @param slaveId  
	 *            slave Id  设备ID
	 * @param offset
	 *            偏移截止位置
	 * @param dataType
	 *            数据类型,来自com.serotonin.modbus4j.code.DataType
	 * @return
	 * @throws ModbusTransportException
	 *             异常
	 * @throws ErrorResponseException
	 *             异常
	 * @throws ModbusInitException
	 *             异常
	 */
	public static Number readHoldingRegister(ModbusMaster master,int slaveId, int offset, int dataType)
			throws ModbusTransportException, ErrorResponseException, ModbusInitException {
		// 03 Holding Register类型数据读取
		BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);
		System.out.println("loc:"+loc);
		Number value =master.getValue(loc);
		System.out.println();
		return value;
   }
	
   
	/**
	 * 批量读取使用寄存器数据
	 * @param  master ModbusMaster对象
	 * @param batchRead   批量读取集合
	 * @throws ModbusTransportException
	 * @throws ErrorResponseException
	 * @throws ModbusInitException
	 */
	public static BatchResults<Integer> batchRead(ModbusMaster master,BatchRead<Integer> batchRead)throws Exception {
		try {
			batchRead.setContiguousRequests(false);
			BatchResults<Integer> results = master.send(batchRead);
			return results;
		} catch (Exception e) {
			logger.error("批量读取使用寄存器数据出现异常"+e);
			e.printStackTrace();
		}
		return null;
		
	}
	
	//测试
	public static void main(String[] args) {
		try {
			ModbusMaster master=getMaster("127.0.0.1",502);
			 BatchRead<Integer> batch = new BatchRead<Integer>();

				batch.addLocator(0, BaseLocator.holdingRegister(1,1002, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(1, BaseLocator.holdingRegister(1,1004, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(2, BaseLocator.holdingRegister(1,1006, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				batch.addLocator(3, BaseLocator.holdingRegister(1,1008, DataType.FOUR_BYTE_FLOAT_SWAPPED));
				
				BatchResults<Integer> batchRead=batchRead(master,batch);
				System.out.println(batchRead.getValue(0));
				System.out.println(batchRead.getValue(1));
				System.out.println(batchRead.getValue(2));
				System.out.println(batchRead.getValue(3));
				//DataType.FOUR_BYTE_FLOAT_SWAPPED  float高低位数据处理
				Number v031 = readHoldingRegister(master,1,1010, DataType.FOUR_BYTE_FLOAT_SWAPPED);// 注意,float
				System.out.println("v031:"+v031);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
   
}

代码以及依赖JAR下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Modbus TCP读取寄存器数据 的相关文章

  • .git文件泄露

    知识点 git文件泄露 详情 简述 git文件导致的源码泄露 git文件是开发人员在开发过程中使用 Git 分布式版本控制系统 做开发时产生的隐藏目录 该文件包含一些版本信息和网站源码 数据库信息等敏感信息 原理利用 1 通常开发人员在开发
  • lightmapper

    https github com ands lightmapper
  • Mybatis在使用count和group_by查询时,mysql数据库5.7,报错

    Mybatis在使用count和group by查询时 mysql数据库5 7 报错 2023 05 31 20 49 09 792 ERROR 7548 io 8081 exec 10 o a c c C dispatcherServle
  • 混淆工具javascript-obfuscator使用简介

    javascript obfuscator是一个免费的JavaScript代码混淆工具 它功能强大 可以把你的源代码变得 面目全非 完全没有可读性 还具有部分防调试功能 给JavaScript代码多一层保护 安装 它支持很多流行的前端打包工
  • 算法基础14 —— 图论入门之迪杰斯特拉算法(Dijkstra)

    回顾 Floyed算法可以求任意两点之间的最短路径 但是Dijkstra算法只能求一个结点到另一个结点的最短路径 它是一个单源的最短路径算法 Floyed算法的时间复杂度为O n 3 故一般情况下数据范围要求在100以内 Dijkstra算
  • 深度学习:神经网络中为什么需要使用激活函数?(超详细)

    一 百度百科 我们先看下百度百科的解释 如果不用激活函数 每一层输出都是上层输入的线性函数 无论神经网络有多少层 输出都是输入的线性组合 这种情况就是最原始的感知机 Perceptron 如果使用的话 激活函数给神经元引入了非线性因素 使得
  • 【GitHub教程】 GitHub上传自己的项目

    GitHub教程 GitHub上传自己的项目 1 首先安装git 安装git后才能上传项目 下载地址 https git scm com download win 进入直接检测电脑型号并下载 下载好后一直下一步安装即可 以下表示安装成功 2
  • IntelliJ IDEA Junit

    为了学习最新计算机知识 我决定用英语写文档 并多看英文文档 today It take me lots of time to find how to make TestCase in IntelliJ7 You could follow t
  • IntelliJ IDEA 2020.2 配置大全(更新中)

    文章目录 1 提示改为不区分大小写 2 代码字体大小修改 2 1使用Ctrl 鼠标滚轮修改代码字体大小 2 2常规方法修改代码字体大小 行距 3 主题设置 4 控制台输出字体大小修改 5 Maven配置 6 打开IDEA直接进入上次退出的项
  • Set 数据构造函数

    Set数据结构 类似数组 所有的数据都是唯一的 没有重复的值 它本身是一个构造函数 主要是用来去重 但是必须转成真数组 我们来学习以下转真数组的两种方法 第一种 Array from 第二种 拓展运算符 利用拓展运算符把 set 集合将字符
  • FatMouse' Trade(贪心算法)

    FatMouse Trade Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 45918 Accep
  • 案例驱动python编程入门-python监听socket客户端连接(驱动串口屏幕)

    实例简介 实例截图 核心代码 import socket import os import sys import struct def socket service data try s socket socket socket AF IN
  • 轨迹规划五次多项式学习

    五次多项式是一种常用的平滑轨迹规划方法 可以在运动过程中使得机器人的加速度和曲率连续变化 以达到平滑 稳定控制的效果 这里简单介绍如何通过五次多项式来求解运动轨迹 假设我们要将一个物体从起始点 x0 y0 运动到终止点 xT yT 并且要求
  • React框架(十九)在使用style-components的同时引入.css文件

    什么是style components style components是针对React写的一套css in js框架 简单来讲就是在js中写css 相对于与预处理器 sass less 的好处是 css in js使用的是js语法 不用重
  • 小程序-云开发

    小程序 云开发 小程序 云开发 小程序 云开发 什么是小程序云开发 云开发优势 能力概览 配置环境开发 准备工作 第 1 步 创建项目 第 2 步 开通云开发 第 3 步 开始开发 第三方快速注册的小程序 第三方快速注册小程序支持云开发 方
  • Leetcode 485最大连续1的个数

    题目描述 方法 暴力求解 自己想到的思路就是遍历一遍 创建一个新的vector和记录最大值的v max 将等于1的放入新vector中 然后比较新容器大小和v max 如果大于就记录下最大的新容器大小 目的是记录最大的长度 改进 将新数组换
  • Qt5解决中文乱码问题

    Qt5中解决运行时中文乱码 中文乱码问题 中文乱码问题 代码中字符串正常显示 运行时显示乱码 解决方法有如下三种方法 第一种方法 this gt setWindowTitle QString fromLocal8Bit 中文乱码问题 ui
  • 【Web3】认识以太坊钱包

    目录 区块链钱包概念 密码 私钥 Private Key 公钥Public Key Keystore 助记词 Mnemonic 如何解锁账户 区块链钱包概念 钱包用来存钱的 在区块链中 我们的数字资产都会对应到一个账户地址上 只有拥 有账户

随机推荐

  • Neural ODE 神经常微分方程

    Neural ODE ODE常微分方程 欧拉法求解 欧拉法求解过程是一个递归的过程 这个思想和牛顿法 梯度下降法是相似的 并且它将函数离散化 分割成一个个小段来求解 欧拉法求解的常微分方程的形式通常为 图片来自知乎Neural ODE 这个
  • 如何在R语言中找到统计值最小所在的分组

    如何在R语言中找到统计值最小所在的分组 介绍 在数据分析和统计中 我们经常需要找到某个统计值在不同分组中的最小值所在的组别 在R语言中 我们可以使用一些函数和技巧来实现这个目标 本文将介绍如何使用R语言找到统计值最小所在的分组 并提供相应的
  • 算法讲解:二分图匹配【图论】

    二分图匹配 自然要先从定义入手 那么二分图是什么呢 二分图 二分图又称作二部图 是图论中的一种特殊模型 设G V E 是一个无向图 如果顶点V可分割为两个互不相交的子集 A B 并且图中的每条边 i j 所关联的两个顶点i和j分别属于这两个
  • 前端工程师必须收藏的 JavaScript 资源大全

    我想很多程序员应该记得 GitHub 上有一个 Awesome XXX 系列的资源整理 awesome javascript 是 sorrycc 发起维护的 JS 资源列表 内容包括 包管理器 加载器 测试框架 运行器 QA MVC框架和库
  • Go语言的JSON 库

    1 Go语言的JSON 库 Go语言自带的JSON转换库为 encoding json 1 1 其中把对象转换为JSON的方法 函数 为 json Marshal 其函数原型如下 func Marshal v interface byte
  • innodb的锁

    一致性锁定读和一致性非锁定读 Read Committed和Repetable Read级别下采用MVCC 实现非锁定读 但在一些情况下 要使用加锁来保障数据的逻辑一致性 自增列 锁的算法 唯一值 MySQL 中关于gap lock nex
  • qt delegate 委托 多级联动 小结

    最近使用qt写程序用到了treewidget和tablewidget 涉及到编辑默认情况下可以设置treewidget和tablewidget的item可编辑属性来进行编辑 默认情况只是简单的文本输入格式 在qt的demo中看到了spin
  • ES6详解(持续更)

    前言 之前对ES6也有过学习使用 但是都没有深入系统去看看文档书籍 这里开始对一些ES6语法进行整理总结 本文基于阮一峰ES6入门 线上地址 阮一峰ES6入门 let和const命令 1 let命令 如果使用let 声明的变量仅在块级作用域
  • android之adb connect手机设备

    adb手机连接是Android开发过程中常用的 也可以通过无线wifi来连接手机 但是百度搜索了一大堆资料都不全面 而且认知还不全面 导致浪费生命 有时候浪费个人的时间反而更加惹人恶心 window10电脑adb环境搭建 错误提示 adb
  • 人工智能入门学习笔记(一)

    家人们 好久不见哈 最近在尝试着学习人工智能的相关知识和具体技能呀 说实话 当像我这样的 小白初探人工智能体系时 总是被很多未知的名词以及茫茫内容所淹没 便去想通过网络学习帮助自己建立正确的人工智能基本概念认知 在此 我便进一步对人工智能体
  • Token的验证流程以及用法

    一 身份验证流程 1 用户向服务器发送用户名和密码 2 服务端收到请求 去验证用户名与密码 3 验证成功后 服务端会签发一个 Token 将这个 Token 发送给客户端 4 客户端收到 Token 以后可以把它存储起来 放在 Cookie
  • java多线程-Thead线程学习记录笔记

    介绍的内容 主要介绍多线程的基本概念到后面的基本使用 以及一些稍微的原理猜测 个人笔记 不喜勿喷 目录 目录 一 线程使用 1 1 概念 1 2 线程生命周期 1 3 java中实现的方式 1 3 1 继承线程 Thread 1 3 2 实
  • 干货|采用Istio实现灰度发布(金丝雀发布)

    点击上方 中兴开发者社区 关注我们 每天读一篇一线开发者原创好文 灰度发布 又名金丝雀发布 介绍 当应用上线以后 运维面临的一大挑战是如何能够在不影响已上线业务的情况下进行升级 做过产品的同学都清楚 不管在发布前做过多么完备的自动化和人工测
  • unity之shader学习笔记(四)--高光反射

    但是我们会发现物体的背光面是个全黑的颜色 现实生活中物体的背光面并不是全黑的 而是可以看到物体的大概形状 并不是全黑的 之前使用的计算方式是兰伯特光照模型 要实现此种现象 那么就需要使用半兰伯特光照模型来实现 半兰伯特光照模型 Diffus
  • unity鼠标键盘交互

    鼠标交互之鼠标拖动物体 将代码放置在被拖动的物体上 public Camera mainCamera 相机悬挂 private void OnMouseDrag 拖动物体的碰撞体 Ray r mainCamera ScreenPointTo
  • 我在唯品会工作了四年_苦等两年,唯品会消金牌照终于批了,金融业务却“掉队”了...

    图片来源 视觉中国 记者 邹璐徽 界面新闻发现 唯品金融APP即将停用 早前的 唯品宝 唯多利 等金融理财产品也已消失 9月30日 银保监官网发布关于筹建四川省唯品富邦消费金融有限公司的批复 同意在四川省成都市筹建四川省唯品富邦消费金融有限
  • 同时修改多条数据

    想必大家对于可以同时编辑多条数据的事件并不陌生吧 下面我来给大家分享一下可以同时修改多条数据的方法 首先我们看一下我们要处理的是 一个菜品的厨打方案 我们的目的是将批处理方案 也就是同时修改多条数据 也就是把图片中的厨打厨打到区域厨打方案都
  • Hive 核心原理(hive-3.1.2)(转载)

    一 Hive 概述 1 1 Hive 是什么 由Facebook开源用于解决海量结构化日志的数据统计 基于Hadoop的一个数据仓库工具 可以将结构化的数据文件映射成一张表 并且提供类SQL的查询功能 Hive仅仅是一个工具 本身不存储数据
  • Linux系统重新生成boot,在fedora 28中重新生成/boot/grub2/grub.cfg,解决grub问题

    在电脑里安装了windows 7和fedora 28做双系统 现在需要删除掉其中的windows 7系统 在格式化硬盘后 还需要更新grub2的启动选项 删除grub启动界面原来的windows 7选项 以下为方法 grub硬盘启动选项是由
  • Modbus TCP读取寄存器数据

    modbus4j读取寄存器数据 ModbusReadUtil读取工具类 package cn sync modbus import org apache log4j Logger import com serotonin modbus4j