modbus java软件_Java应用程序的MODBUS通讯

本文介绍了如何使用Java通过MODBUS RTU协议与西门子S7-200 PLC进行通信。实验中,Java应用程序作为主站,读取PLC的输入过程映像寄存器,并向PLC的V存储区写入数据。同时,展示了具体的Java代码示例,包括读取和写入保持寄存器的操作。
摘要由CSDN通过智能技术生成

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应用程序第三方开发包

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上的梯形图

11690629_1.jpg

说明:

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

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值