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-200MODBUS

实验目标

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

JAVA应用程序第三方开发包

modbus4j

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

环境搭建

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

PLCQ1显示的结果是:

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

IQ的最大访问个数是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();

        }

    }

}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值