iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >【2023】java通过modbus4j实现modus TCP通讯
  • 786
分享到

【2023】java通过modbus4j实现modus TCP通讯

javatcp/ip开发语言 2023-09-06 07:09:01 786人浏览 八月长安
摘要

Modbus通信协议: 主要分为三个子协议 RTUASCIItcp Modbus RTU:——传输的是字节数组(bit[]) 通信:读写 输出:可以读写 输入:只能读 存储区:输出线圈、输入线

Modbus通信协议:

  • 主要分为三个子协议

Modbus RTU:——传输的是字节数组(bit[])
通信:读写
输出:可以读写
输入:只能读

  • 存储区:输出线圈、输入线圈、输出寄存器、输入寄存器

    • 线圈:代表一个布尔量、最小单位是一个布尔(1或者0),
    • 寄存器:一个寄存器代表16个最小单位,主要用于存储数据
    • 存储区代号:
      • 输出线圈: 0(代号)
        • 00001-09999(标准存储区地址范围)
        • 000001-065536(扩展存储区地址范围)
      • 输入线圈:1
        • 10001-19999
      • 输出寄存器:4
        • 40001-49999
      • 输入寄存器:3
        • 30001-39999
  • 存储区范围:5位和6位

    • 5位:标准地址-Y XXXX
    • 6位:扩展地址-Y XXXXX

功能代码
在这里插入图片描述

验证4个常用功能码,仿真软件上面有F=01,F=02,F=03和F=04来显示

0x01:读线圈
0x02:读离散量输入
0x03:读保持寄存器
0x04:读输入寄存器

测试使用Modbus Slave(下载) 模拟
在这里插入图片描述

saveid:看资料"从站在modbus总线上可以有多个",仿真软件就能模拟一个从站,就是ID=1,当然可以修改成ID=2
功能码:4个功能码,对应写4个方法,,仿真软件上的F=1,或者F=2,3,4
addr:一开始看代码4个方法addr都是从0开始,是否重复?答案是:4个功能码表示4个区域或者设备,addr表示各自区域的地址编号。

  • Connection设置:设置连接参数

在这里插入图片描述

  • 地址设置: F8 ,可以通过Setup或者右击点位的
  • 在这里插入图片描述

在这里插入图片描述

  • 设置不同存储区
    在这里插入图片描述
  • 读取从站在这里插入图片描述

代码实现

1、依赖下载

阿里云不能直接下载
    <repositories>    <repository>        <releases>            <enabled>falseenabled>        releases>        <snapshots>            <enabled>trueenabled>        snapshots>        <id>ias-snapshotsid>        <name>Infinite Automation Snapshot Repositoryname>        <url>https://Maven.manGoautomation.net/repository/ias-snapshot/url>    repository>    <repository>        <releases>            <enabled>trueenabled>        releases>        <snapshots>            <enabled>falseenabled>        snapshots>        <id>ias-releasesid>        <name>Infinite Automation Release Repositoryname>        <url>Https://maven.mangoautomation.net/repository/ias-release/url>    repository>repositories>    <dependencies> <dependency>    <groupId>junitgroupId>    <artifactId>junitartifactId>    <version>4.13-beta-3version>    <scope>testscope>dependency><dependency>    <groupId>com.infiniteautomationgroupId>    <artifactId>modbus4jartifactId>    <version>3.0.3version>dependency><dependency>    <groupId>org.apache.commonsgroupId>    <artifactId>commons-lang3artifactId>    <version>3.9version>dependency>    dependencies>

2、测试读取

  • 读取04(寄存器)
