實驗目的
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();
????????}
????}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
