Java中实现modbustcp的接收

这篇具有很好参考价值的文章主要介绍了Java中实现modbustcp的接收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

此处讲一讲modbustcp在Java中的实现。

modbustcp的格式内容

Modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的Modbus协议:ModbusTCP

modbustcp 主要是用于工业上的通讯,像是作者现在和PLC进行连接就是使用modbustcp协议。

modbustcp协议格式内容分为两个部分,其一是MBAP,其二是PDU

MBAP是表示modbustcp协议中的报文头部分,长度为7个字节

事务处理标识 协议表示 长度 单元标识符
2个字节 2个字节 2个字节 1个字节
名称 解释
事务处理标识 是本次通讯中在发送通讯的第几次,一般按照每发送一次后+1
协议表示 默认00 00 是表示此次通讯是modbustcp协议
长度 表示此次PDU中携带数据长度
单元标识符 表示此次协议发送的端口中设备所处的地址

PDU是表示modbustcp协议中的数据内容,主要由功能码和数据组成

其中功能吗所占用的字节为1,表示此次的所要实现的操作,数据长度根据MBAP中的长度数值来判断。

功能码中主要是对四类操作对象进行操作(此处可以理解为Java中的对象)

对象 含义
线圈 PLC的输出位,开关量,在Modbus中可读可写
离散量 PLC的输入位,开关量,在Modbus中只读
输入寄存器 PLC中只能从模拟量输入端改变的寄存器,在Modbus中只读
保持寄存器 PLC中用于输出模拟量信号的寄存器,在Modbus中可读可写

功能码就是展示此次通讯的操作,具体功能码的识别在下方展示

代码 中文名称 英文名 位操作/字操作 操作数量
01 读线圈状态 READ COIL STATUS 位操作 单个或多个
02 读离散输入状态 READ INPUT STATUS 位操作 单个或多个
03 读保持寄存器 READ HOLDING REGISTER 字操作 单个或多个
04 读输入寄存器 READ INPUT REGISTER 字操作 单个或多个
05 写线圈状态 WRITE SINGLE COIL 位操作 单个
06 写单个保持寄存器 WRITE SINGLE REGISTER 字操作 单个
15 写多个线圈 WRITE MULTIPLE COIL 位操作 多个
16 写多个保持寄存器 WRITE MULTIPLE REGISTER 字操作 多个

Java中的实现

此次实现采用的modbus4j的jar包进行调用的,以下是modbustcp的pom引入

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

由于本人引入的时候,出现无法引入的情况,可以推荐大家直接去github上下载modbus4j

GitHub - MangoAutomation/modbus4j: A high-performance and ease-of-use implementation of the Modbus protocol written in Java. Supports ASCII, RTU, TCP, and UDP transports as slave or master, automatic request partitioning and response data type parsing.https://github.com/MangoAutomation/modbus4j下面是在java中创建modbustcp从机