public class TestModbus {    public static void main(String[] args) throws UnknownHostException {            // 设置主机TCP参数            TcpParameters tcpParameters = new TcpParameters();            // 设置TCP的ip地址            InetAddress address = InetAddress.getByName("127.0.0.1");            // TCP参数设置ip地址            tcpParameters.setHost(address);            // TCP设置长连接            tcpParameters.seTKEepAlive(true);            // TCP设置端口,这里设置是默认端口502            tcpParameters.setPort(Modbus.TCP_PORT);            // 创建一个主机            ModbusMaster master = ModbusMasterFactory.createModbusMasterTCP(tcpParameters);            Modbus.setAutoIncrementTransactionId(true);            int slaveId = 1;//从机地址            int offset = 0;//寄存器读取开始地址            int quantity = 10;//读取的寄存器数量            try {            if (!master.isConnected()){                master.connect(); //开启连接            }                // 读取对应从机的数据,readInputReGISters读取的写寄存器,功能码04            int[] registerValues4 = master.readInputRegisters(slaveId,offset,quantity);            for (int value : registerValues4){                System.out.println("Address:"+offset++ +",Value:"+value);            }            }catch (Exception e){                e.printStackTrace();            }finally {                try {                    master.disconnect();                } catch (ModbusIOException e) {                    e.printStackTrace();                }            }    }}

3、读取工具

public class Modbus4jReadUtils {    static ModbusFactory modbusFactory;    static {        if (modbusFactory == null){            modbusFactory = new ModbusFactory();        }    }        public static ModbusMaster getMaster() throws ModbusInitException{        IpParameters params = new IpParameters();        params.setHost("localhost");        params.setPort(502);        // modbusFactory.createRtuMaster(wapper); //RTU 协议        // modbusFactory.createUdpMaster(params);//UDP 协议        // modbusFactory.createAsciiMaster(wrapper);//ASCII 协议//        ModbusMaster master = modbusFactory.crea        ModbusMaster master = modbusFactory.createTcpMaster(params,false);        master.init();        return master;    }        public static Boolean readCoilStatus(int slaveId,int offset) throws ModbusInitException, ErrorResponseException, ModbusTransportException {        BaseLocator<Boolean> loc = BaseLocator.coilStatus(slaveId,offset);        Boolean value = getMaster().getValue(loc);        return value;    }        public static Boolean readInputStatus(int slaveId, int offset)            throws ModbusTransportException, ErrorResponseException, ModbusInitException {        // 02 Input Status        BaseLocator<Boolean> loc = BaseLocator.inputStatus(slaveId, offset);        Boolean value = getMaster().getValue(loc);        return value;    }        public static Number readHoldingRegister(int slaveId, int offset, int dataType)            throws ModbusTransportException, ErrorResponseException, ModbusInitException {        // 03 Holding Register类型数据读取        BaseLocator<Number> loc = BaseLocator.holdingRegister(slaveId, offset, dataType);        Number value = getMaster().getValue(loc);        return value;    }        public static Number readInputRegisters(int slaveId, int offset, int dataType)            throws ModbusTransportException, ErrorResponseException, ModbusInitException {        // 04 Input Registers类型数据读取        BaseLocator<Number> loc = BaseLocator.inputRegister(slaveId, offset, dataType);        Number value = getMaster().getValue(loc);        return value;    }//    批量读取public static void batchRead(Integer count) throws ModbusInitException, ErrorResponseException, ModbusTransportException {    BatchRead<Integer> batch = new BatchRead<Integer>();    for (int i = 0; i <= count; i++) {        batch.addLocator(i,BaseLocator.holdingRegister(1,i, DataType.TWO_BYTE_INT_SIGNED));    }    ModbusMaster master =getMaster();    batch.setContiguousRequests(false);    BatchResults<Integer> results = master.send(batch);    for (int i = 0; i <= count; i++) {        System.err.println(results.getValue(i));    }}    public static void main(String[] args) {        try {            // 01测试            Boolean v011 = readCoilStatus(1,1);            Boolean v012 = readCoilStatus(1,2);            Boolean v013 = readCoilStatus(1,3);            System.out.println("v011:" + v011);            System.out.println("v012:" + v012);            System.out.println("v013:" + v013);            // 02测试            Boolean v021 = readInputStatus(1, 1);            Boolean v022 = readInputStatus(1, 2);            Boolean v023 = readInputStatus(1, 3);            System.out.println("v021:" + v021);            System.out.println("v022:" + v022);            System.out.println("v023:" + v023);            // 03测试            Number v031 = readHoldingRegister(1, 1, DataType.TWO_BYTE_INT_SIGNED);//signed            Number v032 = readHoldingRegister(1, 2, DataType.TWO_BYTE_INT_SIGNED);// 同上            System.out.println("v031:" + v031);            System.out.println("v032:" + v032);            // 04测试            Number v041 = readInputRegisters(1, 1, DataType.TWO_BYTE_INT_SIGNED);//            Number v042 = readInputRegisters(1, 2, DataType.TWO_BYTE_INT_SIGNED);//            System.out.println("v041:" + v041);            System.out.println("v042:" + v042);//            批量读取            batchRead(9);        } catch (Exception e) {            e.printStackTrace();        }    }}

读取结果:
在这里插入图片描述

4、写入工具类

public class Modbus4jWriteUtils {    static Log log = LogFactory.getLog(Modbus4jWriteUtils.class);        static ModbusFactory modbusFactory;    static {        if (modbusFactory == null) {            modbusFactory = new ModbusFactory();        }    }        public static ModbusMaster getMaster() throws ModbusInitException {        IpParameters params = new IpParameters();        params.setHost("localhost");        params.setPort(502);        ModbusMaster tcpMaster = modbusFactory.createTcpMaster(params, false);        tcpMaster.init();        return tcpMaster;    }        public static boolean writeCoil(int slaveId, int writeOffset, boolean writeValue)            throws ModbusTransportException, ModbusInitException {        // 获取master        ModbusMaster tcpMaster = getMaster();        // 创建请求        WriteCoilRequest request = new WriteCoilRequest(slaveId, writeOffset, writeValue);        // 发送请求并获取响应对象        WriteCoilResponse response = (WriteCoilResponse) tcpMaster.send(request);        if (response.isException()) {            return false;        } else {            return true;        }    }        public static boolean writeCoils(int slaveId, int startOffset, boolean[] bdata)            throws ModbusTransportException, ModbusInitException {        // 获取master        ModbusMaster tcpMaster = getMaster();        // 创建请求        WriteCoilsRequest request = new WriteCoilsRequest(slaveId, startOffset, bdata);        // 发送请求并获取响应对象        WriteCoilsResponse response = (WriteCoilsResponse) tcpMaster.send(request);        if (response.isException()) {            return false;        } else {            return true;        }    }        public static boolean writeRegister(int slaveId, int writeOffset, short writeValue)            throws ModbusTransportException, ModbusInitException {        // 获取master        ModbusMaster tcpMaster = getMaster();        // 创建请求对象        WriteRegisterRequest request = new WriteRegisterRequest(slaveId, writeOffset, writeValue);        WriteRegisterResponse response = (WriteRegisterResponse) tcpMaster.send(request);        if (response.isException()) {            log.error(response.getExceptionMessage());            return false;        } else {            return true;        }    }        public static boolean writeRegisters(int slaveId, int startOffset, short[] sdata)            throws ModbusTransportException, ModbusInitException {        // 获取master        ModbusMaster tcpMaster = getMaster();        // 创建请求对象        WriteRegistersRequest request = new WriteRegistersRequest(slaveId, startOffset, sdata);        // 发送请求并获取响应对象        ModbusResponse response = tcpMaster.send(request);        if (response.isException()) {            log.error(response.getExceptionMessage());            return false;        } else {            return true;        }    }        public static void writeHoldingRegister(int slaveId, int offset, Number value, int dataType)            throws ModbusTransportException, ErrorResponseException, ModbusInitException {        // 获取master        ModbusMaster tcpMaster = getMaster();        // 类型        BaseLocator<Number> locator = BaseLocator.holdingRegister(slaveId, offset, dataType);        tcpMaster.setValue(locator, value);    }    public static void main(String[] args) {        try {//             测试01  单个写入(0x)boolean t01 = writeCoil(1, 0, true);System.out.println("T01:" + t01);//             测试02  批量写入(0x)boolean t02 = writeCoils(1, 0, new boolean[] { true, false, true });System.out.println("T02:" + t02);//             测试03  单个写入(4x)short v = -3;boolean t03 = writeRegister(1, 0, v);System.out.println("T03:" + t03);//             测试04  批量写入(4x)boolean t04 = writeRegisters(1, 0, new short[] { -309, 390, 91 });System.out.println("t04:" + t04);            //写模拟量            writeHoldingRegister(1,8, 100, DataType.TWO_BYTE_INT_SIGNED);                    } catch (Exception e) {            e.printStackTrace();        }    }}

来源地址:https://blog.csdn.net/weixin_52315708/article/details/131681754

--结束END--

本文标题: 【2023】java通过modbus4j实现modus TCP通讯

本文链接: https://www.lsjlt.com/news/396615.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【2023】java通过modbus4j实现modus TCP通讯
    Modbus通信协议: 主要分为三个子协议 RTUASCIITCP Modbus RTU:——传输的是字节数组(bit[]) 通信:读写 输出:可以读写 输入:只能读 存储区:输出线圈、输入线...
    99+
    2023-09-06
    java tcp/ip 开发语言
  • Java中TCP通信的实现
    0、TCP通信 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议, 如果使用了 WireShark 工具,可以看到一次TCP连接建立时的整个过程。 1...
    99+
    2023-09-02
    java tcp/ip 开发语言
  • C#基于Sockets类实现TCP通讯
    本文实例为大家分享了C#基于Sockets类实现TCP通讯的具体代码,供大家参考,具体内容如下 最终效果 TCPClient using System; using Syste...
    99+
    2024-04-02
  • Go语言实现UDP协议及TCP通讯
    ⼀、使用Golang创建⼀一个TCP连接 1.服务端处理理流程 a.监听端口b.接受客户端的链接c.创建Goroutine,处理这个链接(⼀个服务端要链接多个客户端,所以使用Goro...
    99+
    2024-04-02
  • C#基于Sockets类如何实现TCP通讯
    这篇文章主要介绍了C#基于Sockets类如何实现TCP通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下最终效果TCPClientusing Syst...
    99+
    2023-06-29
  • Java项目中怎么实现TCP通信
    Java项目中怎么实现TCP通信?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Socket简介:Socket称为“套接字”,描述IP地址和端口。在Internet上的主机一...
    99+
    2023-05-31
    java ava tcp通信
  • C#与java TCP通道加密通信实例
    目录1、背景说明2、测试证书3、复制粘贴加密算法4、证书格式转换5、PS1 RSA证书格式6、参考博文1、背景说明 公司收费系统需要与银行做实时代收对接,业务协议使用我们收费系统的...
    99+
    2024-04-02
  • 通过数据结构实现简易通讯录
    AddressBookTest是测试类package MyADB;import java.util.InputMismatchException;import java.util.Scanner;class InstructionsMist...
    99+
    2023-06-02
  • php实现通过JSON RPC与go通讯(附代码)
    本篇文章给大家带来了关于php与golang的相关知识,其中主要介绍了php是怎么通过JSON RPC和go进行通讯的,下面一起来看一下,希望对需要的朋友有所帮助。php 通过 JSON RPC 与 golang 通讯此方法为解决php处理...
    99+
    2023-05-14
    php Golang
  • 怎么在JAVA项目中实现一个TCP网络通讯功能
    怎么在JAVA项目中实现一个TCP网络通讯功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体如下:TCP(Transmission Control Prot...
    99+
    2023-05-31
    java tcp ava
  • Netty框架实现TCP/IP通信的完美过程
          项目中需要使用到TCP/IP协议完成数据的发送与接收。如果只是用以前写的简单的socket套接字方法,每次接收...
    99+
    2024-04-02
  • Netty框架实现TCP/IP通信的详细过程
    这篇文章主要介绍“Netty框架实现TCP/IP通信的详细过程”,在日常操作中,相信很多人在Netty框架实现TCP/IP通信的详细过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Netty框架实现TCP/...
    99+
    2023-06-20
  • linux中shell脚本如何实现tcp/upd协议通讯
    小编给大家分享一下linux中shell脚本如何实现tcp/upd协议通讯,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!linux 设备里面有个比较特殊的文件: ...
    99+
    2023-06-13
  • 基于Qt的TCP实现通信
    本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下 一、tcp介绍 TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:服务...
    99+
    2024-04-02
  • 如何进行TCP通信实现
    本篇文章给大家分享的是有关如何进行TCP通信实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。TCP是底层通讯协议,定义的是数据传输和连接方式的规范。TCP协议,传输控制协议(...
    99+
    2023-06-05
  • QT5实现简单的TCP通信的实现
    目录一、客户端二、服务器三、运行结果这段时间用到了QT的TCP通信,做了初步的学习与尝试,编写了一个客户端和服务器基于窗口通信的小例程。 使用QT的网络套接字需要.pro文件中加入一...
    99+
    2024-04-02
  • C#如何实现TCP和UDP通信
    本篇内容主要讲解“C#如何实现TCP和UDP通信”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#如何实现TCP和UDP通信”吧!C#在命名空间System.Net.Sockets中对伯克利套接...
    99+
    2023-07-05
  • 【2023】JAVA和PLC实现通讯读取写入数据,以三菱PLC举例
    1、创建maven工程引入依赖 com.github.dathlin HslCommunication ...
    99+
    2023-09-01
    java 驱动开发 硬件架构 计算机网络
  • 如何使用linux shell 脚本实现tcp/upd协议通讯
    本篇内容主要讲解“如何使用linux shell 脚本实现tcp/upd协议通讯”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用linux shell 脚本实现tcp/upd协议通讯”吧!...
    99+
    2023-06-09
  • Linux怎么实现TCP双向通信
    这篇文章主要讲解了“Linux怎么实现TCP双向通信”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux怎么实现TCP双向通信”吧!双向通信一般指双向交替通信。双向交替通信又称为半双工通...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作