modbus4j应用

news2025/1/7 11:16:00

1、简介

  • Modbus4j 支持 Modbus 的多种传输模式,包括 TCP、RTU、ASCII 等,能够适应不同的网络环境和设备需求。例如,在工业自动化场景中,可能会遇到通过串口(使用 RTU 模式)或以太网(使用 TCP 模式)连接的设备,Modbus4j 可以灵活处理这些不同的通信方式。

2、通信过程中的重要概念

  • 主站(Master)和从站(Slave)
    • 主站:发起 Modbus 请求的设备,例如监控计算机或控制器,负责发送命令(如读取或写入数据)。
    • 从站:响应主站请求的设备,例如传感器、PLC 等,它们根据主站的请求进行操作,如提供数据或接收写入的数据。
  • 功能码(Function Codes)
    • Modbus 协议定义了多种功能码,用于不同的操作,例如读取线圈状态、读取输入寄存器、写入单个线圈等。Modbus4j 提供了相应的 API 来使用这些功能码,方便开发者调用。

3、pom文件

<dependency>
    <groupId>com.infiniteautomation</groupId>
    <artifactId>modbus4j</artifactId>
    <version>3.0.4</version>
</dependency>

4、创建slave从站

package com.example.demo.modbus;

import com.serotonin.modbus4j.*;
import com.serotonin.modbus4j.exception.IllegalDataAddressException;
import com.serotonin.modbus4j.exception.ModbusInitException;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.locator.BaseLocator;


public class ModbusSlaveExample {
    public static void main(String[] args) {
        // 创建 Modbus 工厂
        ModbusFactory modbusFactory = new ModbusFactory();

        // 设置 IP 参数
        IpParameters ipParameters = new IpParameters();
        ipParameters.setHost("127.0.0.1");
        ipParameters.setPort(502);

        // 创建 Modbus 从站集合
        ModbusSlaveSet slaveSet = modbusFactory.createTcpSlave(false);

        try {
            // 添加从站
            int slaveId = 1;
            ProcessImage processImage = new ProcessImage() {
                @Override
                public int getSlaveId() {
                    return slaveId;
                }

                @Override
                public boolean getCoil(int offset) throws IllegalDataAddressException {
                    return offset % 2 == 0;
                }

                @Override
                public void setCoil(int offset, boolean value) {

                }

                @Override
                public void writeCoil(int offset, boolean value) throws IllegalDataAddressException {

                }

                @Override
                public boolean getInput(int offset) throws IllegalDataAddressException {
                    return offset % 2 == 0;
                }

                @Override
                public void setInput(int offset, boolean value) {

                }

                @Override
                public short getHoldingRegister(int offset) throws IllegalDataAddressException {
                    return (short) (offset % 2);
                }

                @Override
                public void setHoldingRegister(int offset, short value) {

                }

                @Override
                public void writeHoldingRegister(int offset, short value) throws IllegalDataAddressException {

                }

                @Override
                public short getInputRegister(int offset) throws IllegalDataAddressException {

                    return (short) (offset % 2);
                }

                @Override
                public void setInputRegister(int offset, short value) {

                }

                @Override
                public byte getExceptionStatus() {
                    return 0;
                }

                @Override
                public byte[] getReportSlaveIdData() {
                    return new byte[0];
                }
            };
            slaveSet.addProcessImage(processImage);
            // 初始化从站
            slaveSet.start();

        } catch (ModbusInitException e) {
            e.printStackTrace();
        } finally {
            // 关闭从站
            slaveSet.stop();
        }
    }
}

5、创建master主站读取数据

package com.example.demo.modbus;

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;


public class ModbusMasterExample {
    public static void main(String[] args) {
        // 创建 Modbus 工厂
        ModbusFactory modbusFactory = new ModbusFactory();

        // 设置 IP 参数
        IpParameters ipParameters = new IpParameters();
        ipParameters.setHost("127.0.0.1"); // 目标设备的 IP 地址
        ipParameters.setPort(502);       // Modbus TCP 端口号,默认为 502

        // 创建 Modbus TCP 主站
        ModbusMaster master = modbusFactory.createTcpMaster(ipParameters, false);

        try {
            // 初始化主站
            master.init();

            // 读取从站的保持寄存器
            int slaveId = 1;  // 从站地址
            int startOffset = 0; // 起始寄存器地址
            int numberOfRegisters = 10; // 要读取的寄存器数量

            // 创建读取请求
            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, startOffset, numberOfRegisters);

            // 发送请求并获取响应
            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);

