Java应用程序的MODBUS通讯

实验目的

JAVA应用程序通过MODBUS协议RTU模式读写设备

 

实验器材

西门子 s7-200 226cn PLC 的CPU一台;s7-200 编程电缆一条,这条电缆亦充当MODBUS的串行口上的连接线。编程电缆是USB接口的,由于此编程电缆的驱动程序安装后即模拟了一个虚拟的串行口COM3,因此可以借助此电缆充当实际的物理连接线路

 

开发环境

Jdk1.6 update 25; STEP 7-MicroWIN 4.0;西门子S7-200的MODBUS库

 

实验目标

读PLC的输入过程映像寄存器;写PLC的V存储区

 

JAVA应用程序第三方开发包下载页面 http://sourceforge.net/projects/modbus4j/files/modbus4j/

 

Java串行口编程开发包 RXTXcomm.jar

 

环境搭建

PLC充当从站,占用通讯口port0;JAVA应用程序充当主站,发起读写的请求并等待PLC的响应。示例程序里写十六进制数值31(即二进制 00110001)到保持寄存器上,

PLC的Q1显示的结果是:

Q1.0 亮

Q1.1 灭

Q1.2 灭

Q1.3 灭

Q1.4 亮

Q1.5 亮

Q1.6 灭

Q1.7 灭

 

PLC从站的编程目标:MODBUS协议上的保持寄存器里的一个字节输出到Q,以便通过PLC上的指示灯观察。

 

PLC上的梯形图



 

说明:

IB0上的值决定是否启用MODBUS

通讯波特率9600

从站地址是5

I和Q的最大访问个数是128

模拟量输入最大访问个数是32

保持寄存器可访问1000个字

VB1上的字节输出到Q1.0 ... Q1.7

 

 

 

JAVA应用程序

import com.serotonin.io.serial.*;

import com.serotonin.modbus4j.*;

import com.serotonin.modbus4j.exception.*;

import com.serotonin.modbus4j.msg.*;

import java.util.*;

final class HardneedlTest {

    //MODBUS网络上从站地址

    private final static int SLAVE_ADDRESS=5;

 

    //串行口波特率

    private final static int BAUD_RATE = 9600;

    

    public static void main(String[] args) throws Exception {

        SerialParameters serialParameters = new SerialParameters();

 

        //设定MODBUS通讯的串行口

        serialParameters.setCommPortId("COM3");

 

        //设定成无奇偶校验

        serialParameters.setParity(0);

 

        //设定成数据位是8位

        serialParameters.setDataBits(8);

 

        //设定为1个停止位

        serialParameters.setStopBits(1);

 

        serialParameters.setPortOwnerName("Numb nuts");

 

        //串行口上的波特率

        serialParameters.setBaudRate(BAUD_RATE);

 

        ModbusFactory modbusFactory = new ModbusFactory();

        ModbusMaster master = modbusFactory.createRtuMaster(serialParameters);

        try {

            master.init();

            readDiscreteInputTest(master,SLAVE_ADDRESS,0,8);

            writeRegistersTest(master,SLAVE_ADDRESS, 0, new short[]{0x31,0xb,0xc,0xd,0xe,0x9, 0x8, 0x7, 0x6} );

            readHoldingRegistersTest(master,SLAVE_ADDRESS,0,8);

        }

        finally {

            master.destroy();

        }

    }

 

    /**

     * 读开关量型的输入信号

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始偏移量

     * @param len 待读的开关量的个数

     */

    private 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();

        }

    }

 

    /**

     * 读保持寄存器上的内容

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始地址的偏移量

     * @param len 待读寄存器的个数

     */

    private 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();

        }

    }

 

    /**

     * 批量写数据到保持寄存器

     * @param master 主站

     * @param slaveId 从站地址

     * @param start 起始地址的偏移量

     * @param values 待写数据

     */

    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();

        }

    }

}

### 回答1: Java Modbus串口通讯源码是指在Java语言中实现Modbus串口通讯的源代码。串口通讯是指通过串口进行数据传输的通讯方式,而Modbus是一种工业上常见的通讯协议,常用于PLC和其他自动化设备的通讯Java作为一种面向对象的编程语言,具有良好的可移植性和跨平台性,因此在工业控制领域中也得到了广泛的应用。而Modbus串口通讯源码则是Java语言应用于工业控制领域的重要一环,能够实现Java程序与Modbus设备之间的数据通讯。 该源码通常由几个关键组件组成,包括串口连接、Modbus协议实现、数据读写等。其中,串口连接是实现Java与设备通讯的重要一环,需要通过编写代码来实现串口连接和相关设置。Modbus协议实现则涉及到Modbus协议的各种细节和规定,需要实现读写寄存器、读写数据块等常见操作。数据读写功能则负责具体的数据传输和解析,需要确保数据的准确性和可靠性,以免通讯过程中出现错误。 综上所述,Java Modbus串口通讯源码是工业控制领域中十分重要的一环,由多个组件构成,需要开发者结合Modbus通讯协议和Java编程知识进行编写。该源码能够实现JavaModbus设备之间的数据通讯,具有重要的应用价值。 ### 回答2: Java Modbus串口通讯源码是一个用Java语言编写的便于Modbus协议通信的开源库。该库可以用于与串行设备通信,如串行口、USB串口、蓝牙串口等。通过该库,Java程序可以实现与Modbus从机设备的数据交换,包括读取和写入寄存器值、线圈状态和离散状态等。 该库提供了许多功能,如Modbus Master和Slave设备的实现、计算Modbus协议的CRC校验和、生成和解析Modbus数据包等。它使用了一些Java框架和库,如Apache Commons Lang、RXTXComm和SLF4J等。 Java Modbus串口通讯源码具有易于使用的API,其中包括了一些实用方法,例如: 1. 从Modbus从机设备中读取单个寄存器或多个寄存器的值。 2. 将数据 writes 到Modbus从机设备的寄存器中。 3. 将数据 writes 到Modbus从机设备的线圈状态或离散状态中。 Java Modbus串口通讯源码的优点是可以轻松地添加和删除协议的功能特性,拓展了程序开发的灵活性和可扩展性。由于基于Java,该库可以在不同的平台上运行,而无需从头开始实现Modbus通信的功能。 总之,Java Modbus串口通讯源码是Modbus协议通信的开源库,它允许Java程序与Modbus从设备进行通信,提供了易于使用的API和功能特性,是一款值得尝试的工具。 ### 回答3: Java Modbus串口通讯源码是指用Java语言编写的Modbus串口通讯的程序源代码。 在这个源码中,主要包含了针对Modbus通讯协议的相关程序设计。Modbus是一种常见的通信协议,用于实现在工业自动化设备和PLC等设备之间的通信。 在Java Modbus串口通讯源码中,应该会包含针对串口通讯的相关程序设计。Java语言本身并不支持串口通信,因此在编写这个程序时,需要借助一些第三方库或接口来实现串口通讯功能。 此外,这个源码还应该会包含一些针对Modbus协议的程序设计。比如,如何建立连接、如何读取和写入数据、如何处理异常等。 使用Java Modbus串口通讯源码可以方便地实现串口通讯功能,并且可以高效地处理Modbus通讯协议。有了这个源码,开发人员可以快速地定制自己的Modbus串口通讯应用,以满足自己的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值