public class SlaverTest {
    public static void main(String[] args) {
        //创建modbus工厂类
        ModbusFactory modbusFactory = new ModbusFactory();
        //创建TCP服务端
        // final ModbusSlaveSet salve = modbusFactory.createTcpSlave(false);
        final ModbusSlaveSet salve = new TcpSlave(502, false);
        Register register =new Register();
        //向502端口添加从机并且赋予不同的地址
        salve.addProcessImage(register.getModscanProcessImage(5));
        salve.addProcessImage(register.getModscanProcessImage(4));
        salve.addProcessImage(register.getModscanProcessImage(3));
        salve.addProcessImage(register.getModscanProcessImage(2));
        salve.addProcessImage(register.getModscanProcessImage(1));

        try {
            salve.start();
            System.out.println("salve.start();");

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 初始化从机中的四个对象,一般来讲在通讯中可读写开关量是10000到19999,只读开关量是20000到29999,只读寄存器是30000到39999,保持寄存器是40000到49999,工业上的定义是这样子的,但是在modbustcp中的实现已经提前确定了每个对象的位置,所以创建的时候是从0开始创建的,否则就会出现非法地址值的错误,这是本人亲自体会过的。

public class Register {
    public  BasicProcessImage getModscanProcessImage(int slaveId){
        /**
         * 初始化从机
         */
        BasicProcessImage processImage =new BasicProcessImage(slaveId);
        //processImage.setInvalidAddressValue(Short.MIN_VALUE);

        for (int i=0;i<47999;i++){
            //创建可读写开关量
            //processImage.setCoil(i,true);
            //创建只读开关量
            //processImage.setInput(i,true);
            //创建保持寄存器
            processImage.setHoldingRegister(i,(short) 0);
            //创建只读寄存器
            //processImage.setInputRegister(i,(short) 1);

        }
        processImage.addListener(new BasicProcessImageListener());

        return processImage;
    }
}

关于地址值变化的监听器,由于modbustcp中只有可读写开关量和保持寄存器中存在了关于写的变化,所以modbus4j自己只有两个监听器监听写的变化。

public class BasicProcessImageListener implements ProcessImageListener {
    @Override
    public void coilWrite(int address, boolean oldvalue, boolean newValue) {
        System.out.println("Coil at "+address+" chang:"+oldvalue+" to"+newValue);
    }

    @Override
    public void holdingRegisterWrite(int address, short oldvalue, short newValue) {
        System.out.println("HoldingRegister at "+address+" chang:"+oldvalue+" to"+newValue);
    }
}

modbustcp主机的实现文章来源地址https://www.toymoban.com/news/detail-621879.html

public class MasterTest {
    public static void main(String[] args) throws Exception {
       
        IpParameters parameters=new IpParameters();
        parameters.setHost("127.0.0.1");
        parameters.setPort(502);
        parameters.setEncapsulated(false);

        ModbusFactory modbusFactory =new ModbusFactory();
        ModbusMaster master =modbusFactory.createTcpMaster(parameters,true);
        //master.setTimeout(5000);
        try {
            master.init();
            int slaveId =5;

            //    writeRegistersTest(master, slaveId, 400, new short[]{0, 1, 0, 100, 10000, (short) 65535});
            //    writeCoilsTest(master,slaveId,200,new boolean[]{true,true,false,false});
            //writeCoilTest(master,slaveId,250,true);
            //Random random=new Random();
            //writeRegistersTest(master,1,42000,new short[] {(short) 1,(short) 0,(short) 1000,(short) 1,(short) 1,(short) 1});
            //writeRegistersTest(master,slaveId,42000,new short[] {(short) 1,(short) 0});


            //writeMaskRegisterTest(master,slaveId,1,0xf2,0xa5);
            //readCoilTest(master,slaveId,41000,20);
            //readDiscreteInputTest(master,slaveId,40200,7);
            //readExceptionStatusTest(master,slaveId);
            readHoldingRegistersTest(master, 1, 1000, 2);
            //readInputRegistersTest(master,slaveId,40300,10);
            //readCoilStatus(master,slaveId,40000,1);
        }finally {
            master.destroy();
        }

    }
    public static void readCoilStatus(ModbusMaster master,int slaveId, int offset, int numberOfBits)
            throws ModbusTransportException {

        ReadCoilsRequest request = new ReadCoilsRequest(slaveId, offset, numberOfBits);
        ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);
        boolean[] booleans = response.getBooleanData();
        boolean[] valueRegroup = valueRegroup(numberOfBits, booleans);
        System.out.println(Arrays.toString(valueRegroup));
    }
    public static void readCoilTest(ModbusMaster master, int slaveId, int start, int len) {
        try {
            ReadCoilsRequest request = new ReadCoilsRequest(slaveId, start, len);
            ReadCoilsResponse response = (ReadCoilsResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(Arrays.toString(response.getBooleanData()));
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void readDiscreteInputTest(ModbusMaster master, int slaveId, int start, int len) {
        try {
            ReadDiscreteInputsRequest request = new ReadDiscreteInputsRequest(slaveId, start, len);
            ReadDiscreteInputsResponse response = (ReadDiscreteInputsResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(Arrays.toString(response.getBooleanData()));
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void readHoldingRegistersTest(ModbusMaster master, int slaveId, int start, int len) {
        try {
            ReadHoldingRegistersRequest request = new ReadHoldingRegistersRequest(slaveId, start, len);
            ReadHoldingRegistersResponse response = (ReadHoldingRegistersResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(Arrays.toString(response.getShortData()));
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void readInputRegistersTest(ModbusMaster master, int slaveId, int start, int len) {
        try {
            ReadInputRegistersRequest request = new ReadInputRegistersRequest(slaveId, start, len);
            ReadInputRegistersResponse response = (ReadInputRegistersResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(Arrays.toString(response.getShortData()));
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void writeCoilTest(ModbusMaster master, int slaveId, int offset, boolean value) {
        try {
            WriteCoilRequest request = new WriteCoilRequest(slaveId, offset, value);
            WriteCoilResponse response = (WriteCoilResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println("Success");
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void writeRegisterTest(ModbusMaster master, int slaveId, int address, int value) {
        try {
            WriteRegisterRequest request = new WriteRegisterRequest(slaveId, address, value);
            WriteRegisterResponse response = (WriteRegisterResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println("Success");
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void readExceptionStatusTest(ModbusMaster master, int slaveId) {
        try {
            ReadExceptionStatusRequest request = new ReadExceptionStatusRequest(slaveId);
            ReadExceptionStatusResponse response = (ReadExceptionStatusResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(response.getExceptionStatus());
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void reportSlaveIdTest(ModbusMaster master, int slaveId) {
        try {
            ReportSlaveIdRequest request = new ReportSlaveIdRequest(slaveId);
            ReportSlaveIdResponse response = (ReportSlaveIdResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println(Arrays.toString(response.getData()));
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void writeCoilsTest(ModbusMaster master, int slaveId, int start, boolean[] values) {
        try {
            WriteCoilsRequest request = new WriteCoilsRequest(slaveId, start, values);
            WriteCoilsResponse response = (WriteCoilsResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println("Success");
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void writeRegistersTest(ModbusMaster master, int slaveId, int start, short[] values) {
        try {
            WriteRegistersRequest request = new WriteRegistersRequest(slaveId, start, values);
            WriteRegistersResponse response = (WriteRegistersResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println("Success");
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }

    public static void writeMaskRegisterTest(ModbusMaster master, int slaveId, int offset, int and, int or) {
        try {
            WriteMaskRegisterRequest request = new WriteMaskRegisterRequest(slaveId, offset, and, or);
            WriteMaskRegisterResponse response = (WriteMaskRegisterResponse) master.send(request);

            if (response.isException())
                System.out.println("Exception response: message=" + response.getExceptionMessage());
            else
                System.out.println("Success");
        }
        catch (ModbusTransportException e) {
            e.printStackTrace();
        }
    }
    private static boolean[] valueRegroup(int numberOfBits, boolean[] values) {
        boolean[] bs = new boolean[numberOfBits];
        int temp = 1;
        for (boolean b : values) {
            bs[temp - 1] = b;
            temp++;
            if (temp > numberOfBits)
                break;
        }
        return bs;
    }


}

到了这里,关于Java中实现modbustcp的接收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java】--网络编程:基于TCP协议的网络通信

    TCP协议(Transmission Control Protocol),即传输控制协议,是一种 面向连接 的, 可靠 的,基于 字节流 的传输层通信协议。数据大小无限制。 建立连接的过程需要 三次握手 。 断开连接的过程需要 四次挥手 。 使用TCP协议的通信双方分别为 客户端 和 服务器端 。 客户端负责向服务

    2024年01月23日
    浏览(58)
  • Java 网络编程 —— 客户端协议处理框架

    Java 对客户程序的通信过程进行了抽象,提供了通用的协议处理框架,该框架封装了 Socket,主要包括以下类: URL 类:统一资源定位符,表示客户程序要访问的远程资源 URLConnection 类:表示客户程序与远程服务器的连接,客户程序可以从 URLConnection 获得数据输入流和输出流

    2024年02月07日
    浏览(43)
  • Java网络编程 *TCP与UDP协议*

    把分布在 不同地理区域 的具有独立功能的计算机, 通过通信设备与线路 连接起来,由功能完善的软件实现资源共享和信息传递的 系统 简单来说就是把不同地区的计算机通过设备连接起来,实现不同地区之前的数据传输 网络编程 是借助计算机网络,实现我们所写的程序,在不同

    2024年01月16日
    浏览(58)
  • 【Java】网络通信基础、协议分层及封装分用

    网络互连的目的是进行网络通信,也就是网络数据传输,更具体一点,是网络主机中的不同进程间基于网络来传输数据。 ip地址表示了主机在网络上的地址,类似于收发快递时的收件人地址和发件人地址。 端口号表示了主机中某一个进程,使用网络的进程在启动时系统会分配

    2024年02月11日
    浏览(36)
  • 【Java网络编程】HTTP超文本传输协议

        HTTP 全称为 Hyper Text Transfer Protocol 超文本传输协议,它是基于 TCP 传输协议构建的应用层协议,作为支撑万维网 www 的核心协议,为了保证其效率及处理大量事务的能力,因此在设计时, HTTP 被制定成为一种无状态协议,也就是说: HTTP 本身不会对发送过的请求和相应的通

    2024年04月09日
    浏览(58)
  • Java中网络的基本介绍。网络通信,网络,ip地址,域名,端口,网络通信协议,TCP/IP传输过程,网络通信协议模型,TCP协议,UDP协议

    - 网络通信 概念:网络通信是指 通过计算机网络进行信息传输的过程 ,包括数据传输、语音通话、视频会议等。在网络通信中,数据被分成一系列的数据包,并通过网络传输到目的地。在数据传输过程中,需要确保数据的完整性、准确性和安全性。常见的网络通信协议有T

    2024年02月10日
    浏览(69)
  • QT+ModbusTCP 全网唯一好用,基于QTcpSocket纯手搓modbustcp协议

    1.发现问题 最近项目上要把之前的modbus RTU改为TCP形式,因此之前的modbus通讯线程得重构,一开始当然是使用Qt自带的QModbusTcpClient类,很快就重构好线程,读取数据没有问题,但是只要一发送写数据请求,整个tcp连接就会断开,做了很多尝试,排除了从站的问题,即使直接连

    2024年02月03日
    浏览(42)
  • 【Java网络编程】OSI七层网络模型与TCP/IP协议簇

    1.1、OSI七层网络模型 OSI七层网络模型中,每层的功能如下: 应用层:人与计算机网络交互的窗口。 表示层:负责数据格式的封装,如加密、压缩、编解码等。 会话层:建立、终止、管理不同端间的会话连接。 传输层:提供端到端(两台机器)之间的传输机制,以及提供流

    2024年04月11日
    浏览(47)
  • ModbusTCP协议报文解析

    交互(通信)标识 :2个字节 为此次通信事务处理标识符,一般每次通信之后将被要求加1以区别不同的通信数据报文。 协议标识 :2个字节 表示该条指令遵循ModbusTCP协议,一般都为00 00 报文长度 :2个字节 表示后面数据的长度,有几个字节,高字节在前 (前六位Modbus/TCP协议

    2024年02月02日
    浏览(33)
  • Java网络编程之IP,端口号,通信协议(UDP,TCP)

    ① C/S :客户端/服务器 在用户本地需要下载安装客户端程序,在远程有一个服务器端程序。 优点:画面精美,用户体验好 缺点:用户需要下载更新 ② B/S :浏览器/服务器 只需要一个浏览器,用户通过指定网址访问对应的服务器。 优点:不需要开发客户端,只需要页面+服务

    2024年02月03日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包