            if (response.isException()) {
                System.out.println("Exception response: " + response.getExceptionMessage());
            } else {
                // 获取数据
                short[] registerData = response.getShortData();
                for (int i = 0; i < registerData.length; i++) {
                    System.out.println("Register " + (startOffset + i) + " value: " + registerData[i]);
                }
            }
        } catch (ModbusInitException | ModbusTransportException e) {
            e.printStackTrace();
        } finally {
            // 关闭主站
            master.destroy();
        }
    }
}

5、工具

modscan(主站/客户端)、modsim(从站/服务端)

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

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

相关文章

Linux上安装配置单节点zookeeper

直接先去官网下载安装包&#xff0c; https://downloads.apache.org/zookeeper/ 选择合适的版本&#xff0c;然后上传至服务器 解压&#xff1a; tar -zxvf apache-zookeeper-3.9.3-bin.tar.gz创建data和logs目录 mkdir data mkdir logs配置环境变量&#xff1a; vim /etc/p…

ModuleNotFoundError: No module named XXX

我们在安装了某个包之后&#xff0c;还是提示找不到包 方法一&#xff1a; python -m pip install 包名 -i https://pypi.tuna.tsinghua.edu.cn/simple 方法二&#xff1a; conda install 包名 如果还是找不到包&#xff1a; 请检查环境&#xff1a;

(leetcode算法题)384. 打乱数组 398. 随机数索引

问题转化&#xff1a; 题目要求将nums中的数字出现的次序随机打乱 转化成&#xff1a;对于 0 号位置来说&#xff0c;nums[i], ..., nums[n - 1] 可以等概率的出现 ... && ... && 对于 n - 1号位置来说&#xff0c;nums[i], ..., nums[n - 1] 可以等概率的出…

从零开始开发纯血鸿蒙应用之实现起始页

从零开始开发纯血鸿蒙应用 一、前言二、主要页面三、应用起始页四、MainPageContent 实现1、一级结构2、二级结构2.1、EmptyContent2.2、FileListContent2.2.1、ViewAction&#xff1a;2.2.2、EditAction2.2.3、DeleteAction2.2.4、ShareAction 五、载入起始页的时机五、总结 一…

Linux(Ubuntu24.04)源码编译安装VTK7.1.1记录

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的3D可视化开发工具包&#xff0c;用于开发可视化和图形处理应用程序。VTK提供了一系列的算法和工具&#xff0c;用于创建、渲染和处理复杂的3D图形和数据。VTK由C编写&#xff0c;并提供了Python、Java和Tcl等语言…

三、GIT与Github推送(上传)和克隆(下载)

GIT与Github推送&#xff08;上传&#xff09;和克隆&#xff08;下载&#xff09; 一、配置好SSH二、在Github创建仓库三、git克隆&#xff08;下载&#xff09;文件四、git推送&#xff08;上传&#xff09;文件到远程仓库 一、配置好SSH Git与Github上传和下载时需要使用到…

SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)

一、Sentinel概述 1、Sentinel是什么 随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 一句话概括:sentinel即Hystrix的替代品,官网: https://sentinelguard.io/zh…

24年无人机行业资讯 | 12.23-12.29

24年无人机行业资讯 | 12.23-12.29 1、 国家发改委新设低空经济司&#xff0c;助力低空经济规范发展2、商务部支持无人机民用国际贸易&#xff0c;强调出口管制与安全并重3、滨州高新区首架无人机成功下线4、 2025第九届世界无人机大会筹备推进会顺利召开5、2024年世界无人机竞…

前端实现大文件上传(文件分片、文件hash、并发上传、断点续传、进度监控和错误处理,含nodejs)

大文件分片上传是前端一种常见的技术&#xff0c;用于提高大文件上传的效率和可靠性。主要原理和步骤如下 文件分片 确定分片大小&#xff1a;确定合适的分片大小。通常分片大小在 1MB 到 5MB 之间使用 Blob.slice 方法&#xff1a;将文件分割成多个分片。每个分片可以使用 Bl…

源代码编译安装X11及相关库、vim,配置vim(1)

一、目录结构 如下。 所有X11及相关库装到mybuild&#xff0c;源代码下载到src下&#xff0c;解压&#xff0c;进入&#xff0c;编译安装。编译时指定--prefix到相同的目录&#xff0c;即上图中mybuild。 ./configure --prefixpwd/../../mybuild [CFLAGS"-I/path/to/X11…

bytetrack 解决跟踪后框晃动的问题

使用距离最近的匹配的检测框 替代 bytetrack返回的跟踪框 作为最终的返回结果 完整byte_tracker.py代码为&#xff1a; import numpy as np from collections import deque import os import os.path as osp import copy import torch import torch.nn.functional as Ffrom …

如何使用OBS Studio录制屏幕?

可以进入官网或github进行下载&#xff1a; https://obsproject.com/download 安装包解压后进入bin 进入64-bit 选择obs 64 进入OBS Studio后在来源内右键&#xff0c;选择添加 选择添加显示器采集即可录取整个屏幕&#xff0c;窗口采集可选择窗口进行录制 选择对应显示器即配置…

ArcGIS Server 10.2授权文件过期处理

新的一年&#xff0c;arcgis server授权过期了&#xff0c;服务发不不了。查看ecp授权文件&#xff0c;原来的授权日期就到2024.12.31日。好吧&#xff0c;这里直接给出处理方法。 ArcGIS 10.2安装时&#xff0c;有的破解文件中会有含一个这样的注册程序&#xff0c;没有的话&…

循环冗余校验CRC的介绍

一、简介 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域中最常用的一种差错校验码。该校验方法中&#xff0c;使用多项式出发&#xff08;模2除法&#xff09;运算后的余数为校验字段。CRC只能实现检错&#xff0c;不能实现纠错&#xff0c;使…

消息中间件类型都有哪些

在消息中间件的专业术语中&#xff0c;我们可以根据其特性和使用场景将其划分为几种主要的类型。这些类型不仅反映了它们各自的技术特点&#xff0c;还决定了它们在不同应用场景下的适用性。 1. 点对点&#xff08;Point-to-Point&#xff09;消息中间件&#xff1a; • 这类中…

微信小程序中 “页面” 和 “非页面” 的区别

微信小程序中 “页面” 和 “非页面” 的区别&#xff0c;并用表格进行对比。 核心概念&#xff1a; 页面 (Page)&#xff1a; 页面是微信小程序中用户可以直接交互的视图层&#xff0c;也是小程序的基本组成部分。每个页面都有自己的 WXML 结构、WXSS 样式和 JavaScript 逻辑…

卸载wps后word图标没有变成白纸恢复

这几天下载了个wps教育版&#xff0c;后头用完了删了 用习惯的2019图标 给兄弟我干没了&#xff1f;&#xff1f;&#xff1f; 其他老哥说什么卸载关联重新下 &#xff0c;而且还要什么撤销保存原来的备份什么&#xff0c;兄弟也是不得不怂了 后头就发现了这个半宝藏博主&…

SQL Server导出和导入可选的数据库表和数据,以sql脚本形式

一、导出 1. 打开SQL Server Management Studio&#xff0c;在需要导出表的数据库上单击右键 → 任务 → 生成脚本 2. 在生成脚本的窗口中单击进入下一步 3. 如果只需要导出部分表&#xff0c;则选择第二项**“选择具体的数据库对象(Select specific database objects)”**&am…

基于SpringBoot在线竞拍平台系统功能实现十五

一、前言介绍&#xff1a; 1.1 项目摘要 随着网络技术的飞速发展和电子商务的普及&#xff0c;竞拍系统作为一种新型的在线交易方式&#xff0c;已经逐渐深入到人们的日常生活中。传统的拍卖活动需要耗费大量的人力、物力和时间&#xff0c;从组织拍卖、宣传、报名、竞拍到成…

Android Camera压力测试工具

背景描述&#xff1a; 随着系统的复杂化和业务的积累&#xff0c;日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化&#xff0c;需要对Android Camera应用进行全面的压测。 对于压…